找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 565|回复: 0
打印 上一主题 下一主题
收起左侧

51单片机驱动a4988和tb6600,加按键单机没反映

[复制链接]
跳转到指定楼层
楼主
ID:1042077 发表于 2024-1-27 21:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大佬们,我两个驱动分别驱动,电机都能正常转动,加上按键却没响应

单片机源程序如下:
#include <reg51.h>
#include <intrins.h>  //微秒(_nop_)头文件
#define uint  unsigned int
#define uchar unsigned char

sbit dir=P1^0;
sbit pul=P1^1;
sbit ena=P1^5;

sbit dir1=P1^2;
sbit step1=P1^3;

sbit key1 = P0^0;
sbit key2 = P0^1;
sbit key3 = P0^2;
sbit key4 = P0^3;

uint x,y;        
uchar flag = 0;

/*******************************************************************/
/***********             延时函数                     **************/
/*******************************************************************/
void Delay1000us()                //@11.0592MHz
{
        unsigned char i, j;

        _nop_();
        i = 2;
        j = 199;
        do
        {
                while (--j);
        } while (--i);
}
void Delay_xms(uint x)
{
uint i,j;
for(i=0;i<x;i++)
  for(j=0;j<112;j++);
}

void delay(uint x)
{
uint i,j;
for(i=0;i<x;i++)
  for(j=0;j<112;j++);
}
/*******************************************************************/
/***********                运动函数                    *************/
/*******************************************************************/
void up_1()
{
                  ena = 1;
                                                dir=1;       //dir为1时正转,dir为0时反转
                                                 for( x = 0; x <=133; x++)
                  {        //一圈200个脉冲      两个pul为一个脉冲    16个脉冲就是28.8°距离30°是1.2°,如果改成17个脉冲就是30.6°
                                                         pul=1;
                                                         Delay1000us();                 //修改微秒值可以调速
                                                         pul=0;
                                                         Delay1000us();              
                                                }

}
void do_1()
{
                                                  ena = 1;
              dir=0;       //dir为1时正转,dir为0时反转
                                                 for( x = 0; x <=133; x++)
                  {        //一圈200个脉冲      两个pul为一个脉冲    16个脉冲就是28.8°距离30°是1.2°,如果改成17个脉冲就是30.6°
                                                         pul=1;
                                                         Delay1000us();                 //修改微秒值可以调速
                                                         pul=0;
                                                         Delay1000us();              
                                                }

}

void up_2()
{
                            dir1=1;//电机正转
                                                 for( x = 0; x <=100; x++) {     //一个圈200个脉冲
                                                         step1=1;
                                                         Delay1000us();
                                                         step1=0;
                                                         Delay1000us();
                                                }
}
void do_2()
{
                                                        dir1=0;//电机反转
                                                        for( x = 0; x <=100; x++) {     
                                                         step1=1;
                                                         Delay1000us();//时间长短会影响电机运动
                                                         step1=0;
                                                         Delay1000us();
                                                }
}
/*******************************************************************/
/***********              中断函数                     *************/
/*******************************************************************/
void keyscan()
{
        
//按键一
                if(P0^0==0)                        //如果K1按键按下
                {
                        delay(20);                //延时消抖
                        while(P0^0==1);        //松手检测
                        delay(20);                //延时消抖
      flag = 1;
                }               
//按键二        
                else if(P0^1==0)                        //如果K1按键按下
                {
                        delay(20);                //延时消抖
                        while(P0^1==1);        //松手检测
                        delay(20);                //延时消抖
      flag = 2;
                }
//按键三
                else if(P0^2==0)                        //如果K1按键按下
                {
                        delay(20);                //延时消抖
                        while(P0^2==1);        //松手检测
                        delay(20);                //延时消抖                        
      flag = 3;                                
                }
                else
                        flag =0;
        
}
void time0_init() //定时器T0初始化
{
        TMOD=0x01;          //设置定时器0工作方式1
        TH0=(65536-50000)/256;//定时50ms取高八位
        TL0=(65536-50000)%256; //取低八位
        ET0=1; //开定时器0中断使能
        EA=1;  //开总中断使能
        TR0=1; //开启中断
}

void time0() interrupt 1 //定时器T0入口函数
{
        TH0=(65536-50000)/256; //定时50ms重新赋初值
        TL0=(65536-50000)%256;
        keyscan();
}
/*******************************************************************/
/***********                主函数                     *************/
/*******************************************************************/
void main()
{
        time0_init();
                while(1){        
                if(flag != 0)
                {
                        
      if(flag == 1)
                        {
                                up_1();
                                         delay(1000);               
        do_1();               
                                         delay(1000);               
                                
                        }
      else if(flag == 2)
                        {
                                up_2();
                                         delay(1000);               
        do_2();               
                                         delay(1000);               
                        }
      else if(flag == 3)
                        {do_2();                                       
                                         delay(1000);               
        up_2();
        
                                         delay(1000);               
                        }
                }
        }        
}
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表