51單片機-串口
SM0,SM1工作方式選擇位,SM2多機通信控制位,REN允許串行接收位,TI發(fā)送中斷標志位,RI接
收中斷標志位。串行發(fā)送停止位的開始時,由內部硬件使TI置1,向CPU發(fā)出中斷申請。在中斷服務
程序中,必須用軟件將其清0,取消此中斷申請。
電源管理寄存器PCON也是一個特殊功能寄存器,字節(jié)地址為87H,不能位尋址,PCON用來管理單片
機的電源部分,包括上電復位檢測,掉電模式,空閑模式等。單片機復位時PCON全部被清0。
SMOD該位與串口波特率有關,SMOD=0,串口方式1,2,3時,波特率正常。SMOD=1,串口方式1,2,3時,波特率加倍。
用軟件置REN為1時,接收器會以所選擇波特率的16倍速采樣RXD引腳電平,檢測到RXD引腳輸入電平發(fā)生
負跳變時,則說明起始位有效,將其移入輸入移位寄存器,并開始接受這一幀信息的其余位。接受過
程中,數據從輸入移位寄存器的右邊輸入,起始位移至輸入移位寄存器最左邊時,控制電路進行最后
一次移位。當RI = 0,且SMOD = 0(或接受到的停止位為1)時,將接收到的9位數據的前8位數據
裝入接受SBUF,第9位進入RB8,并置RI=1,向CPU中斷請求。
在具體操作串行口之前,需要對單片機一些與串行口有關的特殊功能寄存器進行初始化設置:
確定T1的工作方式(編程TMOD寄存器)
計算T1的初值,裝載TH1,TL1
開啟T1(編程TCON中的TR1位)
設置串口的工作方式(編程SCON寄存器)
串行口工作在中斷方式下,要進行中斷設置(IE寄存器)
波特率計算公式:
方式0的波特率=fosc/12。
方式1的波特率=(2^smod/32)*(T1溢出率)。
方式2的波特率=(2smod/64)*fosc。
方式3的波特率=(2smod/32)*(T1溢出率)。
T1溢出率=fosc/{12*[256-(TH1)]}
fosc為系統(tǒng)晶振頻率,通常為12MHZ或11.05926MHZ
異步串口通信兩種方式:輪詢和中斷
下面是一個中斷程序,使用串口調試工具發(fā)出什么返回什么。
#include <reg52.h>
unsigned char a,flag;
void main(){
TMOD = 0x20; //工作方式2,8位自動重裝定時/計數器
TH1 = 0xfd; //波特率為9600bps,系統(tǒng)晶振頻率為11.0592MHZ時需要裝入的
TL1 = 0xfd; //TH1,TL1的值可以通過公式 T1溢出率=fosc/{12*[256-(TH1)]}
EA = 1; //開啟CPU中斷允許位
ES = 1; //開始串口中斷允許位
SM1 = 1; //設置串口的工作方式為01即方式1,10位異步收發(fā)(8位數據)
TR1 = 1; //T1開啟
REN = 1; //允許串行接受位
while(1){
if(flag == 1){
ES = 0; //關閉串口中斷,防止發(fā)送數據時產生中斷
SBUF = a; //將數據送到發(fā)送緩沖寄存器
while(!TI); //發(fā)送當停止位開始時,會產生中斷,把TI置1
TI = 0;
flag = 0;
ES = 1; //允許中斷
}
}
}
void uart() interrupt 4{
a = SBUF; //當產生RI中斷時說明數據接收完畢,把數據賦給變量a
RI = 0; //軟件方法把RI置0
flag = 1;
}
輪詢方式,如果有數據輸入發(fā)送給串口,當停止位開始時,蜂鳴器響起。
#include <reg52.h>
#define uchar unsigned char
sbit buzzer=P3^4;
void delay(uchar z)
{
uchar x,y;
for(x=1000;x>1;x--)
for(y=z;y>1;y--);
評論