一、功能介绍
- 在电脑端的串口助手通过串口对51单片机发送一个字节的16进制数控制LED的亮灭
- 单片机通过串口将接收到的数据发送回电脑
二、串口通信的相关知识
1、51单片机的串口
- 51单片机内部自带UART(Universal Asynchronous Receiver Transmitter,通用异步收发器),可实现单片机的串口通信
- STC89C52有1个UART,有四种通信模式:模式0:同步移位寄存器、 模式1:8位UART,波特率可变(常用)、模式2:9位UART,波特率固定、 模式3:9位UART,波特率可变
- HEX模式/十六进制模式/二进制模式:以原始数据的形式显示
- 文本模式/字符模式:以原始数据编码后的形式显示
- SBUF:串口数据缓存寄存器,物理上是两个独立的寄存器,但占用相同的地址。写操作时,写入的是发送寄存器,读操作时,读出的是接收寄存器
- STC89C52的串口模式(简化版)
- 串行口数据缓存寄存器SBUF
2、相关术语
- 全双工:通信双方可以在同一时刻互相传输数据
- 半双工:通信双方可以互相传输数据,但必须分时复用一根数据线
- 单工:通信只能有一方发送到另一方,不能反向传输
- 异步:通信双方各自约定通信速率
- 同步:通信双方靠一根时钟线来约定通信速率
- 总线:连接各个设备的数据传输线路(类似于一条马路,把路边各住户连接起来,使住户可以相互交流)
3、相关参数
- 波特率:串口通信的速率(发送和接收各数据位的间隔时间)
- 检验位:用于数据验证
- 停止位:用于数据帧间隔
三、程序设计
1、UART初始化函数
1.1、实现功能
串口初始化,使定时器1工作在8位自动重装模式,允许串行接收状态,配置中断系统开启
1.2、设计原理
串行口控制寄存器SCON和PCON
配置SM0=0,SM1=1使定时器1工作在8位串行接收方式,REN = 1,使其允许串行接收状态
SCON = 0x50; //8位数据,可变波特率
PCON |= 0x80; //使能波特率倍速位SMOD
接下来配置定时器工作模式TMOD
配置高四位M1 = 1, M0 = 0,第四位为0000,使定时器1工作在8位自动重装模式
TMOD = TMOD & 0x0F; //高四位置零,低四位不变,清除定时器1模式位
TMOD = TMOD | 0x20; //设定定时器1为8位自动重装方式
STC89C52的晶振频率为11.0592MHz,配置的PCON寄存器SMOD = 0, SMOD0 = 1,
波特率= 11.0592MHZ * 1/16/12/12us = 4800
计算出波特率为4800,通过串口助手生成定时器计数的初始值
TL1 = 0xF4;
TH1 = 0xF4; //设定定时器重装值
配置定时器控制寄存器,令TR1 = 1,允许计数;配置中断允许寄存器IE,令ET1 = 0禁止定时器1溢出中断,令EA = 1, ES = 1,允许串口中断
ET1 = 0; //禁止定时器1中断
TR1 = 1; //启动定时器1
EA = 1; //配置中断开启
ES = 1;
1.3、代码实现
/**
* @brief 串口初始化,4800bps@11.0592MHz
* @param 无
* @retval 无
* 定时器1为8位自动重装模式,接收开启,配置中断系统开启
*/
UART_Init()
{
SCON = 0x50; //8位数据,可变波特率
PCON |= 0x80; //使能波特率倍速位SMOD
TMOD = TMOD & 0x0F; //高四位置零,低四位不变,清除定时器1模式位
TMOD = TMOD | 0x20; //设定定时器1为8位自动重装方式
TL1 = 0xF4;
TH1 = 0xF4; //设定定时器重装值
ET1 = 0; //禁止定时器1中断
TR1 = 1; //启动定时器1
EA = 1; //配置中断开启
ES = 1;
}
2、UART_SendByte函数
2.1、实现功能
串口向电脑发送一个字节数据
2.2、设计原理
将发送的数据读入缓存寄存器,判断发送完后立即将允许中断标志位复位
SBUF = Byte;
while(TI == 0); //检测请求中断标志位为1时程序才继续
TI = 0; //发送完毕后立即将标志位清0
2.3、代码实现
/**
* @brief 串口向电脑发送一个字节数据
* @param 发送的一字节数据 Byte
* @retval 无
*/
void UART_SendByte(unsigned char Byte)
{
SBUF = Byte;
while(TI == 0); //检测请求中断标志位为1时程序才继续
TI = 0; //发送完毕后立即将标志位清0
}
3、串口中断函数
3.1、实现功能
串口接收电脑发送的数据控制LED
3.2、设计原理
检测到接收完毕的中断请求后执行从缓存区读取数据到P2,控制LED的亮灭,并立即将接收允许中断标志位复位
if(RI == 1) //只检测到接收中断的时候执行
{
P2 = SBUF; //从缓存区读取数据
UART_SendByte(P2); //将接收到的数据从串口发送回电脑
RI = 0; //接收完毕立即给接收标志位复位
}
3.3、代码实现
void UART_Routine() interrupt 4
{
if(RI == 1) //只检测到接收中断的时候执行
{
P2 = SBUF; //从缓存区读取数据
UART_SendByte(P2); //将接收到的数据从串口发送回电脑
RI = 0; //接收完毕立即给接收标志位复位
}
}
4、主函数设计
4.1、实现功能
调用串口初始化,让程序一直执行不停止
4.2、代码实现
#include <REGX52.H>
#include"UART.h"
void main()
{
UART_Init();
while(1)
{
}
}
四、结果展示
发送数据和串口返回结果
LED亮灭情况
文章来源:https://www.toymoban.com/news/detail-486733.html
对应0110 0110文章来源地址https://www.toymoban.com/news/detail-486733.html
到了这里,关于电脑通过串口控制51单片机的LED的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!