找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5233|回复: 4
打印 上一主题 下一主题
收起左侧

基于51单片机的自动存储柜系统设计 by KIZAI

[复制链接]
跳转到指定楼层
楼主
本人是一名大二的高职院学生,这只是本人的一个练习设计,写这个贴子主要是为了让想学单片机的师兄可以做下参考,这只是一个比较简单的案例,以下我把我的设计文档分享给大家,主要是给你们参考,希望大家学电子专业不是为了浑水摸鱼,有什么不懂的可以加我qq问我!大家互相学习!!!阿里嘎多!!!

摘要
    本设计以AT89C52为主控制器,来实现通过密码的比对完成自动存取包过程的设计。整个系统由控制模块、LCD1602显示模块和矩阵按键模块组成。
    此自动存包柜系统能控制4个存包柜,它利用控制柜门的打开,当顾客按“存包”或“取包”键时,相应的空柜门会自动打开(本项目通过亮灯表示打开),并且能产生一组4位数的随机密码,密码使用一次有效,且有三次容错功能和解锁功能,所以安全性能很高。由于随机密码是软件产生,使得硬件更为经济实用、简单且便于安装。
第一节    控制系统的工作原理及技术要求

本系统采用AT89C52单片机为主控制器,可以同时管理4个存包柜。当顾客需要存包的时候,可以自行到存包柜前按“存”键,单片机接收到一脉冲信号,并通过系统I/O口发出相应的信号,控制锁柜门的电磁阀将一空箱打开(用对应的灯表示),顾客即可存包。当顾客需要取包时,只要手动输入密码就会把信息输出相应的高低电平信号传给单片机,系统比较密码一致后,打开相应的箱子,顾客可以取包。
本系统要求具有较高的自动化程度,以AT89C52单片机为核心,通过按键控制柜门(灯)的打开。关门后通过LCD1602显示柜子的信息;实时显示无物的箱体号。并具有断电保护功能。
第二节  自动存包柜系统框图

该系统MC51单片机为核心,还有空箱显示,断电保护等部分。



图 1-1 自动存包柜系统框图

第二节    电路设计一、  按键、矩阵输入电路

按键、矩阵按键图如图1-2。该系统中键盘的主要功能是用于顾客选择适当的柜来存包,这里我们用3x4矩阵式键盘和两个独立按键,用独立按键来实现存取的功能,矩阵键盘实现密码解锁功能,矩阵键盘有一个确定按键,键盘是用AT89C52通过横纵扫描方式实现矩阵键盘的功能,使用编程扫描方式可以很容易的实现键盘和显示的功能及消抖功能。
file:///C:/Users/THIC-PC/AppData/Local/Temp/msohtmlclip1/01/clip_image004.png
图 1-2  按键和矩阵按键电路
二、  对应柜子灯设计

提示电路图1-3。由于时间和耗材不足的问题,就没有准备做机械开关,只能通过灯亮灭情况来说明柜子的情况,我采用低电平触发,由于单片机I/O的电压过低,灯的功率过大都可能影响灯的高度,从而影响实际体验,所以把灯采用共阳低电平触发,保证显示效果。



图 1-3  提示灯电路设计
三、  报警模块电路设计

报警电路图1-4。为了提醒顾客密码输入错误或提醒柜子全都被使用而设计的报警模块。
报警电路使用到的是有源蜂鸣器,所以要有三极管来驱动提供足够的电压来驱使蜂鸣器发声,所以我们把信号传到三极管的基极让三极管为蜂鸣器提供
动力。
图 1-4  报警模块设计
四、  主控制器电路设计

主控制器电路图1-4。本项目采用的主控是89C52,基本的晶振设计和复位电路都必须要具备的,还有一个复位按键,可以在单片机卡BUG的时候可以进行复位。


图 1-5  主控电路设计
程序主要源代码
主函数部分
#include "LCD1602.h”
#include "TIME0.h"   
#include "Key_scan.h"
#include<stdlib.h>//数学运算的头文件
uchar cabinet_1=0; //一号柜子空/满的标志位
uchar cabinet_2=0; //二号柜子空/满的标志位
uchar cabinet_3=0; //三号柜子空/满的标志位
uchar cabinet_4=0; //四号柜子空/满的标志位
uchar FULL_flag=1; //柜子全部是空标志

