下图4个方式位定时器0的图,如果配置定时器一需要使用TMOD高4位配置,之后配置TR1,因为定时器一由TR1控制与门
方式 0

方式 1

方式 2

方式 3
SMOD:波特率倍增位。在串口方式 1、方式 2、方式 3 时,波特率与 SMOD 有
关,当 SMOD=1 时,波特率提高一倍。复位时,SMOD=0。
void
uart_init
(
u8 baud
)
{
TMOD
|=
0X20
;
//c/t 定时/计数器1 设置定时器工作方式 2 在51单片机中,定时器1经常与串口中断配合使用,这主要是基于定时器1的特定功能和串口通信的需求。至于定时器0,虽然它同样是一个功能强大的定时/计数器,但在某些特定的应用场景下,可能不如定时器1适合与串口中断配合使用。 并且定时器一使用的时TMOD的高四位,所以需要设置TR1 = 1;而不是TR0;
//SMO SM1 SM2 REN TB8 RB8 TI RI
SCON
=
0X50
;
// 0 1 0 1 (TB8 RB8 工作在方式2、3用于第九位校验奇偶校验) TI RI 发送或接收完 由硬件自动致1
在中断服务程序中必须由软件致0
设置为
工作方式 1
REN:允许串行接收位。由软件置 REN=1,则启动串行口接收数据;若软件置REN=0,则禁止接收。
PCON
=
0X80
;
//波特率加倍
TH1
=
baud
;
//计数器初始值设置
TL1
=
baud
;
ES
=
1
;
//打开接收中断
EA
=
1
;
//打开总中断
TR1
=
1
;
//打开计数器 TR1(TCON.6):T1 运行控制位。TR1 置 1 时,T1 开始工作;TR1 置 0 时,T1 停止工作。TR1 由软件置 1 或清 0。所以,用软件可控制定时/计数器的启动与停止。
// TI = 1; 如果要发送文本信息使用printf()的话需要将TI致1
}
void
main
()
{
uart_init
(
0XFA
) ;
//波特率为 9600
while
(
1
)
{
}
}
void
uart
()
interrupt
4
//串口通信中断函数
{
u8 rec_data
;
RI
=
0
;
//清除接收中断标志位
rec_data
=
SBUF
;
//存储接收到的数据
SBUF
=
rec_data
;
//将接收到的数据放入到发送寄存器
while
(!
TI
) ;
//等待发送数据完成
TI
=
0
;
//清除发送完成标志位
}
TI:发送中断标志位。RI:接收中断标志位。
由内部硬件使TI置 1,向 CPU 发中断申请。在中断服务程序中,
必须用软件将其清 0
,取消此中断申请。
由内部硬件使RI置 1,向 CPU 发中断申请。必须在中断服务程序中,
用软件将其清 0
,取消此中断申请。