娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

歷史上的今天

今天是:2025年06月21日(星期六)

2021年06月21日 | 51單片機開發之串口通信

發布者:素心輕語 來源: eefocus關鍵字:51單片機開發  串口通信  傳感器 手機看文章 掃描二維碼
隨時隨地手機看文章

4.3 串口通信

4.3.1 通信的概念

通信一詞按照傳統的理解就是信息的傳輸與交換。

對于單片機來說,通信則與傳感器、存儲芯片、外圍控制芯片等技術緊密結合,成為整個單片機系統的“神經中樞”;沒有通信,單片機所實現的功能僅僅局限于單片機本身,就無法通過其它設備獲得有用信息,也無法將自己產生的信息告訴其它設備。如果單片機通信沒處理好的話,它和外圍器件的合作程度就受到限制,最終整個系統也無法完成強大的功能,由此可見單片機通信技術的重要性。

 UART(Universal Asynchronous Receiver/Transmitter,即通用異步收發器)串行通信是單片機最常用的一種通信技術,通常用于單片機和電腦之間以及單片機和單片機之間的通信。

4.3.2 串口通信介紹

串口通信是按照位(bit)發送和接收,串口可以在使用一根線發送數據的同時用另一根線接收數據;這種通信方式使用的數據線少,在遠距離通信中可以節約通信成本,但其傳輸速度比并行傳輸低。

串口是計算機上一種非常通用的設備通信協議,大多數計算機(不包括筆記本電腦,主要是臺式主機)包含兩個基于RS-232的串口。串口同時也是儀器儀表設備通用的通信協議。

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

圖4-3-1 標準RS232串口

 

上面圖中的串行接口叫做 RS232 接口,由于現在筆記本電腦都不帶這種 9 針串口了,所以和單片機通信越來越趨向于使用USB協議虛擬的串口(就是使用USB轉串口協議芯片,實現串口與USB協議互轉,比如:CH340)。 標準的RS232接口里,2號引腳是接收數據口RXD,3號引腳是發送數據TXD,對于 RS232 標準來說,它的TXD 和 RXD 的電壓, -3V~-15V 電壓代表是 1, +3~+15V 電壓代表是 0。因此電腦的 9 針 RS232串口是不能和單片機直接連接的,需要用一個電平轉換芯片 MAX232 來完成,單片機上的電壓是TTL標準,TTL電平信號規定,+5V等價于邏輯“1”,0V等價于邏輯“0”。

STC90C51RC/RD+系列單片機串口通信對應的專用管腳是P3.0/RxD和P3.1/TxD,由它們組成的通信接口就叫做串行接口,簡稱串口。

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

圖4-3-2 兩個單片機之間串口通信示意圖

 

圖中, GND 表示單片機系統電源的參考地, TXD 是串行發送引腳, RXD 是串行接收引腳。兩個單片機之間要通信,首先電源基準得一樣,所以要把兩個單片機的 GND 相互連接起來,然后單片機1的TXD引腳接到單片機2 的 RXD 引腳上,即此路為單片機 1 發送而單片機 2 接收的通道,單片機 1 的 RXD 引腳接到單片機 2 的 TXD 引腳上,即此路為單片機 2 發送而單片機 1 接收的通道。這個示意圖就體現了兩個單片機相互收發信息的過程。

當單片機 1 想給單片機 2 發送數據時,比如發送一個 0xE4 這個數據,用二進制形式表示就是 0b11100100,在 UART 通信過程中,是低位先發,高位后發的原則,那么就讓 TXD首先拉低電平,持續一段時間,發送一位 0,然后繼續拉低,再持續一段時間,又發送了一位 0,然后拉高電平,持續一段時間,發了一位 1……一直到把 8 位二進制數字 0b11100100全部發送完畢。

這里就涉及到了一個問題,就是持續的這“一段時間”到底是多久?由此便引入了通信中的一個重要概念——波特率,也叫做比特率。

波特率就是發送二進制數據位的速率,習慣上用 baud 表示,即發送一位二進制數據的持續時間=1/baud。在通信之前,單片機 1 和單片機 2 首先都要明確的約定好它們之間的通信波特率,必須保持一致,收發雙方才能正常實現通信。

約定好速度后,還要考慮第二個問題,數據什么時候是起始,什么時候是結束?不管是提前接收還是延遲接收,數據都會接收錯誤。在 UART 通信的時候,一個字節是 8 位,規定當沒有通信信號發生時,通信線路保持高電平,當要發送數據之前,先發一位 0 表示起始位,然后發送 8 位數據位,數據位是先低后高的順序,數據位發完后再發一位 1 表示停止位。這樣本來要發送一個字節的 8 位數據,而實際上一共發送了 10 位,多出來的兩位其中一位起始位,一位停止位。而接收方,原本一直保持的高電平,一旦檢測到了一位低平,那就知道了要開始準備接收數據了,接收到 8 位數據位后,然后檢測到停止位,再準備下一個數據的接收。

下面圖片展示了一個完整的串口數據發送接收過程:

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

圖4-3-3 串口數據發送示意圖

 

4.3.3 51單片機的串口寄存器介紹

STC90C51RC/RD+系列單片機內部集成有一個功能很強的全雙工串行通信口(P3.0/RxD和P3.1/TxD),與傳統8051單片機的串口完全兼容。設有2個互相獨立的接收、發送緩沖器,可以同時發送和接收數據。

串行通信設有4種工作方式,其中兩種方式的波特率是可變的,另兩種是固定的,波特率由內部定時器/計數器產生。

4種工作模式,可通過軟件編程對SCON中的SM0、 SM1的設置進行選擇。其中模式1、模式2和模式3為異步通信,每個發送和接收的字符都帶有1個起始位和1個停止位。

