STC15W408AS只有一個串口,串口1,有4種工作方式,其中兩種方式的波特率是可變的,另兩種是固定的,以供不同應(yīng)用場合選用。
一、串口1相關(guān)寄存器
下面只把接下來我需要的寄存器和寄存器的位說明一下。
1.1 控制寄存器SCON
其中SM0、SM1按下列組合確定串行口1的工作方式:
REN:允許/禁止串行接收控制位。由軟件置位REN,即REN=1為允許串行接收狀態(tài),可啟動串行接收器RxD,開始接收信息。軟件復(fù)位REN,即REN=0,則禁止接收。
TI:發(fā)送中斷請求標(biāo)志位。在方式0,當(dāng)串行發(fā)送數(shù)據(jù)第8位結(jié)束時,由內(nèi)部硬件自動置位,即TI=1,向主機請求中斷,響應(yīng)中斷后TI必須用軟件清零,即TI=0。在其他方式中,則在停止位開始發(fā)送時由內(nèi)部硬件置位,即TI=1,響應(yīng)中斷后TI必須用軟件清零。
RI:接收中斷請求標(biāo)志位。在方式0,當(dāng)串行接收到第8位結(jié)束時由內(nèi)部硬件自動置位RI=1,向主機請求中斷,響應(yīng)中斷后RI必須用軟件清零,即RI=0。在其他方式中,串行接收到停止位的中間時刻由內(nèi)部硬件置位,即RI=1,向CPU發(fā)中斷申請,響應(yīng)中斷后,RI必須由軟件清零。
串行通信的中斷請求:當(dāng)一幀發(fā)送完成,內(nèi)部硬件自動置位TI,即TI=1,請求中斷處理;
當(dāng)接收完一幀信息時,內(nèi)部硬件自動置位RI,即RI=1,請求中斷處理。由于TI和RI以"或邏輯"關(guān)系向主機請求中斷,所以主機響應(yīng)中斷時事先并不知道是TI還是RI請求的中斷,必須在中斷服務(wù)程序中查詢TI和RI進(jìn)行判別,然后分別處理。因此,兩個中斷請求標(biāo)志位均不能由硬件自動置位,必須通過軟件清0,否則將出現(xiàn)一次請求多次響應(yīng)的錯誤。
電源控制寄存器PCON中的SMOD/PCON.7用于設(shè)置方式1、方式2、方式3的波特率是否加倍。
1.2 數(shù)據(jù)緩沖寄存器SBUF
STC15系列單片機的串行口1緩沖寄存器(SBUF)的地址是99H,實際是2個緩沖器,寫SBUF的操作完成待發(fā)送數(shù)據(jù)的加載,讀SBUF的操作可獲得已接收到的數(shù)據(jù)。兩個操作分別對應(yīng)兩個不同的寄存器,1個是只寫寄存器,1個是只讀寄存器。
串行通道內(nèi)設(shè)有數(shù)據(jù)寄存器。在所有的串行通信方式中,在寫入SBUF信號(MOV SBUF,A)的控制下,把數(shù)據(jù)裝入相同的9位移位寄存器,前面8位為數(shù)據(jù)字節(jié),其最低位為移位寄存器的輸出位。根據(jù)不同的工作方式會自動將 1" TB8的值裝入移位寄存器的第9位,并進(jìn)行發(fā)送。
串行通道的接收寄存器是一個輸入移位寄存器。在方式0時它的字長為8位,其他方式時為9位。當(dāng)一幀接收完畢,移位寄存器中的數(shù)據(jù)字節(jié)裝入串行數(shù)據(jù)緩沖器SBUF中,其第9位則裝入SCON寄存器中的RB8位。如果由于SM2使得已接收到的數(shù)據(jù)無效時,RB8和SBUF中內(nèi)容不變。
由于接收通道內(nèi)設(shè)有輸入移位寄存器和SBUF緩沖器,從而能使一幀接收完將數(shù)據(jù)由移位寄存器裝入SBUF后,可立即開始接收下一幀信息,主機應(yīng)在該幀接收結(jié)束前從SBUF緩沖器中將數(shù)據(jù)取走,否則前一幀數(shù)據(jù)將丟失。SBUF以并行方式送往內(nèi)部數(shù)據(jù)總線。
1.3 輔助寄存器AUXR
T0x12: 定時器0速度控制位
0, 定時器0是傳統(tǒng)8051速度,12分頻;
1, 定時器0的速度是傳統(tǒng)8051的12倍,不分頻
T1x12: 定時器1速度控制位
0, 定時器1是傳統(tǒng)8051速度,12分頻;
1, 定時器1的速度是傳統(tǒng)8051的12倍,不分頻
如果UART1/串口1用T1作為波特率發(fā)生器,則由T1x12決定UART1/串口是12T還是1T
UART_M0x6: 串口模式0的通信速度設(shè)置位
0, 串口1模式0的速度是傳統(tǒng)8051單片機串口的速度,12分頻;
1, 串口1模式0的速度是傳統(tǒng)8051單片機串口速度的6倍,2分頻
T2R: 定時器2允許控制位
0, 不允許定時器2運行;
1, 允許定時器2運行
T2_C/T: 控制定時器2用作定時器或計數(shù)器
0, 用作定時器(對內(nèi)部系統(tǒng)時鐘進(jìn)行計數(shù));
1, 用作計數(shù)器(對引腳T2/P3.1的外部脈沖進(jìn)行計數(shù))
T2x12: 定時器2速度控制位
0, 定時器2是傳統(tǒng)8051速度,12分頻;
1, 定時器2的速度是傳統(tǒng)8051的12倍,不分頻
如果串口1或串口2用T2作為波特率發(fā)生器,則由T2x12決定串口1或串口2是12T還是1T.
EXTRAM: 內(nèi)部/外部RAM存取控制位
0, 允許使用邏輯上在片外、物理上在片內(nèi)的擴展RAM;
1, 禁止使用邏輯上在片外、物理上在片內(nèi)的擴展RAM
S1ST2: 串口1(UART1)選擇定時器2作波特率發(fā)生器的控制位
0, 選擇定時器1作為串口1(UART1)的波特率發(fā)生器;
1, 選擇定時器2作為串口1(UART1)的波特率發(fā)生器,此時定時器1得到釋放,可以作為獨立定時器使用串口1可以選擇定時器1做波特率發(fā)生器,也可以選擇定時器2作為 波特率發(fā)生器當(dāng)設(shè)置AUXR寄存器中的S1ST2位(串行口波特率選擇位)為1時,串行口1選擇定時器2作為波特率發(fā)生器,此時定時器1可以釋放出來作為定時器/計數(shù)器/時鐘輸出使用。
對于STC15系列單片機,串口2只能使用定時器2作為其波特率發(fā)生器,不能夠選擇其他定時器作為波特率發(fā)生器。而串口1默認(rèn)選擇定時器2作為其波特率發(fā)生器,也可以選擇定時器1作為其波特率發(fā)生器;串口3默認(rèn)選擇定時器2作為其波特率發(fā)生器,也可以選擇定時器3作為其波特率發(fā)生器;串口4默認(rèn)選擇定時器2作為其波特率發(fā)生器,也可以選擇定時器4作為其波特率發(fā)生器。
1.4 定時器2的寄存器T2H, T2L
定時器2寄存器T2H(地址為D6H,復(fù)位值為00H)及寄存器T2L(地址為D7H,復(fù)位值為00H)用于保存重裝時間常數(shù)。
注意:對于STC15串口2只能使用定時器2作為其波特率發(fā)生器,不能夠選擇其他定時器作為波特率發(fā)生器;而串口1默認(rèn)選擇定時器2作為其波特率發(fā)生器,也可以選擇定時器1作為其波特率發(fā)生器;串口3默認(rèn)選擇定時器2作為其波特率發(fā)生器,也可以選擇定時器3作為其波特率發(fā)生器;串口4默認(rèn)選擇定時器2作為其波特率發(fā)生器,也可以選擇定時器4作為其波特率發(fā)生器。
1.5 與串行口1中斷相關(guān)的寄存器位ES和PS
串行口中斷允許位ES位于中斷允許寄存器IE中,中斷允許寄存器的格式如下:
IE : 中斷允許寄存器 (可位尋址)
EA : CPU的總中斷允許控制位
EA=1,CPU開放中斷,
EA=0,CPU屏蔽所有的中斷申請。
EA的作用是使中斷允許形成多級控制。即各中斷源首先受EA控制;其次還受各中斷源自己的
中斷允許控制位控制。
ES : 串行口中斷允許位
ES=1,允許串行口中斷,
ES=0,禁止串行口中斷。
IP : 中斷優(yōu)先級控制寄存器低 (可位尋址)
PS: 串行口1中斷優(yōu)先級控制位。
當(dāng)PS=0時,串行口1中斷為最低優(yōu)先級中斷(優(yōu)先級0)
當(dāng)PS=1時,串行口1中斷為最高優(yōu)先級中斷(優(yōu)先級1)
二、串口1工作模式1:8位UART,波特率可變
當(dāng)軟件設(shè)置SCON的SM0、SM1為"01" 時,串口1則以模式1工作。此模式為8位UART格式,一幀信息為10位:1位起始位,8位數(shù)據(jù)位(低位在先)和1位停止位。波特率可變,即可根據(jù)需要進(jìn)行設(shè)置。TxD/P3.1為發(fā)送信息,RxD/P3.0為接收端接收信息,串行口為全雙工接受/發(fā)送串行口。
模式1的發(fā)送過程:串行通信模式發(fā)送時,數(shù)據(jù)由串行發(fā)送端TxD輸出。當(dāng)主機執(zhí)行一條寫 SBUF" 的指令就啟動串行通信的發(fā)送,寫"SBUF"信號還把"1"裝入發(fā)送移位寄存器的第9位,并通知TX控制單元開始發(fā)送。發(fā)送各位的定時是由16分頻計數(shù)器同步。
移位寄存器將數(shù)據(jù)不斷右移送TxD端口發(fā)送,在數(shù)據(jù)的左邊不斷移入"0"作補充。當(dāng)數(shù)據(jù)的最高位移到移位寄存器的輸出位置,緊跟其后的是第9位 1" ,在它的左邊各位全為"0" ,這個條件,使TX控制單元作最后一次移位輸出,然后使允許發(fā)送信號 SEND"失效,完成一幀信息的發(fā)送,并置位中斷請求位TI,即TI=1,向主機請求中斷處理。
模式1的接收過程:當(dāng)軟件置位接收允許標(biāo)志位REN,即REN=1時,接收器便以選定波特率的16分頻的速率采樣串行接收端口RxD,當(dāng)檢測到RxD端口從 "1"→"0"的負(fù)跳變時就啟動接收器準(zhǔn)備接收數(shù)據(jù),并立即復(fù)位16分頻計數(shù)器,將1FFH植裝入移位寄存器。復(fù)位16分頻計數(shù)器是使它與輸入位時間同步。16分頻計數(shù)器的16個狀態(tài)是將1波特率(每位接收時間)均為16等份,在每位時間的7、8、9狀態(tài)由檢測器對RxD端口進(jìn)行采樣,所接收的值是這次采樣直經(jīng)"三中取二" 即3次采樣至少2次相同的值,以此消除干擾影響,提高可靠性。在起始位,如果接收到的值不為"0"(低電平),則起始位無效,復(fù)位接收電路,并重新檢測 1"→0" 的起始位有效,則將它輸入移位寄存器,并接收本幀的其余信息。
接收的數(shù)據(jù)從接收移位寄存器的右邊移入,已裝入的1FFH向左邊移出,當(dāng)起始位 0" 移位寄存器的最左邊時,使RX控制器作最后一次移位,完成一幀的接收。若同時滿足以下兩個條件:
·RI=0;
·SM2=0或接收到的停止位為1。
則接收到的數(shù)據(jù)有效,實現(xiàn)裝載入SBUF,停止位進(jìn)入RB8,置位RI,即RI=1,向主機請求中斷,若上述兩條件不能同時滿足,則接收到的數(shù)據(jù)作廢并丟失,無論條件滿足與否,接收器重又檢測RxD端口上的 "1"→"0"的跳變,繼續(xù)下一幀的接收。接收有效,在響應(yīng)中斷后,必須由軟件清0,即RI=0。通常情況下,串行通信工作于模式1時,SM2設(shè)置為"0"。STC15系列單片機指南
三、串口1測試程序
#include "stc15.h"
typedef unsigned char BYTE;
typedef unsigned int WORD;
#define FOSC 11059200L //系統(tǒng)頻率
#define BAUD 9600 //串口波特率
void SendData(BYTE dat);
void SendString(char *s);
void main()
{
SCON = 0x50; //8位可變波特率 串口工作模式1
T2L = (65536 - (FOSC/4/BAUD)); //設(shè)置波特率重裝值
T2H = (65536 - (FOSC/4/BAUD)) >?>8;
AUXR = 0x14; //T2為1T模式, 并啟動定時器2
AUXR |= 0x01; //選擇定時器2為串口1的波特率發(fā)生器
ES = 1; //使能串口1中斷
EA = 1;
while(1);
}
// UART 中斷服務(wù)程序
void Uart() interrupt 4
{
// 接收中斷標(biāo)志位
if (RI)
{
RI = 0; //清除RI位
SendData(SBUF + 1); // 把接收的數(shù)據(jù)+1 再發(fā)送出去
}
// 發(fā)送中斷標(biāo)志位
if (TI)
{
TI = 0; //清除TI位
SendString("發(fā)送完成!\\r\\n");
}
}
// 發(fā)送串口數(shù)據(jù)
void SendData(BYTE dat)
{
SBUF = dat;
while(TI == 0);
TI = 0;
}
// 發(fā)送字符串
void SendString(char *s)
{
while (*s) //檢測字符串結(jié)束標(biāo)志
{
SendData(*s++); //發(fā)送當(dāng)前字符
}
}