目录
1. 串口介绍
- 串口是一种应用十分广泛的通讯接口,串口成本低、容易使用、通信线路简单,可实现两个设备的互相通信。
- 单片机的串口可以使单片机与单片机、单片机与电脑、单片机与各式各样的模块互相通信,极大的扩展了单片机的应用范围,增强了单片机系统的硬件实力。
- 51单片机内部自带UART(Universal Asynchronous Receiver Transmitter,通用异步收发器),可实现单片机的串口通信。
2. 硬件电路
- 简单双向串口通信有两根通信线(发送端TXD和接收端RXD)
- TXD与RXD要交叉连接
- 当只需单向的数据传输时,可以直接一根通信线
- 当电平标准不一致时,需要加电平转换芯片
3. 电平标准
- 电平标准是数据1和数据0的表达方式,是传输线缆中人为规定的电压与数据的对应关系,串口常用的电平标准有如下三种:
- TTL电平:+5V表示1,0V表示0(单片机)
- RS232电平:-3~-15V表示1,+3~+15V表示0
- RS485电平:两线压差+2~+6V表示1,-2~-6V表示0(差分信号)
4. 接口及引脚定义
5. 常见通信接口比较
名称 | 引脚定义 | 通信方式 | 特点 |
UART | TXD、RXD | 全双工、异步 | 点对点通信 |
I²C | SCL、SDA | 半双工、同步 | 可挂载多个设备 |
SPI | SCLK、MOSI、MISO、CS | 全双工、同步 | 可挂载多个设备 |
1-Wire | DQ | 半双工、异步 | 可挂载多个设备 |
还有CAN、USB等
- 全双工:通信双方可以在同一时刻互相传输数据
- 半双工:通信双方可以互相传输数据,但必须分时复用一根数据线
- 单工:通信只能有一方发送到另一方,不能反向传输
- 异步:通信双方各自约定通信速率
- 同步:通信双方靠一根时钟线来约定通信速率
- 总线:连接各个设备的数据传输线路(类似于一条马路,把路边各住户连接起来,使住户可以相互交流)
6. 51单片机的UART
STC89C52有1个UART
STC89C52的UART有四种工作模式:
模式0:同步移位寄存器
模式1:8位UART,波特率可变(常用)
模式2:9位UART,波特率固定
模式3:9位UART,波特率可变
7. 串口参数及时序图
- 波特率:串口通信的速率(发送和接收各数据位的间隔时间)
- 检验位:用于数据验证
- 停止位:用于数据帧间隔
8. 串口模式图
• SBUF :串口数据缓存寄存器,物理上是两个独立的寄存器,但占用相同的地址。写操作时,写入的是发送寄存器,读操作时,读出的是接收寄存器9. 串口和中断系统
这里使用的中断系统图是传统51单片机的图,STC89C52的中断系统图可参考手册
10. 串口相关寄存器
HEX模式/十六进制模式/二进制模式:以原始数据的形式显示
文本模式/字符模式:以原始数据编码后的形式显示
11. 串口向电脑发送数据
#include <REGX52.H>
#include"Delay.h"
unsigned char sec; //main.c
void UART_Init()
{
PCON |= 0x80;
SCON = 0x40;
TMOD &= 0x0F;
TMOD |= 0x20;
TL1 = 0xF3;
TH1 = 0xF3;
ET1 = 0;
TR1 = 1;
}
void UART_send(unsigned char a)
{
SBUF=a;
while(TI==0);
TI=0;
}
void main()
{
UART_Init();
while(1)
{
UART_send(sec);
sec++;
Delay(1000);
}
}
#include <REGX52.H> //Delay.c
void Delay(unsigned int xms)
{
unsigned char i, j;
while(xms)
{
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
xms--;
}
}
#ifndef __Delay_H //防止重定义
#define __Delay_H //Delay.h
void Delay(unsigned int xms);
#endif
12. 电脑通过串口控制LED
#include <REGX52.H>
#include"Delay.h" //main.c
void UART_Init()
{
PCON |= 0x80;
SCON = 0x50;
TMOD &= 0x0F;
TMOD |= 0x20;
TL1 = 0xF3;
TH1 = 0xF3;
ET1 = 0;
TR1 = 1;
EA=1;
ES=1;
}
void UART_send(unsigned char a)
{
SBUF=a;
while(TI==0);
TI=0;
}
void main()
{
UART_Init();
while(1)
{
}
}
void VART_Routine() interrupt 4
{
if(RI==1)
{
P2=~SBUF;
UART_send(SBUF);
RI=0;
}
}
谢谢观看
标签:LED,UART,void,通信,电平,Delay,单片机,串口 From: https://blog.csdn.net/Limerence_Aries/article/details/140278236