2021-10-25 14:03:59 +00:00
|
|
|
|
# 毕业设计之 STM32 公交站牌系统
|
2021-10-25 14:00:22 +00:00
|
|
|
|
|
2021-10-25 14:03:59 +00:00
|
|
|
|
# 前言
|
|
|
|
|
|
|
|
|
|
自从去年六月二十一日离校,想来毕业已八月有余,工作也渐入正轨,很久很久没写博客了,就今天开始更吧,哈哈,本文主要讨论一些功能的代码实现。
|
|
|
|
|
毕业设计题目“智能公交系统电子站牌设计”,大概是模拟一个公交车信息实时发布系统,采集公交车信息,再发布在站台和移动客户端,系统结构如下图。
|
|
|
|
|
|
|
|
|
|
[![](https://www.writebug.com/myres/static/uploads/2021/10/25/826afbcd47e98f793be1129d2ccbf171.writebug)](https://billie.oss-cn-shanghai.aliyuncs.com/image/%E6%AF%95%E4%B8%9A%E8%AE%BE%E8%AE%A1/%E7%BB%93%E6%9E%84%E5%9B%BE.png?x-oss-process=style/bolg2)
|
|
|
|
|
|
|
|
|
|
# 1 站牌思路
|
|
|
|
|
|
|
|
|
|
站牌主要功能是接收显示公交信息,但考虑也可以上传些数据,索性增加几个传感器,采集些数据,大概长下面这个样子。模块和单片机通讯除了 LCD 用的 FSMC 其他都是串口 UART。整个站牌部分主要麻烦在 LCD 屏的驱动和无线通信部分的代码。
|
|
|
|
|
[![](https://www.writebug.com/myres/static/uploads/2021/10/25/e80d155c90799b9fe6abdf5569658bc1.writebug)](https://billie.oss-cn-shanghai.aliyuncs.com/image/%E6%AF%95%E4%B8%9A%E8%AE%BE%E8%AE%A1/%E7%AB%99%E7%89%8C.jpg?x-oss-process=style/bolg2)
|
|
|
|
|
|
|
|
|
|
# 2 ILI9320
|
|
|
|
|
|
|
|
|
|
ILI9320 是液晶屏的驱动芯片,屏幕分辨率 320 × 240 像素,单片机通过 FSMC 总线控制器操作屏幕,需要 16 根数据线和 6 根控制线,外加电源接地等共 24 根线才能驱动。FSMC(Flexible Static Memory Controller)是 STM32 的一个并行接口,通过此接口,单片机可以控制 NOR Flash、NAND Flash、SRAM 和 PSRAM。除了控制储存器,FSMC 还可以控制支持 Intel8080 和 Motorola 6800 时序的 LCD 屏幕。这个文档详细介绍了相关技术:[Using the high-density STM32F10xxx FSMC peripheral to drive external memories](https://billie.oss-cn-shanghai.aliyuncs.com/image/%E6%AF%95%E4%B8%9A%E8%AE%BE%E8%AE%A1/STM32F10xxx_FSMC.pdf)。核心初始化代码如下,
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
//! GPIO结构体声明
|
|
|
|
|
GPIO_InitTypeDef GPIO_InitStructure;
|
|
|
|
|
//! FSMC NORSRAM结构体声明
|
|
|
|
|
FSMC_NORSRAMInitTypeDef FSMC_NORSRAMInitStructure;
|
|
|
|
|
//! FSMC 读写时序结构体,当扩展模式时,仅有读时序有效
|
|
|
|
|
FSMC_NORSRAMTimingInitTypeDef readWriteTiming;
|
|
|
|
|
//! FSMC 写时序结构体,扩展模式使用
|
|
|
|
|
FSMC_NORSRAMTimingInitTypeDef writeTiming;
|
|
|
|
|
//! 使能FSMC时钟
|
|
|
|
|
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC,ENABLE);
|
|
|
|
|
//! 使能PART B,D,E,G及AFIO复用功能时钟,
|
|
|
|
|
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOE|RCC_APB2Periph_GPIOG,ENABLE);
|
|
|
|
|
//! PB0---------背光功能
|
|
|
|
|
//! PB1---------RESET功能 高电平工作,低电平硬件复位
|
|
|
|
|
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;
|
|
|
|
|
//! 推挽输出
|
|
|
|
|
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
|
|
|
|
|
//! GPIO最大输出频率50MHz
|
|
|
|
|
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
|
|
|
|
|
GPIO_Init(GPIOB, &GPIO_InitStructure);
|
|
|
|
|
|
|
|
|
|
//! PORTD复用推挽输出 PD0,1,8,9,10,14,15为数据管脚
|
|
|
|
|
//! PD4--------RD; PD5-----------WR
|
|
|
|
|
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_14|GPIO_Pin_15;
|
|
|
|
|
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
|
|
|
|
|
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
|
|
|
|
|
GPIO_Init(GPIOD, &GPIO_InitStructure);
|
|
|
|
|
|
|
|
|
|
//! PORTE复用推挽输出 PE7,8,9,10,11,12,13,14,15为数据管脚 详细定义见"GPIO管脚及功能定义.txt" 文件
|
|
|
|
|
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;
|
|
|
|
|
//! 复用推挽输出
|
|
|
|
|
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
|
|
|
|
|
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
|
|
|
|
|
GPIO_Init(GPIOE, &GPIO_InitStructure);
|
|
|
|
|
|
|
|
|
|
//! PORTG复用推挽输出 PG12----CS; PG0-----RS;
|
|
|
|
|
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_12;
|
|
|
|
|
//! 复用推挽输出
|
|
|
|
|
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
|
|
|
|
|
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
|
|
|
|
|
GPIO_Init(GPIOG, &GPIO_InitStructure);
|
|
|
|
|
|
|
|
|
|
//拉高RESET管脚,液晶屏才工作
|
|
|
|
|
GPIO_SetBits(GPIOB,GPIO_Pin_1);
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
以上代码大部分是 LCD 商家提供的驱动,主要更改了管脚配置和初始化时增加对 RESET 管脚和背光管脚的配置,必须配置背光和 RESET 才能点亮液晶。完整代码见文末 GitHub 仓库地址。
|
|
|
|
|
|
|
|
|
|
# 3 串口 GPRS 模块
|
|
|
|
|
|
|
|
|
|
选择通信模块时考虑到时间有限,选择开发难度相对较低(不需要开发驱动)的串口 GPRS 模块,模块型号:USR-GSM232-7S3,主要特性是支持 GPRS 网络通信,支持数据请求地址自定义或请求至官方后台,官方后台提高访问数据的 API。在上位机软件配置好请求地址后,向串口发送数据,模块会自动打包数据并向配置的服务器地址发起请求,整个模块类似一个 HTTP 客户端。当然,这个模块的缺点也很明显,2G 网络速度太慢,请求一帧数据到收到服务器回复平均需要十几秒。上位机示意图如下图。
|
|
|
|
|
|
|
|
|
|
[![](https://www.writebug.com/myres/static/uploads/2021/10/25/f323a4769cabfe3e47a175721f5945c0.writebug)](https://billie.oss-cn-shanghai.aliyuncs.com/image/%E6%AF%95%E4%B8%9A%E8%AE%BE%E8%AE%A1/%E4%B8%B2%E5%8F%A3%E6%A8%A1%E5%9D%97.png?x-oss-process=style/bolg2)
|
|
|
|
|
|
|
|
|
|
图中省略号的内容由如下代码实现,后台部分的实现将在另一篇博文里介绍。模块实际请求的地址为: **http://xkmg9m2k.qcloud.la/weapp/usrcloud?a=255&b=1&c=18&d=15&e=1&f=12&g=50&h=3&i=0**
|
|
|
|
|
|
|
|
|
|
- 其中 a 参数指示站牌初始化状态,类似于帧头,0xff:初始化成功;0xfe:初始化失败;
|
|
|
|
|
- b 参数指示站牌工作状态,1:工作正常;0:工作异常;
|
|
|
|
|
- c 参数指示温度数据,单位:℃;
|
|
|
|
|
- d 参数指示湿度数据,单位:%rh;
|
|
|
|
|
- e 参数指示 pm2.5 浓度的整数部分(抠脚的变量命名方式 2333);
|
|
|
|
|
- f 参数指示 pm2.5 浓度的小数部分,单位:ug/m3;
|
|
|
|
|
- g 参数指示噪音传数据的整数部分;
|
|
|
|
|
- h 参数指示噪音数据的小叔部分,单位:dB;
|
|
|
|
|
- i 参数无实际意义,作用类似于帧尾或者保留参数。
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
if(dht11_flag==1) //get请求参数:a=255&b=1&c=18&d=15&e=1&f=12&g=50&h=3&i=0
|
|
|
|
|
{
|
|
|
|
|
send[0]='a';
|
|
|
|
|
send[1]='=';
|
|
|
|
|
send[2]=0xFF;
|
|
|
|
|
send[3]='&';
|
|
|
|
|
send[4]='b';
|
|
|
|
|
send[5]='=';
|
|
|
|
|
//! 需加48转换成对应的ASCII码,否则服务器无法读出数据
|
|
|
|
|
send[6]=1+48;
|
|
|
|
|
send[7]='&';
|
|
|
|
|
send[8]='c';
|
|
|
|
|
send[9]='=';
|
|
|
|
|
send[10]=temperature+48;
|
|
|
|
|
send[11]='&';
|
|
|
|
|
send[12]='d';
|
|
|
|
|
send[13]='=';
|
|
|
|
|
send[14]=humidity+48;
|
|
|
|
|
send[15]='&';
|
|
|
|
|
send[16]='e';
|
|
|
|
|
send[17]='=';
|
|
|
|
|
send[18]=pm25_zheng+48;
|
|
|
|
|
send[19]='&';
|
|
|
|
|
send[20]='f';
|
|
|
|
|
send[21]='=';
|
|
|
|
|
send[22]=pm25_xiao+48;
|
|
|
|
|
send[23]='&';
|
|
|
|
|
send[24]='g';
|
|
|
|
|
send[25]='=';
|
|
|
|
|
send[26]=hh06_zheng+48;
|
|
|
|
|
send[27]='&';
|
|
|
|
|
send[28]='h';
|
|
|
|
|
send[29]='=';
|
|
|
|
|
send[30]=hh06_xiao+48;
|
|
|
|
|
send[31]='&';
|
|
|
|
|
send[32]='i';
|
|
|
|
|
send[33]='=';
|
|
|
|
|
send[34]=0+48;
|
|
|
|
|
send[35]='\0';
|
|
|
|
|
//! 向服务器发送请求
|
|
|
|
|
USART_SendString(USART3,send);
|
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
# 4 传感器简介
|
|
|
|
|
|
|
|
|
|
噪音传感器和 pm2.5 传感器都是通过串口读取数据,只需按要求初始化串口配置并解析收到的数据即可。DHT11 温湿度传感器数据读取需按特定的时序,模块和单片机间使用单总线传输数据。在购买模块时商家已提供驱动代码,相关代码见 GitHub 仓库,驱动时序如下图所示。
|
|
|
|
|
[![](https://www.writebug.com/myres/static/uploads/2021/10/25/1ae31351c0a8f56f92632ea9c479f579.writebug)](https://billie.oss-cn-shanghai.aliyuncs.com/image/%E6%AF%95%E4%B8%9A%E8%AE%BE%E8%AE%A1/dht11%E6%97%B6%E5%BA%8F.png?x-oss-process=style/bolg2)
|
|
|
|
|
|
|
|
|
|
# 5 最终成品
|
|
|
|
|
|
|
|
|
|
站牌制作过程并不复杂,只需把买来的模块焊接在面包板上即可,各模块的供电统一由一个 12V 输出的适配器提供,5V 电源由一个直流降压模块提供,模块间的连线使用杜邦线,比较混乱。
|
|
|
|
|
|
|
|
|
|
注:代码有 bug 未解决,不过就保留原样吧 233。
|
|
|
|
|
|
|
|
|
|
[![](https://www.writebug.com/myres/static/uploads/2021/10/25/ff0b653d7a60154e2641930652b4a9d9.writebug)](https://billie.oss-cn-shanghai.aliyuncs.com/image/%E6%AF%95%E4%B8%9A%E8%AE%BE%E8%AE%A1/%E7%A1%AC%E4%BB%B6%E7%BB%93%E6%9E%84%E5%8E%8B%E7%BC%A9.png?x-oss-process=style/bolg2)
|
|
|
|
|
|
|
|
|
|
[![](https://www.writebug.com/myres/static/uploads/2021/10/25/47376b9cbc4d95b56ae0dbec08b3fea1.writebug)](https://billie.oss-cn-shanghai.aliyuncs.com/image/%E6%AF%95%E4%B8%9A%E8%AE%BE%E8%AE%A1/%E7%AB%99%E7%89%8C%E6%98%BE%E7%A4%BA.png?x-oss-process=style/blog3)
|
|
|
|
|
|
|
|
|
|
-------------本文结束感谢您的阅读-------------
|
|
|
|
|
|
|
|
|
|
- **本文作者:** Billie
|
|
|
|
|
- **本文链接:** [https://www.billie.cc/blog/Graduation-design-of-STM32F103ZET6.html](https://www.billie.cc/blog/Graduation-design-of-STM32F103ZET6.html)
|
|
|
|
|
- **许可协议:** 本博客所有文章除特别声明外,均采用 [CC BY-NC-SA 3.0](https://creativecommons.org/licenses/by-nc-sa/3.0/) 协议。转载请注明出处!
|