电脑通过串口控制51单片机的LED
一、功能介绍
- 在电脑端的串口助手通过串口对51单片机发送一个字节的16进制数控制LED的亮灭
- 单片机通过串口将接收到的数据发送回电脑
二、串口通信的相关知识
1、51单片机的串口
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亮灭情况
对应0110 0110