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;
}
}
#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?
我也在调试,可是频率和转速对不上啊