主要參考學習資料:B站【普中官方】51單片機手把手教學視頻
開發資料下載鏈接:http://www.prechin.cn/gongsixinwen/208.html
前置知識:C語言
單片機套裝:普中STC51單片機開發板A4標準版套餐7
目錄
- 通信的基本概念
- 串行通信與并行通信
- 串行通信
- 并行通信
- 異步通信與同步通信
- 異步通信
- 同步通信
- 單工、半雙工與全雙工通信
- 通信速率
- 51單片機串口介紹
- 串口通信簡介
- 接口標準
- 通信協議
- 串口內部結構
- 串口相關寄存器
- 串口控制寄存器SCON
- 電源控制寄存器PCON
- 串口工作方式
- 方式0
- 方式1
- 方式2和方式3
- 串口的使用方法
- 波特率計算
- 串口初始化步驟
- 硬件設計
- 實驗13 串口通信
通信的基本概念
串行通信與并行通信
串行通信
使用一條數據線,8位順次傳送,適用于遠距離傳輸,數據處理較復雜。
并行通信
使用多條數據線,8位同時傳送,數據處理簡單,傳輸速度快,成本高。
異步通信與同步通信
異步通信
發送設備和接收設備使用各自的時鐘,要求兩者時鐘盡量但不嚴格一致。
相鄰字符幀間隙任意,相鄰位間隙相等。
同步通信
發送設備時鐘控制接收設備使兩者時鐘同步。
相鄰字符幀不留間隙,相鄰位間隙相等。
外同步:兩條線分別傳輸數據信號和時鐘信號。
自同步:一條線傳輸數據和時鐘的疊加信號。0先低后高,1先高后低。
單工、半雙工與全雙工通信
單工通信(廣播):數據只按一個方向傳輸,不能反向傳輸。
半雙工通信(對講機):數據可以按兩個方向傳輸,但只能分時進行。
全雙工通信(電話):數據可以同時按兩個方向傳輸。
通信速率
比特率(bps):每秒鐘傳輸二進制代碼的位數。
波特率(Baud):每秒鐘傳輸的碼元數。
碼元:承載信息量的基本信號單位。通常一個碼元表示兩種狀態0和1,此時波特率=比特率。
51單片機串口介紹
串口通信簡介
串口通信指外設和計算機之間以數據信號線和地線按照位進行數據傳輸的通信方式。
接口標準
串口(串行接口)是一種接口標準,規定了接口的物理標準,沒有規定電纜和使用協議。
接口根據針腳數量不同分為DB25和DB9:
帶孔的為母頭,帶針的為公頭,兩者管腳從同一方向看順序相反,連接時一一對應:
RS-232C標準接口主要引腳定義
(插針序號括號外為DB25腳位,括號內為DB9腳位)
插針序號 | 信號名稱 | 功能 | 信號方向 |
---|---|---|---|
1 | PGND | 保護接地 | |
2(3) | TXD | 發送數據(串行輸出) | DTE→DCE |
3(2) | RXD | 接收數據(串行輸入) | DTE←DCE |
4(7) | RTS | 請求發送 | DTE→DCE |
5(8) | CTS | 允許發送 | DTE←DCE |
6(6) | DSR | DCE就緒(數據建立就緒) | DTE←DCE |
7(5) | SGND | 信號接地 | |
8(1) | DCD | 載波檢測 | DTE←DCE |
20(4) | DTR | DTE就緒(數據終端準備就緒) | DTE→DCE |
22(9) | RI | 振鈴指示 | DTE←DCE |
其中串口通信常用的為2/3/5腳(DB9)。
RS-232C電平規定邏輯1為-3V到-15V,邏輯0為3V到15V。51單片機需要通過MAX232芯片將RS232電平與TTL電平進行轉換。
通信協議
RS232的通信協議通常遵循96-N-8-1格式:9600bps-無校驗位-8位傳輸數據位-使用1為停止位
校驗位:解決串口通信因外部干擾導致的傳輸偏差問題,分為奇校驗、偶校驗和無校驗(零校驗)。
停止位:數據包的起始位由邏輯電平0表示,而停止位可以是0.5/1/1.5/2。
串口內部結構
TXD/RXD:單片機的串口管腳,TXD對應P3.1,RXD對應P3.0。
SBUF:串口數據緩存寄存器,存儲發送和接受的數據。
TH1/TL1:定時器1的功能,采用方式2工作,用于產生波特率。
SMOD:特殊寄存器,控制T1溢出率的分頻,進而控制T1/R1的采樣頻率。置零時先二分頻再十六分頻,置一時直接十六分頻。
TI/R1:發送/接收控制器,數據發送/接收完成時產生發送/接收中斷。
串口相關寄存器
串口控制寄存器SCON
位 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|
字節地址:98H | SM0 | SM1 | SM2 | REN | TB8 | RB8 | TI | RI |
SM0 | SM1 | 方式 | 說明 | 波特率( f o s c f_{\mathrm{osc}} fosc?為外部晶振頻率) |
---|---|---|---|---|
0 | 0 | 0 | 移位寄存器 | f o s c / 12 f_{\mathrm{osc}}/12 fosc?/12 |
0 | 1 | 1 | 10位異步收發器(8位數據) | 可變 |
1 | 0 | 2 | 11位異步收發器(9位數據) | f o s c / 64 f_{\mathrm{osc}}/64 fosc?/64或 f o s c / 12 f_{\mathrm{osc}}/12 fosc?/12 |
1 | 1 | 3 | 11位異步收發器(9位數據) | 可變 |
SM2和RB8用于方式2和方式3中多級通信(一臺主機通過一條總線向多個設備發送數據)下數據的選擇性接收。
SM2控制RB8是否激活。當SM2=0,RB8不激活;當SM2=1,RB8激活。
RB8在激活狀態下控制RI是否激活。當RB8=0,收到信息即丟棄;當RB8=1,收到信息存儲進SBUF。RB8在非激活狀態下,收到信息均可以存儲進SBUF。
REN是允許接收位,置一時啟動串行口接收數據,置零時禁止接收,通常置一。
TB8和RB8工作在方式2和方式3用來發送數據的第9位,可用于奇偶校驗位或多級通信中地址幀和數據幀的標志位。
TI/R1是發送/接收中斷標志位,在方式0當串行發送/接收第8位數據結束時或在其他方式串行發送/接收停止位時置一發送中斷請求,需要軟件清零取消中斷申請等待下一次中斷。
電源控制寄存器PCON
位 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|
字節地址:97H | SMOD |
PCON只用到最高位,用于控制波特率的分頻。
串口工作方式
方式0
方式0數據由RXD(P3.0)輸入或輸出,移位脈沖由TXD輸出,發送和接收均為8位數據,低位在前高位在后,波特率為 f o s c / 12 f_{\mathrm{osc}}/12 fosc?/12。
輸出(圖中線條高低表示對應的高低電平)
輸入
方式1
方式1是10位數據的異步通信口,其中起始位為低電平,停止位為高電平。TXD為數據發送引腳,RXD為數據接收引腳。
輸出
發送開始時,存儲在輸出寄存器中的數據幀以起始位為首從左向右移入TXD引腳并輸出,同時輸出寄存器左邊的空缺補零。當停止位移至輸出寄存器右端時,左邊其余位全為0,檢測電路檢測到該條件使控制電路進行最后一次移位,并將TI置一。
輸入
位采樣脈沖為波特率,由TH1和TL1提供,控制對RXD的電平采樣。采樣接收到下降沿時起始位有效,開始接收一幀數據,數據幀以起始位為首從右向左移入移位寄存器。起始位移至移位寄存器左端時,控制電路進行最后一次移位。當RI=0且SM2=0時,移位寄存器將接收到9位數據的前8位存儲進SBUF,第9位進入RB8并將RI置一。
方式2和方式3
方式2和方式3與方式1的不同在于數據幀為11位,多出一位RB8/TB8。其數據幀的接收和發送過程與方式1類似,區別在于在接收數據時,進入RB8的信號從停止位變為了數據位的第9位,可以控制多級通信中信息的選擇性發送和接收(當RI=0且SM2=0時)。
輸出(過程與方式1類似)
輸入
串口的使用方法
波特率計算
方式0: f o s c / 12 f_{\mathrm{osc}}/12 fosc?/12
方式2: ( 2 S M O D / 64 ) ? f o s c (2^{\mathrm{SMOD}}/64)\cdot f_{\mathrm{osc}} (2SMOD/64)?fosc?
方式1/3: ( 2 S M O D / 32 ) ? T 1 溢出率 (2^{\mathrm{SMOD}}/32)\cdot\mathrm{T1}溢出率 (2SMOD/32)?T1溢出率
2 S M O D 2^{\mathrm{SMOD}} 2SMOD的意義是當SMOD=0/1,進行/不進行二分頻。
T 1 溢出率 = f o s c / [ 12 × ( 256 ? T H 1 ) ] \mathrm{T1}溢出率=f_{\mathrm{osc}}/[12\times(256-\mathrm{TH1})] T1溢出率=fosc?/[12×(256?TH1)]
其中 12 / f o s c 12/f_{\mathrm{osc}} 12/fosc?是一個機器周期, 256 ? T H 1 256-\mathrm{TH1} 256?TH1為定時器在自動重載模式下溢出一次所需的機器周期數(參見外部中斷實驗中定時器中斷部分),兩者相乘取倒數得到溢出率。
串口初始化步驟
①確定T1工作方式(TMOD寄存器);
②確定串口工作方式(SCON寄存器);
③計算TI初值(設定波特率),裝載TH1、TL1;
④啟動T1(TCON中的TR1位);
⑤若使用中斷,需開啟串口中斷控制位(IE寄存器)。
//串口初始化函數
void uart_init(u8 baud)
{//設置定時器工作方式2,或運算不干擾其他位TMOD |= 0X20;//設置串口工作方式1SCON = 0X50;//不采用二分頻PCON = 0X80;//定時器初值設置TH1 = baud;TL1 = baud;//打開接收中斷ES = 1;//打開總中斷EA = 1;//打開定時器TR1 = 1;
}
硬件設計
該電路未采用MAX232電平轉換芯片,而是USB轉TTL的CH340G轉換芯片,現今筆記本電腦大多沒有RS232接口,因此通過USB串口互轉實現串口通信。其原理與下載電路相同,單片機程序燒錄的過程實質上也是串口通信。
實驗13 串口通信
實現功能:當串口助手發送數據給單片機,單片機原封不動轉發給串口助手顯示。
使用波特率計算器獲取十六進制初值:
#include "reg52.h"typedef unsigned char u8;
typedef unsigned int u16;
//串口初始化函數
void uart_init(u8 baud)
{TMOD |= 0X20;SCON = 0X50;PCON = 0X80;TH1 = baud;TL1 = baud;ES = 1;EA = 1;TR1 = 1;
}void main()
{//串口初始化uart_init(0XFA);while(1){}
}
//處理接收中斷(RI=1)的服務函數,串口中斷代號為4
void uart() interrupt 4
{//定義接收數據的變量u8 rec_data = 0;//將接收控制器置零RI = 0;//讀取SBUF接收的數據rec_data = SBUF;//將數據寫入SBUF進行發送SBUF = rec_data;//等待發送中斷(TI=1)while(!TI);//將發送控制器置零TI = 0;
}
先燒錄程序,然后打開串口助手軟件:
連接開發板,檢查端口號是否匹配,波特率設為實驗所用波特率,在串口設置中檢驗校驗方式,最后打開串口。
輸入數據后發送,上方窗口最新行顯示接收到的數據: