本章概述思維導圖:
51單片機實現串口模塊教程
通信基本概念
通信,至少是需要兩個對象,一個收一個發數據。
根據數據通信的傳輸時序協調方式,可分為:同步通信和異步通信;
根據數據通信的傳輸線路可分為:串行通信和并行通信;
根據數據通信的傳輸方向性及雙向交互能力可分為:單工通信和雙工通信(半雙工通信和全雙工通信);
串行通信和并行通信定義
串行通信:數據按位順序傳輸,使用單條線路進行數據得傳輸。例如,發送字節?10110010
?時,先傳?1
,再傳?0
,以此類推。
并行通信:數據的多個位(通常8位、16位等)同時通過多條線獨立線路并行傳輸。如傳輸字節?10110010
,會使用8根數據線,每根線同時傳1位。
串行和并行的區別;
串行通信指同一時刻,只能收或發一個bit位信息,因此只用一根數據信號線即可;并行通信指同一時刻,可以收或發多個bit位信息,因此需要多根數據信號線才行;
同步通信和異步通信定義
同步通信:發送方與接收方通過共享時鐘線的時鐘信號,確保數據按固定時間間隔傳輸,接收方能準確預測數據到達時間;
異步通信:發送方與接收方無共享時鐘線,通過數據包或數據幀格式(如起始信號/停止位)協調傳輸數據;
同步和異步的區別:同步通訊需要有時鐘信號控制,通過時鐘線的高低電平控制數據的收發;異步通信沒有時鐘信號控制,通過數據幀格式控制數據的收發(大家約定好通信速度(波特率));
小心得:就是一個有時鐘線提供時鐘時序,一個沒有時鐘線;
單工和半雙工、全雙工定義
單工通信:數據僅能沿固定方向單向傳輸,發送端與接收端角色不可互換。
應用場景:廣播系統(電臺→聽眾、衛星數據下行)、傳感器網絡(如溫濕度傳感器→數據中心)等;
半雙工通信:同一信道分時復用,雙方交替發送和接收。就是指同一時刻只允許發送或者接收;
應用場景:對講機、傳統Wi-Fi;
全雙工通信:雙方可同時發送和接收數據;
應用場景:電話通話、以太網交換機等;
單工和半雙工、全雙工的區別:
單工通信:單工要么收要么發,只能做接收設備或者發送設備。接收器不能發送數據給 ?發送器。例如:收音機;?
半雙工通信:雙發都可以發送數據,雙方不能同時發送數據或接收數據;只有一根發送/接收數據信號線。(特點:可以收可以發,但是不能同時收發)例如:對講機;?
全雙工通信:雙方可以同時發送或者接收數據;有兩根發送/接收數據信號線;(特點:可以同時即發送又接收數據)例如:手機
通信速率
通信速率(比特率)是衡量數據在信道中傳輸效率的核心指標,其本質是單位時間內傳輸的信息量。每秒傳輸的二進制比特數,單位為比特/秒(bps),是衡量信息量的直接指標。;例如1000bps表示每秒傳輸1000個二進制位(0或1);
波特率是每秒傳輸的符號(碼元)數,是物理層信號變化的頻率,用于描述UART串口通信時的通信速度,其單位(bps)即每秒鐘傳送的位(bit) 的數量
在二進制調制中(如UART),1符號=1比特,此時波特率=比特率
在多進制調制中(如QPSK、16QAM),1符號可攜帶多比特,波特率!=比特率
串口通信簡介
串口(UART)通訊:異步通訊、全雙工、串行通訊、總線協議;
UART通用同步異步收發器,是一種通用的串行、異步/同步通信總線。該總線有兩條數據信號線,可以實現全雙工的發送和接收;
上位機:就是連接串口的電腦或者手機上的APP軟件;是在自動化控制系統中,用于監控 和控制下位機(如單片機、PLC等)的計算機。它可以直接發送操作指令給下位機, 并接收下位機的反饋數據,通過用戶操作交互界面向用戶展示數據。
51單片機串口相關寄存器
一、串口控制寄存器(SCON)
SCON用于控制串口工作模式,數據收發及狀態指示,其各位定義如下:?????????
? ? ????位序 | 名稱 | 功能描述 |
? ????????7 | SM0 | 串口工作模式選擇位(與SM1組合) |
??????????6 | SM1 | 串口工作模式選擇位(與SM0組合) |
? ? ? ? ? 5 | SM2 | 多機通信控制位(模式2/3時啟用) |
? ? ? ? ? 4 | REN | 接收允許位(1=允許接收,0=禁止接收) |
? ? ? ? ? 3 | TB8 | 模式2/3時發送的第9位數據 |
? ????????2 | RB8 | 模式2/3時接收的第9位數據 |
? ? ? ? ? 1 | TI | 發送中斷標志(硬件置位,軟件清零) |
? ? ? ? ? 0 | RI | 接收中斷標志(硬件置位,軟件清零) |
RI位:接收中斷標志位。當數據接收完成后由硬件自動置1,響應完中斷后必須軟件復位寫0;
TI位:發送中斷標志位。當數據發送完成后由硬件自動置1,響應完中斷后必須軟件復位寫0;
RB8位:模式2/3時接收的第9位數據;模式1,若SM2=0,則為接收到的停止位;
TB8位:模式2/3時發送的第9位數據,由軟件寫0/1;可用作于數據校驗位或多機通信中表示地址幀/數據幀的標志位;
REN位:接收運行位,使用串口接收必須將改為置1(1=允許接收,0=禁止接收);
SM2位:多機通信控制位,模式2/3時,SM2位為1,REN位為1,則從機只有接收到RB8位為1(地址幀)時才會觸發RI位為1。SM2為0時,從而接收RB8位為0的數據幀;
SM1位:串口模式選擇位(與SM0組合);
SM2位:串聯模式選擇位(與SM1組合);
工作模式選擇(SM0/SM1):
????????SM0 | ????????SM1 | 模式 | 特點 |
? ? ? ? ? ?0 | ?????? ? ? 0 | 模式0 | 同步移位寄存器(8位數據,波特率固定) |
? ? ? ? ? 0 | ? ? ? ? ? ?1 | 模式1 | 8位UART,波特率可變 |
? ? ? ? ? 1 | ? ? ? ? ? ?0 | 模式2 | 9位UART,波特率固定(PCON寄存器中SMOD位控制) |
? ? ? ? ? 1 | ? ? ? ? ? ?1 | 模式3 | 9位UART,波特率可變 |
二、電源控制寄存器(PCON)
????????位序 | 名稱 | 功能描述 |
? ? ? ? ? ?7 | SMOD | 波特率倍增位(1=波特率加倍,僅模式1/2/3有效) |
? ? ? ? ?6-0 | 保留 | 僅SMOD位有效,其他位為虛設或保留 |
三、串行口數據緩存寄存器SBUF
串行口數據緩存寄存器(SBUF)是串口通信中的核心寄存器,用于實現數據的發送和接收。
SBUF在物理上是一個寄存器,但在邏輯上分為發送緩沖區和接收緩沖器,兩者通過同一地址訪問,但功能獨立:
????????????????????????發送緩沖器:寫入SBUF的數據將被串口發送。
????????????????????????接收緩沖器:串口接收的數據將存入SBUF,供CPU讀取。
SBUF寄存器操作方式:
????????數據發送方式步驟:? ?
????????1、將待發送數據寫入SBUF。
????????2、硬件自動將SBUF中的數據通過TXD引腳(P3.1)發送。
????????3、發送完成后,發送中斷標志(TI)由硬件置位。
代碼示例:
SBUF = 0x41; // 發送字符'A'(ASCII碼0x41)
while(!TI); // 等待發送完成
TI = 0; // 清零TI標志(必須軟件清零)
? ? ? ? 數據接收方式步驟:????????
????????1、啟用串口接收(通過SCON的REN位設置)。
????????2、當RXD引腳(P3.0)檢測到有效起始位時,硬件開始接收數據。
????????3、接收完成后,數據存入SBUF,接收中斷標志(RI)由硬件置位。
代碼示例:
if(RI) { // 檢測接收標志char data = SBUF; // 讀取接收數據RI = 0; // 清零RI標志(必須軟件清零)
}
串口工作模式
1、模式0
模式0:同步移位寄存器模式
????????數據格式:8位同步移位寄存器,LSB優先,無起始/停止位。
????????波特率:固定為晶振頻率(fosc)的1/12。
????????寄存器配置:
????????????????SCON寄存器:SM0=0,SM1=0。
數據通過RXD引腳(P3.0)輸入輸出,TXD引腳(P3.1)輸出(移位脈沖)同步時鐘。
如果設置中斷的情況下,發送/接收完成,對應中斷標志位TI/RI都會硬件置一,小伙伴們使用完中斷標志位要記得軟件清0呦!
2、模式1
模式1:8位UART模式(可變波特率)
????????數據格式:10位異步通信(1起始位+8數據位+1停止位)。
????????波特率:由定時器1的溢出率決定,計算公式為:
????????波特率=定時器時鐘頻率 / ?(12×(256?TH1初值))?
????????定時器時鐘頻率通常為fosc/12(12時鐘模式)或fosc/6(6時鐘模式)。
????????寄存器配置:
????????????????SCON寄存器:SM0=0,SM1=1。
????????????????TMOD寄存器:定時器1設為模式2(自動重裝載),TMOD=0x20。
? ?TH1/TL1:設置波特率初值,例如9600bps時(fosc=11.0592MHz,SMOD=0),TH1=0xFD。
3、模式2
模式2:9位UART模式(固定波特率)
????????數據格式:11位異步通信(1起始位+9數據位+1停止位)。第9位為可編程位(TB8)。
????????波特率:由PCON寄存器的SMOD位控制:
????????SMOD=0時,波特率=fosc/64;
????????SMOD=1時,波特率=fosc/32。
????????寄存器配置:
????????????????SCON寄存器:SM0=1,SM1=0。
????????????????PCON寄存器:SMOD位根據需求設置(例如,波特率倍增時SMOD=1)。
應用場景:多機通信中,第9位可用于地址識別(如TB8=1表示地址幀)。
4、模式3
模式3:9位UART模式(可變波特率)
????????數據格式:與模式2相同,但波特率生成方式不同。
????????波特率:由定時器1的溢出率決定,計算公式與模式1一致,但支持更高波特率(因 SMOD可倍增)。
????????寄存器配置:
????????SCON寄存器:SM0=1,SM1=1。
????????TMOD/TH1/TL1配置與模式1相同,但需結合PCON的SMOD位優化波特率。
應用場景:需高波特率或多機通信的復雜場景,如工業控制網絡。
串口計算波特率
計算波特率方法:
????????方式0:波特率(固定)=fosc / 12
????????方式1:波特率=(2的SMOD次方 / 32)* (T1溢出率)
????????方式2:波特率(固定)=(2的SMOD次方 / 64)* fosc
????????方式3:波特率=(2的SMOD 次方/ 32)* (T1溢出率)
????????其中T1溢出率=fosc / { 12 * [ 256 - ( TH1 )]}
在這里我使用串口波特率計算器進行計算,也會打包成文件方便大家使用喲!
51單片機串口配置步驟
配置步驟:
? ? ? ? 1、確定T1的工作方式(TMOD寄存器):選擇定時器1的方式2,波特率的產生
????????2、確定串口工作方式(SCON寄存器):一般選擇選擇串口方式1
????????3、計算T1的初值(設定波特率),賦初值裝載到TH1、TL1;
????????4、啟動T1(TCON中的TR1位);
????????5、如果使用中斷,需開啟串口中斷控制器位(IE寄存器),并開啟總中斷位EA位
代碼示例:
Void UART_Init(u8 baud) //串口配置函數:形參為定時器計數的初值
{TMOD|=0x20; //設置計數器工作方式2SCON=0x50; //設置為工作方式1PCON=0x80; //波特率加倍TH1=baud; //賦初值TL1=baud;ES=1; //開啟接收中斷EA=1; //打開總中斷TR1=1; //打開計數器
}
串口模塊硬件電路原理圖分析
小伙伴們看這個電路圖是不是非常熟悉,是我們之前學習51開發板最小系統中的下載電路,它不僅是USB轉TTF電路也是開發板與電腦上位機軟件進行串口通信的電路,因為我們下載燒錄程序的時也是用的是串口功能實現燒錄的;同時我們要使用串口與電腦上位機軟件實現通信功能需要將P5底座進行跳線帽的連接。
觀察圖中CH340G是一款USB轉串口芯片,負責將PC的USB信號轉換為TTL串口信號(RXD/TXD),從而與51單片機的串口通信模塊(如STC89C52的P3.0/P3.1)對接。
電源引腳:
? ? ? ? USB的5V(VCC)連接到CH340G的VCC引腳,為芯片供電。
? ? ? ? USB的GND與CH340G的GND引腳連接,形成公共地。
數據引腳:
? ? ? ? USB的D+和D-分別連接到CH340G的UD+和UD-引腳,實現USB通信。
串口引腳:
? ? ? ? CH340G的TXD引腳 → 單片機的RXD(如P3.0),用于向單片機發送數據。
? ? ? ? CH340G的RXD引腳 → 單片機的TXD(如P3.1),用于接收單片機發送的數據。
串口模塊軟件編程設計
實現三個主題任務:
任務一:實現串口助手(上位機)發送數據給單片機,單片機接收到后原封不動轉發給串口助手(上位機)顯示;
實現步驟:
1、我們首先要進行串口初始化函數的配置,配置內容有配置定時器1的工作模式3,這是為了生成波特率。在配置串口的工作模式,并開啟定時器和串口中斷
2、配置串口中斷服務函數
代碼示例:
#include "reg52.h"void UART_Init(u8 bps)//串口初始時化函數:形參為定時器1賦初值
{TMOD|=0x20; //配置定時器1工作模式3,用或運算是避免影響其他定時器初始化SCON=0x50; //配置串口工作模式1,開啟接收允許位PCON=0x80; //波特率加倍TH1=bps; //賦初值TL1=bps;ES=1; //串口中斷允許位開啟EA=1; //總中斷允許位開啟TR1=1; //定時器1開啟
}void UART_ISR() interrupt 4
{u8 dat=0;RI=0; //接收中斷軟件清零dat=SBUF; //從SBUF寄存器中取值SBUF=dat; //將數據發送給上位機while(!TI); //等待發送完成TI=0; //發送中斷軟件清零
}
int main()
{UART_Init(0xFA);while(1){}
}
效果展示:
任務二:實現串口發送數據給上位機,本任務是我們主動控制MCU利用串口發送數據給上位機
實現步驟:
1、在上面的基礎上我們構建串口發送一字節數據函數
2、利用串口一字節數據發送函數實現串口數據包發生函數
代碼示例:
#include "TYPEDEF.h"
#include "reg52.h"void UART_Init(u8 bps)//串口初始時化函數:形參為定時器1賦初值
{TMOD|=0x20; //配置定時器1工作模式3,用或運算是避免影響其他定時器初始化SCON=0x50; //配置串口工作模式1,開啟接收允許位PCON=0x80; //波特率加倍TH1=bps; //賦初值TL1=bps;ES=1; //串口中斷允許位開啟EA=1; //總中斷允許位開啟TR1=1; //定時器1開啟
}
void UART_TX(u8 temp)//串口發送一字節函數
{ES=0; //在串口初始化函數中我們開啟了串口中斷,在這里我們先關閉等數據發生完成在開啟TI=0;SBUF=temp; //開始發送數據while(!TI); //等待數據發送完成TI=0; //軟件請0ES=1; //開啟串口中斷
}
void USAR_TxPacket(u8 *temps)//串口發送數據包函數
{while(*temps){UART_TX(*temps++);Delay_10us(2); }}
void UART_ISR() interrupt 4
{u8 dat=0;RI=0; //接收中斷軟件清零}
int main()
{UART_Init(0xFA);USAR_TxPacket((u8*)"今晚夜色不錯,抬頭看看月光\n");while(1){}
}
效果展示:
任務三:上位機給串口發送控制指令,串口根據控制指令完成相應的步驟(模擬物聯網控制)
實現步驟:
1、創建一個接收緩沖區數組,接收緩存區數組標志位,接收標志位。(判斷接收完成要依靠\r\n標志符)
2、在串口中斷服務函數中判斷是否接收數據,接收到數據,放入到緩沖區數組中
3、在主函數中判斷緩沖區數組的數據是否與控制指令相同,相同執行開燈,關燈指令;
代碼示例:
#include "TYPEDEF.h"
#include "reg52.h"
#include "LED.h"
void UART_Init(u8 bps)//串口初始時化函數:形參為定時器1賦初值
{TMOD|=0x20; //配置定時器1工作模式3,用或運算是避免影響其他定時器初始化SCON=0x50; //配置串口工作模式1,開啟接收允許位PCON=0x80; //波特率加倍TH1=bps; //賦初值TL1=bps;ES=1; //串口中斷允許位開啟EA=1; //總中斷允許位開啟TR1=1; //定時器1開啟
}
void UART_TX(u8 temp)//串口發送一字節函數
{ES=0; //在串口初始化函數中我們開啟了串口中斷,在這里我們先關閉等數據發生完成在開啟TI=0;SBUF=temp; //開始發送數據while(!TI); //等待數據發送完成TI=0; //軟件請0ES=1; //開啟串口中斷
}
void USAR_TxPacket(u8 *temps)//串口發送數據包函數
{while(*temps){UART_TX(*temps++);Delay_10us(2); }}
u8 UART_buff[10]=0; //緩沖區接收數組
u8 UART_cnt=0; //緩存區數組下標
u8 UART_flag=0; //標志位
void UART_ISR() interrupt 4
{u8 dat=0;if(RI){RI=0; //接收dat=SBUF;if(UART_cnt>=9 || UART_buff[UART_cnt]=='\n' ){UART_buff[UART_cnt]='\0';UART_flag=1;}else{UART_buff[UART_cnt++]=dat;}}}
int main()
{UART_Init(0xFA);//USAR_TxPacket((u8*)"今晚夜色不錯,抬頭看看月光\n");while(1){if(UART_flag){if(!strcmp((char *)UART_buff,"LED_ON")){LED=0;UART_flag=0;UART_cnt=0;}if(!strcmp((char *)UART_buff,"LED_OFF")){LED=1;UART_flag=0;UART_cnt=0;}} }
}
制作不易!喜歡的小伙伴給個小贊贊!喜歡我的小伙伴點個關注!有不懂的地方和需要的資源隨時問我喲!