目录

0 引言

1 硬件设计

框图:

2 软件设计

main.c

bitmap.c

3 重点难点(BMP文件格式解析、内存与屏幕显示的对应)

4 写在最后


0 引言

有幸做过一个无线传输的设计,有关BMP文件格式在STM32上的解析,更难的在于文件中图片的像素值与屏幕的一一对应关系,在这里跟大家分享出来。

1 硬件设计

这里没有什么难点,简要说明。

  1. STM32主控与屏幕使用IIC总线连接。
  2. STM32主控与ESP-01S无线透传模块通过串口进行连接。
  3. ULN2003驱动步进电机。(这里不赘述)

框图:

2 软件设计

直接上代码。

main.c

#include "sys.h"
#include "delay.h"
#include "usart.h"    #include "step_motor.h"
#include "oled.h"
#include "bmp.h"
#include "led.h"
#include "common.h"
#include "malloc.h"
#include "bitmap.h"int main(void)
{   vu16 t = 0,cnt = 0;u8 constate=0;    //连接状态u8 res = 0;NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级delay_init();           //延时函数初始化    uart_init(115200);     //串口初始化为115200LED_Init();Step_Motor_GPIO_Init();mem_init();                //初始化内存池OLED_Init();OLED_ColorTurn(0);//0正常显示,1 反色显示OLED_DisplayTurn(1);//0正常显示 1 屏幕翻转显示//--------------------开始WIFI配置----------------------//while(atk_8266_send_cmd("AT","OK",20))//检查WIFI模块是否在线{  atk_8266_quit_trans();//退出透传atk_8266_send_cmd("AT+CIPMODE=0","OK",20);  //关闭透传模式  delay_ms(800);}delay_ms(200);while(atk_8266_send_cmd("ATE0","OK",20));//关闭回显    atk_8266_wifista_tcp();//--------------------结束WIFI配置----------------------//
/*  OLED_ShowChinese(0,0,0,16,1);OLED_ShowChinese(16,0,1,16,1);OLED_ShowChinese(32,0,2,16,1);*/OLED_ShowString(0,0,"SSID:ESP8266",16,1);OLED_ShowString(0,16,"KEY:1234567890",16,1);OLED_ShowString(0,32,"IP:192.168.4.1",16,1);OLED_ShowString(0,48,"Port:8086",16,1);while(1){            delay_ms(10);OLED_Refresh();if(USART_RX_STA&0X8000)     //接收到一次数据了{ res = getDataFromUart();//  +IPD,0,1088:BM>......if(res)//若收到数据{res = 0;getBitmapInfo(bitmap_buf);}
//          rlen=USART_RX_STA&0X7FFF;  //得到本次接收到的数据长度
//          USART_RX_BUF[rlen]=0;      //添加结束符
//          printf("%s",USART_RX_BUF);    //发送到串口   //sprintf((char*)p,"收到%d字节,内容如下",rlen);//接收到的字节数  USART_RX_STA=0;if(constate!='+')cnt=200;        //状态为还未连接,立即更新连接状态else cnt=0;                   //状态为已经连接了,10秒后再检查}  cnt++;t++;if(cnt>=200)//连续10秒钟没有收到任何数据,检查连接是不是还存在.{constate=atk_8266_consta_check();//得到连接状态cnt=0;}if(t==10){t = 0;LED = !LED;}
//      OLED_Clear();}
}

bitmap.c

#include "malloc.h"
#include "bitmap.h"
#include "oled.h"u8 bitmap_buf[1088];/****获取bmp格式文件信息*********/
/*  返回值     0   成功          */
/*          1   失败          */
/*      入口参数    缓冲区首地址*/
/********************************/
u16 getBitmapInfo(u8 *ptr)
{BITMAP_FILE_HEADER *fileHead;//文件头BITMAP_INFO_HEADER *infoHead;//信息头vu8 buf;vu8 buff=0x00;u8 *display_buf;u8 *p;volatile int i,j,k,l;fileHead = (BITMAP_FILE_HEADER*)ptr;infoHead = (BITMAP_INFO_HEADER*)(ptr + sizeof(BITMAP_FILE_HEADER));if(fileHead->bfType != 0x4D42)//验证文件头{return 1;//返回失败}if(infoHead->biWidth != 128 || infoHead->biHeight != 64)//验证图片大小{return 1;//返回失败}display_buf = (u8*)mymalloc(infoHead->biSizeImage);//申请1024字节的内存用于存储p = display_buf;for(i=63;i>=0;i=i-8)//这里将bmp格式转换为oled可以识别的字节顺序{for(j=0;j<16;j++){for(l = 0;l<8;l++){buff = 0;for(k=0;k<8;k++){buf = ((u8(*)[16])(ptr+fileHead->bfOffBits))[i-k][j];if(((~buf)&(0x80>>l))){buff |= 1<<k;}else{buff &= ~(1<<k);}}*p++ = buff;if(p-display_buf>1023){p = display_buf;}}}}OLED_ShowPicture(0,0,128,64,display_buf,1);myfree(display_buf);return 0;
}

3 重点难点(BMP文件格式解析、内存与屏幕显示的对应)

光有代码没有用,主要是当时提取BMP文件的图片信息就耗费了很长时间;另外,还需要将像素矩阵的顺序跟屏幕刷新时的顺序相对应,具体要看用的什么屏幕驱动,这里是将像素矩阵转置后再把每行倒序输入进屏幕缓存就可以。

注:每个屏幕驱动都不一样,历经1年多我也忘记我的是什么顺序了,反正就是要调整顺序的意思。

首先,判断是都未BMP文件,判断文件头。

 if(fileHead->bfType != 0x4D42)//验证文件头{return 1;//返回失败}

然后,判断图片大小,因为是128x64的屏幕,因此我这里只显示128x64的图片。

 if(infoHead->biWidth != 128 || infoHead->biHeight != 64)//验证图片大小{return 1;//返回失败}

最后,重中之重,提取BMP文件的像素并转换成屏幕可以识别的顺序。(笨办法,多重for循环之术

    display_buf = (u8*)mymalloc(infoHead->biSizeImage);//申请1024字节的内存用于存储p = display_buf;for(i=63;i>=0;i=i-8)//这里将bmp格式转换为oled可以识别的字节顺序{for(j=0;j<16;j++){for(l = 0;l<8;l++){buff = 0;for(k=0;k<8;k++){buf = ((u8(*)[16])(ptr+fileHead->bfOffBits))[i-k][j];if(((~buf)&(0x80>>l))){buff |= 1<<k;}else{buff &= ~(1<<k);}}*p++ = buff;if(p-display_buf>1023){p = display_buf;}}}}OLED_ShowPicture(0,0,128,64,display_buf,1);myfree(display_buf);

4 写在最后

难点解决了就很简单了,就是通过TCP将图片传输过来,单片机收到数据后进行数据解析。

演示视频稍后放出。


各位大佬,码字不易,如果需要完整代码,可以交流联系。

【毕业设计】基于STM32的无线WIFI投影设计(解析BMP、TCP通讯)相关推荐

  1. 基于数字电路交通灯信号灯控制系统设计-基于单片机病房温度监测与呼叫系统设计-基于STM32的无线蓝牙心电监护仪系统设计-基于STM32的智能蓝牙温控风扇控制设计-基于STM32的智能温室控制系统设计

    1617基于数字电路交通灯信号灯控制系统设计(仿真电路,论文报告)  摘  要:交通灯控制系统在城市交通控制中发挥着重要的作用,本次课程设计就是以城市交通灯控制系统为背景的,主要通过运用学过的数字电路 ...

  2. 基于STM32的多功能MP3设计 毕业设计(论文)开题报告

    中国计量学院 毕业设计(论文)开题报告 学生姓名:卢杰学 号:XXXXXXXXX 专    业:电子科学与技术 班    级:10电子1 设计(论文)题目: 基于STM32的多功能MP3设计 指导教师 ...

  3. (毕业设计资料)基于STM32的物联网WiFi智能家居控制系统

    092[电路方案]基于STM32的物联网WiFi智能家居控制系统 功能: 1.可以检测环境中温湿度,气压,一氧化碳,空气质量,烟雾浓度和光照强度. 2.将测量的值显示在屏幕上,数据上报机智云平台可以通 ...

  4. 单片机毕业设计 基于stm32的病房呼叫系统

    文章目录 1 简介 2 绪论 2.1 课题背景 3 系统设计 3.1 系统架构 3.2 主程序设计 3.3 语音模块程序设计 3.4 显示模块程序设计 3.5 键盘模块程序设计 3.6 无线传输模块程 ...

  5. 最简单DIY基于STM32单片机的WIFI智能小车设计方案

    STM32库函数开发系列文章目录 第一篇:STM32F103ZET6单片机双串口互发程序设计与实现 第二篇:最简单DIY基于STM32单片机的蓝牙智能小车设计方案 第三篇:最简单DIY基于STM32F ...

  6. 毕业设计 基于stm32的灯光控制系统 物联网

    基于stm32的灯光控制系统 本次设计的是基于STM32F103C8T6单片机设计的一款教室灯光控制系统 系统内有光敏电阻模块采集教室内的光照强度,光电管检测教室内是否有人 通过按键可以直接控制开灯和 ...

  7. 基于stm32自动伸缩雨伞的设计与实现

    基于stm32自动伸缩雨伞的设计与实现 **==整篇文章字数有一万三左右,图片太多了,实在是懒得全部放在这上面来,太废时间了.完整论文可通过q963160156获得,也可在微信公众号 *高级嵌入式软件 ...

  8. 基于STM32的智能温室控制系统仿真电路设计(温控补光)-基于STM32的智能蓝牙温控风扇控制系统设计-基于STM32的无线蓝牙心电监护仪系统设计【毕设课设分享】

    1609 基于STM32的智能蓝牙温控风扇控制系统设计-毕设课设 1.LCD1602液晶显示当前温度,温度上下限值,风扇等级,自动手动模式: 2.设置有4个按键,按键1可以设置自动和手动2种模式切换: ...

  9. 基于STM32的无线飞鼠(二)

    基于STM32的无线飞鼠(二) 在前一篇博客中讲了下一些题外话,从本篇开始讲讲重点的知识,说说无线飞鼠过程用到的模块 细说MPU6050 一. MPU6050简介 二. 细节问题 三. 相关技术 四. ...

最新文章

  1. linux入门(三)常见Linux指令及其用法
  2. svcagent32.exe,javaM.exe木马查杀解决方案 (转Ad0.cn)
  3. Nuget常用命令(转)
  4. 如何开发一个异常检测系统:如何评价一个异常检测算法
  5. java 异常 过滤器_java-Spring:如何使过滤器引发自定义异常?
  6. Vim自动补全神器YouCompleteMe的配置
  7. Hadoop公司考试题(基础)
  8. python火车票查询系统_Python脚本实现12306火车票查询系统
  9. 【计算机网络】第一部分 概述(1) 数据通信和网络绪论
  10. pass样本量_基于PASS两样本均数比较的样本量计算
  11. 设计模式java 模板模式_设计模式-模板模式 JAVA实现
  12. SecureCRT http代理设置
  13. Python系列9——类和对象(3)
  14. 利用计算机金融诈骗,金融诈骗能追回钱款吗
  15. 百练:1042 Gone Fishing
  16. 苹果AppStore审核规则标准指南!
  17. 网站内容快速填充的技巧和方法
  18. 数学分析 - 隐函数
  19. ubuntu开机启动项
  20. 数独-图片定位分割数字

热门文章

  1. 一颗芯片的前世今生:何为低功耗
  2. Alfred v5.0.0-EA9 Mac效率神器 兼容 M1
  3. java - jstack java堆栈跟踪工具
  4. 《J2SE 回炉再造03》-------溺水狗
  5. 三维力控接入多比物联网云平台教程
  6. 解决wordpress的PC网站变为 手机自适应模板
  7. linux中的hda分区,请查资料了解这些术语:/dev/hda, /dev/hdb, /dev/sda, /dev/sdb, 他们之间有什么区别?...
  8. 手机归属地查询(云平台开发)
  9. 【JavaEE】Vincent's Understand of JPA(XMind Picture)
  10. STM32-H750利用USB虚拟端口(VCP)类进行数据发送的移植记录