(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;
}
void UartInit(void) //[email protected]
{
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 != '\0')
{
trans_char(*p);
p++;
}
}
void uart_isr() interrupt 4
{
RI = 0;
rechar = SBUF;
trans_char(rechar); //验证
}