初学51——串口通信

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;
	}
}

原文地址:https://www.cnblogs.com/sophomores/p/12396528.html