串口是一种通信接口,可以让两个串口设备互相通信,传输数据 吧啦吧啦(这句是废话)。
首先,我们需要一个CH340模块,这个模块是USB转串口的模块
大概长这样子
有些电脑也自带串口通信接口(电平标准与51单片机不一致),这里不作讨论。
串口的连接:
简单的双向串口通信由两根线(TXD发送端和RXD接收端)
TXD和RXD要交叉连接
当只需要单项的数据传输时可以只接通一根线
当电平标准不一致时,需要加电平转换芯片
电平标准:
TTL电平:+5v表示1,0v表示0;
RSS232电平:-3v- -15v表示1,+3-+15表示0;
RS485电平:两线压差+2- +6v表示1,-2—-6v表示0(差分信号)
STC89C52(以下简称单片机)有一个UART,定义在P3.0RXD与P3.1TXD
单片机的UART由四种工作模式:
模式0:同步移位寄存器
模式1:8位UART波特率可变(常用)
模式2:9位UART波特率固定
模式1:9位UART波特率可变
串口的参数:
波特率:串口通信的速率(发送和接受各位数据位之间的间隔时间)
检验位:用于数据的验证
停止位:用于数据帧之间的间隔
串口模式图:
靠T1定时器的溢出率来控制频率,再经过2分频和16分频来得到最终波特率
当发送或接受时TI和RI将产生一个中断。
SBUF:串口数据缓存寄存器,物理上是两个独立的寄存器,但占用相同的地址。写操作时,写入的是发送寄存器,读操作时,读出的是接受寄存器
串口相关寄存器:
虽然看着多,挺吓人的,但其实并不复杂,一共就5个需要新知道的,我们来一一拆解
SCON:串行控制寄存器
SM0和SM1用于定义串口模式,一共4种,上面说过。TI(需要如那件复位)和RI也一样说过
但是SM0有一个复用功能,当PCON寄存器中SMOD0为1时,这一位用于错误帧检测,当检测到一个无效停止位时,通过UART接收器设置该位。
REN:置位(1)为允许接受数据,复位(0)为禁止接收数据
SBUF:上面说过
PCON:电源管理寄存器,实际也就用到前两个
SMOD:波特率选择位,当它置位时,通信方式1,2,3的波特率加倍,当复位时,各工作方式加倍。(其实我没太懂)
SMOD0:指定SM0的功能,是错误帧检测还是设置串口工作模式。
说了这么多,上代码!
初始化函数:
void UART_Init(){ //4800bps@11.0592MHz
SCON = 0x50; //8位数据,可变波特率
PCON = 0x80; //使能波特率倍速位SMOD
TMOD &= 0x0F; //清除定时器1模式位
TMOD |= 0x20; //设定定时器1为8位自动重装方式
TL1 = 0xF4; //设定定时初值
TH1 = 0xF4; //设定定时器重装值
ET1 = 0; //禁止定时器1中断
TR1 = 1; //启动定时器1
EA = 1; //设置中断使能
ES = 1; //设置串口中断
}
发送数据:
void sentByte(char data_msg)
{
SBUF = data_msg;
while(!TI);//用于检测是否发送完成
TI = 0;
}
就是这么的朴实无华,很简单吧?
接收数据:
将接收到的数据写入P2寄存器
void UART_Routine() interrupt 4{
if(RI == 1){
P2 = SBUF;
UART_SendByte(SUBUF);
RI = 0;
}
}