通信
通信的的基本概念
通信方式 | 具体解释 |
---|
串行通信 | 一条数据线,将数据一位一位地依次传输 | 并行通信 | 多条数据线,8位数据同时传输 | 异步通信 | 通信双方各自约定通信速率 | 同步通信 | 通信双方靠一根时钟线来约定通信速率 | 单工 | 通信只能有一方发送到另一方,不能反向传输 | 半双工 | 通信双方可以互相传输数据,但必须分时复用一根数据线 | 全双工 | 通信双方可以在同一时刻互相传输数据 |
- 总线:连接各个设备的数据传输线路,类似于一条马路,把路边各住户连接起来,使住户可以相互交流
串口参数及时序图
- 通信速率(比特率)衡量通信性能的重要参数
比特率 :每秒钟传送二进制数据的位数(单位:位/s即bps=bit per second)检验位 :用于数据验证(九位的最后一位)停止位 :用于数据帧间隔
常用通信接口比较
此外还有CAN、USB等
51单片机串口介绍
串口通信简介
-
串口通信:计算机与外设通过数据信号线、地线,按位进行数据通信的方式,属于串行通信 -
接口标准:常见接口有RS-232C、RS-232、RS-485等 常用引脚:TXD、RXD、GND(发送、接收、接地) 串口通信一定要确保设备之间共地,l即连接GND -
连接方式:交叉连接且共地 -
通信协议 :RS-232的通信协议遵循96-N-8-1格式
符号 | 含义 |
---|
96 | 比特率9600bps | N | 无校验位(校验:排除由外界干扰、降低数据偏差) | 8 | 传输数据位的个数,8位1个字节 | 1 | 代表停止位 |
串口内部结构
单片机的串口可以使单片机与单片机、单片机与电脑、单片机与各式各样的模块互相通信,极大的扩展了单片机的应用范围,增强了单片机系统的硬件实力
-
51单片机内部自带UART(Universal Asynchronous Receiver Transmitter,通用异步收发器),可实现单片机的串口通信 -
51单片机的通信接口UART 只有一个UART,四个工作模式,常用模式1 详细内容联系下文中串口寄存器来理解 -
两根通信线连接方法 TXD与RXD交叉连接 当只需单向的数据传输时,可以只接一根通信线 当电平标准不一致时,需要加电平转换芯片 一定要接地GND -
电平标准: 数据1和数据0的表达方式,是传输线缆中认为规定的电压与数据的对应关系,串口常用的电平标准由如下三种:
电平标准 | 特点 | 表示1 | 表示0 |
---|
TTL电平 | 对地电压 | +5V | 0V | RS232电平 | 更稳定 | -3 ~ -15V | +3 ~ +15V | RS485电平 | 两线压差,差分 | +2~+6V | -2~-6V |
- 内部结构、串口模式图
将USB电平协议转换为串口的电平协议 最左端为总线 定时器控制收、发控制器 发送给、接收完成后有相应的中断 发送端TXD接P3_1 接收端RXD接P3_0 SBUF:串口数据缓存寄存器 上下两个SBUF在物理上是两个独立的寄存器,但占用相同的地址,写操作时,写入的是发送寄存器,读操作时,独处的是接收寄存器
串口通信相关寄存器
SCON :串口模式控制寄存器(可位寻址,单个赋值 ) 当PCON.6位=1时,SCON.7用FE(free error)帧错误检测 当PCON.6位=0时,SCON.7用SM0与SM1一起控制串口通信工作模式 SM2:与方式2/3有关,多机通信控制位 REN:为1时允许接收,为0时禁止接收 TB8:只与方式2/3有关,为第9位数据清零 RB8:为0时是方式1的接收停止位;方式2/3接收第9位置数据 TI:发送中断标志位,发送完为1,必须由软件复位 RI:接收中断标志位,接受完为1,必须由软件复位
四种工作模式
SM0 | SM1 | 工作方式 | 功能说明 |
---|
0 | 0 | 方式0 | 同步移位 | 0 | 1 | 方式1 | 8位,波特率可变 | 1 | 0 | 方式2 | 9位,波特率固定 | 1 | 1 | 方式3 | 9位,波特率可变 |
串口通信实验
串口向计算机发送数据
- stc软件中波特率计算器用来得到PCON的赋值
串口寄存器、定时器(只能用定时器1)初始化配置
void UART_Init()
{
SCON=0x40;
PCON&=0x80;
TMOD &= 0x0F;
TMOD |= 0x20;
TL1 = 0xFD;
TH1 = 0xFD;
ET1 = 0;
TR1 = 1;
}
写入程序 Byte要发送的一个字节数据
void UART_SendByte(unsigned char Byte)
{
SBUF=Byte;
while(TI==0);
TI=0;
}
显示数值
void main()
{
UART_Init();
while(1)
{
UART_SendByte(0x66);
}
}
串口助手显示时一定要注意选择对应的波特率
改动main函数部分
void main()
{
UART_Init();
while(1)
{
UART_SendByte(Sec);
Sec++;
Delay(100);
}
}
计算机通过串口控制LED
利用中断系统,当数据发送到计算机时,触发中断,接收数据
- 需要接受数据,用到SCON.4的REN=1接收位
- 打开串口的中断EA=1;ES=1;允许触发中断
改动主函数部分并添加中断服务子函数
void main()
{
UART_Init();
while(1)
{
}
}
void UART_Routine() interrupt 4
{
if(RI==1)
{
P2=SBUF;
UART_SendByte(SBUF);
RI=0;
}
}
注意!!!用串口助手打开串口时,一定要调整相应的波特率!!!
|