51串口通信
串行口控制寄存器
SCON | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
---|---|---|---|---|---|---|---|---|
98H | SM0 | SM1 | SM2 | REN | TB8 | RB8 | TI | RI |
SM1、SM0:串行口工作方式选择位
SM0 | SM1 | 方式 | 功能 | 波特率 |
---|---|---|---|---|
0 | 0 | 方式0 | 移位寄存器方式 | f(osc) / 12 |
0 | 1 | 方式1 | 8位异步通信方式 | 可变 |
1 | 0 | 方式2 | 9位异步通信方式 | f(osc)/32 或 f(osc)/64 |
1 | 1 | 方式3 | 9位异步通信方式 | 可变 |
SM2 : 多机通信控制位
REN : 允许接受控制位
TB8/RB8 : 发送/接受的第9数据位
RI : 接收中断标志位
电源控制寄存器PCON
PCON | D7 | ... |
---|---|---|
87H | SMOD |
当SMOD位为1,则串行口方式1,方式2, 方式3的波特率加倍
设置定时器初值
(一般通过使用软件设置)
T1的溢出率 = 波特率 x 32/2^SMOD
T1 工作于方式二的溢出率可以表示为:
T1的溢出率 = fosc/(12 x (256 - 初值))
两个算式联立即可得到定时器的初值
例程
/* 定时器初始化 */
void Sbuff_Init(void)
{
// 工作方式1
SCON = 0x50;
// 八位自动重装定时器
TMOD = 0x20;
// 初始化
TL1 = 0xFD;
TH1 = 0xFD;
// 开定时器
TR1 = 1;
// 开中断
EA = 1;
ES = 1;
}
static char string[SIZE];
void funins(void) interrupt 4
{
// 手动清空RI位
RI = 0;
// 将SBUF接受到的数据传入数组中
string[flag] = SBUF;
// 测试代码,回显
// SBUF = string[flag];
// while(!TI);
// TI = 0;
// ES = 1;
flag++;
if (flag == 4)
{
flag = 0;
}
}