嵌入式作业十三(汉字点阵与OLED屏显)

题目:

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"的文本文件

1、文件准备

2、代码编写

3、结果

四、OLED屏显和汉字点阵编码

1、显示学号姓名

1.源码下载

2.字模准备

3.修改代码

4.烧录结果

2、显示温湿度

1.创建STM32CubMX工程

2.字模准备

3.代码合成改编

4.烧录结果

3、滑动显示长字符

1、字模准备

2、代码编写

3、编译烧录

4、结果

五、参考资料


一、 串口传输文件的练习

波特率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秒左右。

故得到波特率,时间,文件大小的关系为:

时间 = 文件大小/波特率

二、汉字的机内码、区位码编码规则和字形数据存储格式

【精选】点阵汉字的字模读取与显示_汉字字模码怎么看-CSDN博客

三、用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屏显-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/qq_68517348/article/details/134422625

汉字点阵与OLED屏显示-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/wakeup_high/article/details/134387755?spm=1001.2014.3001.5502

STM32 —— 读取 AHT20 数据到 OLED 屏幕 - ppqppl - 博客园 (cnblogs.com)icon-default.png?t=N7T8https://www.cnblogs.com/ppqppl/articles/16914182.html电脑间串口连接传输文件-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/weixin_56102526/article/details/121176070

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
嵌入式STM32F103项目实例是通过使用STM32F103C8T6芯片来实现OLED幕显示和汉字点阵编码的原理。可以使用STM32F103的SPI或IIC接口来实现显示学号和姓名,显示AHT20的温湿度,并实现滑动显示长字符的功能。\[2\] 在实际操作中,需要在oledfont.h文件中添加文字字模,并在test.c文件中对函数Test_MainPage进行修改,以实现显示梅花香自苦寒来的汉字。\[1\] 在项目实操过程中,可能会遇到一些挑战。例如,姓名与学号的显示可能会比较顺利,滚动字幕的实现也不太难,但显示AHT20的温度和湿度可能会遇到一些问题。这可能是因为电压需要给予5V,并且可能会出现接触不良导致无法采集数据的情况。通过反复调试代码、查阅资料和细心操作,最终可以成功实现功能。\[2\] 嵌入式开发是一个具有挑战性的过程,但当最终成功时,会感到内心的喜悦。这个过程可能会让人热泪盈眶,但也充满了成长的喜悦。\[2\] 在实现嵌入式STM32F103项目实例时,需要学习和理解STM32F103系列芯片的地址映射和寄存器映射原理,以及GPIO端口的初始化设置步骤,包括时钟配置、输入输出模式设置和最大速率设置。可以参考网上的资料来加深理解。\[3\] 希望这个项目实例能够给你带来启发和帮助,祝你在嵌入式开发的道路上取得更多的成就!\[2\] #### 引用[.reference_title] - *1* *2* [【嵌入式系统开发18】理解OLED屏显汉字点阵编码原理,STM32F103实现OLED屏显实例](https://blog.csdn.net/qq_52199251/article/details/127658793)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [【嵌入式】STM32F103寄存器方式点亮LED流水灯](https://blog.csdn.net/qq_57611233/article/details/120923883)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值