找回密码
 立即注册

QQ登录

只需一步,快速开始

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

超市存包柜系统设计 PPT proteus仿真及密码锁源程序

[复制链接]
跳转到指定楼层
楼主

给51黑电子论坛的朋友们分享一个超市存包柜系统设计:


完整资料下载:
http://www.51hei.com/bbs/dpj-77166-1.html


下面是
超市存包柜设计的ppt文档预览:




设计思路
      本设计采用AT89C51单片机作为控制核心,以LCD1602作为显示器件,以矩阵键盘作为人机操作手段。
     系统主要设置了“存包”和“取包”的功能,当存包时,系统会生成一个四位的随机数密码,供用户记忆;然后取包时,用户输入刚才的密码,如果密码正确就开锁,如果错误就不开锁,并做出警告提示。




5、继电器电路的设计

采用继电器来模拟柜门的开关
该继电器一端固定接地,另外一端接P37引脚
当P37为高,继电器吸合,代表关门
当P37为低,继电器断开,代表开门



按键电路的设计
系统设计了1个4*4的矩阵键盘
  其中有10个数字按键(0-9)
存包 – 按下此按键,生成随机密码
取包 – 按下此按键,进行密码输入
清除 – 在输入密码过程中,按下此键,可以清空输入
确认 – 按下此键,进行密码验证




LED电路设计
系统采用一个红色LED,用来作为密码错误提示
一个绿色LED,用来作为密码正确提示
红色LED正极通过一个限流电阻接电源正极,负极接单片机P33,因此P33为低时,该LED点亮
绿色LED正极通过一个限流电阻接电源正极,负极接单片机P34,因此P34为低时,该LED点亮











下面是仿真原理图:




