写在前面:
由于时间的不足与学习的碎片化,写博客变得有些奢侈。
但是对于记录学习(忘了以后能快速复习)的渴望一天天变得强烈。
既然如此
不如以天为单位,以时间为顺序,仅仅将博客当做一个知识学习的目录,记录笔者认为最通俗、最有帮助的资料,并尽量总结几句话指明本质,以便于日后搜索起来更加容易。
标题的结构如下:“类型”:“知识点”——“简短的解释”
部分内容由于保密协议无法上传。
点击此处进入学习日记的总目录
2023.4.10
- 一、51:串口通信
- 二、51:串口发送出现低时延相同十六进制数字
- 三、51:串口发送中文汉字
一、51:串口通信
- 设置串口初始化,根据板子的参数更改设置
由于直接设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
,然后将定时器的M1
置1
:打开定时器1
,并设置定时器1
的模式
- 编写 串口发送数据函数
/*
发送数字
Byte:发送内容
*/
void UART_SendByte(unsigned char Byte)
{
SBUF = Byte; // 将数据放入发送缓冲区
while(!TI); // 等待发送完成
TI = 0; // 清除发送完成标志位
}
SBUF
:
TI
:发送控制器
当TI
为1
时,说明正在发送;当TI
为0
时,说明发送完成;
TI
需要软件置0
,所以最后加上TI=0;
- (拓展)编写 串口发送数据串函数
#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:串口发送出现低时延相同十六进制数字
PC端
接收数据如图所示:
而程序如下所示,很明显系统出现了一些错误,只能重复的输出第一个字符。
UART_SendString("bobobobobo");
- 解决问题
经过排查,终于发现了问题源自全局中断
在初始化程序中,将:
EA = 1; // 全局中断开启
改为
EA = 0; // 全局中断关闭
即可避免上述问题
三、51:串口发送中文汉字
只需要将汉字放到 UART_SendString()
函数中即可,如:
UART_SendString("啵啵啵,中午吃什么呢");