> 文章列表 > (学习日记)2023.4.10

(学习日记)2023.4.10

(学习日记)2023.4.10

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

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

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

2023.4.10

  • 一、51:串口通信
  • 二、51:串口发送出现低时延相同十六进制数字
  • 三、51:串口发送中文汉字

一、51:串口通信

  1. 设置串口初始化,根据板子的参数更改设置
    (学习日记)2023.4.10
    由于直接设4800误差太大,2400误差为0.16,所以可以用2400翻倍得到4800

(学习日记)2023.4.10

(学习日记)2023.4.10

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

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

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

其中,PCON打开B7:控制SMOD翻倍
(学习日记)2023.4.10
(学习日记)2023.4.10
SCON设为 0x50:控制数据位数,并允许接收
(学习日记)2023.4.10
TMOD 高四位先置0,然后将定时器的M11:打开定时器1,并设置定时器1的模式
(学习日记)2023.4.10
(学习日记)2023.4.10

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

(学习日记)2023.4.10

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

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

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

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

(学习日记)2023.4.10