STM32学习笔记【15.智能排队控制系统项目】

发布时间:2026/6/6 4:11:23

STM32学习笔记【15.智能排队控制系统项目】 智能排队控制系统1. 模块介绍1.1 红外传感器【红外跟随避障模块】注意如果接收到信号OUT引脚输出低电平亮绿灯。【与震动传感器相似】如果未接收到信号OUT引脚一直高电平。顺时针旋转灵敏度变高检测距离变长逆时针灵敏度变低检测距离变短。驱动代码与【震动传感器】代码一样1.2 LCD1602显示模块一种常见的字符型液晶显示模块。它能够显示16列2行共32个字符每个字符由5*8像素点阵构成是一种专门用来显示字母、数字、符号等的液晶显示模块。1.2.1 引脚介绍引脚不能接错否则可能会烧掉板子。RS:1——数据寄存器0——指令寄存器R/W: 1——读0——写1.2.2 基本操作时序读操作时序写操作时序1.2.3 LCD1602显示字符串小实验驱动LCD1602显示内容实验目的使用LCD1602显示一个字符使用LCD1602显示一个字符串。硬件清单LCD1602上官二号ST-Link硬件接线STM32LCD1602GNDGND5VVDDGNDV0B1RSB2RWB10EA0D0A1D1A2D2A3D3A4D4A5D5A6D6A7D73.3BLAGNDBLK代码写代码前要知道两个问题在哪里显示字符LCD知道显示什么内容用下面这个知道在什么地方显示内容。写指令代码lcd1602.c文件#includelcd1602.h#includedelay.h// RS引脚定义#defineRS_GPIO_PortGPIOB#defineRS_GPIO_PinGPIO_PIN_1#defineRS_HIGHHAL_GPIO_WritePin(RS_GPIO_Port,RS_GPIO_Pin,GPIO_PIN_SET);#defineRS_LOWHAL_GPIO_WritePin(RS_GPIO_Port,RS_GPIO_Pin,GPIO_PIN_RESET);// RW引脚定义#defineRW_GPIO_PortGPIOB#defineRW_GPIO_PinGPIO_PIN_2#defineRW_HIGHHAL_GPIO_WritePin(RW_GPIO_Port,RW_GPIO_Pin,GPIO_PIN_SET);#defineRW_LOWHAL_GPIO_WritePin(RW_GPIO_Port,RW_GPIO_Pin,GPIO_PIN_RESET);// EN引脚定义#defineEN_GPIO_PortGPIOB#defineEN_GPIO_PinGPIO_PIN_10#defineEN_HIGHHAL_GPIO_WritePin(EN_GPIO_Port,EN_GPIO_Pin,GPIO_PIN_SET);#defineEN_LOWHAL_GPIO_WritePin(EN_GPIO_Port,EN_GPIO_Pin,GPIO_PIN_RESET);voidlcd1602_init(void){// GPIO初始化lcd1602_gpio_init();// 上电初始化lcd1602_start();}// GPIO初始化voidlcd1602_gpio_init(void){GPIO_InitTypeDef gpio_initstruct;// 打开时钟__HAL_RCC_GPIOA_CLK_ENABLE();// 使能GPIOA时钟__HAL_RCC_GPIOB_CLK_ENABLE();// 使能GPIOB时钟gpio_initstruct.PinGPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7;// 对应的引脚gpio_initstruct.ModeGPIO_MODE_OUTPUT_PP;// 推挽输出gpio_initstruct.PullGPIO_PULLUP;// 上拉gpio_initstruct.SpeedGPIO_SPEED_FREQ_HIGH;// 高速HAL_GPIO_Init(GPIOA,gpio_initstruct);gpio_initstruct.PinGPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_10;// LED1对应的引脚gpio_initstruct.ModeGPIO_MODE_OUTPUT_PP;// 推挽输出gpio_initstruct.PullGPIO_PULLUP;// 上拉gpio_initstruct.SpeedGPIO_SPEED_FREQ_HIGH;// 高速HAL_GPIO_Init(GPIOB,gpio_initstruct);}// 上电初始化voidlcd1602_start(void){//1延时15msdelay_ms(15);//2写指令38H(不检测忙信号)lcd1602_write_cmd(0x38);//3延时5msdelay_ms(5);//4不检测忙信号//5写指令38H显示模式设置lcd1602_write_cmd(0x38);//6写指令08H显示关闭lcd1602_write_cmd(0x08);//7写指令01H显示清屏lcd1602_write_cmd(0x01);//8写指令06H显示光标移动设置lcd1602_write_cmd(0x06);//9写指令0CH显示开及光标设置lcd1602_write_cmd(0x0C);}// 指令voidlcd1602_write_cmd(charcmd){RS_LOW;RW_LOW;EN_LOW;GPIOA-ODRcmd;delay_ms(5);EN_HIGH;delay_ms(5);EN_LOW;}// 数据voidlcd1602_write_data(chardataShow){RS_HIGH;RW_LOW;EN_LOW;GPIOA-ODRdataShow;delay_ms(5);EN_HIGH;delay_ms(5);EN_LOW;}// 显示一个字符voidlcd1602_show_data(void){// 在什么地方显示lcd1602_write_cmd(0x800x02);// 显示什么内容lcd1602_write_data(Z);}// 显示字符串voidlcd1602_show_line(charrow,charcol,char*string){switch(row){case1:lcd1602_write_cmd(0x80col);while(*string){lcd1602_write_data(*string);string;}break;case2:lcd1602_write_cmd(0x800x40col);while(*string){lcd1602_write_data(*string);string;}break;}}main.c中不要忘记调用lcd1602_show_line(char row, char col, char *string)2. 智能排队控制系统项目需求红外传感器检测有人通过并计数计数值显示在LCD1602允许通过时LED1闪烁蜂鸣器不响继电器不闭合不允许通过时LED2闪烁蜂鸣器响继电器闭合。每次允许通过5个人之后转为不允许通过3秒后再转为允许通过硬件清单继电器模拟闸机蜂鸣器红外避障模块LCD1602上官二号ST-Link硬件接线STM32LCD1602继电器蜂鸣器红外GNDGND5VVDDGNDV0B1RSB2RWB10EA0D0A1D1A2D2A3D3A4D4A5D5A6D6A7D73.3BLAVCCVCCVCCGNDBLKGNDGNDGNDB4OUTB5I/OB6IN项目框图2.1 搭建项目工程基于SysTick模拟多线程实验上写将之前所做的实验加进来红外、LCD1602、继电器、蜂鸣器、LED。分别调试这几个模块代码验证硬件没问题再进行下一步。2.1.1 状态机状态机State Machine是一种用于描述系统行为或功能行为的数学模型。它通常包含一组状态、一组转换条件以及动作执行。状态机通过在不同状态之间进行转换来模拟系统的行为。每个状态都代表系统的一个特定配置或情况而转换规则则定义了从一个状态转换到另一个状态的条件和动作。状态机广泛应用于多个领域包括但不限于计算机科学、电子工程、通信、自动化、机器人技术等。在计算机科学中状态机常用于描述软件系统的行为特别是在硬件设计、编译器设计、网络协议以及用户界面交互等方面。状态机的主要特点包括有限状态状态机通常具有有限数量的状态。这些状态可以是有序的、离散的或层次化的。转换条件状态之间的转换是基于特定条件触发的。当满足某个条件时状态机会从当前状态转换到下一个状态。动作执行在状态转换过程中状态机可能会执行某些动作或操作。这些动作可以包括计算、数据更新、输出信号等。确定性和非确定性状态机可以是确定性的每个条件唯一对应一个转换或非确定性一个条件可能导致多个可能得转换。状态机的实现方式多种多样可以使用编程语言中的条件语句、循环结构或专门的状态机库来实现。此外硬件设计领域中的有限状态机Finite State MachineFSM也是状态机的一种重要应用。该项目的状态2.1.2 业务代码状态代码写在tasks.c中问题1未检测到传感器直接就通过。解决在传感器检测是否有人通过时写成了用gate_state_get来获取了应该是用红外传感器ia_flag_get函数检测是否有人通过。ia_flag_get() TRUE state PASS_STATE。问题2当检测有人通过时LCD并没有计数加1。在中断函数中设置的下降沿触发和GPIO_PIN_RESET 低电平触发gpio_initstruct.ModeGPIO_MODE_IT_FALLING;// 下降沿触发voidHAL_GPIO_EXTI_Callback(uint16_tGPIO_Pin){// 消抖delay_ms(20);if(GPIO_PinGPIO_PIN_4){if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_4)GPIO_PIN_RESET)ia_flagTRUE;}}但是出现一个问题传感器靠近和离开都加了一个人说明传感器在靠近时也产生了一个短暂的下降沿被误识别为一次有效信号。解决HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_4) GPIO_PIN_RESET引脚是B4之前写成了A4。总结学会把项目步骤进行拆解写业务代码前一定要先把硬件设备连线并调试好再接着写业务代码。红外传感器【检测人数】→继电器【闸机】→蜂鸣器→LED1和LED2→LCD1602【显示通过人数】

相关新闻