【毕业设计】基于STM32的无线WIFI投影设计(解析BMP、TCP通讯)
目录
0 引言
1 硬件设计
框图:
2 软件设计
main.c
bitmap.c
3 重点难点(BMP文件格式解析、内存与屏幕显示的对应)
4 写在最后
0 引言
有幸做过一个无线传输的设计,有关BMP文件格式在STM32上的解析,更难的在于文件中图片的像素值与屏幕的一一对应关系,在这里跟大家分享出来。
1 硬件设计
这里没有什么难点,简要说明。
- STM32主控与屏幕使用IIC总线连接。
- STM32主控与ESP-01S无线透传模块通过串口进行连接。
- 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通讯)相关推荐
- 基于数字电路交通灯信号灯控制系统设计-基于单片机病房温度监测与呼叫系统设计-基于STM32的无线蓝牙心电监护仪系统设计-基于STM32的智能蓝牙温控风扇控制设计-基于STM32的智能温室控制系统设计
1617基于数字电路交通灯信号灯控制系统设计(仿真电路,论文报告) 摘 要:交通灯控制系统在城市交通控制中发挥着重要的作用,本次课程设计就是以城市交通灯控制系统为背景的,主要通过运用学过的数字电路 ...
- 基于STM32的多功能MP3设计 毕业设计(论文)开题报告
中国计量学院 毕业设计(论文)开题报告 学生姓名:卢杰学 号:XXXXXXXXX 专 业:电子科学与技术 班 级:10电子1 设计(论文)题目: 基于STM32的多功能MP3设计 指导教师 ...
- (毕业设计资料)基于STM32的物联网WiFi智能家居控制系统
092[电路方案]基于STM32的物联网WiFi智能家居控制系统 功能: 1.可以检测环境中温湿度,气压,一氧化碳,空气质量,烟雾浓度和光照强度. 2.将测量的值显示在屏幕上,数据上报机智云平台可以通 ...
- 单片机毕业设计 基于stm32的病房呼叫系统
文章目录 1 简介 2 绪论 2.1 课题背景 3 系统设计 3.1 系统架构 3.2 主程序设计 3.3 语音模块程序设计 3.4 显示模块程序设计 3.5 键盘模块程序设计 3.6 无线传输模块程 ...
- 最简单DIY基于STM32单片机的WIFI智能小车设计方案
STM32库函数开发系列文章目录 第一篇:STM32F103ZET6单片机双串口互发程序设计与实现 第二篇:最简单DIY基于STM32单片机的蓝牙智能小车设计方案 第三篇:最简单DIY基于STM32F ...
- 毕业设计 基于stm32的灯光控制系统 物联网
基于stm32的灯光控制系统 本次设计的是基于STM32F103C8T6单片机设计的一款教室灯光控制系统 系统内有光敏电阻模块采集教室内的光照强度,光电管检测教室内是否有人 通过按键可以直接控制开灯和 ...
- 基于stm32自动伸缩雨伞的设计与实现
基于stm32自动伸缩雨伞的设计与实现 **==整篇文章字数有一万三左右,图片太多了,实在是懒得全部放在这上面来,太废时间了.完整论文可通过q963160156获得,也可在微信公众号 *高级嵌入式软件 ...
- 基于STM32的智能温室控制系统仿真电路设计(温控补光)-基于STM32的智能蓝牙温控风扇控制系统设计-基于STM32的无线蓝牙心电监护仪系统设计【毕设课设分享】
1609 基于STM32的智能蓝牙温控风扇控制系统设计-毕设课设 1.LCD1602液晶显示当前温度,温度上下限值,风扇等级,自动手动模式: 2.设置有4个按键,按键1可以设置自动和手动2种模式切换: ...
- 基于STM32的无线飞鼠(二)
基于STM32的无线飞鼠(二) 在前一篇博客中讲了下一些题外话,从本篇开始讲讲重点的知识,说说无线飞鼠过程用到的模块 细说MPU6050 一. MPU6050简介 二. 细节问题 三. 相关技术 四. ...
最新文章
- linux入门(三)常见Linux指令及其用法
- svcagent32.exe,javaM.exe木马查杀解决方案 (转Ad0.cn)
- Nuget常用命令(转)
- 如何开发一个异常检测系统:如何评价一个异常检测算法
- java 异常 过滤器_java-Spring:如何使过滤器引发自定义异常?
- Vim自动补全神器YouCompleteMe的配置
- Hadoop公司考试题(基础)
- python火车票查询系统_Python脚本实现12306火车票查询系统
- 【计算机网络】第一部分 概述(1) 数据通信和网络绪论
- pass样本量_基于PASS两样本均数比较的样本量计算
- 设计模式java 模板模式_设计模式-模板模式 JAVA实现
- SecureCRT http代理设置
- Python系列9——类和对象(3)
- 利用计算机金融诈骗,金融诈骗能追回钱款吗
- 百练:1042 Gone Fishing
- 苹果AppStore审核规则标准指南!
- 网站内容快速填充的技巧和方法
- 数学分析 - 隐函数
- ubuntu开机启动项
- 数独-图片定位分割数字
热门文章
- 一颗芯片的前世今生:何为低功耗
- Alfred v5.0.0-EA9 Mac效率神器 兼容 M1
- java - jstack java堆栈跟踪工具
- 《J2SE 回炉再造03》-------溺水狗
- 三维力控接入多比物联网云平台教程
- 解决wordpress的PC网站变为 手机自适应模板
- linux中的hda分区,请查资料了解这些术语:/dev/hda, /dev/hdb, /dev/sda, /dev/sdb, 他们之间有什么区别?...
- 手机归属地查询(云平台开发)
- 【JavaEE】Vincent's Understand of JPA(XMind Picture)
- STM32-H750利用USB虚拟端口(VCP)类进行数据发送的移植记录