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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1847|回復: 5
打印 上一主題 下一主題
收起左側

小白求助 關于51單片機串口數據處理

[復制鏈接]
跳轉到指定樓層
樓主
判斷從串口接收到的兩個字節,即4位16進制的數據,如果第一個字節對了led1亮然后判斷第二個,第二個字節對了led3亮。
但是令我很好奇的是某些數據是對的,另一些卻不能正確判斷
如fafb, e1d1 ,等,燈可以正常亮起。f開頭的字節都可以
但是數字開頭的字節,比如5a7b,1111等就不行。


正常

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

#define uchar unsigned char
#define uint  unsigned int

sbit led0 = P0^0; //接收到數據時閃爍
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;  //第一個字節對了之后led1亮
                        while(!RI);
                        led2=0;
                        RI=0;
                        num2=SBUF;
                        if(num2==0xA5)
                        led3=0;                 //第二個字節對了之后led3亮
                }
                else {led1=1;led2=1;led3=1;}
        
}
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:94031 發表于 2023-6-7 18:27 | 只看該作者
在串口中斷里應該只處理數據接收,LED處理放在main循環里,不要因為LED處理影響數據接收。
回復

使用道具 舉報

板凳
ID:1082596 發表于 2023-6-7 20:06 | 只看該作者
xuyaqi 發表于 2023-6-7 18:27
在串口中斷里應該只處理數據接收,LED處理放在main循環里,不要因為LED處理影響數據接收。

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

void UART() interrupt 4
{         
        while(!RI);        //檢測是否接收完成
                RI = 0;       
                num1 = SBUF;
                       
}
回復

使用道具 舉報

地板
ID:1082659 發表于 2023-6-7 21:04 | 只看該作者
串口中斷函數接收第一個字節之后,開啟定時器計數。接受下一個字節的時候清空定時器計數。如此,當沒有數據接收后,計時器無法清零,當計時器計數超過設定的數值之后,觸發定時器溢出中斷,此時數據即接收完畢
回復

使用道具 舉報

5#
ID:1082596 發表于 2023-6-7 21:53 | 只看該作者
我把接收到的字節數據賦給了P2,P2接了8個LED燈。注意到一個現象,從串口接收到的數據,最高位會被莫名其妙地置1。比如5A(01011010),會被認為是DA(11011010)。其他的數據也是如此。這可能就是為什么部分數據可以成功識別(最高位已經是1的,如fa,e1等),而剩下的不能成功(最高位不是1的,如5A)
可是我沒寫讓最高位 置一的程序
???
如下圖所示。接收到的是5A(01011010),顯示的卻是DA(11011010)
感謝各位大佬的解答

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

1.png
回復

使用道具 舉報

6#
ID:1082596 發表于 2023-6-7 21:54 | 只看該作者
劉宇杰找實訓 發表于 2023-6-7 21:04
串口中斷函數接收第一個字節之后,開啟定時器計數。接受下一個字節的時候清空定時器計數。如此,當沒有數據 ...

謝謝解答
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久高清精品 | 中文字幕一区二区三区在线观看 | 夜夜爽99久久国产综合精品女不卡 | 伊人网综合在线观看 | 91观看| 综合色播| www.日日干| 久久久久久久久99 | 色香蕉在线 | 日韩a| 91精品国产美女在线观看 | 亚洲视频在线看 | 高清久久久 | 福利av在线 | 成人在线网 | 日韩综合网 | 亚洲天堂日韩精品 | 欧美精品网站 | 亚洲精品电影网在线观看 | 国产午夜精品久久久 | 国产中文字幕亚洲 | 亚洲欧美日韩系列 | 免费中文字幕 | 国产欧美一区二区三区在线播放 | 日本视频中文字幕 | 福利社午夜影院 | 婷婷久久五月 | 国产日韩电影 | 亚洲国产成人精品女人久久久野战 | 在线观看深夜视频 | 亚洲巨乳自拍在线视频 | 国产电影精品久久 | 日本精品一区二区三区视频 | 91天堂| 伊人电影院av | 激情五月婷婷综合 | 欧美成人h版在线观看 | 日韩在线视频免费观看 | 午夜专区| 一区二区三区不卡视频 | 毛片入口 |