久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1625|回復: 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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 蜜桃视频在线观看免费视频网站www | 天天综合久久 | 涩涩视频网站在线观看 | 激情91 | 国产在线a | 国产精品观看 | 亚洲欧洲中文 | 亚洲精品久久久久久久久久久 | 九色av| 日韩欧美精品一区 | av在线电影网站 | 成人在线精品 | 婷婷成人在线 | 中文字幕一区二区三区不卡在线 | 久久精品国产一区二区电影 | 国产高清一区二区 | 日本黄色免费视频 | 精品视频在线观看 | 小早川怜子xxxxaⅴ在线 | 日韩av中文 | 日韩理论电影在线观看 | 欧美日韩中文国产一区发布 | 日本激情视频中文字幕 | 日韩一区二区免费视频 | 国产精品毛片一区二区在线看 | 免费看的av | 亚洲欧洲视频 | 国产精品久久欧美久久一区 | 国内精品一区二区三区 | 一区二区三区国产 | 国产99久久精品一区二区永久免费 | 国产亚洲一区在线 | 极品粉嫩国产48尤物在线播放 | 久久久久久久国产精品 | 一级全黄视频 | 亚洲欧美日韩国产综合 | 欧美亚洲视频 | 国产一区二区在线免费观看 | 伊人色综合久久天天五月婷 | 欧美日韩国产高清 | 国产98色在线 | 日韩 |