题目:
1. 串口传输文件的练习。将两台笔记本电脑,借助 usb转rs232 模块和杜邦线,建立起串口连接。然后用串口助手等工具软件(带文件传输功能)将一台笔记本上的一个大文件(图片、视频和压缩包软件)传输到另外一台电脑,预算文件大小、波特率和传输时间三者之间的关系,并对比实际传输时间。
2. 学习理解汉字的机内码、区位码编码规则和字形数据存储格式。在Ubuntu下用C/C++(或python) 调用opencv库编程显示一张图片,并打开一个名为"logo.txt"的文本文件(其中只有一行文本文件,包括你自己的名字和学号),按照名字和学号去读取汉字24*24点阵字形字库(压缩包中的文件HZKf2424.hz)中对应字符的字形数据,将名字和学号叠加显示在此图片右下位置。
3. 理解OLED屏显和汉字点阵编码原理,使用STM32F103的SPI或IIC接口实现以下功能:
1) 显示自己的学号和姓名;
2) 显示AHT20的温度和湿度;
3) 上下或左右的滑动显示长字符,比如“Hello,欢迎来到重庆交通大学物联网205实训室!”或者一段歌词或诗词(最好使用硬件刷屏模式)。
目录
三、用opencv库编程显示一张图片,并打开一个名为"logo.txt"的文本文件
一、 串口传输文件的练习
波特率115200 = 115200 (位/秒)
如果没有校验位,就应该除以 10,得到的是每秒字节数: 波特率115200 = 115200 (位/秒) = 11520 (字节/秒)
再除以 1024,就是每秒 KB 数: 波特率115200 = 115200 (位/秒) = 11.25 (KB/秒)也就是满足每秒可以接收512字节
如果传输183340字节,就需要183340/11520=15.914s。实际上为:
修改波特率为9600=9600(位/秒)。需要183340/960=190.98s,即3分10秒左右。
故得到波特率,时间,文件大小的关系为:
时间 = 文件大小/波特率
二、汉字的机内码、区位码编码规则和字形数据存储格式
【精选】点阵汉字的字模读取与显示_汉字字模码怎么看-优快云博客
三、用opencv库编程显示一张图片,并打开一个名为"logo.txt"的文本文件
1、文件准备
新建文件夹加入以下文件:
安装opencv:
2、代码编写
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_SPI2_Init();
MX_I2C1_Init();
OLED_Init();
OLED_Clear(0);
OLED_WR_Byte(0x2E, OLED_CMD);//¹Ø±Õ¹ö¶¯
OLED_WR_Byte(0x27,OLED_CMD);//ˮƽÏò×ó»òÕßÏòÓÒ¹ö¶¯
OLED_WR_Byte(0x00,OLED_CMD);//ÐéÄâ×Ö½Ú
OLED_WR_Byte(0x00,OLED_CMD);//Æðʼҳ0
OLED_WR_Byte(0x07,OLED_CMD);//¹ö¶¯Ê±¼ä¼ä¸ô
OLED_WR_Byte(0x07,OLED_CMD);//ÖÕÖ¹Ò³7
OLED_WR_Byte(0x00,OLED_CMD);
OLED_WR_Byte(0xFF,OLED_CMD);
GUI_ShowCHinese(10,20,16,"事了拂衣去,深藏身与名。",1);
HAL_Delay(1500);
HAL_Delay(1500);
OLED_WR_Byte(0x2F,OLED_CMD);
}
3、结果
四、OLED屏显和汉字点阵编码
1、显示学号姓名
1.源码下载
源码下载:
0.96inch SPI OLED Module - LCD wiki
2.字模准备
将其粘贴到oledfont.h中的typFNT_GB16 cfont16[]里面
3.修改代码
main.c
test.c--->TEST_MainPage(void)
4.烧录结果
2、显示温湿度
1.创建STM32CubMX工程
RCC配置
SYS配置:
SPI1配置:
I2C配置:
时钟配置:
引脚配置:
2.字模准备
3.代码合成改编
将之前温湿度实验和上一个OLED显示实验中的gui.c,oled.c,AHT20-21_DEMO_V1_3.c等添加进项目代码中:
代码修改
main.c
1、头函数
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "i2c.h"
#include "spi.h"
#include "usart.h"
#include "gpio.h"
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include <stdio.h>
#include "oled.h"
#include "gui.h"
#include "AHT20-21_DEMO_V1_3.h"
2、变量声明
char strTemp[100];//存储字符串温度
char strHumi[100];//存储字符串湿度
uint32_t CT_data[2]={0,0};
volatile int c1,t1;
3、main函数中的初始化
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_I2C1_Init();
MX_SPI2_Init();
MX_USART1_UART_Init();
/* USER CODE BEGIN 2 */
OLED_Init();
OLED_Clear(0);
AHT20_Init();
Delay_1ms(500);
/* USER CODE END 2 */
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET);//用来查看程序执行流程的,程序执行后会熄灭小灯,如果卡死,则小灯不会熄灭。
/* Infinite loop */
/* USER CODE BEGIN WHILE */
4、while循环
while (1)
{
/* USER CODE END WHILE */
/* USER CODE END WHILE */
//GUI_ShowCHinese(16,20,16,"È«¶¯",1);
AHT20_Read_CTdata_crc(CT_data); //crc???,??AHT20????????
c1 = CT_data[0]*1000/1024/1024; //???????c1(???10?)
t1 = CT_data[1]*2000/1024/1024-500;//???????t1(???10?)
printf("温度%d%d.%d",t1/100,(t1/10)%10,t1%10);
sprintf((char *)strTemp, "%.1f",t1/10+(t1%10)*0.1);
GUI_ShowCHinese(16,20,16,"温度:",1);
GUI_ShowString(53,20,(uint8_t*)strTemp,16,1);
sprintf((char *)strHumi, "%.1f", c1/10+(c1%10)*0.1);
GUI_ShowCHinese(16,38,16,"湿度:",1);
GUI_ShowString(53,38,(uint8_t*)strHumi,16,1);
printf("湿度%d%d.%d",c1/100,(c1/10)%10,c1%10);
printf("\r\n");
HAL_Delay(3000);
OLED_Clear(0);
}
5、串口重定向
int fputc(int ch,FILE *f)
{
HAL_UART_Transmit(&huart1,(uint8_t *)&ch,1,0xFFFF);
return ch;
}
//这个一定要勾选use microlib
4.烧录结果
3、滑动显示长字符
1、字模准备
2、代码编写
在显示学号姓名项目中更改
test.c-->void TEST_MainPage(void)
void TEST_MainPage(void)
{
GUI_ShowCHinese(28,20,16,"苔花如米小,也学牡丹开",1);
delay_ms(1500);
delay_ms(1500);
}
const typFNT_GB16 cfont16[]
const typFNT_GB16 cfont16[] =
{
"苔",0x08,0x20,0x08,0x20,0xFF,0xFE,0x08,0x20,0x04,0x00,0x08,0x20,0x10,0x10,0x3F,0xF8,
0x00,0x08,0x00,0x00,0x1F,0xF0,0x10,0x10,0x10,0x10,0x10,0x10,0x1F,0xF0,0x10,0x10,/*"苔",0*/
"花",0x08,0x20,0x08,0x20,0xFF,0xFE,0x08,0x20,0x00,0x00,0x08,0x88,0x08,0x90,0x10,0xA0,
0x30,0xC0,0x50,0x80,0x91,0x80,0x12,0x82,0x14,0x82,0x10,0x82,0x10,0x7E,0x10,0x00,/*"花",1*/
"如",0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x7C,0xFE,0x44,0x22,0x44,0x22,0x44,0x22,0x44,
0x42,0x44,0x24,0x44,0x14,0x44,0x08,0x44,0x14,0x44,0x22,0x7C,0x42,0x44,0x80,0x00,/*"如",2*/
"米", 0x01,0x00,0x21,0x08,0x11,0x08,0x09,0x10,0x09,0x20,0x01,0x00,0x7F,0xFC,0x03,0x80,
0x05,0x40,0x05,0x40,0x09,0x20,0x11,0x10,0x21,0x08,0xC1,0x06,0x01,0x00,0x01,0x00,/*"米",3*/
"小",0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x11,0x10,0x11,0x08,0x11,0x04,
0x21,0x04,0x21,0x02,0x41,0x02,0x81,0x02,0x01,0x00,0x01,0x00,0x05,0x00,0x02,0x00,/*"小",4*/
",",0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x30,0x00,0x10,0x00,0x20,0x00,0x00,0x00,/*",",5*/
"也", 0x01,0x00,0x01,0x00,0x11,0x00,0x11,0x30,0x11,0xD0,0x17,0x10,0x39,0x10,0xD1,0x10,
0x11,0x10,0x11,0x50,0x11,0x20,0x11,0x02,0x10,0x02,0x10,0x02,0x0F,0xFE,0x00,0x00,/*"也",6*/
"学",0x22,0x08,0x11,0x08,0x11,0x10,0x00,0x20,0x7F,0xFE,0x40,0x02,0x80,0x04,0x1F,0xE0,
0x00,0x40,0x01,0x80,0xFF,0xFE,0x01,0x00,0x01,0x00,0x01,0x00,0x05,0x00,0x02,0x00,/*"学",7*/
"牡",0x08,0x20,0x08,0x20,0x48,0x20,0x48,0x20,0x7E,0x20,0x48,0x20,0x89,0xFC,0x08,0x20,
0x0E,0x20,0xF8,0x20,0x48,0x20,0x08,0x20,0x08,0x20,0x08,0x20,0x0B,0xFE,0x08,0x00,/*"牡",8*/
"丹",0x00,0x00,0x1F,0xF0,0x10,0x10,0x10,0x10,0x12,0x10,0x11,0x10,0x11,0x10,0x10,0x10,
0xFF,0xFE,0x10,0x10,0x10,0x10,0x10,0x10,0x20,0x10,0x20,0x10,0x40,0x50,0x80,0x20,/*"丹",9*/
"开",0x00,0x00,0x7F,0xFC,0x08,0x20,0x08,0x20,0x08,0x20,0x08,0x20,0x08,0x20,0xFF,0xFE,
0x08,0x20,0x08,0x20,0x08,0x20,0x08,0x20,0x10,0x20,0x10,0x20,0x20,0x20,0x40,0x20,/*"开",10*/
};
mian.c
#include "delay.h"
#include "sys.h"
#include "oled.h"
#include "gui.h"
#include "test.h"
int main(void)
{
delay_init();
NVIC_Configuration();
OLED_Init();
OLED_Clear(0);
OLED_WR_Byte(0x2E, OLED_CMD);
OLED_WR_Byte(0x27,OLED_CMD);
OLED_WR_Byte(0x00,OLED_CMD);
OLED_WR_Byte(0x00,OLED_CMD);
OLED_WR_Byte(0x07,OLED_CMD);
OLED_WR_Byte(0x07,OLED_CMD);
OLED_WR_Byte(0x00,OLED_CMD);
OLED_WR_Byte(0xFF,OLED_CMD);
TEST_MainPage();
OLED_WR_Byte(0x2F,OLED_CMD);
}
3、编译烧录
4、结果
五、参考资料
汉字点阵与OLED屏显-优快云博客https://blog.youkuaiyun.com/qq_68517348/article/details/134422625
STM32 —— 读取 AHT20 数据到 OLED 屏幕 - ppqppl - 博客园 (cnblogs.com)https://www.cnblogs.com/ppqppl/articles/16914182.html电脑间串口连接传输文件-优快云博客
https://blog.youkuaiyun.com/weixin_56102526/article/details/121176070