Keil5+STM32实现智能仓库管理系统:红外感应、显示与蜂鸣报警全搞定!
以下是一个基于STM32使用Keil5编写的智能仓库管理系统的示例代码,该系统包含一个显示器(这里假设为LCD1602)、一个红外传感器和一个蜂鸣器。 代码思路 1. 初始化:初始化GPIO引脚用于连接红外传感器、蜂鸣器和LCD1602。 2. 读取传感器数据:定期读取红外传感器的状态。 3. 显示与报警:根据传感器状态更新LCD显示内容,并控制蜂鸣器是否报警。 代码示例 ```c #include "stm32f10x.h" #include <stdio.h> // 定义红外传感器引脚 #define IR_SENSOR_PIN GPIO_Pin_0 #define IR_SENSOR_PORT GPIOA // 定义蜂鸣器引脚 #define BUZZER_PIN GPIO_Pin_1 #define BUZZER_PORT GPIOA // 定义LCD引脚 #define LCD_RS_PIN GPIO_Pin_2 #define LCD_EN_PIN GPIO_Pin_3 #define LCD_D4_PIN GPIO_Pin_4 #define LCD_D5_PIN GPIO_Pin_5 #define LCD_D6_PIN GPIO_Pin_6 #define LCD_D7_PIN GPIO_Pin_7 #define LCD_PORT GPIOA // 延时函数 void delay_ms(uint32_t ms) { for (uint32_t i = 0; i < ms * 1000; i++); } // LCD发送4位数据 void LCD_Send4Bits(uint8_t data) { GPIO_WriteBit(LCD_PORT, LCD_D4_PIN, (BitAction)(data & 0x01)); GPIO_WriteBit(LCD_PORT, LCD_D5_PIN, (BitAction)((data >> 1) & 0x01)); GPIO_WriteBit(LCD_PORT, LCD_D6_PIN, (BitAction)((data >> 2) & 0x01)); GPIO_WriteBit(LCD_PORT, LCD_D7_PIN, (BitAction)((data >> 3) & 0x01)); } // LCD发送命令 void LCD_SendCommand(uint8_t command) { GPIO_ResetBits(LCD_PORT, LCD_RS_PIN); // RS = 0 for command LCD_Send4Bits(command >> 4); GPIO_SetBits(LCD_PORT, LCD_EN_PIN); delay_ms(1); GPIO_ResetBits(LCD_PORT, LCD_EN_PIN); LCD_Send4Bits(command & 0x0F); GPIO_SetBits(LCD_PORT, LCD_EN_PIN); delay_ms(1); GPIO_ResetBits(LCD_PORT, LCD_EN_PIN); delay_ms(2); } // LCD发送字符 void LCD_SendChar(char c) { GPIO_SetBits(LCD_PORT, LCD_RS_PIN); // RS = 1 for data LCD_Send4Bits(c >> 4); GPIO_SetBits(LCD_PORT, LCD_EN_PIN); delay_ms(1); GPIO_ResetBits(LCD_PORT, LCD_EN_PIN); LCD_Send4Bits(c & 0x0F); GPIO_SetBits(LCD_PORT, LCD_EN_PIN); delay_ms(1); GPIO_ResetBits(LCD_PORT, LCD_EN_PIN); delay_ms(1); } // LCD初始化 void LCD_Init(void) { delay_ms(20); LCD_Send4Bits(0x03); GPIO_SetBits(LCD_PORT, LCD_EN_PIN); delay_ms(1); GPIO_ResetBits(LCD_PORT, LCD_EN_PIN); delay_ms(5); LCD_Send4Bits(0x03); GPIO_SetBits(LCD_PORT, LCD_EN_PIN); delay_ms(1); GPIO_ResetBits(LCD_PORT, LCD_EN_PIN); delay_ms(1); LCD_Send4Bits(0x03); GPIO_SetBits(LCD_PORT, LCD_EN_PIN); delay_ms(1); GPIO_ResetBits(LCD_PORT, LCD_EN_PIN); delay_ms(1); LCD_Send4Bits(0x02); GPIO_SetBits(LCD_PORT, LCD_EN_PIN); delay_ms(1); GPIO_ResetBits(LCD_PORT, LCD_EN_PIN); delay_ms(1); LCD_SendCommand(0x28); // 4-bit mode, 2 lines, 5x7 dots LCD_SendCommand(0x0C); // Display on, cursor off LCD_SendCommand(0x06); // Increment cursor LCD_SendCommand(0x01); // Clear display delay_ms(2); } // LCD显示字符串 void LCD_DisplayString(const char *str) { while (*str) { LCD_SendChar(*str++); } } // 主函数 int main(void) { GPIO_InitTypeDef GPIO_InitStructure; // 使能GPIOA时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // 初始化红外传感器引脚 GPIO_InitStructure.GPIO_Pin = IR_SENSOR_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(IR_SENSOR_PORT, &GPIO_InitStructure); // 初始化蜂鸣器引脚 GPIO_InitStructure.GPIO_Pin = BUZZER_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(BUZZER_PORT, &GPIO_InitStructure); // 初始化LCD引脚 GPIO_InitStructure.GPIO_Pin = LCD_RS_PIN | LCD_EN_PIN | LCD_D4_PIN | LCD_D5_PIN | LCD_D6_PIN | LCD_D7_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(LCD_PORT, &GPIO_InitStructure); // 初始化LCD LCD_Init(); while (1) { if (GPIO_ReadInputDataBit(IR_SENSOR_PORT, IR_SENSOR_PIN) == 1) { // 感应到物品 LCD_SendCommand(0x01); // 清屏 LCD_DisplayString("In Stock"); GPIO_ResetBits(BUZZER_PORT, BUZZER_PIN); // 蜂鸣器不响 } else { // 感应不到物品 LCD_SendCommand(0x01); // 清屏 LCD_DisplayString("Out of Stock"); GPIO_SetBits(BUZZER_PORT, BUZZER_PIN); // 蜂鸣器报警 } delay_ms(500); // 每隔500ms检测一次 } } ``` 代码注释解释 1. 延时函数:`delay_ms` 用于简单的延时,实际应用中可以使用定时器实现更精确的延时。 2. LCD相关函数:`LCD_Send4Bits`、`LCD_SendCommand`、`LCD_SendChar`、`LCD_Init` 和 `LCD_DisplayString` 用于控制LCD1602的显示。 3. 主函数:初始化GPIO引脚、LCD,然后在循环中不断读取红外传感器状态,根据状态更新LCD显示内容并控制蜂鸣器。 额外需要注意的逻辑点 1. 红外传感器的电平逻辑:代码中假设感应到物品时传感器输出高电平,实际应用中可能需要根据传感器的具体型号进行调整。 2. 蜂鸣器的驱动能力:如果蜂鸣器需要较大的驱动电流,可能需要添加三极管等驱动电路。 3. LCD的初始化和延时:LCD的初始化过程需要严格按照时序要求进行,延时时间也需要根据实际情况进行调整。 ######[AI写代码神器 | 1790点数解答 | 2025-07-01 18:12:06]
- Java 继承实现:重温经典剪刀石头布游戏(字节豆包 | 451点数解答 | 2024-10-20 19:57:58)472
- Python 实现球类:精准计算半径、表面积与体积,附输入验证与异常处理!(阿里通义 | 261点数解答 | 2024-11-28 21:19:39)362
- 工程师必备!10 种工程日常易用管理工具大揭秘(百度文心 | 346点数解答 | 2023-11-09 18:26:09)303
- 仅36元!低成本人体感应自动门控制系统,硬件选型、代码全揭秘 (DeepSeek | 586点数解答 | 2025-04-08 16:54:34)191
- 51 单片机+Keil5:YL - 69 土壤湿度采集并在 LCD1602 显示的示例代码及注意事项(字节豆包 | 1239点数解答 | 2025-11-02 17:53:34)67
- 51 单片机:定时器 0 实现 8 个 LED 循环点亮,附代码及优化建议(字节豆包 | 1193点数解答 | 2024-12-27 15:10:29)333
- 深度剖析:黑盒、白盒、单元、集成、系统与验收测试的区别与联系 (百度文心 | 424点数解答 | 2023-11-09 18:24:11)310
- Spring Boot 打造 MallShop 购物商城:多角色权限、全业务功能的 Web 应用奇迹 (GPT | 1095点数解答 | 2024-12-09 14:06:47)374
- C++实现银行排队系统:从思路到代码的完整解析(讯飞星火 | 2048点数解答 | 2024-12-11 15:11:23)500
- 哈弗大狗 2026 款 7 月 17 日上市,9.89 万起开启潮玩越野新体验 (讯飞星火 | 351点数解答 | 2025-07-21 17:11:39)95
- 9.89万起,哈弗大狗2026款:轻越野新王者,年轻人的潮玩新宠(讯飞星火 | 355点数解答 | 2025-07-21 17:13:07)87
- Windows 10 下用按键精灵:鼠标左键一键绑定窗口及代码详解与注意要点(字节豆包 | 509点数解答 | 2025-08-24 23:34:49)250