發送緩沖器只能寫入而不能讀出,接收緩沖器只能讀出而不能寫入,因而兩個緩沖器可以共用一個地址碼(99H)。兩個緩沖器統稱串行通信特殊功能寄存器SBUF。

串口相關的配置寄存器如下:

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

圖4-3-4

完成基本串口通信主要使用的寄存器有4個:

SCON: 串行控制寄存器 (可位尋址)

PCON: 電源控制寄存器 (不可位尋址)

IE : 中斷允許寄存器 (可位尋址)

SBUF: 發送/接收緩沖區(雙向的)

4.3.4 串行控制寄存器SCON

串行控制寄存器SCON用于選擇串行通信的工作方式和某些控制功能,其格式如下:

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

圖4-3-5

 

TI: 數據發送完成中斷請求標志位,由內部硬件自動置位(TI=1),必須用軟件復位(TI=0)。

RI: 數據接收完成中斷請求志位,由內部硬件置位,即RI=1,必須由軟件復位,即RI=0。

SCON的所有位在復位之后全部為"0"。

REN:允許/禁止串行接收控制位。 由軟件置位REN,即REN=1為允許串行接收狀態,可啟動串行接收器RxD,開始接收信息。軟件復位REN,即REN=0,則禁止接收。

SM0/FE:當PCON寄存器中的SMOD0/PCON.6位為0時,該位和SM1一起指定串行通信的工作方式,如下表所示。

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

圖4-3-6

 

SCON寄存器主要配置串口的工作方式,啟動串口的接收功能,常用的工作模式是方式1(8位UART)。

串口工作在方式1時,波特率是可變的,可變的波特由定時器/計數器1或獨立波特率發生器產生。


示例:

SCON=0x50;          //設置為工作方式1,允許串口接收


4.3.5 電源控制寄存器PCON

電源控制寄存器PCON格式如下:

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

圖4-3-7

 

SMOD: 波特率選擇位。當SMOD=1,則使串行通信方式1、 2、 3的波特率加倍;復位時SMOD=0。

SMOD0: 幀錯誤檢測有效控制位,當SMOD0=0時,與SCON寄存器中的SM0/FE位一起指定串行口的工作方式。復位時SMOD0=0。

配置示例:

PCON=0x80;          //波特率加倍

 

4.3.6 串行口數據緩沖寄存器SBUF

STC90C51RC/RD+系列單片機的串行口緩沖寄存器(SBUF)的地址是99H,實際是2個緩沖器,寫SBUF的操作完成待發送數據的加載,讀SBUF的操作可獲得已接收到的數據。兩個操作分別對應兩個不同的寄存器,1個是只寫寄存器,1個是只讀寄存器。

示例:

u8 Rx_Byte;Rx_Byte = SBUF;  //接收到的數據保存到變量中SBUF = Rx_Byte; //將變量保存的數據發送出去


4.3.7 波特率設置

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

圖4-3-8

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

圖4-3-9

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

圖4-3-10 常見的波特率設置

 

4.3.8 配置串口實現數據收發示例(波特率不加倍)

下面代碼配置串口的波特率為9600,波特率不加倍,當前運行代碼的單片機晶振是: 11.059200MHZ。

單片機工作在12T模式下(在12T架構下一個機器周期是12個時鐘周期,也就是 12/11059200 秒)

主函數里1秒鐘向串口發送一個字符串,串口開啟了接收中斷,如果收到數據就原樣將數據再發送出去。

波特率的配置方法,在STC芯片參考手冊的串口章節有示例代碼(P199),可以參考修改。

示例代碼:

(硬件平臺說明:CPU是STC90C516RD 、晶振頻率12MHZ 、工作在12T模式下、一個機器周期為1us時間)

#include /*串口初始化函數*/void UART_Init(void){    PCON=0x00;    //波特率不加倍    SCON=0x50;    //配置串口工作在模式1(8位數據模式)    EA=1;         //打開總中斷    ES=1;         //打開接收中斷    TMOD&=0x0F;   //清零T1的控制位    TMOD|=0x20;   //配置T1為模式2 (8位自動重裝載)    TL1=TH1=256-(11059200/12/32/9600); //計算 T1 重載值 28800    //TH1= TL1=256-(FOSC/12/32/BAUD);  //計算公式  FOSC表示晶振頻率  BAUD表示波特率    TR1=1;        //啟動 T1}/*串口接收中斷*/void UART_IRQHandler(void) interrupt 4{    u8 Rx_Byte;    if(RI)  //接收到字節    {        RI=0;//手動清零接收中斷標志位        Rx_Byte=SBUF;  //接收到的數據保存到變量中        UART_SendOneByte(Rx_Byte); //再發回給電腦端    }}/*發送一個字符*/void UART_SendOneByte(u8 c){    SBUF = c;    while(TI==0){}    TI = 0;}/*發送字符串*/void UART_SendString(u8 *p){    while(*p++!='

主站蜘蛛池模板: 阿拉尔市| 布尔津县| 天水市| 耒阳市| 亳州市| 博客| 新余市| 钟山县| 泸水县| 广河县| 英超| 余姚市| 西平县| 文登市| 吉首市| 石门县| 蕲春县| 东乡县| 胶南市| 本溪市| 陵川县| 灵寿县| 碌曲县| 平远县| 星子县| 长春市| 河东区| 岚皋县| 平南县| 锡林郭勒盟| 剑河县| 南岸区| 商丘市| 建平县| 西贡区| 石渠县| 福安市| 建昌县| 海南省| 商南县| 绍兴市|