找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3922|回复: 8
收起左侧

单片机通讯中断接收程序 求解释和流程图

[复制链接]
回帖奖励 20 黑币 回复本帖可获得 20 黑币奖励! 每人限 1 次
ID:294461 发表于 2019-4-8 19:21 | 显示全部楼层 |阅读模式
  1. //  通讯中断接收程序   
  2.   void uart_rx(void)  interrupt 4        using 3         
  3. {

  4.            unsigned char i;
  5.         unsigned char flag;
  6.         unsigned char dat;
  7.     if(RI)                         //是否接收中断
  8.     {

  9.            RI=0;
  10.        dat=SBUF;
  11.        if(dat==':'&&(i==0)) //接收数据第一帧
  12.        {
  13.             buff[i]=dat;
  14.             flag=1;        //开始接收数据
  15.        }
  16.        else
  17.             if(flag==1)
  18.               {
  19.                       i++;
  20.                       buff[i-1]=dat;
  21.                       if(i>=2)
  22.                   {
  23.                            i=0;
  24.                            flag=0;
  25.                            flag_REC=1 ;
  26.                            switch (buff[0])
  27.                            {
  28.                                  case 'C':
  29.                                  switch (buff[1])
  30.                                  {
  31.                                   case '1': LED_3_S=1;break;
  32.                                   case  '3': LED_3_S=0;break;

  33.                                  }        break;

  34.                                  case 'D':
  35.                                  switch (buff[1])
  36.                                  {
  37.                                   case '1': LED_4_S=1;break;
  38.                                   case  '3': LED_4_S=0;break;

  39.                                  }        break;
  40.                            }
  41.                       }  // 停止接收
  42.               }
  43.          }

  44. }
复制代码
回复

使用道具 举报

ID:507279 发表于 2019-4-8 20:00 | 显示全部楼层
前面  dat=SBUF;直接赋值了,后面if语句里面的判断不就没有起到作用,就一直是无法用的,直接跳转else,不就错了。。。嗯。我也不是很懂,只是觉得这个地方错了。
回复

使用道具 举报

ID:213173 发表于 2019-4-8 22:59 | 显示全部楼层
这个串口中断函数有诸多错误,根本不可能正常工作。
回复

使用道具 举报

ID:294461 发表于 2019-4-9 09:34 | 显示全部楼层
wulin 发表于 2019-4-8 22:59
这个串口中断函数有诸多错误,根本不可能正常工作。

求大佬帮我改一下错误

回复

使用道具 举报

ID:158375 发表于 2019-4-9 13:14 | 显示全部楼层
先从简单的开始吧;
你是想一口吃成胖子吗?
回复

使用道具 举报

ID:213173 发表于 2019-4-9 13:31 | 显示全部楼层
123741 发表于 2019-4-9 09:34
求大佬帮我改一下错误

按你的意图写了串口通讯程序
无标题.jpg


  1. #include <reg51.h>
  2. #define uint unsigned int
  3. #define uchar unsigned char
  4. sbit LED_3_S=P1^6;
  5. sbit LED_4_S=P1^7;
  6. bit flag=0;
  7. uchar buff[]={0,0,0};                        //缓存
  8. /*************初始化串口**************/
  9. void InitUART()                //9600bps@11.0592MHz
  10. {
  11.         PCON &= 0x7F;                //波特率不倍速
  12.         SCON = 0x50;                //8位数据,可变波特率
  13.         TMOD= 0x20;                        //设定定时器1为8位自动重装方式
  14.         TL1 = 0xFD;                        //设定定时初值
  15.         TH1 = 0xFD;                        //设定定时器重装值
  16.         ET1 = 0;                        //禁止定时器1中断
  17.         TR1 = 1;                        //启动定时器1
  18.         EA = 1;                                //开总中断
  19.         ES = 1;                                //开串口中断
  20. }
  21. /**********串口发送函数*************/
  22. void SendOneByte(uchar c)
  23. {
  24.     SBUF = c;                        //发送数据
  25.     while(!TI);                        //等待发送完成
  26.     TI = 0;                                //发送中断请求标志位清0
  27. }
  28. /**************主程序**************/
  29. void main()
  30. {
  31.         uchar i;
  32.         InitUART();                                //初始化串口
  33.         while(1)
  34.         {
  35.                 if(flag==1)                        //3字节数据串接收完成
  36.                 {
  37.                         ES=0;                        //关串口中断
  38.                         flag=0;                        //接收完成标志清0
  39.                         for(i=0;i<3;i++)
  40.                                 SendOneByte(buff[i]);//返回收到的数据
  41.                         ES=1;                        //开串口中断
  42.                         if(buff[1]=='C')
  43.                         {
  44.                                 switch (buff[2])
  45.                                 {
  46.                                         case '1': LED_3_S=1;break;
  47.                                         case '3': LED_3_S=0;break;
  48.                                 }
  49.                         }
  50.                         if(buff[1]=='D')
  51.                         {
  52.                                 switch (buff[2])
  53.                                 {
  54.                                         case '1': LED_4_S=1;break;
  55.                                         case '3': LED_4_S=0;break;
  56.                                 }
  57.                         }
  58.                         for(i=0;i<3;i++)
  59.                                 buff[i]=0;        //清空缓存
  60.                 }
  61.         }
  62. }
  63. /*****通讯中断接收程序**********/   
  64. void uart_rx() interrupt 4         
  65. {       
  66.         static uchar  i=0;       
  67.         RI=0;
  68.         buff[i]=SBUF;
  69.         if(buff[0]==':')        //验证数据头,否则重新接收覆盖
  70.         {
  71.                 i++;               
  72.                 if(i==3)
  73.                 {
  74.                         flag=1;                 //接收完成标志置1
  75.                         i=0;
  76.                 }
  77.         }
  78. }
复制代码



回复

使用道具 举报

ID:192847 发表于 2019-8-1 15:26 | 显示全部楼层
我最近也在弄串口,觉得自己好多不会啊
回复

使用道具 举报

ID:542954 发表于 2019-8-8 10:29 | 显示全部楼层
值得学习
回复

使用道具 举报

ID:597613 发表于 2019-8-8 11:29 | 显示全部楼层
好多错误
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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