UART

慢慢看,仔细看,其实没啥东西

对于蓝桥来说:只能使用T18位重载(方式2)来产生8位可变波特率(简称Baud)的UART。
Baud = (2^SMOD/32) × Use_CLK /(256 - TH1)



可说2SMOD = 1 或 2,
亦为2SMOD/32 = 1/32 或 1/16,
也就是系数是 1/32 还是 1/16,取决于PCON的SMOD标志位(MSB)。


Use_CLK = SYS_CLK / 分频倍数
12T就除12,1T就除1。


下面就叫这个数为系数SMOD(1/32 or 1/16)
所以 Baud = SMOD × Use_CLK / (256 - TH1);
(就是先乘后除的思维,扩大了Baud的范围)
所以TH1 = 256 - SMOD × Use_CLK / Baud


Use_CLK 越高
能实现的波特率最小值(Baud_min)越高

  • 例如:
    1T:11.0592Mhz下,Baud_min = 2700;Baud_max = 346725 × 2
    12T:11.0592 / 12 Mhz下,Baud_min = 225;Baud_max = 28800 × 2

  • 常用
    1T:4800 ~ 115200。
    12T :1200 ~ 9600。倍速后可用:19200 、57600、38400(25%误差率)


//从STC-ISP复制的//

void UartInit(void)  //9600bps@11.0592MHz
{
 PCON &= 0x7F;  //波特率不倍速
 SCON = 0x50;  //8位数据,可变波特率
 AUXR &= 0xBF;  //定时器1时钟为Fosc/12,即12T
 AUXR &= 0xFE;  //串口1选择定时器1为波特率发生器
 TMOD &= 0x0F;  //清除定时器1模式位
 TMOD |= 0x20;  //设定定时器1为8位自动重装方式
 TL1 = 0xFD;  //设定定时初值
 TH1 = 0xFD;  //设定定时器重装值
 ET1 = 0;  //禁止定时器1中断
 TR1 = 1;  //启动定时器1
}
//接收串口u8 data,返回data + 1//

void Interrupt_UART() interrupt 4
{
  if(RI) //接收完成
    {
        RI = 0;	//准备发送
        SBUF = SBUF + 1;
    }
    if(TI) //发送完成
    {
        TI = 0;	//准备接收
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值