【蓝桥杯单片机组】(6)uart

2019-04-15 19:27发布

(1)波特率的概念:1bps = 1 bit/s (2)板载资源有两个串口,仅UART1可以通过USB连接电脑 (3)四种方式波特率计算公式:(fosc:晶振频率 ) 方式1:baud = fosc / 12; 方式2:baud = (2^smod / 32) * (T1溢出率) 方式3:baud = (2^smod / 64) * fosc
方式4:baud = (2^smod / 32) * (T1溢出率)
(4)SMOD的设定位于PCON(电源管理寄存器中)PCON_D7 SMOD = 1 波特率加倍PCON &= 0x7f SMOD = 0  波特率不变 PCON |= 0x80 (5)T1溢出率为T1定时器溢出的频率,即:T1溢出一次所需要的时间的倒数  溢出率 = 1 / ( N * (12 / fosc)) (6)使用T1做时钟源的时候应当使用方式2,以避免重装计时器初值带来的时延,否则会产生累积误差。 (7)计算计数器初值方法(方式1): 设初值为x, T1 = (256 - x) * ( 12 / fosc) baud = ( 2 ^ SMOD) / 32 * T1 需要使用的寄存器:SCON 串行口寄存器(可位寻址) SCON D7 D6 D5 D4 D3 D2 D1 D0   SM0 SM1 SM2 REN TB8 RB8 TI RI
SM0/SM1: 工作方式选择位 SM0 SM1 方式 功能说明 0 0 0 同步移位寄存器方式(用于拓展I/O口) 0 1 1 10位异步收发(1开始位,8位数据,1停止位)波特率可变(T1控制) 1 0 2 11位异步收发(9位数据)波特率固定 1 1 3 11位异步收发(9位数据)波特率可变(T1控制)
一般使用方式1 SM2: 多机通信控制位,SM2 = 1:收到的RB8(第9位数据)进入SBUF,并激活RI,引起中断 SM2 = 0:收到的RB8被丢弃 REN: 接收使能 TB8 / RB8:发送、接收到的第9位数据 TI :发送结束标志(在发送最后一位停止位开始时TI硬件置1,需要手动清零 RI:接收中断标志(在接受到最后一位停止位中间,RI硬件置1,需要手动清零
编程步骤: (1)设定T1工作方式(方式2) (2)为TH1 TL1装初值,开计数器 (3)为串口设定所使用的时钟源 sfr AUXR = 0x8e; AUXR &= 0xBF; //定时器1时钟为Fosc/12,即12T AUXR &= 0xFE; //串口1选择定时器1为波特率发生器
(4)设定SCON工作方式(主要:SM0 SM1 REN) (5)开中断(总中断与串口中断) P.S:善于使用STC - ISP中自带的波特率计算器
发送函数: (1)送字符入SBUF (2)等待TI变为1(while( ! TI ); ) (3)清零TI 接收中断: (1)清零RI (2)收SBUF中的数据
自己写的分片代码初始化: void t1_init() { TMOD = 0x20; //M1 = 1; M0 = 0 TH1 = 0xfd; TL1 = 0xfd; EA = 1; TR1 = 1 ; } void uart_init() { AUXR &= 0xBF; //定时器1时钟为Fosc/12,即12T AUXR &= 0xFE; //串口1选择定时器1为波特率发生器 SM0 = 0; SM1 = 1; //方式1 REN = 1; //RECEIVE INTERRUPT ES = 1; //uart interrupt EA = 1; }
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 }
发送函数: void trans_char(char t) { SBUF = t; while(!TI); TI = 0; } void trans_str(char t[]) { char *p; p = t; while(*p != '