文章目录
前言
一个学习嵌入式的小白~ 有错误评论区或私信指出~
提示:以下是本篇文章正文内容,下面案例可供参考
一、串口的介绍及使用
1什么是串口?
串口是一种十分广泛的通讯接口,串口成本低,容易使用,通信线路简单,可实现两个设备的互相通信。
单片机的串口可以使单片机与单片机,单片机与电脑,单片机与各式各样的模块相互通信,极大的扩展了单片机的应用范围,增强了单片机系统的硬件实力。
51单片机内部自带UART(),可实现单片机的串口通信。
2.串口的连接方式
简单双向串口通信有两根通信线(发送端TXD和接收端RXD)TXD与RXD要交叉连接
当只需单向的数据传输时,可以直接一根通信线
当电平标准不一致时,需要加电平转换芯片
3.串口电平标准
电平标准是与数据的对应关系数据1与数据0的表达方式,是传输线缆中认为规定的电压,串口常用的电平标准有三种:
1.TTL电平:+5V表示1.0V表示0
2.RS232电平:-3~-15V表示1,+3 ~+15V表示0
3.RS485电平:两线压差+2~+6V表示1,-2 ~-6V表示0(差分信号)
4.常用通信接口比较
全双工:通信双方可以在同一时刻互相传输数据
半双工:通信双方可以互相传输数据,但某一时刻,只能一个状态
单 :通信只能有一方发送到另一方,不能反向纯属
异步 :通信双方各自约定通信速率
同步:通信双方靠一根时钟线来约定通信速率
总线 :连接各个设备的数据传输线
(类似于一条阿鲁,把路边各住户连接起来,使住户可以相互交流)
二、51单片机的UART
1.引脚定义
2.相关寄存器
3.工作模式
STC89C52有一个UART
STC89C52的UART有四种工作模式:
模式0:同步移位寄存器 波特率固定
模式1:8位UART,波特率可变(常用)
模式2:9位UART,波特率固定
模式3:9位UART,波特率可变
4.时序及帧格式介绍
波特率:串口通信的速率(发送和接收各数据位的间隔时间)
校验位:用于数据验证
停止位:用于数据帧的间隔
5.内部工作过程
SUBF:串口数据缓存寄存器,物理上是两个独立的寄存器,但占用相同的地址。
写操作时,写入的是发送寄存器,读操作时,读出的是接收寄存器。
三、串口练习
1.发送接收
#include <REGX52.H>
void UART_Init()
{
SCON = 0x50;
PCON |= 0x80;
TMOD &= 0x0F; //清除定时器1模式位
TMOD |= 0x20; //设定定时器1为8位自动重装方式
TL1 = 0xFA; //设定定时初值
TH1 = 0xFA; //设定定时器重装值
ET1 = 0; //禁止定时器1中断
TR1 = 1; //启动定时器1
}
void UART_SendByte(unsigned char Byte)
{
SBUF = Byte;//SBUF接收要传的数据
while(TI == 0);//等待TI置1表示传输完成
TI = 0;//清除标志位
}
unsigned char UART_Receive()
{
unsigned char Byte;
if(RI == 1)
{
RI = 0;
return 1;
}
return 0;
}
void main()
{
UART_Init();
UART_SendByte(0x66);
while(1)
{
if(UART_Receive() == 1)
{
if(SBUF == 0x55)
{
UART_SendByte('O');
UART_SendByte('K');
UART_SendByte('\r');
UART_SendByte('\n');
}
else
{
UART_SendByte('N');
UART_SendByte('G');
UART_SendByte('\r');
UART_SendByte('\n');
}
}
}
}
2.中断接收
#include <REGX52.H>
void UART_Init()
{
SCON = 0x50;
PCON |= 0x80;
TMOD &= 0x0F; //清除定时器1模式位
TMOD |= 0x20; //设定定时器1为8位自动重装方式
TL1 = 0xFA; //设定定时初值
TH1 = 0xFA; //设定定时器重装值
ET1 = 0; //禁止定时器1中断
TR1 = 1; //启动定时器1
ES = 1;
EA = 1;
}
void UART_SendByte(unsigned char Byte)
{
SBUF = Byte;
while(TI == 0);
TI = 0;
}
void main()
{
UART_Init();
while(1)
{
}
}
void UART_Routine () interrupt 4
{
unsigned char Byte;
if(RI == 1)
{
Byte = SBUF;
UART_SendByte(Byte);
RI = 0;
}
}