找回密码
 立即注册

QQ登录

只需一步,快速开始

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

Proteus仿真C51单片机的电子密码锁程序 24C02C

  [复制链接]
回帖奖励 10 黑币 回复本帖可获得 1 黑币奖励! 每人限 1 次
跳转到指定楼层
楼主
本帖最后由 lxl_51h 于 2020-5-22 23:14 编辑

分享电子密码锁项目

第一次发帖,分享电子密码锁项目。关键代码段注释详尽。
仿真视频如下连接:







单片机源程序如下:
  1. #include <reg52.h>
  2. #include <intrins.h>

  3. #include "lxl_24C02C.h"
  4. #include "uart.h"
  5. #include "LCD1602.h"
  6. #include <keypad44.h>

  7. sbit greenled=P2^3;                                                //Enter the right passwords,green led will lighting.
  8. sbit lock=P2^4;                                                                //Enter the right passwords,electronic lock will unlock.
  9. sbit redled=P2^5;                                                        //Enter the wrong passwords,red led will lighting.
  10. void show_base_infromation()        //show something personal information on the screen of LCD1206.just delay for a moment than cleanning all screen.
  11. {
  12.         uchar i;
  13.         LCMDisplayString(0,0,"Design:LiXinLong");
  14.         LCMDisplayString(1,0,"My ID:208171421");        
  15.         for(i=0;i<4;i++)keypad_delay(65535);                //delay for a moment
  16.         LCMClear();                                                                                                                        //clean all screen.
  17. }

  18. void set_init_password()                        //set users' initialize passwords.
  19. {
  20.         Master_writeByte(1,1);                        //The user 1 ,password:0001,password saved in register 1 of 24C02C.
  21.         Master_writeByte(2,2);                        //The user 2 ,password:0002,password saved in register 2 of 24C02C.
  22.         Master_writeByte(3,3);                        //The user 3 ,password:0003,password saved in register 3 of 24C02C.
  23. }
  24. int get_user_password(uchar i)//Get users' password ,i is the register number of the specific user.
  25. {
  26.         int read=Master_readByte(i);//read the appointed register.
  27.         return _cror_(read,8);                        //translated the value to int,and return the value.
  28. }
  29. void main()
  30. {
  31.         
  32.         uchar presstimes=0;                                        //the register keep user's press times,maximum are 4,because the munber of password bits are defined as 4.  
  33.         uchar enter_times=0;                                //if user enter wrong password ,the register keep user's press times of "Enter",maximum are 3,beyond 3 account will locked(forbid to enter any number.).
  34.         bit changepswd_state=0;                        //flage bit of user pressed "Reset password" key,1:pressed,0:not pressed.
  35.         bit change_use1=0;                                        //flage bit of user1 entered the old password correctly,and input the new passwords done.
  36.         bit change_use2=0;                                        //*****************************similar to change_use1***********************************
  37.         bit change_use3=0;                                        //*****************************similar to change_use1***********************************
  38.         bit beyond3times=1;                                        //flage bit of users' entered the wrong password beyond 3 times.1: not beyond,0:beyond.

  39.         
  40.         int readkeypad;                                                                                                                //the register keep the keypad return value.
  41.         int keypadvalue=0;                                                                                                //the register keep the value when 4 times pressed.
  42.         int press1,press2,press3,press4;                                        //press1:the value of 1st keypad return value multiple oppointed scale.press2-3 are similar to this.
  43.         UartInit();                                                                                                                                //initialize the USART for printf() to debug.
  44.         LCMInit();                                                                                                                                //initialize the LCD1206.
  45.         printf("\nshow some \npersonal \ninfromation!\n");
  46.         show_base_infromation();
  47.         printf("\nplease enter your\npassword\n");
  48.         keypad_delay(65535);        
  49.         set_init_password();
  50.         LCMDisplayString(0,0,"Input pswd:");
  51.         LCMDisplayString(1,0,"You error 0 Time");
  52.         
  53.         while(1)
  54.         {
  55.                 readkeypad=key_scan();
  56.                 if(((readkeypad<10)||(readkeypad==14)||(readkeypad==13))&&beyond3times)//allowed press 0-9,"clean" or "enter" when account not lock(wrong password not beyond 3 times).
  57.                 {
  58.                         presstimes=presstimes+1;
  59.                         switch(presstimes)
  60.                         {
  61.                                 case 1:                                                                                                                        //the 1st bit of 4bits password.
  62.                                         {
  63.                                                 press1=readkeypad*1000;        
  64.                                                 LCMDisplayString(0,11,"*");               
  65.                                                 printf("pressed %d\n",readkeypad);
  66.                                         }break;
  67.                                 case 2:                                                                                                                        //the 2nd bit of 4bits password.
  68.                                         {
  69.                                                 press2=readkeypad*100;
  70.                                                 LCMDisplayString(0,11,"**");
  71.                                                 printf("pressed %d\n",readkeypad);
  72.                                         }break;
  73.                                 case 3:                                                                                                                        //the 3rd bit of 4bits password.
  74.                                         {
  75.                                                 press3=readkeypad*10;
  76.                                                 LCMDisplayString(0,11,"***");
  77.                                                 printf("pressed %d\n",readkeypad);
  78.                                         }break;
  79.                                 case 4:                                                                                                                        //the 4th bit of 4bits password.
  80.                                         {
  81.                                                 press4=readkeypad;
  82.                                                 LCMDisplayString(0,11,"****");
  83.                                                 printf("pressed %d\n\n",readkeypad);
  84.                                         }break;
  85.                                 default:break;                                
  86.                         }                        
  87.                 }
  88.                
  89.                 if((presstimes<=5)&&(readkeypad>11))                //Entered 4bits password,checking whether "Enter" or "Clean" pressed.
  90.                         {
  91.                                 switch(readkeypad)
  92.                                 {
  93.                                         case 14:                                                                                                        //pressed 'Enter' key
  94.                                         {
  95.                                                 keypadvalue=press1+press2+press3+press4;
  96.                                                 presstimes=0;
  97.                                                 if(enter_times<3)LCMDisplayString(0,11,"    ");
  98.                                                 if(change_use1)                                                                        
  99.                                                         {
  100.                                                                 Master_writeByte(1,keypadvalue);
  101.                                                                 change_use1=0;
  102.                                                                 LCMClear();
  103.                                                                 LCMDisplayString(0,0,"Input pswd:");
  104.                                                                 LCMDisplayString(1,0,"You error 0 Time");
  105.                                                         }
  106.                                                 if(change_use2)
  107.                                                         {
  108.                                                                 Master_writeByte(2,keypadvalue);
  109.                                                                 change_use2=0;LCMClear();
  110.                                                                 LCMDisplayString(0,0,"Input pswd:");
  111.                                                                 LCMDisplayString(1,0,"You error 0 Time");
  112.                                                         }
  113.                                                 if(change_use3)
  114.                                                         {
  115.                                                                 Master_writeByte(3,keypadvalue);
  116.                                                                 change_use3=0;
  117.                                                                 LCMClear();
  118.                                                                 LCMDisplayString(0,0,"Input pswd:");
  119.                                                                 LCMDisplayString(1,0,"You error 0 Time");
  120.                                                         }//printf("pswd changed!\n");
  121.                                                 
  122.                                                 if((keypadvalue==get_user_password(1))||(keypadvalue==get_user_password(2))||(keypadvalue==get_user_password(3)))//matching password saved in 24C02C,only password are correct can match successful.
  123.                                                 {
  124.                                                         greenled=0;
  125.                                                         lock=0;
  126.                                                         redled=1;
  127.                                                         printf("\nWelcome You to\nGo Home!\n");
  128.                                                         enter_times=0;
  129.                                                         LCMDisplayChar(1,10,'0');
  130.                                                 }else                                                                                                                //match password failed.
  131.                                                 {
  132.                                                         greenled=1;
  133.                                                         lock=1;
  134.                                                         redled=0;
  135.                                                         printf("\nPasswords error\nplease try\nagain!\n");
  136.                                                         enter_times++;
  137.                                                         switch(enter_times)                                                //show times of enter wrong password.
  138.                                                         {
  139.                                                                 case 0:LCMDisplayChar(1,10,'0');break;
  140.                                                                 case 1:LCMDisplayChar(1,10,'1');break;
  141.                                                                 case 2:LCMDisplayChar(1,10,'2');break;
  142.                                                                 default:                                                                                //enter wrong password 3 times,lock the account!
  143.                                                                         {
  144.                                                                                 beyond3times=0;
  145.                                                                                 LCMClear();
  146.                                                                                 LCMDisplayString(0,0,"Account Locked!");
  147.                                                                                 LCMDisplayString(1,0,"Call 1401856153");
  148.                                                                                 printf("\nInput error\nbeyond 3 times\nthe account\nlocked!\nplease Contact \nadministrator\n");
  149.                                                                         }break;
  150.                                                         }
  151.                                                 }
  152.                                         }break;
  153.                                         case 13:                                                                                                        //press 'Clean' key,clean all entered numbers.
  154.                                         {
  155.                                                 presstimes=0;
  156.                                                 LCMDisplayString(0,11,"    ");
  157.                                                 greenled=1;
  158.                                                 lock=1;
  159.                                                 printf("\nPressed Clean!\n");
  160.                                                 
  161.                                         }break;
  162.                                         default:break;
  163.                                 }
  164.                                 
  165.                         }
  166.                         
  167.                         if((presstimes==5)&&(readkeypad<10))//if 5th entered is a number of 0-9.clean all entered passwords,because passwords were designed 4bits.
  168.                         {                                
  169.                                 presstimes=0;
  170.                                 LCMDisplayString(0,11,"    ");
  171.                                 printf("\nPlease Reenter Your\nPassword\n");
  172.                         }
  173.                         
  174.                         if(readkeypad==12)                                                                        //Press "reset password" key,enter to reset passwords process while loop.
  175.                         {
  176.                                 changepswd_state=1;
  177.                                 LCMClear();
  178.                                 LCMDisplayString(0,0,"Enter Old pswd:");
  179.                                 printf("\nEnter your old\npswd now:\n");
  180.                         }else changepswd_state=0;
  181.                         
  182.                         while(changepswd_state)                                                        //Reset passwords while loop
  183.                         {
  184.                                 readkeypad=key_scan();
  185.                                         if((readkeypad<10)||(readkeypad==14)||(readkeypad==13))
  186.                                         {
  187.                                                 presstimes=presstimes+1;
  188.                                                 switch(presstimes)
  189.                                                 {
  190.                                                         case 1:        
  191.                                                                 {
  192.                                                                         press1=readkeypad*1000;        
  193.                                                                         LCMDisplayString(1,0,"*");               
  194.                                                                         printf("pressed %d\n",readkeypad);
  195.                                                                 }break;
  196.                                                         case 2:
  197.                                                                 {
  198.                                                                         press2=readkeypad*100;               
  199.                                                                         LCMDisplayString(1,0,"**");               
  200.                                                                         printf("pressed %d\n",readkeypad);
  201.                                                                 }break;
  202.                                                         case 3:
  203.                                                                 {
  204.                                                                         press3=readkeypad*10;               
  205.                                                                         LCMDisplayString(1,0,"***");        
  206.                                                                         printf("pressed %d\n",readkeypad);
  207.                                                                 }break;
  208.                                                         case 4:        
  209.                                                                 {
  210.                                                                         press4=readkeypad;                                
  211.                                                                         LCMDisplayString(1,0,"****");        
  212.                                                                         printf("pressed %d\n\n",readkeypad);
  213.                                                                 }break;
  214.                                                         default:break;                                
  215.                                                 }                        
  216.                                         }
  217.                                        
  218.                                         if((presstimes<=5)&&(readkeypad>11))
  219.                                         {
  220.                                                 switch(readkeypad)
  221.                                                 {
  222.                                                         case 14:                                                                                //press 'enter' key
  223.                                                                 {
  224.                                                                                 keypadvalue=press1+press2+press3+press4;
  225.                                                                                 presstimes=0;
  226.                                                                                 LCMDisplayString(1,0,"    ");
  227.                                                                                 if(keypadvalue==get_user_password(1))                                //matched user1's passwords.
  228.                                                                                 {
  229.                                                                                         LCMClear();
  230.                                                                                         LCMDisplayString(1,0,"Enter New pswd:");
  231.                                                                                         presstimes=0;
  232.                                                                                         change_use1=1;
  233.                                                                                         changepswd_state=0;
  234.                                                                                 }else if(keypadvalue==get_user_password(2))        //matched user2's passwords.
  235.                                                                                 {
  236.                                                                                         LCMClear();
  237.                                                                                         LCMDisplayString(1,0,"Enter New pswd:");
  238.                                                                                         presstimes=0;
  239.                                                                                         change_use2=1;
  240.                                                                                         changepswd_state=0;
  241. ……………………

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

所有资料51hei提供下载:
PASSWORDLOCK.zip (642.67 KB, 下载次数: 205)


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

沙发
ID:524698 发表于 2020-5-28 15:40 | 只看该作者
特别好用,有红外功能就好了
回复

使用道具 举报

板凳
ID:755919 发表于 2020-5-28 16:15 | 只看该作者
特别好用,收藏收藏,感谢分享
回复

使用道具 举报

地板
ID:763926 发表于 2020-5-29 03:34 | 只看该作者
感觉不错啊,楼楼,就是不知道用起来如何,一会下载试一试
回复

使用道具 举报

5#
ID:302325 发表于 2020-6-1 01:54 | 只看该作者
感谢分享                           
回复

使用道具 举报

6#
ID:766915 发表于 2020-6-8 21:40 | 只看该作者
楼主这个有i2c吗
回复

使用道具 举报

7#
ID:751649 发表于 2020-6-9 10:20 | 只看该作者
sf666 发表于 2020-6-8 21:40
楼主这个有i2c吗

项目树中的“lxl_24C02C.c”就是软件模拟I2C通信协议
回复

使用道具 举报

8#
ID:774738 发表于 2020-6-10 10:13 | 只看该作者
不错,我先试试能不能行
回复

使用道具 举报

9#
ID:775010 发表于 2020-6-11 21:48 | 只看该作者
感谢大佬分享
回复

使用道具 举报

10#
ID:768868 发表于 2020-6-14 14:33 | 只看该作者
如果把C52改成C51得话这个得怎么改啊
回复

使用道具 举报

11#
ID:776555 发表于 2020-6-14 15:57 | 只看该作者

如果把C52改成C51得话这个得怎么改啊
回复

使用道具 举报

12#
ID:778494 发表于 2020-6-14 17:02 | 只看该作者
感谢分享,有个想法,如果那个输入部分换成那种独立按键的怎么样
回复

使用道具 举报

13#
ID:751649 发表于 2020-6-15 08:11 | 只看该作者
sdsfsade 发表于 2020-6-14 15:57
如果把C52改成C51得话这个得怎么改啊

把<reg52.h>改一下就行了。
回复

使用道具 举报

14#
ID:751649 发表于 2020-6-15 08:12 | 只看该作者
jiafangyuan 发表于 2020-6-14 17:02
感谢分享,有个想法,如果那个输入部分换成那种独立按键的怎么样

可以的,本质上没变,仅仅是外观变了
回复

使用道具 举报

15#
ID:777893 发表于 2020-6-15 08:57 | 只看该作者
这个真的可以牛批
回复

使用道具 举报

16#
ID:781759 发表于 2020-6-24 11:23 | 只看该作者
谢谢楼主
回复

使用道具 举报

17#
ID:789099 发表于 2020-6-25 00:59 | 只看该作者
感谢楼主
回复

使用道具 举报

18#
ID:495287 发表于 2020-6-27 13:46 | 只看该作者
马克,后面再仔细学习,谢谢分享。
回复

使用道具 举报

19#
ID:782689 发表于 2020-6-29 02:34 | 只看该作者
lxl_51h 发表于 2020-6-15 08:11
把改一下就行了。

改完之后可以直接实现这个功能吗?新手求告知
回复

使用道具 举报

20#
ID:751649 发表于 2020-6-29 17:36 | 只看该作者
aaabbbcd 发表于 2020-6-29 02:34
改完之后可以直接实现这个功能吗?新手求告知

项目中未用到定时器T和中断,所以51系列的微控器都可以实现此功能。仅仅改一下头文件就信了。
回复

使用道具 举报

21#
ID:795233 发表于 2020-7-3 16:53 | 只看该作者
不会用啊,谁能教教我
回复

使用道具 举报

22#
ID:771985 发表于 2020-8-7 17:53 | 只看该作者
楼主,这程序是不是可以实现多个密码开锁
回复

使用道具 举报

23#
ID:595237 发表于 2020-8-8 10:09 | 只看该作者
4位密码?
回复

使用道具 举报

24#
ID:1097230 发表于 2023-10-25 12:36 | 只看该作者
真的很牛的!

回复

使用道具 举报

25#
ID:1063561 发表于 2023-11-5 09:18 | 只看该作者
MAAAAAARK学习,谢谢分享。
回复

使用道具 举报

26#
ID:1103460 发表于 2023-12-9 21:01 | 只看该作者
宿舍可以使用吗
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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