【毕业设计】基于STM32的公交站牌系统 - 物联网 嵌入式 单片机

文章目录

  • 1 简介
  • 2 主要器件
    • 2.1 ILI9320
    • 2.2 串口GPRS模块
    • 2.3 相关传感器
  • 3 实现效果
  • 4 设计原理
  • 5 部分实现代码
  • 6 最后


1 简介

Hi,大家好,这里是丹成学长,今天向大家介绍一个单片机项目

STM32公交站牌系统

大家可用于 课程设计 或 毕业设计


单片机-嵌入式毕设选题大全及项目分享:

https://blog.csdn.net/m0_71572576/article/details/125409052


该项目主要是一个模拟公交车信息实时发布系统,采集公交车信息,再发布在站台和移动客户端,系统结构如下图。
【毕业设计】基于STM32的公交站牌系统 - 物联网 嵌入式 单片机_第1张图片

2 主要器件

2.1 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屏幕。

2.2 串口GPRS模块

选择通信模块时考虑到时间有限,选择开发难度相对较低(不需要开发驱动)的串口GPRS模块,模块型号:USR-GSM232-7S3,主要特性是支持GPRS网络通信,支持数据请求地址自定义或请求至官方后台,官方后台提高访问数据的API。在上位机软件配置好请求地址后,向串口发送数据,模块会自动打包数据并向配置的服务器地址发起请求,整个模块类似一个HTTP客户端。当然,这个模块的缺点也很明显,2G网络速度太慢,请求一帧数据到收到服务器回复平均需要十几秒。
【毕业设计】基于STM32的公交站牌系统 - 物联网 嵌入式 单片机_第2张图片

2.3 相关传感器

噪音传感器和pm2.5传感器都是通过串口读取数据,只需按要求初始化串口配置并解析收到的数据即可。DHT11温湿度传感器数据读取需按特定的时序,模块和单片机间使用单总线传输数据。在购买模块时商家已提供驱动代码,相关代码见Github仓库,驱动时序如下图所示。

【毕业设计】基于STM32的公交站牌系统 - 物联网 嵌入式 单片机_第3张图片

3 实现效果


4 设计原理

站牌主要功能是接收显示公交信息,但考虑也可以上传些数据,索性增加几个传感器,采集些数据,大概长下面这个样子。模块和单片机通讯除了LCD用的FSMC其他都是串口UART。整个站牌部分主要麻烦在LCD屏的驱动和无线通信部分的代码。

【毕业设计】基于STM32的公交站牌系统 - 物联网 嵌入式 单片机_第4张图片

5 部分实现代码

ILI9320 驱动代码

 
//! 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);

单片机-嵌入式毕设选题大全及项目分享:

https://blog.csdn.net/m0_71572576/article/details/125409052


6 最后

你可能感兴趣的:(单片机,物联网,毕业设计,单片机,stm32,物联网,智能公交站牌,毕业设计)