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