微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 89C51单片机+TB6600控制步进电机,中断程序感觉写得有问题,还有能不能实现步进电机一步一步走?

89C51单片机+TB6600控制步进电机,中断程序感觉写得有问题,还有能不能实现步进电机一步一步走?

时间:10-02 整理:3721RD 点击:
程序能调通,步进电机也能运行,可是步进电机不能在额定的脉冲数和额定的圈数停下来,中间的程序应该属哪有问题?还有就是想控制步进电机一步一步走,该怎么改呢?
#include<reg51.h>
#define rateNUM 6
#define uchar unsigned char
sbit MotorEn = P2^1;     // 使能
sbit FX = P2^0;          // 方向
sbit CLK = P2^2;         // 脉冲
uchar count=0,number=0,number1=0;
uchar q=0;
uchar snum=2,snum1=2;                          //设定圈数
uchar rate[6] = {6,5,4,3,2,1};   //设定速率
uchar g_MotorNum=0;
void T0_Init();
unsigned char Recive();       
// 串口接收主程序
void main(void)
{
        unsigned char lsData = 0;
        T0_Init();             // 定时器0 1 初始化
        MotorEn=0;     // 使能关闭
        FX=0;                 // 方向
    CLK=0;
        while(1)               
        {
                lsData = Recive();
                if(lsData == 'A')      // 启停
                {
//                        on_off = on_off ^ 0x01;
//                        MotorEn ^= 1;
                        TR0 = 1;           //T0启动
//                        TR0=0;
//                        TR1=1;             //T1启动       
                }
                else if(lsData == 'B') // 方向
                {
//                        dir=dir^0x01;
                        FX=FX^0x01;       
                }
                else if(lsData == 'C')
                {
                        g_MotorNum++;
                        if(g_MotorNum > rateNUM)
                           {g_MotorNum = rateNUM;}               
                }
                else if(lsData == 'D')
                {
                        g_MotorNum--;
                        if(g_MotorNum < 0)
                        g_MotorNum= 0;
                }
        }
}                                   
void T0_Init()
{
        TMOD = 0x21;   //定时器0工作方式1;定时器1工作方式2          C/T=0为定时器方式,为“1”为计数器方式
        SCON = 0x50;   //  设置串口方式1且允许串口接收
        PCON = 0x00;
        TH0 = (65535-100)/256;  // 1ms
        TL0 = (65535-100)%256;
        TH1 = 0xf3;                         // 12MHZ    2400波特率
        TL1 = 0xf3;
        EA = 1;                                 //总中断允许
        ET0 = 1;                         //T0中断允许
//        ET1 = 1;                         //T1中断允许
        TR1 = 1;                         //T1启动 (定时器1作为波特率发生器用?)
        REN = 1;                         //允许串口接收
}  
unsigned char Recive()          // 串口接收程序
{
        unsigned char  date;
        while(RI == 0);              //只要接收中断标志位RI没有被置“1”,等待,直至接收完毕(RI=1)
        RI = 0;                              //为了接收下一帧数据,需将RI清0
        date = SBUF;                  //将接收缓冲器中的数据存于date
        return date;
}
/********定时器0中断*****************/
void T0_time() interrupt 1
{
        TH0 = (65535-100)/256;   
        TL0 = (65535-100)%256;
        q++;
        if(q < rateNUM)
                {return;}
        else
              {
                        q=0;
                        count++;
//                        CLK=CLK^0x01;               //   输出脉冲
                  }                       
                        if(count==50)
                        {
                        snum--;
                        count=0;
                        number1++;
                        }
                        if(number1==snum1)
                        {
                        TR0=0;
                        MotorEn^=1;
                        }
}

感觉有问题就慢慢改啊

中断里面用return?

我也在调试,可是频率和转速对不上啊

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top