当前位置: 首页 > news >正文

51单片机:电脑通过串口控制LED亮灭(附溢出率和波特率详解)

一、功能实现

1.电脑通过串口发送数据:0F

2.点亮4个LED

二、注意事项

1.发送和接受数据的文本模式

2.串口要对应

3.注意串口的波特率要和程序中的波特率保持一致

4.有无校验位和停止位

三、如何使用串口波特率计算器

1.以本程序为例

2.生成代码如下

void Uart1_Init(void)	//9600bps@11.0592MHz
{SCON = 0x50;		//8位数据,可变波特率AUXR |= 0x40;		//定时器时钟1T模式AUXR &= 0xFE;		//串口1选择定时器1为波特率发生器TMOD &= 0x0F;		//设置定时器模式TL1 = 0xE0;			//设置定时初始值TH1 = 0xFE;			//设置定时初始值ET1 = 0;			//禁止定时器中断TR1 = 1;			//定时器1开始计时
}

3.需要手动配置中断系统

根据原理图

配置代码
	//手动配置中断系统ES=1;EA=1;PS=0;

四、如何理解软件生成的波特率

void UART_Init()			
{//由软件自动生成SCON=0x50;				//STC89C52操作手册P235方式1PCON &= 0x7F;			//波特率不倍速TMOD &= 0x0F;			//设置定时器1模式TMOD |= 0x20;			//设置定时器1模式TL1 = 0xFA;			//设置定时初始值TH1 = 0xFA;			//设置定时重载值ET1 = 0;			//禁止定时器中断TR1 = 1;			//定时器1开始计时//需要手动配置中断系统ES=1;EA=1;PS=0;
}

以上述代码为例子进行分析

    由于配置是8位自动重载,TL1=TH1=0xFA ,0xFA=250;
    总计八位,那么数据范围0~255(256溢出)
    256-250=6
    那么每计6个数溢出一次
    晶体振荡器的输出经12 分频后得到输入的时钟脉冲
    一个机器周期内有12 个振荡周期。故其频率为晶振频率的1/12。
    此设备是11.0592M 的晶振,1.085μs为一个输入脉冲的时间
    则6.51μs溢出一次
    1/6.51,则0.1536098MHz就是定时器的溢出率
    再看PCON=0111 1111
    可知SMOD=0(参考串口模式图)
    那么波特率=0.1536098MHz   /2  /16
    波特率为0.00480030625MHz约等于4800Hz
    约等于没有误差

串口模式图

五、如何计算波特率

参考STC89C52手册P235

六、串口中断函数

中断函数(函数可自由命名,但是要加上中断号"interrupt 4")

void UART_Routine(void) interrupt 4      
{if (TI==1)				//检测串口1发送中断{//功能......TI = 0;			//清除串口1发送中断请求位}if (RI==1)				//检测串口1接收中断{//功能......RI = 0;			//清除串口1接收中断请求位}
}

中断函数查询表P166

七、模块化代码:

1.main.c

#include <REGX52.H>
#include "UART.h"unsigned char Sec=0;void main()
{UART_Init();while(1){}}/*** @brief  中断函数查询P166,函数命名可自由,但是要更上中断号"interrupt 4"* @param  无* @retval 无*/
void UART_Routine(void) interrupt 4      
{if(RI==1){P2=~SBUF;RI=0;}
}

2.UART.c

#include <REGX52.H>/*** @brief  串口初始化//4800bps@11.0592MHz* @param  无* @retval 无*/void UART_Init()			
{SCON=0x50;				//STC89C52操作手册P235方式1PCON &= 0x7F;			//波特率不倍速TMOD &= 0x0F;			//设置定时器1模式TMOD |= 0x20;			//设置定时器1模式TL1 = 0xFA;			//设置定时初始值TH1 = 0xFA;			//设置定时重载值ET1 = 0;			//禁止定时器中断TR1 = 1;			//定时器1开始计时//补上中断系统ES=1;EA=1;PS=0;
}/*** @brief  串口发送一个字节的数据* @param  Byte  要发送的一个字节数据* @retval 无*/void UART_SendByte(unsigned char Byte)
{SBUF=Byte;while(TI==0);			//TI=0,数据完整发送出去,TI=1,跳出循环TI=0;			//TI=0,使用软件复位}

3.UART.h

#ifndef __UART_H__
#define __UART_H__void UART_Init();void UART_SendByte(unsigned char Byte);#endif

http://www.lryc.cn/news/397210.html

相关文章:

  • Java中的消息中间件选择与比较
  • react基础语法,模板语法,ui渲染,jsx,useState状态管理
  • OJ-0710
  • 人工智能在自动驾驶中的目标检测研究
  • 【合并两个有序数组】
  • 链表 OJ(一)
  • 《Linux与Windows文件系统的区别》
  • 批量修改Git历史commit信息中的username
  • LabVIEW与ABB工业机器人据监控
  • c++栈内存和堆内存的基本使用
  • 快速入门,springboot知识点汇总
  • Ubuntu20.04系统非root用户安装GAMIT10.71
  • stm32 开发板可以拿来做什么?
  • latex英文转中文word,及一些latex相关工具分享
  • EasyOCR: 简单易用的多语言OCR工具
  • arm架构安装chrome
  • ETAS工具导入Com Arxml修改步骤
  • Apache Kylin模型构建全解析:深入理解大数据的多维分析
  • element-plus的文件上传组件el-upload
  • 等保测评视角下的哈尔滨智慧城市安全框架构建
  • Java中的数据缓存技术及其应用
  • SQL 索引
  • free第一次成功,第二次失败
  • 各种音频处理器
  • 深度学习探秘:Transformer模型跨框架实现大比拼
  • 京准电钟:云计算中NTP网络时间服务器的作用是什么?
  • Apache中使用CGI
  • 宏任务与微任务对比【前端异步】
  • Autogen和LangGraph对比
  • uniapp vue3微信小程序如何获取dom元素