51单片机串口配置

1.配置串口工作模式为模式1。即设置SCON寄存器(SM0,SM1,REN位),SCON |= 0X50;(SM0 = 0,SM1 = 1,REN =1).

SM0 = 0,SM1 = 0  方式0:同步移位串行方式:波特率= SYSclk / 12.

SM0 = 0,SM1 = 1  方式1:8位UART,波特率可变: 波特率 =  (2^SMOD / 32) * (定时器1的溢出率)

SM0 = 1,SM1 = 0  方式2:9位UART: 波特率 =  (2^SMOD / 64) * (SYSclk系统工作时钟频率)

SM0 = 1,SM1 = 1 方式3: 8位UART,波特率可变: 波特率 =  (2^SMOD / 32) * (定时器1的溢出率)

注意:

当单片机工作在12T模式时,定时器1的溢出率 = SYSclk / 12  / (256 - TH1);

当单片机工作在1T模式时,定时器1的溢出率 = SYSclk / 6  / (256 - TH1);

SMOD默认为0。具体作用参考数据手册。


2.配置定时器1为模式2,即自动重装载模式。TMOD &= 0X0F; TMOD |= 0X20.


3.根据波特率计算TH1,TL1的初值,如果有需要可使用PCON进行波特率加倍(PCON最高位为波特率加倍位)。

计算公式:TH1 = TL1 = 256 - 晶振值 / 12 / 2 / 16 / 波特率;

如果波特率加倍则:PCON |= 0X80; 计算公式:TH1 = TL1 = 256 - 晶振值 / 12  / 16 / 波特率;


4.打开定时器控制寄存器TR1,启动定时器。


5.如果需要开串口中断,则 ES =1;


while(1)

{

while(!RI);// 等待接收完一字节数据

RI = 0; // 需软件清零

SBUF = SBUF +1;// 把接收的数据+1再发送出去

while(!TI);// 等待发送完一字节数据

TI = 0; // 需软件清零

}


注意:如果定时器1作为串口波特率发生器后不可再用作普通定时器。

一般我们可以准备好要发送的数据,TI = 1,会立即进入串口发送中断,可在串口发送中断中发送要发的数据。RI一旦为1表示接受中断发生,进中断取数据。




©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页