找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1175|回复: 6
打印 上一主题 下一主题
收起左侧

单片机小白有关串口通信的问题

[复制链接]
回帖奖励 1 黑币 回复本帖可获得 1 黑币奖励! 每人限 1 次(中奖概率 50%)
跳转到指定楼层
楼主
有大佬知道为什么我这接收端接收到的数据在为什么在1602上不显示吗?这是部分程序,我自己写的感觉问题很大,lcd驱动程序就不放上来了,下面有仿真图

单片机源程序如下:
  1. #include <reg51.h>
  2. #include "lcd.h"

  3. void LcdInit();
  4. void LcdDisplay();
  5. void delay(unsigned int i);
  6. void UART_T();
  7. void UART_init(void);
  8. uchar TIME[7];
  9. unsigned char receiveData=0;
  10. char r = 0;
  11. unsigned char rec[7];

  12. void UART_init(void)
  13. {
  14.         SCON=0X50;
  15.         TMOD=0X20;
  16.         PCON=0x80;
  17.         TH1=0XF3;
  18.         TL1=0XF3;
  19.   TR1=1;
  20.         TI=0;
  21.         ES=1;
  22.         EA=1;
  23. }

  24.         void UART_T() interrupt 4
  25. {
  26.          if(RI)
  27.         {
  28.                 receiveData = SBUF;
  29.                 if((receiveData==0x59))
  30.                 {
  31.                         r = 0;        
  32.                 }
  33.                 rec[r] = receiveData;
  34.            r++;
  35.                  while(!RI);
  36.                  RI = 0;
  37.         }
  38.         RI = 0;
  39.         }
  40. void main()
  41. {
  42.         LcdInit();
  43.         delay(1000);
  44.         UART_init();
  45.         while (1)
  46.         {
  47.                 TIME[0]=rec[0];
  48.                 TIME[1]=rec[1];
  49.                 TIME[2]=rec[2];
  50.                 TIME[3]=rec[3];
  51.                 TIME[4]=rec[4];
  52.                 TIME[5]=rec[5];
  53.                 TIME[6]=rec[6];
  54.                 delay(100);
  55.     LcdDisplay();
  56.         }
  57. }
  58. void LcdDisplay()
  59.         {
  60.   LcdWriteCom(0x80 + 0x40);
  61.         LcdWriteData('0'+TIME[4] / 16);
  62.         LcdWriteData('0' + (TIME[4] & 0x0f));
  63.         LcdWriteData(':');
  64.         LcdWriteData('0' + TIME[5] / 16);
  65.         LcdWriteData('0' + (TIME[5] & 0x0f));
  66.         LcdWriteData(':');
  67.         LcdWriteData('0' + TIME[6] / 16);
  68.         LcdWriteData('0' + (TIME[6] & 0x0f));
  69.         LcdWriteCom(0x80);
  70.         LcdWriteData('2');
  71.         LcdWriteData('0');
  72.         LcdWriteData('0' + TIME[0] / 16);
  73.         LcdWriteData('0' + (TIME[0] & 0x0f));
  74.         LcdWriteData('-');
  75.         LcdWriteData('0' + TIME[1] / 16);
  76.         LcdWriteData('0' + (TIME[1] & 0x0f));
  77.         LcdWriteData('-');
  78.         LcdWriteData('0' + TIME[2] / 16);
  79.         LcdWriteData('0' + (TIME[2] & 0x0f));
  80.         LcdWriteCom(0x8B);
  81.         LcdWriteData('0' + (TIME[3] & 0x07));
  82. }
  83. void delay(unsigned int i)
  84. {
  85.         while(i--);        
  86. }
复制代码

屏幕截图 2021-12-28 090444.png (134.66 KB, 下载次数: 31)

屏幕截图 2021-12-28 090444.png
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:997070 发表于 2021-12-28 09:38 | 只看该作者
我自己已经搞了两天了没有什么头绪
回复

使用道具 举报

板凳
ID:161164 发表于 2021-12-28 11:22 | 只看该作者
因为代码不全
只能推测
第27行串口代码有点问题
试改为
  1. void UART_T() interrupt 4
  2. {
  3.         if(RI)
  4.         {
  5.                 receiveData = SBUF;
  6.                 if((receiveData==0x59))
  7.                 {
  8.                         r = 0;
  9.                 }else{                       
  10.                         rec[r] = receiveData;
  11.                         r++;
  12.                 }
  13.                 while(!RI);
  14.                 RI = 0;
  15.                 }
  16.         RI = 0;
  17. }
复制代码



然后输入59 19 06 07 05 07 30 44
回复

使用道具 举报

地板
ID:997070 发表于 2021-12-28 13:56 | 只看该作者
lkc8210 发表于 2021-12-28 11:22
因为代码不全
只能推测
第27行串口代码有点问题

没用啊,我是在做电子钟,要求是要通过串口通信将单片机实物与仿真环境里的电子钟时间同步显示,数据不能只发一段,要实时不停发送,但是数据能发送出去,但是接收端这边有问题,LCD能正常显示,但没法显示我发送过去的数据,我就是这里不知道问题出在哪。还有这上面就是我接收端的整个代码了(除了LCD的驱动程序)。
回复

使用道具 举报

5#
ID:313048 发表于 2021-12-28 14:19 | 只看该作者
确定是否收到数据了,收到了再去显示肯定就没问题
回复

使用道具 举报

6#
ID:997070 发表于 2021-12-28 14:57 | 只看该作者
AUG 发表于 2021-12-28 14:19
确定是否收到数据了,收到了再去显示肯定就没问题

我加了个蜂鸣器在里面,只有把蜂鸣器响的条件改为数据为0的时候才会响,这是表示没有收到数据吗?
回复

使用道具 举报

7#
ID:213173 发表于 2021-12-28 21:40 | 只看该作者
最容易看懂的处理方法如下
自定义通信协议
0xAA'2' '1' '1' '2' '2' '8' '2' '1' '2' '2' '4' '0' '2'0x55
表示21年12月28日21点22分40秒星期二

unsigned char rec_buf[15];//接收缓存

void UARTInterrupt() interrupt 4
{
        static uchar i=0;                //静态计数变量
        RI=0;                                        //接收中断请求标志位清0
        rec_buf[num]=SBUF;                //接收到的数据串保存在缓存数组
        if(rec_buf[0]==0xAA)        //验证数据头(起始位)
        {
                i++;
                if(i>=15)
                {
                        flag=1;                        //一帧数据接收完成标志置1
                        i=0;                        //计数变量清0
                }
        }
}
在主函数中验证数据尾无误,再把收到的字符显示在LCD相应位置
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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