找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3046|回复: 0
收起左侧

单片机1602密码锁程序仿真 源码及论文

[复制链接]
ID:204395 发表于 2017-5-24 17:53 | 显示全部楼层 |阅读模式
单片机1602密码锁程序仿真
0.png
目 录
第1节 引言…………………………………………………………………………1
    1.1  电子密码锁述……………………………………………………………1
    1.2  本设计主要任务…………………………………………………………1
    1.3  系统主要功能……………………………………………………………2
第2节 系统硬件设计………………………………………………………………3
2.1  系统的硬件构成及功能 …………………………………………………3
2.2  AT89C2051单片机及其引脚说明………………………………………3
第3节 系统软件设计………………………………………………………………5
3.1  系统主程序设计(流程图)……………………………………………5
3.2  软件设计思想……………………………………………………………5
3.3  储单元的分配……………………………………………………………5
3.4  系统源程序………………………………………………………………6
3.5  系统应用说明……………………………………………………………9
3.6  小结………………………………………………………………………9
结束语……………………………………………………………………10
参考文献 ………………………………………………………………………11
附录 ……………………………………………………………………………12

本设计主要任务
(1)共8位密码,每位的取值范围为1~8。
(2)用户可以自行设定和修改密码。
(3)按每个密码键时都有声、光提示。
(4)若键入的8位开锁密码不完全正确,则报警5秒钟,以提醒他人注意。
(5)开锁密码错3次要报警10分钟,报警期间输入密码无效,以防窃贼多次试探密码。
(6)键入的8位开锁密码完全正确才能开锁,开锁时要有1秒的提示音。
(7)密码键盘上只允许有8个密码按键和1个发光管。锁内有备用电池,只有内部上电复位时才能设置或修改密码,因此,仅在门外按键是不能修改或设置密码的。
(8)密码设定完毕后要有2秒的提示音。
     以上是初步设定的电子密码锁的主要功能。
