标题: 51单片机串口通讯,中断完成特定动作,单片机发送特定数据 [打印本页]

作者: 爱学习爱交流    时间: 2018-12-26 11:40
标题: 51单片机串口通讯,中断完成特定动作,单片机发送特定数据
问题:中断完成特定动作,单片机发送特定数据,问题在于它一直发数据,不停,动作标志位也清0了,代码太多,部分代码如下:
//**串口中断程序**//
void UART_SER(void) interrupt 4
{
  unsigned char Temp;
  uchar i;
  if(RI)
  {
    RI=0;         // 标志位清零
        Temp=SBUF;
        judge[cnt]=Temp;
        if(judge[0]==0x2A)        
         {
            cnt++;
                if(cnt>=8)
                {
                   check();
                   if(judge[7]==sum)
                     {
                           re_flag=1;
                         }
                        else
                        {
                           for(i=0;i<8;i++)
                           {
                              judge[ i]=0x00;//缓存数组清零[ i]
                           }
                        }
                   cnt=0;
                }
         }
         
//    SBUF=Temp;//把接受的值再返还给电脑端         
  }
//  if(TI)  //如果是发送标志位,清零
//  {
//    TI=0;
//  }
}
//**发送数据**//
void TX1_sendmsg(uchar *pdat)
{
  
  uchar i;
  ES=0;
for(i=0;i<8;i++)
  {
    SBUF=*pdat;
         pdat++;
         while(!TI);
         TI=0;
  }
  TX_flag=1;
   ES=1;


}
中断部分:
void Timer0_(void) interrupt 1
{

  sw=0;         //为了测试程序先定义一个sw的状态
  sw1=0; //为了测试程序先定义一个sw的状态
  sw2=0; //为了测试程序先定义一个sw的状态
  TH0=(65536-2000)/256;         //定时2ms
  TL0=(65536-2000)%256;
     if(pulse==0)

        {
          Mot_Dir=1;
          Mot_En=1;
          Mot_Pulse=0;
        }
        else
        {
          Mot_Dir=1;
          Mot_Pulse=~Mot_Pulse;
          Mot_En=1;
          pulse--;
        }
            if(pulse==0)
           {
             Mot_Dir=1;
             Mot_Pulse=0;
             Mot_En=1;
             move_ok=1;
                                 
           }
           break;

     default:
         Mot_Dir=1;
           Mot_Pulse=0;
           Mot_En=1;
             break;

}
在while语句对move_ok进行判定
void main ()
.......
while(1)
{
.......
if(move_ok==1)
  {
     move_ok=0;
         send_msg[0] = 0x2A;
         send_msg[1] = 0x2A;
         send_msg[2] = judge[2];
         send_msg[3] = 0x00;
         send_msg[4] = 0x00;
         send_msg[5] = 0x4f;
         send_msg[6] = 0x4b;
         send_msg[7] = 0x88; //check_number累计校验和
         TX1_sendmsg(send_msg);
  }
  if(TX_flag==1)
  {
           TX_flag==0;

  }


}


回家.png (39.59 KB, 下载次数: 32)

串口通讯助手发送接收

串口通讯助手发送接收

作者: zhan8665    时间: 2018-12-26 12:28
你这中断只响应了一次
作者: 爱学习爱交流    时间: 2018-12-26 16:11
已搞定,咋感觉每次发完贴都会了,自己结题。谢谢各位!错的原因是因为move_ok中的一个函数又将其置1,默认又进入中断执行命令。
作者: tsylovely    时间: 2018-12-26 16:32
爱学习爱交流 发表于 2018-12-26 16:11
已搞定,咋感觉每次发完贴都会了,自己结题。谢谢各位!错的原因是因为move_ok中的一个函数又将其置1 ...

恭喜恭喜




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