1. 程式人生 > >捌:序列口的原理與應用

捌:序列口的原理與應用

基本概念

通訊分為兩種:序列通訊並行通訊。 序列通訊方式中,可以分為兩類:非同步通訊同步通訊非同步通訊中,微控制器與外設之間必須有兩項規定。 第一項規定:雙方通訊時採用怎樣的資料格式。資料格式指的是序列通訊中怎樣標誌一組資料的開頭和結束,這組資料有多少個有效資料位,以及是否帶有校驗碼等等。 例如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

D7
D6
D5
D4
D3
D2
D1
D0
SM0
SM1
SM2
REN
TB8
RB8
TI
RI
SM0、SM1:序列口工作方式控制位
SM0 SM1
工作方式
功能說明
波特率
0  0
方式0
移位暫存器輸入輸出
fosc/12(fosc是振盪器的頻率)
0  1
方式1
8位UART
T1溢位率(16×2^SMOD)
1  0
方式2
9位UART
fosc/(32×2^SMOD)
1  1
方式3
9位UART
T1溢位率(16×2^SMOD)

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軟體清零
		}  	  	
	}
}