一个用单片机放视频的小项目
总体设计思路
视频的播放实际上就是一系列的图片按照一定的顺序,以一定的时间间隔连续播放所产生的视觉效果。因此,使用单片机驱动LCD去播放视频实际上就是让单片机以一定的时间间隔向LCD的缓存推送图片,让其不断刷新屏幕去切换图片即可。在文章的最后我放入了这个项目的源工程文件供大家参考。
如果要同时播放音频那么就给单片机的管脚连入一个功放,单片机以音频电压不断给功放上电即可。由于单片机的频率只有1MHz,并且产生的也是方波信号,protues仿真效果不好,所以这里就没有加入声音的播放。
演示视频如下:
因此整个项目可以拆分成如下几部:
- 将视频剪裁缩放到该显示器大小,并且对视频内容进行二值化
- 将二值化后的视频流按照帧的顺序写入.h文件中方便读取
- 在protues仿真平台上连接电路
- 编写程序控制单片机不断向LCD写入图像。
1.处理视频
这里采用python进行视频的处理,使用了OpenCV对python支持的库对于视频进行操作,参考了一本关于OpenCV-python教程的书,我将该书的电子版放在这里,需要的同学可以自取。点击下载
这里将视频读入
源代码如下:
1 | import cv2 |
2.将帧数据写入.h文件
我们将上一步获取到的一些帧数据进行顺序排列并用','分隔即构成了我们需要显示视频的数据集。
接下了建立一个image.h文件,将所有数据粘贴到静态数组中:
这里要注意,我们采用的显示器分辨率为64 * 128共计8192个像素,每个像素的像素值为0/1,使用状态压缩将8个像素压缩到1B之后,每一帧占用的内存大小为8 * 128=1024B=1K。而protues仿真软件中,RAM最大为64K,考虑到还需要一部分空间来存放其他代码,所以这里最多可以存放62~63帧,视其他代码占用空间决定。
3.在protues上连接电路
选取的单片机为经典的AT89C51,显示器型号为AMPIPR128*64
这里连线采用标号的方式,方便连接和查看:
有关单片机管脚的含义和使用方法以及该LCD各个引脚的意义大家可以自行搜索学习,网上有很多相关的资料。
4.编写单片机的程序
要编写单片机驱动LCD的程序,我们需要了解该LCD各个引脚的作用和如何驱动它显示图像,同上,网上有很多相关的手册供大家自行查询。那么这里我们直接使用一个已经封装好的驱动文件对该显示器进行底层操作,我们只关注应用层面的逻辑即可。
源代码:
1 |
|
封装好的显示驱动.h文件
1 |
|
5.结束语(附工程下载链接)
该项目是博主大三时做的一个电子线路设计,给我最大的启发就是我们在生活中看起来复杂的项目,实际上其背后的原理是简单的,就如视频的播放一样。但同时,简单的事情是复杂的,之后在做语音识别的时候,采用自己提取的语音特征去分辨数字0-9,整体的识别率不到30%。因此,判断一件事难易程度不能凭空去想,而是要思考其运行机制和模块构成,分析其实现原理从而对于每个项目有清晰的认知。
工程文件下载:点击下载