0.png 0.png
单片机源程序如下:
  1. #include"reg51.h"
  2. #include"key.h"
  3. #include"lcd.h"
  4. uchar code show_0[]="Please input the password:";
  5. uchar code show_1[]="The mima is:" ;
  6. uchar code show_2[]="********";
  7. uchar code show_3[]="The password is wrong!";
  8. uchar code show_4[]="This is delay 5s";
  9. uchar code show_5[]="Please zai shu yici!";
  10. uchar code show_6[]="you are right!";
  11. uchar code show_7[]="Please input the new mima:";
  12. uchar code show_8[]="Input it again!";
  13. uchar code show_9[]="Establishes successful! ";
  14. uchar code show_10[]="(^_^)";
  15. uchar code show_11[]="shuru guanliyuan mima";
  16. uchar code show_12[]="chao shi baojing";

  17. sbit baojing                        = P1^1;       
  18. sbit jidianqi=P1^0;
  19. int k;
  20. //蜂鸣器
  21. void beep()                //????????
  22. {   uchar  i;
  23.   for(i=0;i<10;i++)
  24.         {
  25.        
  26.                 delay(10);           //??10??
  27.                 baojing =! baojing;
  28.                 delay(10);           //??10??
  29.         }   
  30. }
  31.        
  32.        
  33. void play(uchar *j,uchar q)          //K是显示的个数,j是地址
  34. {
  35.    uchar  i;
  36.    for(i=0;i<q;i++)
  37.    {
  38.     dat_w(*(j+i));
  39.         delay(20);
  40.    }
  41. }
  42. time0() interrupt 1
  43. {          
  44.                 TH0=(65536-50000)/256;
  45.           TL0=(65536-50000)%256;
  46.           k++;
  47.        
  48.           if(k>=(20*60*3))
  49.                 {  k=0;
  50.                         //jidianqi=0;
  51.                         beep();       
  52.                         clear();
  53.   gotoxy(1,0);
  54.   play(show_12,16);
  55.   gotoxy(2,0);
  56.   play(show_12+17,10);
  57.                  }
  58.        
  59. }
  60. void main()
  61. { uchar  init_pswd[]={0,0,0,0,0,0,0,0};
  62.   uchar  guanli_pswd[]={8,8,8,8,8,8,8,8};
  63.   uchar  pswd[8]={0};
  64.   uchar  pswd_1[8]={0};
  65.   uchar j=0,i=0,sum_1=0,g=0;
  66.         TMOD=0x01;
  67.         TH0=(65536-50000)/256;
  68.         TL0=(65536-50000)%256;
  69.         EA=1;
  70.         ET0=1;
  71.         //beep();
  72.   loop:init();
  73.         i=0;sum_1=0;
  74.     clear();
  75.   gotoxy(1,0);
  76.   play(show_0,16);
  77.   gotoxy(2,0);
  78.   play(show_0+17,10);
  79.   /****密码输入****/
  80.   do
  81.   {
  82.     key();
  83.   }
  84.   while(ki!=15);
  85.        
  86.         TR0=1;//定时器开始计时,超时报警
  87.   clear();
  88.   gotoxy(1,0);
  89.   play(show_1,13);
  90.   do
  91.   {
  92.     flag=0;
  93.     key();
  94.                
  95.                 gotoxy(2,0);
  96.         if(flag==1&&ki<=9)
  97.          {
  98.           pswd[i]=ki;
  99.                  i++;
  100.           play(show_2,i);
  101.          
  102.          }
  103.    }       
  104.    while(i<=7);
  105.    for(i=0;i<=7;i++)
  106.    {
  107.      sum_1=init_pswd[i]-pswd[i]+sum_1;//比较密码是否正确
  108.                  
  109.          }
  110.    
  111.           if(sum_1==0)
  112.           {
  113.           
  114.            clear();
  115.            gotoxy(1,0);
  116.            play(show_6,15);
  117.                    jidianqi=0;
  118.        //beep();                       
  119.         //TR0=0;                        //密码正确打开继电器,关闭计时器
  120.            do
  121.            {
  122.            key();
  123.            }
  124.            while(ki!=13);
  125.                  jidianqi=1;
  126.            loop1:clear();
  127.            gotoxy(1,0);
  128.            play(show_7,13);
  129.            gotoxy(2,0);
  130.            play(show_7+13,13);
  131.            /****第一次输密码***/
  132.            i=0;
  133.             do
  134.             {
  135.                   flag=0;
  136.           key();
  137.                   if(flag==1&&ki<=9)
  138.              {
  139.                pswd[i]=ki;
  140.                    i++;
  141.                    clear();
  142.                    gotoxy(1,0);
  143.                    play(show_2,i);
  144.                    }
  145.                    }while(i<=7);
  146.                  clear();
  147.                  gotoxy(1,0);
  148.              play(show_8,15);
  149.            /***第二次输密码****/
  150.                  i=0;
  151.                  sum_1=0;
  152.             do
  153.             {
  154.                   flag=0;
  155.           key();
  156.                   if(flag==1&&ki<=9)
  157.               {
  158.                pswd_1[i]=ki;
  159.                    i++;
  160.                    clear();
  161.                    gotoxy(1,0);
  162.                    play(show_2,i);
  163.                    }
  164.                     }
  165.                  while(i<=7);
  166.                  for(i=0;i<=7;i++)
  167.                   {
  168.                    sum_1=sum_1+ pswd_1[i]-pswd[i];
  169.                    }
  170.                  if(sum_1==0)
  171.                    {
  172.                     clear();
  173.                            gotoxy(1,2);
  174.                         play(show_9,12);
  175.                         gotoxy(2,2);
  176.                         play(show_9+13,11);
  177.                         for(i=0;i<=7;i++)
  178.                         {
  179.                         init_pswd[i]=pswd[i];
  180.                          }
  181.                          goto  loop ;
  182.                    }
  183.                  if(sum_1!=0)
  184.                    {
  185.                      clear();
  186.                      goto loop1;
  187.                    }
  188.           }       
  189.   if(sum_1!=0)//密码不正确e
  190.          {
  191.            clear();
  192.                  
  193.            j++;//统计输错次数
  194.            if(j==3)
  195.            {
  196.             clear();
  197.           
  198.        beep();//三次输入密码失败,报警

  199.                           
  200.             while(g==0)
  201.                         {
  202.        clear();
  203.   gotoxy(1,0);
  204.   play(show_11,15);
  205.         gotoxy(2,0);
  206.         play(show_11+15,6);
  207.         i=0;sum_1=0;
  208.   do
  209.   {
  210.     flag=0;
  211.                 gotoxy(2,7);
  212.     key();
  213.                 //beep();       
  214.        
  215.                
  216.         if(flag==1&&ki<=9)
  217.          {
  218.           pswd[i]=ki;
  219.                 i++;
  220.           play(show_2,i);
  221.           
  222.          }
  223.    }       
  224.    while(i<=7);
  225.    for(i=0;i<=7;i++)
  226.    {
  227.      sum_1=guanli_pswd[i]-pswd[i]+sum_1;
  228. ……………………

  229. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
电子密码锁1602液晶显示资料.zip (446.83 KB, 下载次数: 103)
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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