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

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

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


正常

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

#define uchar unsigned char
#define uint  unsigned int

sbit led0 = P0^0; //接收到數(shù)據(jù)時閃爍
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位自動重裝
        TH1 = 0xfd;
        TL1 = 0xfd;         //0xfd波特率9600。
        ET1 = 0;
        TR1 = 1;                //啟動T1定時器
         
        PCON =0x00;         //若0x80 SMOD置1,波特率加倍
        REN=1;                 //看似無用實則不可缺失
        SCON = 0x50;                //串口允許接收
        EA  = 1;                //開總中斷
        ES  = 1;                //串口中斷打開
}
void main()
{        
        UART_init(); //串口初始化
        while(1)
        {
        }        
}


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

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

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

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

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

1.png

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

謝謝解答




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