標(biāo)題: 單片機(jī)小白有關(guān)串口通信的問(wèn)題 [打印本頁(yè)]

作者: gaoao_236    時(shí)間: 2021-12-28 09:02
標(biāo)題: 單片機(jī)小白有關(guān)串口通信的問(wèn)題
有大佬知道為什么我這接收端接收到的數(shù)據(jù)在為什么在1602上不顯示嗎?這是部分程序,我自己寫(xiě)的感覺(jué)問(wèn)題很大,lcd驅(qū)動(dòng)程序就不放上來(lái)了,下面有仿真圖

單片機(jī)源程序如下:
  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. }
復(fù)制代碼

屏幕截圖 2021-12-28 090444.png (134.66 KB, 下載次數(shù): 31)

屏幕截圖 2021-12-28 090444.png

作者: gaoao_236    時(shí)間: 2021-12-28 09:38
我自己已經(jīng)搞了兩天了沒(méi)有什么頭緒
作者: lkc8210    時(shí)間: 2021-12-28 11:22
因?yàn)榇a不全
只能推測(cè)
第27行串口代碼有點(diǎn)問(wèn)題
試改為
  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. }
復(fù)制代碼



然后輸入59 19 06 07 05 07 30 44

作者: gaoao_236    時(shí)間: 2021-12-28 13:56
lkc8210 發(fā)表于 2021-12-28 11:22
因?yàn)榇a不全
只能推測(cè)
第27行串口代碼有點(diǎn)問(wèn)題

沒(méi)用啊,我是在做電子鐘,要求是要通過(guò)串口通信將單片機(jī)實(shí)物與仿真環(huán)境里的電子鐘時(shí)間同步顯示,數(shù)據(jù)不能只發(fā)一段,要實(shí)時(shí)不停發(fā)送,但是數(shù)據(jù)能發(fā)送出去,但是接收端這邊有問(wèn)題,LCD能正常顯示,但沒(méi)法顯示我發(fā)送過(guò)去的數(shù)據(jù),我就是這里不知道問(wèn)題出在哪。還有這上面就是我接收端的整個(gè)代碼了(除了LCD的驅(qū)動(dòng)程序)。
作者: AUG    時(shí)間: 2021-12-28 14:19
確定是否收到數(shù)據(jù)了,收到了再去顯示肯定就沒(méi)問(wèn)題
作者: gaoao_236    時(shí)間: 2021-12-28 14:57
AUG 發(fā)表于 2021-12-28 14:19
確定是否收到數(shù)據(jù)了,收到了再去顯示肯定就沒(méi)問(wèn)題

我加了個(gè)蜂鳴器在里面,只有把蜂鳴器響的條件改為數(shù)據(jù)為0的時(shí)候才會(huì)響,這是表示沒(méi)有收到數(shù)據(jù)嗎?
作者: wulin    時(shí)間: 2021-12-28 21:40
最容易看懂的處理方法如下
自定義通信協(xié)議
0xAA'2' '1' '1' '2' '2' '8' '2' '1' '2' '2' '4' '0' '2'0x55
表示21年12月28日21點(diǎn)22分40秒星期二

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

void UARTInterrupt() interrupt 4
{
        static uchar i=0;                //靜態(tài)計(jì)數(shù)變量
        RI=0;                                        //接收中斷請(qǐng)求標(biāo)志位清0
        rec_buf[num]=SBUF;                //接收到的數(shù)據(jù)串保存在緩存數(shù)組
        if(rec_buf[0]==0xAA)        //驗(yàn)證數(shù)據(jù)頭(起始位)
        {
                i++;
                if(i>=15)
                {
                        flag=1;                        //一幀數(shù)據(jù)接收完成標(biāo)志置1
                        i=0;                        //計(jì)數(shù)變量清0
                }
        }
}
在主函數(shù)中驗(yàn)證數(shù)據(jù)尾無(wú)誤,再把收到的字符顯示在LCD相應(yīng)位置




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1