标题: 51单片机驱动a4988和tb6600,加按键单机没反映 [打印本页]

作者: noheadgaga    时间: 2024-1-27 21:37
标题: 51单片机驱动a4988和tb6600,加按键单机没反映
大佬们,我两个驱动分别驱动,电机都能正常转动,加上按键却没响应

单片机源程序如下:
#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);               
                        }
                }
        }        
}





欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1