捌:序列口的原理與應用
基本概念
通訊分為兩種:序列通訊和並行通訊。 序列通訊方式中,可以分為兩類:非同步通訊和同步通訊。 非同步通訊中,微控制器與外設之間必須有兩項規定。 第一項規定:雙方通訊時採用怎樣的資料格式。資料格式指的是序列通訊中怎樣標誌一組資料的開頭和結束,這組資料有多少個有效資料位,以及是否帶有校驗碼等等。 例如UART序列通訊雙方規定:形成的資料格式如圖: 1個起始位低電平0(通訊匯流排在空閒時是高電平),7個數據位,1個奇偶校驗位,1個停止位,這是完整的一幀資料。稱之為資料格式。
非同步通訊還必須有一項規定:即雙方通訊過程中每傳送一個數位需要多長的時間。在有些場合也稱為波特率,即每秒鐘傳送的二進位制位數。這項規定對於微處理器與外界通訊是很重要的。
51內部的序列口
89C51內部有一個全雙工序列通訊介面,具有UART功能。 解釋:51微控制器核心,如果要傳送一個數據出去,首先把資料放到傳送SBUF中(緩衝區),然後SBUF會自主自發的將資料送到輸出移位暫存器(8位),然後一個位一個位的送到TXD,首先發送右側的那一位,傳送完前面的自動往後移動位,傳送的速度由波特率控制;當有資料來的時候,首先通過RXD送入輸入移位暫存器(8位),當裝滿之後(一個位元組),一次性送入接收SBUF(傳送SBUF與接收SBUF名字一樣,但實體地址不一樣),然後再由微控制器從接收SBUF中讀取資料。PCON暫存器控制波特率,序列口控制暫存器SCON,TI與RI是標誌位,TXD連線P3.1引腳,RXD連線P3.0引腳。這兩個引腳又稱為功能複用引腳(既做普通I/O口,又做序列口的輸出/輸入)。 #暫存器描述 序列口資源的有3個暫存器:SCON、SBUF、PCON 1、序列口控制暫存器SCON
SM2:在方式2和方式3下,多機通訊的控制位。在方式2和方式3下,如果SM2=0,只要接收到停止位資訊後就會置位RI標誌位,表示接收到資料;如果SM2=1,只有序列口接收到第9位資料(RB8)為1時,則會置位RI標誌位。 REN:允許接收控制位。REN=0,則禁止序列口接收;REN=1,允許序列口接收。 TB8:在工作方式2和方式3中要傳送的第9位資料,可以是奇偶校驗位或者是地址/資料標識位。 RB8:接收到的第9位資料。 TI:傳送中斷標誌位。資料傳送完畢之後,TI由硬體自動置位。微控制器響應中斷後,不會自動清除該位,必須用軟體對TI清零。 RI:接收中斷標誌位。一幀資料接收完畢之後,RI由硬體自動置位。微控制器此時可以從SBUF中讀取資料,讀完資料後必須用軟體對RI清零。
序列口的使用
第一項規定:雙方通訊時採用怎樣的 資料格式。(四種工作方式) 序列口有四種工作方式,方式0主要用於擴充套件並行輸入輸出口;方式1、方式2和方式3用於序列通訊中。 (1)方式0 在方式0下,序列口的SBUF作為同步移位暫存器使用,傳送SBUF相當於一個併入串出的移位暫存器。接收SBUF相當於一個串入並出的移位暫存器。 (2)方式1 序列口在方式1下工作於非同步通訊方式,一幀資料有10包,包括1位起始位、8位資料位和1位停止位。 傳送過程:微控制器執行一條寫入SBUF的指令就啟動傳送,資料從TXD引腳輸出,傳送完一幀資料後,硬體置位TI標誌。 接收過程:當REN=1時,接收器對RXD引腳進行取樣,取樣脈衝頻率是所選波特率的16倍。當取樣到RXD引腳上出現從高電平“1”到低電平“0”的負跳變時,就啟動接收器接收資料。接收完資料後,將有效的8位資料送入接收SBUF中,停止位送入RB8中,並置位RI。 (3)方式2和方式3 方式2或方式3非同步通訊的資料幀都是由11位組成,包括1位起始位、8位資料位、1位可程式設計位(第9位)、1位停止位。傳送資料時,第9位送入SCON中的TB8;接收資料時,第9位送入SCON中的RB8。(可用於多機通訊) 傳送過程:先把第9位資料裝入SCON中的TB8中,再把要送的資料送入傳送的SBUF。傳送器便立即啟動傳送資料,傳送完一幀資料後,硬體置位TI。 接收過程:當REN=1時,序列口可以接收資料。接收到的有效8位資料送入接收SBUF,第9位資料裝入RB8,然後根據SM2的設定判定是否置位RI。 第二項規定:雙方通訊速度的確定。(計算波特率) 序列口都是選用T1作為波特率發生器(T1工作在方式2(n=8)下),所以需要計算T1的計算初值和SMOD值。公式如下: 方式1、方式3的波特率=[定時器T1溢位率×2^SMOD]/32 (公式1)
定時器T1溢位率 = 1/溢位週期 = 晶振頻率/[(2^8-計數初值)×12] (公式2)
由公式1和公式2推匯出計算初值的計算公式,見公式3。
計數初值 = 256-[晶振頻率×2^SMOD]/[波特率×32×12] (公式3)
如需精確的通訊波特率4800bps,設晶振頻率fosc=12MHz,定時器T1工作在方式2下,有兩種方法實現:
由上可知,SMOD的選擇對計數初值和波特率有直接影響,一般波特率誤差不大於2.5%,所以選擇SMOD的值時先計算一下,選擇使波特率誤差小的SMOD值。
#序列口的使用步驟 1、通訊雙方資料通訊格式的約定。 2、通訊雙方波特率的約定。(速度) 3、序列口的工作方式的選擇,一般選擇方式1和方式3。 4、計數初值和SMOD值的確定。 5、清除傳送中斷標誌位TI和接收終端標誌位RI。 6、往SBUF暫存器寫入資料或等待從SBUF暫存器中接收資料。
實驗
彙編程式碼
******************************************************************/
* 【課程9】 ****UART的應用***********
* 【說 明】 ****使用微控制器UART進行資料的傳送
* 【描 述】 ****使用UART向PC機發送字串
******************************************************************/
ORG 0000H
MIAN: MOV SCON,#50H ;SM0:SM1=01,選擇方式1;TI=0
MOV PCON,#00H ;設定SMOD位=0
MOV TMOD,#20H ;定時器T1工作在方式2下
MOV TH1,#0E6H ;設定計數重灌值
MOV TL1,#0E6H ;設定計數初值
SETB TR1 ;啟動T1計數工作
MOV A,#41H ;給A送字元‘A’的ASCII碼,各字元的ASCII碼見附錄
L1: MOV SBUF,A ;把資料送給SBUF,開始串列埠傳送
JNB TI,$ ;如果TI=0,則一直等待,直到TI=1(即傳送完成)才往下執行
CLR TI ;清除TI標誌
JMP L1 ;跳轉到L1,繼續傳送字元‘A’
END
C程式碼
******************************************************************/
* 【課程9】 ****UART的應用***********
* 【說 明】 ****使用微控制器UART進行資料的傳送
* 【描 述】 ****使用UART向PC機發送一個 'A'字元
******************************************************************/
#include<reg52.h>
char arr[8]={'H','e','l','l','o','b','o','y'};
void main()
{
int i;
SCON=0x50; //設定串列埠工作於方式1,TI位清0
PCON=0x00; //PCON.7是SMOD位,SMOD=0
TMOD=0x20; //選擇定時器T1工作於方式2
TH1=0xe6; //設定波特率為1200
TL1=0xe6;
TR1=1; //開啟定時器T1
while(1)
{
for(i=0;i<8;i++)
{
SBUF=arr[i]; //傳送字元‘A’
while(!TI) ; //等待TI置位,即資料傳送完成
TI=0; //對TI軟體清零
}
}
}