1.SM0,SM1 我们一般用 8位UART,波特率可变 (方式1的工作方式)
SCON :SM2 一般不用,SM0 =0 ,SM1 = 1
PCON : 有两位 我们不动它,不加速,初始值
TMOD:8位自动重装定时器,当溢出时将TH1存放的值自动重装入TL1 高四位清零,
TMOD &=0x0F :高四位清0
TMOD |=0x20; 由此变成 M1,M0 为 1 0 8位自动重装模式
定时器:
由波特率计算
TH1 = 0xFD;
TL1 = 0xFD; //9600波特率的初值
TR1 = 1 ; //启动定时器
2.波特率计算
12T:
2^0 / 32 x 11059200 / 12 (256-t) = 9600
SCON:
TMOD:
波特率计算
串口实现字符串输出
1.自定义初始化串口
void UartInit(void)
{
AUXR = 0x01;
SCON = 0x40;
TMOD &= 0x0F;
TMOD |= 0x20;
TH1 =0xFD;
TL1 =0xFD;
TR1 = 1;
}
2.利用串口中断来延迟输出,因为通过手册我们可以知道,发数据的过程中,移位寄存器操作也是消耗时间的,所以我们可以加软件延迟或者中断来抵消这一部分时间
用 TI
void sendByte(char data_msg)
{
SBUF = data_msg;
while(!TI); //(TI==0)
TI = 0;
}
void sendString(char *str)
{
while(*str != '\0'){
sendByte(*str);
str++; //指针偏移
}
}
void main()
{
UartInit();
while(1)
{
Delay1000ms();
sendString("caoshupei shuai\r\n"); //不加 \r 和 \n 会乱行
}
}
串口通信编程,PC端发送指令控制LED
1.REN使能端必须让它等于1才能接受数据
B7 B6 B5 B4 B3 B2 B1 B0
0 1 0 1 0 0 0 0
SM1 0 REN
2.RI接收中断请求标志位。在方式0,当接收到第八位结束时,硬件自动置位RI = 1;
响应中断后必须软件复位,即 RI= 0;
2.1 用外部中断函数,不会卡死,同时打开ES外部串口中断和总中断EA;