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

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

点击链接下载资料: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显示模块、舵机、电磁锁及软件控制,实现了自动生成密码、自动分配空箱、密码验证开箱等功能。其设计充分体现了单片机在智能化控制中的应用优势,系统结构简单、操作方便、运行稳定,具有良好的推广价值。未来可在此基础上扩展网络通信模块,实现远程监控与数据管理,从而构建更加智能化的公共自助存包平台。

相关推荐
失散134 小时前
软件设计师——09 数据库技术基础
数据库·软考·软件设计师
养生技术人4 小时前
Oracle OCP认证考试题目详解082系列第53题
数据库·sql·oracle·database·开闭原则·ocp
银帅183350309715 小时前
2018年下半年试题四:论NoSQL数据库技术及其应用
数据库·架构·nosql
liu****5 小时前
基于websocket的多用户网页五子棋(九)
服务器·网络·数据库·c++·websocket·网络协议·个人开发
liu****5 小时前
基于websocket的多用户网页五子棋(八)
服务器·前端·javascript·数据库·c++·websocket·个人开发
Elastic 中国社区官方博客5 小时前
Elasticsearch:使用推理端点及语义搜索演示
大数据·数据库·人工智能·elasticsearch·搜索引擎·ai·全文检索
武子康6 小时前
Java-143 深入浅出 MongoDB NoSQL:MongoDB、Redis、HBase、Neo4j应用场景与对比
java·数据库·redis·mongodb·性能优化·nosql·hbase
萧技电创EIIA7 小时前
基于stc12单片机的PID恒温烙铁设计
单片机·嵌入式硬件·pid过程控制
豆沙沙包?7 小时前
2025年--Lc171--H175 .组合两个表(SQL)
数据库·sql