介绍
整理了一下 MCU 系统综合实验的课程设计,因为老师规定要使用发放的单片机 (STC89C54RC) 和屏幕 (LCM12864F),所以就只能做一些基础的应用。
系统实现了多个菜单选项的选择、RTC 走时、传感器读取以及串口数据解析功能。
Hardware
硬件使用 Altium Designer 绘制,原理图如下:
供电与通信部分使用 16-pin 的 USB-C 接口。使用 HT7333-3.3 线性稳压芯片降压到 3.3V。使用 CH340K 实现 USB 转 TTL 串口,来给 51 单片机或 ESP32 烧录固件,预留排针来通过跳线帽选择进行串口通信的器件。
使用 DHT11 温湿度传感器来获得环境温度和湿度,该传感器为单线通信。
使用 EC11 旋转编码器实现操作功能,其状态有左右旋转和按下。
PCB 图形:
PCB 3D 预览:
Firmware
固件工程目录结构如下:
Firmware
│ keilkilll.bat
│ Template.uvproj
├─ Driver
│ ├─ DHT11
│ │ DHT11.c
│ │ DHT11.h
│ ├─ DS1302
│ │ DS1302.c
│ │ DS1302.h
│ ├─ Key
│ │ Key.c
│ │ Key.h
│ └─ ST7920
│ ST7920.c
│ ST7920.h
└─ Src
Bmp.h
main.c
其中 keilkilll.bat
文件是清理编译中间文件,可以在打包分享工程之前运行以减小文件体积;Template.uvproj
为 Keil C51 的工程文件;Driver
文件夹中为各模块驱动;Src
文件夹存放源文件,其中 Bmp.h
为各图标的字模。
除了 main.c
外,其他文件均为 utf-8
编码,因为使用的屏幕带有字库,字库存放方式为 gb2312
,为了能够直接在代码中写可读的中文来实现对应显示,直接将 main.c
以 gb2312
格式保存,方便程序编写。
单片机使用 11.0592MHz 晶振,工作在 6T 模式下,串口波特率为 19200bps。
程序内较为复杂的函数均写有注释,具体使用方法请参考源文件内的注释以及实现。下面着重介绍一下串口通信的方式。程序实现了通过串口设定时间、天气和空气质量(对应菜单的 1, 3, 4 页),为了完成不同功能独立设置,采用 ~
作为通信开始标志,其后紧跟设定内容标志,T
表示设定时间,W
表示设定天气,A
表示设定空气质量,后面为定长的参数设置选项。如:~T21080701020306
表示把时间设置为2021年8月7日1时2分3秒星期五;~W101025047
表示天气多云,25℃,湿度47%; ~A096033
表示空气质量 AQI 为96,PM2.5 指数为 33。
使用 Esp32 来联网获取上述需要的各种内容后通过串口发送给 51 单片机。除天气代码外,其他的参数设置区域内容都是对应参数的值,天气代码的对应列表如下(具体见代码实现中的语句,因为没有放太多张天气图标,所以就只写了下面的这部分):
代码 | 天气描述 |
---|---|
100 | 晴 |
101 | 多云 |
104 | 阴 |
300 | 雨 |
999 | 未知 |
系统通过 Esp32 来进行网络校时和天气、空气质量信息的获取,但是由于二者串口电平不匹配,设计时在中间串了一个电阻,效果并不是很好。建议采用类似设计时改为使用一片具有单向电平转换功能的 74 系列芯片。因为天气和空气质量数据接口需要申请 Api 且每天可调用的次数有限,所以此部分功能存在较多 bug,便不再放上来了。
效果展示
得益于两家 PCB 打样厂商的激烈竞争,现在每个月都有了好几次免费打样的机会。
PCB 空板:
焊接后用硬纸板和打印的不干胶纸简单做了个面板:
菜单功能演示:
旋转编码器可以实现左右切换框选,按下可以确认或退出。
时钟功能:
通过串口设定一次时间后 DS1302 可以掉电走时。
温湿度监测:
使用 DHT11 测得的数据误差较大。
天气:
因为项目时短时间内完成的课程设计,可以扩展的空间还有很大,如果有感兴趣的可以自己扩展更多功能。需要注意的是:
- 使用 11.0592MHz 晶振,若非此频率需要修改定时器中断初值以匹配串口波特率,还要修改 DHT11 通信时序中的
_nop_()
数量。 - 烧录固件时需要选择 6T 方式,建议连续烧录两次以免未成功修改运行方式。
- PCB 中有预留 51 单片机和 Esp32 的 IO 通信,其中使用了 IO12,因为 IO12 上电的电平影响 Esp32 运行方式,所以此引脚最好不要使用,新设计中注意修改。