uint Cipher_1=0;    //一号柜子密码缓存
uint Cipher_2=0;    //二号柜子密码缓存
uint Cipher_3=0;    //三号柜子密码缓存
uint Cipher_4=0;   //四号柜子密码缓存

#define default_1 1111     //一号柜子的默认密码1111
#define default_2 2222     //二号柜子的默认密码2222
#define default_3 3333     //三号柜子的默认密码3333
#define default_4 4444    //四号柜子的默认密码4444

uchar lcd_The_first_line[16]={"1-NULL    2-NULL"};
uchar lcd_The_second_line[16]={"3-NULL    4-NULL"};
{
  if(cabinet_1){lcd_The_first_line[2]='F';}else{lcd_The_first_line[2]='N';}
  if(cabinet_2){lcd_The_first_line[12]='F';}else{lcd_The_first_line[12]='N';}
  if(cabinet_3){lcd_The_second_line[2]='F';}else{lcd_The_second_line[2]='N';}
   if(cabinet_4){lcd_The_second_line[12]='F';}else{lcd_The_second_line[12]='N';}
   WriteChar(1,0,16,lcd_The_first_line);   
   WriteChar(2,0,16,lcd_The_second_line);
}void System_init(void)
{
   LED_ALL_ON();
   Delay_ms(500);
   LED_ALL_OFF();
   Delay_ms(500);

   LED_ALL_ON();
   Delay_ms(500);
   LED_ALL_OFF();
   Delay_ms(500);

   LED_ALL_ON();
   Delay_ms(500);
   LED_ALL_OFF();
   Delay_ms(500);

   BUZZER_ON();
   LED_ALL_ON();
   Delay_ms(1000);
   BUZZER_OFF();
   LED_ALL_OFF();
   Delay_ms(1000);
}
//存东西函数
uint Random_Cipher(uchar CH)
{
   uint Cipher_val;
   ucharCipher_all[16]={"Cipher:     CH:"};
   if(CH==1)Cipher_all[15]='1';
   elseif(CH==2)Cipher_all[15]='2';
   elseif(CH==3)Cipher_all[15]='3';
   elseif(CH==4)Cipher_all[15]='4';
   srand(count);//设置随机数种子
   Cipher_val=rand()%1000; //调用随机函数,产生一个1000以内的函数,用作随机密码。
   Cipher_all[7]=Cipher_val/1000+0x30;
   Cipher_all[8]=Cipher_val/100%10+0x30;
   Cipher_all[9]=Cipher_val/10%10+0x30;
   Cipher_all[10]=Cipher_val%10+0x30;   
   WriteChar(1,0,16,"Pleaseremember  ");
   WriteChar(2,0,16,Cipher_all);
   return Cipher_val;
}
void Storage(void)
{
   if(!cabinet_1){cabinet_1=1;FULL_flag=0;LED1=1;Cipher_1=Random_Cipher(1);}//第一个柜子是空的
  else if(!cabinet_2){cabinet_2=1;FULL_flag=0;LED2=1;Cipher_2=Random_Cipher(2);} //第二个柜子是空的
  elseif(!cabinet_3){cabinet_3=1;FULL_flag=0;LED3=1;Cipher_3=Random_Cipher(3);} //第三个柜子是空的
  elseif(!cabinet_4){cabinet_4=1;FULL_flag=0;LED4=1;Cipher_4=Random_Cipher(4);} //第四个柜子是空的
   else
   {
        //FULL_flag=1;
        WriteChar(1,0,16,"Sorry!Full load");
        WriteChar(2,0,16,"Thankyou....   ");
        BUZZER_ON();Delay_ms(2000);BUZZER_OFF();//蜂鸣器提醒
   }
   while((uchar)Key_scan()!=11);{LCD_DISP_ALL();/*LED_ALL_OFF;*/}
void Extract(void)
{
   uchar i=0,j=0;
   uint Cipher_val;
   ucharCipher_all[16]={"Cipher:        "};
   if(FULL_flag)
   {
        WriteChar(1,0,16,"Sorry!No-load  ");
        WriteChar(2,0,16,"Thankyou....   ");
        BUZZER_ON();Delay_ms(2000);BUZZER_OFF();
        Delay_ms(4000);
        LCD_DISP_ALL();
   }
   else
   {
        WriteChar(1,0,16,"Pleaseinput     ");
        WriteChar(2,0,16,Cipher_all);
        while(1)
        {
              i=Key_scan();//扫描函数0-9确认
              if(i!=11&&i!=12&&i!=13&&j<4)//4位密码数
              {   
                   Cipher_all[8+j++]=(i+0x30);
                   WriteChar(2,0,16,Cipher_all);
              }
              if(i==11)//确认键,比较密码是否正确
              {
                   Cipher_val=(Cipher_all[8]-0x30)*1000+(Cipher_all[9]-0x30)*100+(Cipher_all[10]-0x30)*10+(Cipher_all[11]-0x30);   
                  if(Cipher_val==Cipher_1||Cipher_val==default_1){cabinet_1=0;LED1=0;}
                  if(Cipher_val==Cipher_2||Cipher_val==default_2){cabinet_2=0;LED2=0;}
   if(Cipher_val==Cipher_3||Cipher_val==default_3){cabinet_3=0;LED3=0;}      if(Cipher_val==Cipher_4||Cipher_val==default_4){cabinet_4=0;LED4=0;}
   if(cabinet_1==0&&cabinet_2==0&&cabinet_3==0&&cabinet_4==0)FULL_flag=1;

               if(Cipher_val==Cipher_1||Cipher_val==Cipher_2||Cipher_val==Cipher_3||Cipher_val==Cipher_4||Cipher_val==default_1||Cipher_val==default_2||Cipher_val==default_3||Cipher_val==default_4)
                   {
                         WriteChar(1,0,16,"CipherCorrect ! ");
                         WriteChar(2,0,16,"Goodluck....    ");
                         BUZZER_ON();Delay_ms(2000);BUZZER_OFF();
                   }
                   else
                   {
                         WriteChar(1,0,16,"CipherError!   ");
                         WriteChar(2,0,16,"Reenter!!!     ");
                         BUZZER_ON();Delay_ms(6000);BUZZER_OFF();     
                   }
                   Delay_ms(4000);
                   LCD_DISP_ALL();
                   /*LED_ALL_OFF();*/
                   break;
              }
        }
   }   
}
void main(void)
{
   System_init();
   Time0_Init();

   LCD_Init();   
  LCD_DISP_ALL();
  while(1)
   {   
        if(!Save){Delay_ms(10);while(!Save);Storage();}//存键
        if(!Take){Delay_ms(10);while(!Take);Extract();}//取键
   }
}
比较难的部分都写好注解了
其他代码自己写,不会就多看书,问度娘,只要你不是睿智的,只要花点时间就会写,别给自己找太多借口,不然你永远无法进步。

接下来是PCB的布局和成品的样子



注意可调电阻二号脚的位置



这是成品的板子



具体效果样图



补充一句,如果你需要这块板子可以私聊我,板子是白色的。

第一次发帖,请大家多多指教!!


评分

参与人数 2黑币 +65 收起 理由
彬Lsl + 15 很给力!
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:718110 发表于 2020-4-9 13:24 | 只看该作者
头文件可以发出来研究一下吗
回复

使用道具 举报

板凳
ID:718110 发表于 2020-4-9 13:25 | 只看该作者
本篇文章写的特别好,可以把头文件发出来研究一下吗
回复

使用道具 举报

地板
ID:621446 发表于 2021-4-3 19:46 | 只看该作者
您好!可以发下完整代码吗?小白想学习下 谢谢~
回复

使用道具 举报

5#
ID:672473 发表于 2021-5-27 12:10 | 只看该作者
完整代码可以分享一下吗
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表