找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1548|回复: 3
收起左侧

51单片机串口通讯,中断完成特定动作,单片机发送特定数据

[复制链接]
ID:311281 发表于 2018-12-26 11:40 | 显示全部楼层 |阅读模式
问题:中断完成特定动作,单片机发送特定数据,问题在于它一直发数据,不停,动作标志位也清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;

  }


}


串口通讯助手发送接收

串口通讯助手发送接收
回复

使用道具 举报

ID:434820 发表于 2018-12-26 12:28 | 显示全部楼层
你这中断只响应了一次
回复

使用道具 举报

ID:311281 发表于 2018-12-26 16:11 | 显示全部楼层
已搞定,咋感觉每次发完贴都会了,自己结题。谢谢各位!错的原因是因为move_ok中的一个函数又将其置1,默认又进入中断执行命令。
回复

使用道具 举报

ID:72777 发表于 2018-12-26 16:32 | 显示全部楼层
爱学习爱交流 发表于 2018-12-26 16:11
已搞定,咋感觉每次发完贴都会了,自己结题。谢谢各位!错的原因是因为move_ok中的一个函数又将其置1 ...

恭喜恭喜
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表