单片机论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机电子密码锁电路程序带仿真,调试通过lcd1602+24C02

  [复制链接]
跳转到指定楼层
楼主
调试通过,,,电子密码锁,,,资料,,,,分享
lcd1602液晶屏显示 并且用24c02保存数据

仿真图 电路图(proteus仿真文件可以从51黑本贴附件下载)


全部资料(压缩包)下载:
密码锁单片机源程序仿真.zip (128 KB, 下载次数: 202)



S0-S9为密码数字键;
S10为删除键,删除上一次输入的数字;
S11为清除键,清除所有输入的数字;
S12为确认键,输入密码后按确认键确认密码是否输入正确;
S13为密码修改键。
S1-S10键按下5秒后,没有其他键按下,则发出报警声,声音持续10s;
输入密码后按确认键,若密码正确,则绿灯亮,否则则红灯亮。

下面是部分程序预览(完整版本请下载本帖附件):
  1. //S1-S9为数字密码输入键0-9
  2. //S10-S13为功能键
  3. //S10为单个数字删除键,S11为所以数字清除键,S12为密码确认键,S13为修改密码键
  4. #include<reg52.h>   //包含头文件
  5. #include"IIC.h"     //包含IIC总线头文件
  6. #include"1602.h"    //包含1602头文件
  7. #include"keyboard.h"    //包含键盘扫描头文件

  8. sbit led_red=P2^5;  //位定义绿灯,密码输入正确时显示
  9. sbit led_gre=P2^6;  //位定义红灯,密码输入错误时显示
  10. sbit spk=P2^7;

  11. uchar ASC[]={'0','1','2','3','4','5','6','7','8','9'};  //将数字转换成字符型数据供1602显示

  12. uchar one=0,two=1,three=2,four=3;      //初始密码0123

  13. uint t0,t1;     //定时器0、1分别溢出的次数

  14. void Init_time0(void)   //定时器0初始化函数   
  15. {
  16.     TMOD=0x11;
  17.     TH0=(65535-50000)/256;
  18.     TL0=(65535-50000)%256;
  19.     TH1=(65535-2000)/256;
  20.     TL1=(65535-2000)%256;
  21.     EA=1;
  22.     ET0=1;
  23.     ET1=1;
  24.     TR0=0;
  25.     TR1=0;
  26. }

  27. void main(void)     //主函数
  28. {
  29.     uchar flag=0,cflag=0;
  30. //flag、cflag分别为修改密码标志和修改密码时初始密码输入正确标志(输入新密码标志)
  31.     uchar i=0,k=0;
  32. //i为输入密码时输入数字密码的个数
  33. //k为修改密码时输入数字密码的个数
  34.     uchar j=0,t=0,shu=1;
  35. //j用于for循环中判断输入密码和存储密码对比
  36. //t=0为进入修改密码状态,只要是为了修改密码时的初始显示
  37. //shu用于输入新密码时,四位密码的地址
  38.     uchar num,newpassword[4];
  39. //num为按键值,newpassword数组存放每次输入的数字密码S0-S13和0-13对应
  40.     Init_IIC();     //初始化IIC
  41.     Init_1602();    //初始化1602
  42.     Init_time0();   //初始化定时器0

  43.     led_red=0;      //熄灭绿灯和红灯
  44.     led_gre=0;
  45.     spk=0;

  46.     write_add(1,one);   //写入初始密码0123到E2PROM
  47.     delay_ms(5);
  48.     write_add(2,two);
  49.     delay_ms(5);
  50.     write_add(3,three);
  51.     delay_ms(5);
  52.     write_add(4,four);
  53.     delay_ms(5);

  54.     displaylistchar(0,0,"Input Password:");     //1602初始化后显示Input Password:

  55.     while(1)
  56.     {
  57. /*检测是否有按键按下,若没有则不停扫描*/
  58.         num=KeyPro();   //扫描按键

  59.         if(num!=0xff)   //如果有键按下
  60.         {
  61. /*******************************************************************************************/
  62. /*输入密码*/
  63.             if((num!=13)&&(flag==0))    //S13为修改密码键,flag为修改密码标志,flag=1时修改密码,判断是否修改密码
  64.             {
  65.                 displaylistchar(0,0,"Input Password:");

  66.                 if(num>=0&&num<=9)  //如果是0-9按下,则输入0-9并在液晶上显示0-9
  67.                 {
  68.                     TR0=~TR0;   //若按键后五秒内没有打开锁,则报警
  69.                     t0=0;
  70.                     displayonechar(i,1,ASC[num]);   //显示输入的数字密码
  71.                     newpassword[i++]=num;        
  72.                 }
  73.    
  74.                 if(num==10)     //如果10按下,在有数字输入的情况下删除上次输入的数字
  75.                 {
  76.                     TR0=~TR0;   //若按键后五秒内没有打开锁,则报警
  77.                     t0=0;
  78.                     if(i>0)
  79.                     {
  80.                         i=i-1;
  81.                         displayonechar(i,1,' ');
  82.                     }
  83.                 }
  84.    
  85.                 if(num==11)     //如果是11按下,清除所有输入的数据,重新输入
  86.                 {
  87.                     TR0=0;
  88.                     i=0;
  89.                     displaylistchar(0,1,"                ");//清除该行
  90.                 }
  91.    
  92.                 if(num==12)     //确认键,如果密码正确,则绿灯亮红灯熄,否则则红灯亮绿灯熄
  93.                 {
  94.                     TR0=0;
  95.                     if(i==4)    //四位密码,所以只在输入四个密码的情况下检测密码是否正确
  96.                     {
  97.                         for(j=0;j<4;j++)
  98.                         {
  99.                             if(newpassword[j]!=read_add(j+1))   //输入的密码和存储的密码对比,若有一个错误,则跳出密码对比
  100.                                 break;
  101.                         }
  102.                         if(j==i)    //若j=i成立,则密码正确
  103.                         {                                               
  104.                             led_gre=1;  //亮绿灯
  105.                             led_red=0;
  106.                             displaylistchar(0,1,"Right Open!");     //显示输入正确
  107.                             delay_ms(1000);
  108.                             i=0;    //按键输入数置0
  109.                             displaylistchar(0,1,"                ");//清除该行
  110.                         }
  111.                         else        //若不成立则密码不正确
  112.                         {
  113.                             led_gre=0;      //亮红灯
  114.                             led_red=1;
  115.                             displaylistchar(0,1,"Wrong Retry!");     //显示输入错误
  116.                             delay_ms(1000);
  117.                             i=0;    //按键输入数置0
  118.                             displaylistchar(0,1,"                ");//清除该行
  119.                         }
  120.                     }

  121.                     else        //若按键输入数i不等于4,则密码肯定错误
  122.                     {
  123.                         led_gre=0;      //亮红灯
  124.                         led_red=1;
  125.                         displaylistchar(0,1,"Wrong Retry!");        //显示输入错误
  126.                         delay_ms(1000);
  127.                         i=0;     //按键输入数置0
  128.                         displaylistchar(0,1,"                ");//清除该行
  129.                     }
  130.                 }
  131.    
  132.                 if(i==6)    //虚设六位密码,数字按键输入六次后还没有按确定的话,则提示密码错误
  133.                 {
  134.                     TR0=0;
  135.                     led_gre=0;        //亮红灯
  136.                     led_red=1;
  137.                     displaylistchar(0,1,"Wrong Retry!");        //显示输入错误
  138.                     delay_ms(1000);
  139.                     i=0;       //按键输入数置0
  140.                     displaylistchar(0,1,"                ");//清除该行
  141.                 }
  142.             }
  143. /*******************************************************************************************/
  144. /*******************************************************************************************/
  145. /*修改密码*/
  146.             else               //有S13键按下或修改密码标志flag置1
  147.             {
  148.                 if(cflag==0)    //修改密码时初始密码输入正确标志cflag置0时为输入初始密码检测状态,类似前面的密码输入   
  149.                 {
  150.                     i=0;        //按键输入数置0
  151.                     flag=1;     //S13键按下,修改密码标志置1
  152.                     if(t==0)    //t=0为进入修改密码状态,只要是为了修改密码时的初始显示
  153.                     {
  154.                         displaylistchar(0,0,"Change Password:");
  155.                         delay_ms(500);
  156.                         displaylistchar(0,1,"Old Password:");
  157.                         delay_ms(500);     
  158.                         displaylistchar(0,1,"                ");//清除该行
  159.                     }
  160.                     t++;        //正在修改密码状态,则不用再次进入修改密码状态
  161.                     if(num>=0&&num<=9)  //如果是0-9按下,则输入0-9并在液晶上显示0-9
  162.                     {
  163.                         TR0=~TR0;   //若按键后五秒内没有打开锁,则报警
  164.                         t0=0;
  165.                         displayonechar(k,1,ASC[num]);
  166.                         newpassword[k++]=num;        
  167.                     }
  168.         
  169.                     if(num==10)     //单个密码删除键,和输入密码时一样
  170.                     {
  171.                         TR0=~TR0;   //若按键后五秒内没有打开锁,则报警
  172.                         t0=0;
  173.                         if(k>0)
  174.                         {
  175.                             k=k-1;
  176.                             displayonechar(i,1,' ');
  177.                         }
  178.                     }
  179.         
  180.                     if(num==11)     //所以密码清除键,和输入密码时一样
  181.                     {
  182.                         TR0=0;
  183.                         k=0;
  184.                         flag=0;
  185.                         displaylistchar(0,1,"                ");//清除该行
  186.                     }  
  187.    
  188.                     if(num==12)     //确认键,和输入密码时一样
  189.                     {
  190.                         TR0=0;
  191.                         if(k==4)
  192.                         {
  193.                             for(j=0;j<4;j++)
  194.                             {
  195.                                 if(newpassword[j]!=read_add(j+1))
  196.                                     break;
  197.                             }
  198.                             if(j==k)        //若初始密码输入正确后提示输入新密码,并将输入新密码标志cflag置1
  199.                             {                                               
  200.                                 led_gre=1;
  201.                                 led_red=0;
  202.                                 displaylistchar(0,1,"Right Open!");
  203.                                 delay_ms(500);
  204.                                 displaylistchar(0,1,"                ");//清除该行
  205.                                 displaylistchar(0,1,"New Password:");
  206.                                 delay_ms(500);
  207.                                 displaylistchar(0,1,"                ");//清除该行
  208.                                 k=0;
  209.                                 cflag=1;
  210.                             }
  211.                             else        //若输入错误,则跳出密码修改,flag=0
  212.                             {
  213.                                 led_gre=0;
  214.                                 led_red=1;
  215.                                 displaylistchar(0,1,"Wrong Retry!");
  216.                                 delay_ms(1000);
  217.                                 k=0;
  218.                                 flag=0;
  219.                                 displaylistchar(0,1,"                ");//清除该行
  220.                                 displaylistchar(0,0,"                ");//清除该行
  221.                                 displaylistchar(0,0,"Input Password:");
  222.                             }
  223.                         }
  224.                         else    //修改密码时输入原密码数不等于4,显然密码错误,跳出密码修改
  225.                         {
  226.                             led_gre=0;
  227.                             led_red=1;
  228.                             displaylistchar(0,1,"Wrong Retry!");
  229.                             delay_ms(1000);
  230.                             k=0;
  231.                             flag=0;
  232.                             displaylistchar(0,1,"                ");//清除该行
  233.                             displaylistchar(0,0,"                ");//清除该行
  234.                             displaylistchar(0,0,"Input Password:");
  235.    
  236.                         }
  237.                     }
  238.                     if(k==6)    //数字按键输入六次后还没有按确定的话,则提示密码错误 ,跳出密码修改
  239.                     {
  240.                         TR0=0;
  241.                         led_gre=0;
  242.                         led_red=1;
  243.                         displaylistchar(0,1,"Wrong Retry!");
  244.                         delay_ms(1000);
  245.                         k=0;
  246.                         flag=0;
  247.                         displaylistchar(0,1,"                ");//清除该行
  248.                         displaylistchar(0,0,"                ");//清除该行
  249.                         displaylistchar(0,0,"Input Password:");
  250.                     }
  251.                 }   
  252.                 else        //输入新密码标志置1,输入新密码并显示新输入的密码
  253.                 {
  254.                     if(num>=0&&num<=9)
  255.                     {
  256.                         write_add(shu,num);
  257.                         displayonechar(shu-1,1,ASC[num]);
  258.                         shu++;
  259.                         if(shu==5)
  260.                         {
  261.                             t=0;
  262.                             shu=1;
  263.                             cflag=0;
  264.                             flag=0;
  265.                             displaylistchar(0,1,"Change Success!");
  266.                             delay_ms(500);
  267.                             displaylistchar(0,0,"                ");//清除该行
  268.                             displaylistchar(0,1,"                ");//清除该行
  269.                             displaylistchar(0,0,"Input Password:");
  270.                         }
  271.                     }
  272.                 }                 
  273.             }

  274.         }
  275.                     
  276.     }
  277. }

  278. void time0(void) interrupt 1
  279. {
  280.     TH0=(65535-50000)/256;
  281.     TL0=(65535-50000)%256;
  282.     t0++;
  283.     if(t0==100)
  284.     {
  285.         t0=0;
  286.         TR0=0;
  287.         TR1=1;      
  288.     }
  289. }

  290. void time1(void) interrupt 3
  291. {
  292.     TH1=(65535-2000)/256;
  293.     TL1=(65535-2000)%256;
  294.     t1++;
  295.     spk=~spk;
  296.     if(t1==5000)
  297.     {
  298.         t1=0;
  299.         TR1=0;
  300.     }
  301. }

