欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

快速回復 返回頂部 返回列表