串口通信相关寄存器图

下图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 ,取消此中断申请。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值