电脑通过串口控制51单片机的LED

一、功能介绍

  1. 在电脑端的串口助手通过串口对51单片机发送一个字节的16进制数控制LED的亮灭
  2. 单片机通过串口将接收到的数据发送回电脑

二、串口通信的相关知识

1、51单片机的串口

  • 51单片机内部自带UARTUniversal Asynchronous Receiver Transmitter,通用异步收发器),可实现单片机的串口通信
  • STC89C52有1UART,有四种通信模式:模式0:同步移位寄存器、 模式18UART,波特率可变(常用)、模式29UART,波特率固定、 模式39UART,波特率可变

  • 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亮灭情况

 

 对应0110 0110

  • 10
    点赞
  • 53
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值