基于单片机的自动存包柜设计

基于单片机的自动存包柜设计

点击链接下载资料:https://download.csdn.net/download/m0_51061483/91926418

1. 系统功能概述

随着智能化技术的不断发展,传统的手工存包方式已经逐渐无法满足人们在公共场所对于安全、高效与便捷的要求。基于单片机的自动存包柜系统应运而生,它通过电子控制、密码管理和位置分配的结合,实现了用户在无需人工干预的情况下完成包裹的存取操作。本系统以STC89C52单片机为核心控制单元,通过键盘输入、LCD显示、继电器控制等功能模块协同工作,实现密码自动生成、箱位分配、密码验证与自动开箱等智能控制功能。

系统主要由单片机控制模块、LCD液晶显示模块、矩阵键盘输入模块、舵机驱动模块、电磁锁控制模块及存储模块等部分构成。系统在用户按下存包键后,会自动生成一个随机密码,并通过LCD显示出来;同时,单片机会自动检测当前空闲的存包柜位置并分配给用户。用户凭借该密码即可完成取包操作。取包时,系统通过键盘输入密码,并与存储的密码进行匹配,验证成功后控制对应柜门打开,实现无人化、自动化的智能存包过程。

系统设计理念以"安全、便捷、智能"为核心,能够广泛应用于图书馆、体育馆、商场、学校等公共场所,极大地提升了使用效率与管理便利性。


2. 系统电路设计

本系统的硬件设计主要包括单片机最小系统电路、LCD显示模块、键盘输入模块、舵机驱动模块、电磁锁控制模块以及电源电路。以下对各模块进行详细说明。

2.1 单片机控制模块

系统采用STC89C52单片机作为主控芯片。该芯片兼容8051指令系统,具有较强的运算与控制能力,内置8KB Flash程序存储器和256B数据RAM,适合中小型嵌入式系统应用。

单片机负责整个系统的核心逻辑控制,包括密码生成、键盘扫描、LCD显示控制、箱门开关控制以及状态管理等。单片机与各模块之间通过I/O口实现信号交互,其中P0口用于LCD数据传输,P1口用于键盘输入检测,P2口用于舵机控制与电磁锁驱动信号输出。

晶振电路采用12MHz晶体振荡器,为系统提供稳定的时钟信号;复位电路采用RC延时复位方式,保证系统上电后自动初始化进入工作状态。

2.2 LCD显示模块

LCD显示模块选用1602液晶屏,主要用于实时显示系统工作状态、用户随机生成的密码以及当前空闲箱位编号。LCD1602采用4位数据总线模式,节约了I/O端口资源。显示内容包括:

  • "欢迎使用自动存包柜"提示信息;
  • 随机生成的存包密码;
  • 空箱位置编号;
  • 密码输入与验证结果反馈。

LCD通过RS、RW、EN控制信号与单片机连接。系统上电后,LCD初始化完成后进入待机状态,等待用户操作。

2.3 键盘输入模块

键盘输入部分采用4×4矩阵键盘设计,共16个按键,其中包括数字键0~9,以及功能键"存包"、"取包"、"清除"、"确认"、"取消"、"设置"。矩阵键盘由4行4列共8个引脚组成,行线与列线分别连接至单片机P1口。

按键功能定义如下:

  • 数字键0~9:输入或生成密码;
  • "存包"键:触发系统生成随机密码并分配箱位;
  • "取包"键:进入密码输入模式;
  • "清除"键:清空当前输入内容;
  • "确认"键:确认密码输入并进行匹配验证。

键盘扫描采用行列轮询方式,通过检测电平变化判断按键状态,同时在程序中加入延时消抖处理以防止误触发。

2.4 舵机驱动模块

为实现箱门的自动开启,系统采用舵机(Servo)驱动控制。舵机通过PWM信号进行角度控制,单片机输出的PWM波控制舵机转动角度,实现柜门的开闭动作。

舵机控制端与单片机P2.0连接,单片机输出高精度脉冲信号控制舵机旋转。系统在密码验证成功后,单片机输出一定时间的PWM波形信号使舵机打开柜门,延时后恢复初始角度。

2.5 电磁锁控制模块

电磁锁作为安全控制组件,用于在非操作状态下保持柜门闭合。电磁锁驱动电路由NPN三极管及继电器组成,单片机输出低电平信号时,继电器断开,柜门处于锁定状态;当输出高电平时,继电器吸合,电磁锁释放,柜门可被打开。

为了防止电磁感应反向电流损坏控制电路,继电器线圈两端并联有续流二极管进行保护。

2.6 电源模块

系统采用5V直流稳压供电,可通过7805稳压芯片实现电源转换。单片机、LCD、键盘及舵机均由5V供电,而电磁锁驱动部分需要12V供电。为了保证系统安全性,电源部分还加入电解电容滤波和过流保护设计。


3. 系统程序设计

系统软件以C语言编写,使用Keil C51开发环境进行编译。程序设计采用模块化结构,主要由主控制程序、密码生成模块、键盘扫描模块、LCD显示模块、箱位管理模块和舵机控制模块组成。

3.1 主程序设计

主程序负责系统的整体流程控制,包括初始化、模式切换、密码管理和箱位控制。主程序的工作流程为:上电初始化 → 等待按键输入 → 判断操作类型(存包/取包) → 执行对应功能 → LCD显示反馈。

复制代码
#include <reg52.h>
#include "lcd1602.h"
#include "key.h"
#include "servo.h"
#include "locker.h"

unsigned char password[4];
unsigned char input[4];
unsigned char box_id = 0;
bit storing = 0;

