问题困扰好久了,步进电机转动问题
总体思路就是,电脑向单片机发送转角度的命令,这个时候232中断开始执行,中断执行seri_run();在seri_run()函数中通过command来判断执行哪个命令,这里执行jiaodu();然后在jiaodu()函数里面去计算步进电机需要转的角度,开启TR0定时器。
问题:好像执行第一次有效,第二次步进电机(一圈3200脉冲,步距角1.8度)就不转了,然后执行第3次又转,第四次又不转,真的不明白什么原因,请教各位大侠.
void T0_time() interrupt 1
{
TH0=(65536-N)/256;
TL0=(65536-N)%256;
pulse=~pulse;
count++;
if(count>=count_1)
{
SBUF = 0x06; //当走完那么多脉冲的时候,发送0x06,也就是ACK给电脑
while(!TI);
TI=0;
TR0=0;
}
}
void jiaodu()
{ uint m,n;
SBUF = 0x66;
TI=0;
TR0=0;
count=0;
m=getcrc(recv,8);
crc[0]=m/256;
crc[1]=m%256;
if(recv[8]==crc[0]&&recv[9]==crc[1])
{ send[0]=0x06;
send[1]=0x28;
n=getcrc(send,2);
send[2]=n/256;
send[3]=n%256;
runjiaodu=1;
qi_d=0;
danbu=0;
//需要发送的脉冲数
count_1=(recv[3]*256+recv[4])*65536+recv[5]*256+recv[6];
count_1=2*count_1;
count=0;
N=(uint)(((float)jc_t*11059200.0)/(maichong_c*12.0));
pulse=1;
//ES=0;
TR0=1;
}
else
{ send[0]=0x15;
send[1]=0x28;
n=getcrc(send,2);
send[2]=n/256;
send[3]=n%256;
for(i=0;i<4;i++)
{
SBUF=send[i]; //串口写信息
while(!TI);
TI=0;
}
}
}
void seri_run()
{
if(flag==1)
{
k=0;
//ES=0;
switch(command)
{
case 0x28: jiaodu(); break;
case 0x30: kaishi(); break;
}
flag=0;
//ES=1;
}
}
void serial() interrupt 4 //串口读信息
{
RI=0;
recv[k]=SBUF;
k++;
if(k==(uint)recv[2]+6) //总字节数,电脑向单片机发送报文,其中recv[2]第三个字节就是存放的这次报文的总字节
{
command=recv[1]; //第一个字节存放命令类别
flag=1;
k=0;
seri_run();
}
}
void main()
{
init();
while(1)
{
for(i=0;i<10000;i++);
i=0;
}
}
链接这里有,CSDN的,好像这里排版没排好
void serial() interrupt 4 //串口读信息
里面的逻辑有点问题。配合着你的代码和功能仔细查一下
能不能给点提示啊,或者帮忙看下