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

目录

一、功能实现

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

2.点亮4个LED

二、注意事项

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

2.串口要对应

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

4.有无校验位和停止位

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

1.以本程序为例

2.生成代码如下

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

根据原理图

配置代码

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

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

串口模式图

五、如何计算波特率

参考STC89C52手册P235

六、串口中断函数

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

中断函数查询表P166

七、模块化代码:

1.main.c

2.UART.c

3.UART.h


一、功能实现

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

ca74ab64fe7c4ac58a40be88711e20af.png

2.点亮4个LED

b729529787664d8da1da9b7d5fa59acf.jpeg

二、注意事项

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

6befa0172c5243deb351b17fc97f7430.png

2.串口要对应

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

4.有无校验位和停止位

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

1.以本程序为例

0587cad36c784808a4c7eb979b136aa7.png

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.需要手动配置中断系统

根据原理图

8eaa18c3ed5e434cbcc04b30ee58f113.png

配置代码

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

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

void UART_Init()			
{
	//由软件自动生成
    SCON=0x50;				//STC89C52操作手册P235方式1
	PCON &= 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
    约等于没有误差

串口模式图

2dec9404953f42a5b6b26b2d91ee19f7.png

五、如何计算波特率

参考STC89C52手册P235

b632e176e1e449dcad0f0da5aba7b749.png

六、串口中断函数

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

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

中断函数查询表P166

0e03338fb5594159aa2641f3f029d6a7.png

七、模块化代码:

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方式1
	PCON &= 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

  • 5
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值