嵌入式作业十三(汉字点阵与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秒左右。

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

时间 = 文件大小/波特率

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

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

三、用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屏显-优快云博客icon-default.png?t=N7T8https://blog.youkuaiyun.com/qq_68517348/article/details/134422625

汉字点阵与OLED屏显示-优快云博客icon-default.png?t=N7T8https://blog.youkuaiyun.com/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电脑间串口连接传输文件-优快云博客icon-default.png?t=N7T8https://blog.youkuaiyun.com/weixin_56102526/article/details/121176070

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值