当前位置: 代码迷 >> 单片机 >> 分不多,但是有关问题困扰好久了,请大侠帮忙看一上
  详细解决方案

分不多,但是有关问题困扰好久了,请大侠帮忙看一上

热度:37   发布时间:2016-04-28 15:41:00.0
分不多,但是问题困扰好久了,请大侠帮忙看一下

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;
}

}


总体思路就是,电脑向单片机发送转角度的命令,这个时候232中断开始执行,中断执行seri_run();在seri_run()函数中通过command来判断执行哪个命令,这里执行jiaodu();然后在jiaodu()函数里面去计算步进电机需要转的角度,开启TR0定时器。

问题:好像执行第一次有效,第二次步进电机(一圈3200脉冲,步距角1.8度)就不转了,然后执行第3次又转,第四次又不转,真的不明白什么原因,请教各位大侠.
以后有分我补上
------最佳解决方案--------------------
中断函数用的时间太长了

void seri_run()最好放在主函数里面
------其他解决方案--------------------
楼上说的对,指令的执行部分不要放在中断里,放在外面,中断程序要尽快的出来
  相关解决方案