標(biāo)題: 小白求助 關(guān)于51單片機(jī)串口數(shù)據(jù)處理 [打印本頁(yè)]

作者: 100202    時(shí)間: 2023-6-7 17:23
標(biāo)題: 小白求助 關(guān)于51單片機(jī)串口數(shù)據(jù)處理
判斷從串口接收到的兩個(gè)字節(jié),即4位16進(jìn)制的數(shù)據(jù),如果第一個(gè)字節(jié)對(duì)了led1亮然后判斷第二個(gè),第二個(gè)字節(jié)對(duì)了led3亮。
但是令我很好奇的是某些數(shù)據(jù)是對(duì)的,另一些卻不能正確判斷
如fafb, e1d1 ,等,燈可以正常亮起。f開(kāi)頭的字節(jié)都可以
但是數(shù)字開(kāi)頭的字節(jié),比如5a7b,1111等就不行。


正常

以下是我的單片機(jī)程序(初學(xué)者,很拉,不同的地方很多)
#include <reg51.h>

#define uchar unsigned char
#define uint  unsigned int

sbit led0 = P0^0; //接收到數(shù)據(jù)時(shí)閃爍
sbit led1 = P0^1;
sbit led2 = P0^2;
sbit led3 = P0^3;
sbit led4 = P0^4;

uchar num1,num2;//讀取SBUF
void UART_init(){        TR1=0;
        TMOD =0x20;          //T1工作模式2  8位自動(dòng)重裝
        TH1 = 0xfd;
        TL1 = 0xfd;         //0xfd波特率9600。
        ET1 = 0;
        TR1 = 1;                //啟動(dòng)T1定時(shí)器
         
        PCON =0x00;         //若0x80 SMOD置1,波特率加倍
        REN=1;                 //看似無(wú)用實(shí)則不可缺失
        SCON = 0x50;                //串口允許接收
        EA  = 1;                //開(kāi)總中斷
        ES  = 1;                //串口中斷打開(kāi)
}
void main()
{        
        UART_init(); //串口初始化
        while(1)
        {
        }        
}


void UART() interrupt 4
{         
        while(!RI);        //檢測(cè)是否接收完成
                RI = 0;
                led0 = ~led0;
                num1 = SBUF;        
                P1 = ~num1;
        
                if(num1==0x5A)
                {   led1=0;  //第一個(gè)字節(jié)對(duì)了之后led1亮
                        while(!RI);
                        led2=0;
                        RI=0;
                        num2=SBUF;
                        if(num2==0xA5)
                        led3=0;                 //第二個(gè)字節(jié)對(duì)了之后led3亮
                }
                else {led1=1;led2=1;led3=1;}
        
}

作者: xuyaqi    時(shí)間: 2023-6-7 18:27
在串口中斷里應(yīng)該只處理數(shù)據(jù)接收,LED處理放在main循環(huán)里,不要因?yàn)長(zhǎng)ED處理影響數(shù)據(jù)接收。
作者: 100202    時(shí)間: 2023-6-7 20:06
xuyaqi 發(fā)表于 2023-6-7 18:27
在串口中斷里應(yīng)該只處理數(shù)據(jù)接收,LED處理放在main循環(huán)里,不要因?yàn)長(zhǎng)ED處理影響數(shù)據(jù)接收。

判斷和LED處理已放進(jìn)主循環(huán),并且僅判斷一個(gè)字節(jié)。
仍只有部分?jǐn)?shù)據(jù)led1可正常亮起,如ff.fb等
請(qǐng)問(wèn)這是什么原因呢?我該如何解決嘞。求大佬指點(diǎn)
這是修改后的程序
void main()
{       
        UART_init(); //串口初始化
        while(1)
        {  
                if(num1==0x5A)
                {   led1=0;  //第一個(gè)字節(jié)對(duì)了之后led1亮
                }
                else led1=1;
       
        }       
}

void UART() interrupt 4
{         
        while(!RI);        //檢測(cè)是否接收完成
                RI = 0;       
                num1 = SBUF;
                       
}
作者: 劉宇杰找實(shí)訓(xùn)    時(shí)間: 2023-6-7 21:04
串口中斷函數(shù)接收第一個(gè)字節(jié)之后,開(kāi)啟定時(shí)器計(jì)數(shù)。接受下一個(gè)字節(jié)的時(shí)候清空定時(shí)器計(jì)數(shù)。如此,當(dāng)沒(méi)有數(shù)據(jù)接收后,計(jì)時(shí)器無(wú)法清零,當(dāng)計(jì)時(shí)器計(jì)數(shù)超過(guò)設(shè)定的數(shù)值之后,觸發(fā)定時(shí)器溢出中斷,此時(shí)數(shù)據(jù)即接收完畢
作者: 100202    時(shí)間: 2023-6-7 21:53
我把接收到的字節(jié)數(shù)據(jù)賦給了P2,P2接了8個(gè)LED燈。注意到一個(gè)現(xiàn)象,從串口接收到的數(shù)據(jù),最高位會(huì)被莫名其妙地置1。比如5A(01011010),會(huì)被認(rèn)為是DA(11011010)。其他的數(shù)據(jù)也是如此。這可能就是為什么部分?jǐn)?shù)據(jù)可以成功識(shí)別(最高位已經(jīng)是1的,如fa,e1等),而剩下的不能成功(最高位不是1的,如5A)
可是我沒(méi)寫(xiě)讓最高位 置一的程序
???
如下圖所示。接收到的是5A(01011010),顯示的卻是DA(11011010)
感謝各位大佬的解答

1.png (14.96 KB, 下載次數(shù): 44)

1.png

作者: 100202    時(shí)間: 2023-6-7 21:54
劉宇杰找實(shí)訓(xùn) 發(fā)表于 2023-6-7 21:04
串口中斷函數(shù)接收第一個(gè)字節(jié)之后,開(kāi)啟定時(shí)器計(jì)數(shù)。接受下一個(gè)字節(jié)的時(shí)候清空定時(shí)器計(jì)數(shù)。如此,當(dāng)沒(méi)有數(shù)據(jù) ...

謝謝解答




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