1,通讯方式基本概念
1,按照 --> 数据传送方式
串行通讯:使用一条数据线,将数据一位一位地依次传输,每一位数据占据一个固定的时间长度,
串行通信的特点:传输线少,长距离传送时成本低,且可以利用电话网等现成的设备,但数据的传送控制比并行通信复杂。
并行通讯:将数据字节的各位用多条数据线同时进行传送,通常是 8位、16 位、32 位等数据一起传输
并行通信的特点:控制简单、传输速度快;由于传输线较多,长距离传送时成本高且接收方的各位同时接收存在困难,抗干扰能力差。
2, 按照 --> 通信的数据同步方式
异步通讯:发送的双方使用各自的时钟控制数据的发送和接收过程,为使双方的收发协调,要求发送和接收设备的时钟尽可能一致。
异步通信的特点:不要求收发双方时钟的严格一致,实现容易,设备开销较小,但每个字符要附加 2~3 位用于起止位,各帧之间还有间隔,因此传输效率不高。
同步通讯:要建立发送方时钟对接收方时钟的直接控制,使双方达到完全同
步
3, 按照 --> 数据的传输方向
单工通信:指数据传输仅能沿一个方向,不能实现反向传输
半双工通讯:数据传输可以沿两个方向,但需要分时进行
全双工通讯:数据可以同时进行双向传输
2,串口通讯简介


RS232 的通信协议比较简单,通常遵循 96-N-8-1 格式。
96: 波特率为9600
N:无检验(校验方法有奇校验 (odd)、偶校验(even)、0 校验(space)、1 校验(mark)以及无校验(noparity)。)
8:表示数据位为8位,当然数据位数还可以为 5、6、7 位长度。
1:表示停止位位1,数据包的停止信号可由 0.5、1、1.5 或 2 个逻辑 1 的数据位表示,只要双方约定一致即可。
3,51单片机串口的内部结构
理解:
TH1和TL1,以及SMOD控制着串口的时钟,即产生稳定的波特率,在单片机中,TH1和TL1为定时器的初始化值寄存器,使用稳定的时钟信号是靠定时器产生的。
当RXD接收到数据时,1位起始位会在移位寄存器最左边,然后紧跟着数据位8位,1位校验位,1位停止位,收到停止位时,将触发RI中断(注意这里是RI不是R1),同时将数据放入SBUF中。
4,串口相关寄存器
SMO~SM1:
为串口工作方式配置寄存器位:如上
SM2:多机通信控制位,主要用于方式 2 和方式 3。当 SM2=1 时可以利用收到 的 RB8 来控制是否激活 RI(RB8=0 时不激活 RI,收到的信息丢弃;RB8=1 时收 到的数据进入 SBUF,并激活 RI,进而在中断服务中将数据从 SBUF 读走)。当 SM2=0 时,不论收到的 RB8 为 0 和 1,均可以使收到的数据进入 SBUF,并激活 RI (即此时 RB8 不具有控制 RI 激活的功能)。通过控制 SM2,可以实现多机通信。REN:允许串行接收位。由软件置 REN=1,则启动串行口接收数据;若软件置REN=0,则禁止接收。TB8:在方式 2 或方式 3 中,是发送数据的第 9 位,可以用软件规定其作用。可以用作数据的奇偶校验位,或在多机通信中,作为地址帧/数据帧的标志位。在方式 0 和方式 1 中,该位未用到。RB8:在方式 2 或方式 3 中,是接收到数据的第 9 位,作为奇偶校验位或地址帧/数据帧的标志位。在方式 1 时,若 SM2=0,则 RB8 是接收到的停止位。
5,串口编程
计算波特率:
定时器工作方式为2(8位自动重装载定时器),SMOD为1,表示倍频
当TL0溢出时,产生中断,并将TH0中的值重新写入TL0,实现重装载(实际是使用的定时器2,TH1和TL1,这里以定时器1为例子)
代码实现:
#include <reg52.h>
typedef unsigned char u8;
typedef unsigned int u16;
sbit LED1 = P2^0;
u8 is_used = 0;
void delay_10us(u16 time)
{
while(time--);
}
void init_uart_serial(u8 baud)
{
TMOD |= 0x20; // 定时器1工作方式2 8位自动转载
SCON = 0x50; // 设置串口工作方式1
PCON = 0x80; // 0x80 倍频
TH1 = baud; // 计数器初值
TL1 = baud;
ES = 1; // 打开串口中断
EA = 1; //打开总中断
TR1 = 1; // 打开定时器(定时器产生波特率)
}
void uart_run() interrupt 4
{
u8 recv_val = 0;
RI = 0; //中断清零
recv_val = SBUF;
SBUF = recv_val;
while(!TI); //TI 等待发送完成
TI = 0;
is_used = 1;
}
void main()
{
init_uart_serial(0xFA);
LED1 = 1;
while(1){
if(is_used == 1)
{
LED1 = 0;
delay_10us(1000);
is_used = 0;
LED1 = 1;
}
}
}
以上:验证使用sscom验证,能发送单个字符和多个字符
6,总结
串口通讯时,使用定时器1作为稳定的信号发送器,需要将其配置为模式2,同时需要知道,程序中配置的串口是一位一位bit发送的数据,收数据也是一字节收写入到sbuf中的。