以用戶在程序中使用串口1和相關定時器T1為例:
1. 設置串口1 的工作模式,SCON 寄存器中的SM0 和SM1 兩位決定了串口1 的4 種工作模式;
SM0, SM1: 0,0 方式0 ---同步移位串行方式:移位寄存器
0,1 方式1 ---8位UART,波特率可變
1,0 方式2 ---9位UART
1,1 方式3 ---9位UART,波特率可變
2. 設置串口1 的波特率,使用定時器T1寄存器 T1H及T1L;
當串行口1用定時器1作為其波特率發生器且定時器1工作于模式2(8位自動重裝模式)時,
Baud=(2^SMOD / 32)*Fosc/(12*(256-TH1))
定時器1的工作模式: M1, M0 0,0---16位自動重裝定時器,當溢出時將RLTH1和RLTL1存放的值自動重裝入TH1和TL1中
0,1---16位不可重裝載模式,TL1、TH1全用
1,0---8位自動重裝載定時器,當溢出時將TH1存放的值自動重裝入TL1
1,1---定時器/計數器1此時無效(停止計數)
3. 設置寄存器AUXR中的位S1ST2/AUXR.0和T1x12/AUXR.6,確定定時器1作為串口1的波特率發生器以及速率是1T還是12T;
S1ST2: 串口1(UART1)選擇定時器2作波特率發生器的控制位
0, 選擇定時器1作為串口1(UART1)的波特率發生器;
1, 選擇定時器2作為串口1(UART1)的波特率發生器,此時定時器1得到釋放,可以作為 獨立定時器使用
T1x12: 定時器1速度控制位
0, 定時器1是傳統8051速度,12分頻;
1, 定時器1的速度是傳統8051的12倍,不分頻
4. 啟動定時器1,讓TR1位為1,T1H/T1L定時器1寄存器就立即開始計數;
TR1: 定時器T1的運行控制位。該位由軟件置位和清零。當GATE(TMOD.7)=0,TR1=1時就允許T1開始 計數,
TR1=0時禁止T1計數。 當GATE(TMOD.7)=1,TR1=1且INT1輸入高電平時,才允許T1計數。
5. 設置串口1的中斷優先級, 及打開中斷相應的控制位是:PS,ES,EA;
6. 如要串口1接收,將REN置1即可, 如要串口1發送,將數據送入SBUF即可,接收完成標志RI,發送完成標志TI,要由軟件清0;
例程如下:
/**************************通訊端口初始化****************************/
void CommInit() //初始化串口
{
AUXR &= ~0x01; //串口1使用定時器T1
AUXR &= ~(1<<6); //定時器T1設置為1T的12分頻模式
TMOD=0x20; //定時器T1使用工作方式2
TH1=0xfd; // 串口工作模式1下, 11.0592M晶振波特率計算: Baud=(2^SMOD / 32)*Fosc/(12*(256-X)), 其中Fosc=11059200
TL1=0xfd; //計算得到Baud=9600
TR1=1; //開始計時
PCON=0x00; //SMOD=0;
SCON=0x50; //串口工作模式1
TI=1; //發送完成標志
EA=1; //CPU開放中斷
}