复制代码


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

使用道具 举报

沙发
牙签 发表于 2016-12-20 11:25 | 只看该作者
还差1分 才能下
回复

使用道具 举报

板凳
faridzled 发表于 2017-2-28 09:17 | 只看该作者
thanks for sharing
回复

使用道具 举报

地板
faridzled 发表于 2017-2-28 09:21 | 只看该作者
thanks for sharing
回复

使用道具 举报

5#
songjingjun1314 发表于 2017-3-27 17:12 | 只看该作者

thanks for sharing
回复

使用道具 举报

6#
zgh035 发表于 2017-5-21 10:23 | 只看该作者
下载不了
回复

使用道具 举报

7#
无效楼层,该帖已经被删除
8#
漫步_xw 发表于 2017-11-20 15:17 | 只看该作者
谢谢分享!不过积分不够~~~
回复

使用道具 举报

9#
1245794447 发表于 2018-5-28 06:11 | 只看该作者
下载不了,求补附件
回复

使用道具 举报

10#
加油兄弟 发表于 2018-6-7 10:57 | 只看该作者
不错我可以学习到真正意义上的知识了
回复

使用道具 举报

11#
jxhjjm 发表于 2018-6-7 18:01 | 只看该作者

thanks for sharing
回复

使用道具 举报

12#
亲爱的混蛋 发表于 2018-7-18 16:01 | 只看该作者
学习下24c02存储程序
回复

使用道具 举报

13#
FGH116 发表于 2018-10-9 15:36 | 只看该作者
多谢。。。。。。。
回复

使用道具 举报

14#
嗒嗒嗒2 发表于 2018-10-12 18:08 | 只看该作者
很好谢谢
回复

使用道具 举报

15#
茶树康宁 发表于 2018-12-30 22:54 | 只看该作者
楼主厉害
回复

使用道具 举报

16#
方山里 发表于 2019-1-10 12:23 | 只看该作者
还差点分,加油
回复

使用道具 举报

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

本版积分规则

QQ|手机版|小黑屋|单片机论坛 |51黑电子论坛单片机.

Powered by 单片机教程网

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