1.系统实现的基本思路
系统基本思路框图如图1.0所示:
图1.0:系统的整体设计思路
1.1下位机设计思路 硬件:下位机硬件主要需要实现的是显示功能,光照采集功能,和灯光控制功能(按钮和灯),以及串口收发协议解析,在硬件上就需要一个显示设备, 还需要能够根据光照强度变化的传感器,也需要有人机交互的按键等。
软件部分:下位机的软件子功能主要分为按键的长按短按操作和LED的切换显示,LCD的驱动,以及串口的收发驱动,和计时功能。
2.系统硬件框图
系统硬件主要由微控制器,ADC0832,光敏电阻,按键,LCD1602以及串口转USB组成,硬件框图如图2.0所示:
图2.0:系统硬件框图
这里的显示设备选用LCD1602,显示效果比数码管更好,更丰富。可以在屏幕上指示模式和时间,以及一些界面切换的文字。光照采集部分使用低成本又简单可靠的光敏电阻方案,直接光敏电阻和电阻串联分压,根据电压不同检测光照不同,光敏电阻电阻不同。串口部分使用单片机的串口转USB和电脑上位机通讯,通讯协议自定。按键采用的是简单的弹簧按钮。灯光使用绿色LED代替。电源使用5V电源。
3.系统的软件框图
下位机:系统软件主要由四部分组成,计时,串口协议处理,光照检测,人机交互(按键和显示),具体流程如图3.0所示:
图3.0下位机软件流程图
上位机:整个系统由事件响应构成,在串口打开的情况下,定时器会定时发送心跳包,检测下位机是否连接,串口事件负责解析协议并刷新状态以及时间显示和状态灯光显示。
按钮事件主要是打开功能和发送命令系统软件流程图如图3.1所示:
图3.1上位机系统软件流程图
3.1通讯协议说明 通讯协议采用的是不定长编码方式由起始帧,命令位,数据,校验和,以及结束帧构成
起始帧使用两个连续的0Xff来表示。
命令位为一个字节0x00-0xfe可以有255个命令可以使用
数据部分不定长,从命令位开始到校验和都可以是数据
校验和为从命令位加到所有数据为的和
结束帧由0Xaa,0Xbb组成
协议举例:
心跳包0x00:
下位机FF FF 00 00 00 AA BB
上位机FF FF 00 01 01 AA BB
上位机发送心跳包,下位机回复心跳包
查询数据0x01:
下位机:FF FF 01 hour min sec vokt(高八位) volt(低八位) 模式 灯 校验和 AA BB
上位机:FF FF 01 0001 AA BB
上位机发送查询,下位机回复数据
命令0x02:
下位机:FF FF 03 01 AA BB
上位机:FF FF 03 00 AA BB
上位机发送指令,下位机执行完成后回复上位机指令。
特点与创新 上位机部分在项目原有的基础上增加了心跳包功能,用于检测连接状况。
下位机采用模块化对象化编程,里面的子模块都是我以前写的通用模块,允许在任何支持C语言的单片机,甚至树莓派上调用,使用面向对象思想去完成整个程序,使程序解耦,,底层采用的是函数接口去和具体单片机连接,调用之前实例化一个对象,既可使用,我觉得里面最创新的应该是串口部分,采用了FIFO的环形缓冲区作为串口的缓冲区,读写指针分别操作,无需进行互斥保护就可以安全操作缓冲区,发送和接受都是使用中断发送,大大释放单片机,以前发送一个字符9600波特率差不多要1ms一字节,现在只需要压入缓冲区,不需要管发送和接受状态,接收部分也可以等一个数据包接受完成再去读出整个数据包解析。键扫描采用的是状态机按键扫描和下降沿扫描结合的方式,不再需要按键消抖。任务与任务之间宏观上是并行运行的,这得益于采用了基于事基和状态机的编程框架。这是我觉得我很创新的地方。
下位机程序结构说明,main.c里主要是事基的初始化,以及开启调度器轮询。
PT_OS.c是时基调度器里的时基。
HardwareSerial.c是串口缓冲区的封装
Serial_One.C是串口封装的实例化,对串口1对象化
Keyboard.c是按键的封装
APP.c是应用程序或者称之为任务的实现,主要程序都在这
ADC083X.c是ADC0832的驱动封装
LCD1602.C是对1602的驱动封装
Button.c是按钮的实例化,以及按键事件回调函数的回调函数在里面。主要的按键响应,例如长按,断按,都在回调函数中实现。
完整电路:
视频链接: