(学习日记)2023.4.10

写在前面:
由于时间的不足与学习的碎片化,写博客变得有些奢侈。
但是对于记录学习(忘了以后能快速复习)的渴望一天天变得强烈。
既然如此
不如以天为单位,以时间为顺序,仅仅将博客当做一个知识学习的目录,记录笔者认为最通俗、最有帮助的资料,并尽量总结几句话指明本质,以便于日后搜索起来更加容易。


标题的结构如下:“类型”:“知识点”——“简短的解释”
部分内容由于保密协议无法上传。


点击此处进入学习日记的总目录

一、51:串口通信

  1. 设置串口初始化,根据板子的参数更改设置
    在这里插入图片描述
    由于直接设4800误差太大,2400误差为0.16,所以可以用2400翻倍得到4800

在这里插入图片描述

在这里插入图片描述

(PS:由于个人的板子问题,4800总是出现乱码,所以下文实际使用的为9600

此时,初始化的函数如下:

#define FOSC 12000000L     // 系统频率为12MHz
#define BAUD 9600          // 波特率为9600
void UartInit(void)		
{
	PCON |= 0x80;         // SMOD = 1,波特率加倍
	SCON = 0x50;          // 8位数据位,允许接收,模式1
  	TMOD &= 0x0F;         // 定时器1模式设为8位自动重载
  	TMOD |= 0x20;
  	TH1 = TL1 = -(FOSC/12/16/BAUD); // 定时器1初始值 (等同用0xFF-(FOSC/12/16/BAUD))
  	TR1 = 1;              // 启动定时器1
  	ES = 1;               // 开启串口中断
  	EA = 0;               // 全局中断关闭
}

其中,PCON打开B7:控制SMOD翻倍
在这里插入图片描述
在这里插入图片描述
SCON设为 0x50:控制数据位数,并允许接收
在这里插入图片描述
TMOD 高四位先置0,然后将定时器的M11:打开定时器1,并设置定时器1的模式
在这里插入图片描述
在这里插入图片描述

  1. 编写 串口发送数据函数
/*
发送数字
Byte:发送内容
*/
void UART_SendByte(unsigned char Byte)
{
	SBUF = Byte;                    // 将数据放入发送缓冲区
  	while(!TI);                    // 等待发送完成
  	TI = 0;                        // 清除发送完成标志位
}

在这里插入图片描述

SBUF
在这里插入图片描述
TI:发送控制器
TI1时,说明正在发送;当TI0时,说明发送完成;
TI需要软件置0,所以最后加上 TI=0;

  1. (拓展)编写 串口发送数据串函数
#include <string.h>

/*
发送字符串
String[]:字符串内容
*/
void UART_SendString(unsigned char *str)
{
	unsigned char i = 0;
	for (i = 0; i < strlen(str); i++)
		UART_SendByte(str[i]);
	UART_SendByte('\n');
}

二、51:串口发送出现低时延相同十六进制数字

  1. PC端接收数据如图所示:
    在这里插入图片描述
    而程序如下所示,很明显系统出现了一些错误,只能重复的输出第一个字符。
UART_SendString("bobobobobo");
  1. 解决问题
    经过排查,终于发现了问题源自 全局中断
    在这里插入图片描述
在初始化程序中,将:
EA = 1;               // 全局中断开启
改为
EA = 0;               // 全局中断关闭
即可避免上述问题

三、51:串口发送中文汉字

只需要将汉字放到 UART_SendString()函数中即可,如:

UART_SendString("啵啵啵,中午吃什么呢"); 

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

YunB西风英

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值