void main() {
    LCD_Init();
    Key_Init();
    LCD_ShowString(1,1,"Auto Locker Sys");
    LCD_ShowString(2,1,"Press Key...");
    while(1) {
        unsigned char key = Key_Scan();
        if(key == 'S') { // 存包
            storing = 1;
            generate_password();
            assign_box();
        } else if(key == 'T') { // 取包
            storing = 0;
            input_password();
            verify_password();
        }
    }
}

3.2 密码生成模块

系统在存包操作时需为用户生成一个唯一的四位随机密码,并在LCD上显示。密码生成采用伪随机算法,利用系统定时器的计数值作为随机种子,提高随机性。

复制代码
void generate_password() {
    unsigned int seed = TH0 + TL0;
    password[0] = (seed % 10);
    password[1] = (seed / 3) % 10;
    password[2] = (seed / 5) % 10;
    password[3] = (seed / 7) % 10;
    LCD_Clear();
    LCD_ShowString(1,1,"Your PWD:");
    for(int i=0;i<4;i++){
        LCD_ShowChar(2,i+1,password[i]+'0');
    }
}

3.3 键盘扫描模块

矩阵键盘扫描采用轮询法,通过行列逐次拉低检测按键闭合状态。当检测到按键按下时返回对应键值。

复制代码
unsigned char Key_Scan() {
    unsigned char row, col, key = 0xFF;
    for(row=0; row<4; row++) {
        P1 = ~(1 << row);
        col = P1 & 0x0F;
        if(col != 0x0F) {
            delay_ms(10);
            col = P1 & 0x0F;
            if(col != 0x0F) {
                key = (row * 4) + (col ^ 0x0F);
                break;
            }
        }
    }
    return key;
}

3.4 LCD显示模块

LCD用于显示系统状态及用户提示信息。根据不同的工作模式,LCD显示不同内容,例如"请输入密码"、"验证成功"、"空箱已分配"等。

复制代码
void display_status(char *msg) {
    LCD_Clear();
    LCD_ShowString(1,1,msg);
}

3.5 箱位管理模块

系统需实时管理存包柜的使用状态。采用数组变量存储各箱位的使用标志。当系统检测到空箱时,自动分配给当前用户。

复制代码
unsigned char box_state[10] = {0};

void assign_box() {
    for(int i=0; i<10; i++) {
        if(box_state[i] == 0) {
            box_id = i + 1;
            box_state[i] = 1;
            LCD_ShowString(2,8,"Box:");
            LCD_ShowNum(2,12,box_id,2);
            return;
        }
    }
    LCD_ShowString(2,1,"No Empty Box!");
}

3.6 舵机与电磁锁控制模块

当用户输入正确密码后,系统控制舵机旋转打开柜门,同时释放电磁锁。延时数秒后舵机复位,柜门关闭。

复制代码
void open_box(unsigned char id) {
    Servo_Open(id);
    Locker_Unlock();
    delay_ms(3000);
    Servo_Close(id);
    Locker_Lock();
}

4. 系统运行流程与逻辑分析

系统上电后,LCD显示欢迎界面,提示用户可进行存包或取包操作。

当用户按下"存包"键时,系统自动生成一个四位随机密码,同时查找空闲的存包柜位置,并通过LCD显示该密码及分配的柜号。用户根据提示将包放入对应柜内后,系统自动关闭柜门并锁定。

当用户按下"取包"键时,系统进入密码输入模式。用户通过键盘输入密码并按下"确认"键后,系统与存储的密码进行匹配。如果验证成功,系统控制舵机和电磁锁打开对应柜门,用户可取回包裹;若输入错误,LCD显示"密码错误",并允许用户重新输入。

整个系统实现了高效、安全的自动存取包控制流程。通过LCD实时显示状态信息和交互提示,系统操作简便、直观。密码管理机制有效防止误操作与信息泄露,具有良好的安全性与实用性。


5. 总结

基于单片机的自动存包柜系统是一个集成度高、可靠性强的智能控制系统。系统以STC89C52单片机为核心,结合矩阵键盘、LCD显示模块、舵机、电磁锁及软件控制,实现了自动生成密码、自动分配空箱、密码验证开箱等功能。其设计充分体现了单片机在智能化控制中的应用优势,系统结构简单、操作方便、运行稳定,具有良好的推广价值。未来可在此基础上扩展网络通信模块,实现远程监控与数据管理,从而构建更加智能化的公共自助存包平台。

相关推荐
Tansmjs37 分钟前
使用Python自动收发邮件
jvm·数据库·python
m0_5613596739 分钟前
用Python监控系统日志并发送警报
jvm·数据库·python
Dxy12393102161 小时前
MySQL INSERT ... ON DUPLICATE KEY UPDATE 与非主键唯一字段
数据库·mysql
zhousenshan1 小时前
springboot事务管理几种方式
数据库
想放学的刺客1 小时前
单片机嵌入式试题(第27期)设计可移植、可配置的外设驱动框架的关键要点
c语言·stm32·单片机·嵌入式硬件·物联网
布局呆星2 小时前
SQLite数据库的介绍与使用
数据库·python
天昊吖2 小时前
stc8H启用DMA发送后 卡住【踩坑日志】
单片机
2401_838472512 小时前
用Python和Twilio构建短信通知系统
jvm·数据库·python
石头wang2 小时前
oracle jdbc 依赖以及对dbeaver的性能影响,如何选择oracle驱动, oracle jdbc 驱动
数据库·oracle
李永奉2 小时前
杰理芯片SDK开发-ENC双麦降噪配置/调试教程
人工智能·单片机·嵌入式硬件·物联网·语音识别