超市存包柜(电子密码锁)单片机主程序:
  1. #include <reg51.h>
  2. #include <intrins.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #include<absacc.h>
  6. #include "lcd1602.h"
  7. #include "main.h"
  8. #include "key.h"

  9. sbit Lock = P3^7;  //代表锁控的继电器IO   高电平关锁,低电平开锁
  10. sbit LEDRED = P3^3;  //代表密码输入错误的红灯IO  高电平熄灭,低电平点亮
  11. sbit LEDGREEN = P3^4;  //代表密码输入正确的绿灯IO  高电平熄灭,低电平点亮
  12. uchar genPasswd[4];           //存储生成的四位随机数密码
  13. uchar inpPasswd[4];           //存储取包时输入的四位密码
  14. uchar code welcome[8]="welcome";  //开机显示的欢迎标语
  15. uchar code set[7]="Passwd";    //显示生成的密码标题
  16. uchar code  close[12]="close door!";   //提示关门
  17. uchar code         input[13] = "input passwd";   //提示请输入密码

  18. /****************定时器设置相关的变量***********************/
  19. unsigned char TL0_temp;         /*暂存TL0的初值*/
  20. unsigned char TH0_temp;         /*暂存TH0的初值*/
  21. #define INT_CLOCK 10    /*INT_CLOCK为定时值,单位为ms ,此处定义为10ms*/
  22. #define CRY_FREQUENCY 11059200 /*CRY_FREQUENCY为晶振频率,单位为Hz*/





  23. /*延时程序*/
  24. void delay(uint z)               
  25. {
  26.         unsigned int i,j;
  27.    for(i=0;i<z;i++)
  28.     for(j=0;j<100;j++);
  29. }
  30. /******************************
  31. 显示首页 welcome
  32. ******************************/
  33. void display1()
  34. {
  35.    unsigned char i;
  36.    for(i = 0;i < 7;i++)
  37.    {
  38.                    wr_com(0x85+i);
  39.                 wr_dat(welcome[i]);
  40.    }
  41. }


  42. /************************************
  43. 显示密码生成界面
  44. ************************************/
  45. void display2()
  46. {
  47.    unsigned char i;
  48.    
  49.    for(i = 0;i < 6;i++)
  50.    {
  51.                    wr_com(0x85+i);
  52.                 wr_dat(set[i]);
  53.    }
  54.    for(i = 0;i < 4;i++)
  55.    {
  56.                    wr_com(0xc6+i);
  57.                 wr_dat(genPasswd[i]+0x30);
  58.                
  59.    }
  60. }

  61. /************************************
  62. 显示请关门界面
  63. ************************************/

  64. void display3()
  65. {
  66.      unsigned char i;
  67.    for(i = 0;i < 11;i++)
  68.    {
  69.                    wr_com(0x83+i);
  70.                 wr_dat(close[i]);
  71.    }

  72. }


  73. /************************************
  74. 显示密码输入界面
  75. ************************************/
  76. void display4()
  77. {
  78.    unsigned char i;
  79.    for(i = 0;i < 12;i++)
  80.    {
  81.                    wr_com(0x82+i);
  82.                 wr_dat(input[i]);
  83.    }
  84.    for(i = 0;i < 4;i++)
  85.    {
  86.                    wr_com(0xc6+i);
  87.                 wr_dat(inpPasswd[i]+0x30);
  88.                
  89.    }

  90. }
  91.         




  92. /***********************************
  93. 定时器0初始化
  94. ***********************************/
  95. void Timer0_init()
  96. {
  97.         unsigned long T0_temp;                                     /*暂存T0的初始值        */
  98.         T0_temp = 65536-((INT_CLOCK *CRY_FREQUENCY /1000)/12);    /*T0初始值计算公式,参考教科书*/
  99.         TL0_temp = T0_temp & 0xff;
  100.         TH0_temp = T0_temp >> 8;
  101.         TL0 = TL0_temp;
  102.         TH0 = TH0_temp;
  103.         TMOD |= 0x01;
  104.         TR0 = 1;                        /*开定时器0中断*/
  105.         ET0 = 1;  
  106.         EA = 1;                    /*开总中断*/                                       

  107. }






  108. /*主函数*/
  109. uchar global_state = 0;
  110. uchar count_num = 0;  //输入的数字个数
  111. void main()
  112. {  
  113.    uchar i;
  114.    uchar passwd;
  115.    
  116.            uchar key_value = 0;
  117.         uchar temp_key_value = 0xff;
  118.         Lock = 1;  //刚上电 锁是需要保持闭合
  119.         Timer0_init();        //定时器初始化
  120.          lcd_init();        //LCD1602初始化
  121.    
  122.         while(1)        //进入不断循环
  123.         {
  124.                    temp_key_value = Calkey_scan();          //读取矩阵按键的键值
  125.                 if(temp_key_value != 0xff)
  126.                 {
  127.                         key_value = temp_key_value;
  128.                 }
  129.                 switch(global_state)
  130.                 {
  131.                         case 0:         //初始化状态
  132.                                 display1();         //显示欢迎语句        -- "welcome"
  133.                         

  134.                                 if(key_value == 13)  //存包按键被按下
  135.                                 {
  136.                                     key_value = 0xff;  //将按键值清除
  137.                                         Lock = 0;    //开锁
  138.                                        
  139.                                         display3();    //显示关门提示语        -- "close door!"
  140.                                     delay(1900);    //等待关门 大约3秒
  141.                                         Lock = 1;   //关门
  142.                                         clear();                 //清屏,准备下一屏的显示
  143.                                         global_state = 1;   //切换运行状态
  144.                                         passwd = TL0;  //采用定时器寄存器的值作为密码
  145.                                         genPasswd[0] = passwd/100;                  //存储密码
  146.                                         genPasswd[1] = passwd%100/10;
  147.                                         genPasswd[2] = passwd%10;
  148.                                         genPasswd[3] = (genPasswd[1]+genPasswd[2])%10;
  149.                                 }
  150.                                 if(key_value == 14)  //取包按键被按下
  151.                                 {
  152.                                     key_value = 0xff;  //将按键值清除
  153.                                         clear();    //清屏,准备下一屏的显示
  154.                                         global_state = 2;  //切换运行状态
  155.                                         count_num = 0;   //清除数字按键变量
  156.                                         for(i = 0;i < 4;i++)  //清空输入的密码数组
  157.                                             inpPasswd[i] = ' '-0x30;
  158.                                 }
  159.                         break;
  160.                         case 1:                //密码生成状态
  161.                                    display2();         //显示密码生成界面
  162.                                 delay(1900);    //等待大约3秒
  163.                                 global_state = 0;  //返回到初始界面
  164.                                 clear();        //清屏,准备下一屏的显示
  165.                                 
  166.                         break;
  167.                         case 2:          //输入密码状态
  168.                            display4();           //显示输入密码界面
  169.                            if((key_value >= 0) && (key_value <= 9))          //如果按下的为0-9的数字按键
  170.                            {
  171.                               
  172.                                 if(count_num <= 3)         //如果按键次数小于4次
  173.                                         {
  174.                                         inpPasswd[count_num] = key_value; //将按键值存入数组,并显示
  175.                                                    count_num++;
  176.                                     }
  177.                                          key_value = 0xff;  //将按键值清除
  178.                            }
  179.                            if(key_value == 15) //清除按键被按下
  180.                            {
  181.                                 key_value = 0xff;  //将按键值清除
  182.                                            for(i = 0;i < 4;i++)
  183.                                           inpPasswd[i] = ' '-0x30;  //清除刚刚输入的密码
  184.                            }
  185.                            if(key_value == 16) //确认按键被按下
  186.                            {
  187.                                 key_value = 0xff;  //将按键值清除
  188.                                            for(i = 0;i < 4;i++)
  189.                                         {
  190.                                                 if(inpPasswd[i] != genPasswd[i])
  191.                                                    break;
  192.                                         }
  193.                                         if(i == 4)          //密码输入正确
  194.                                         {
  195.                                                 LEDRED = 1;         //红灯熄灭
  196.                                                 LEDGREEN = 0;  //绿灯亮
  197.                                                 Lock = 1;  //开锁
  198.                                                 delay(1900);    //等待大约3秒
  199.                                                 Lock = 0;  //关锁
  200.                                                 LEDGREEN = 1;  //绿灯熄灭
  201.                                         }
  202.                                         else   //密码输入错误
  203.                                         {
  204.                                                 LEDRED = 0;         //红灯亮
  205.                                                 LEDGREEN = 1;  //绿灯熄灭
  206.                                                 Lock = 0;  //关锁
  207.                                                 delay(1900);    //等待大约3秒
  208.                                                 LEDRED = 1;  //红灯熄灭
  209.                                         }
  210.                                         clear();           //清屏,准备下一屏的显示
  211.                                         global_state = 0;  //返回到初始界面

  212.                            }
  213.                         break;        
  214.                 }
  215.         }
  216. }


  217. void T0_interrupt(void) interrupt 1         
  218. {
  219.         TH0 += TH0_temp;
  220.         TL0 += TL0_temp;

  221. }

复制代码


本设计的完整资料下载(含仿真 论文 原理图 ppt等):
http://www.51hei.com/bbs/dpj-77166-1.html



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

使用道具 举报

沙发
ID:338109 发表于 2018-5-25 15:51 | 只看该作者
灰常感谢分享!!
回复

使用道具 举报

板凳
ID:621033 发表于 2019-10-9 14:12 | 只看该作者
感谢分享
回复

使用道具 举报

地板
ID:599674 发表于 2019-10-25 14:26 来自手机 | 只看该作者
太感谢楼主
回复

使用道具 举报

5#
ID:677478 发表于 2019-12-30 14:38 | 只看该作者
感谢分享
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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