找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机电子密码锁程序、Proteus仿真、电路图 程序流程图

  [复制链接]
跳转到指定楼层
楼主
1.“输入”按键:每次需要输入密码必须按“输入”按键,否则无法输入密码,若输入密码正确,则提示正确信息,否则提示错误信息并报警,10S内不允许重新输入密码。
2.“确认”按键:同于确认密码输入完成。
3.“修改密码”按键:需要修改密码,在输入正确密码后可按此按键进行修改。
4. 锁的初始密码是123456(密码长度为6位,超过6位再次输入则无效)。
5.  开锁10秒后不允许更改密码、并提示修改超时_进入初始态,需要重新输入密码方可再次修改密码。
6.  系统未使用存储器存储密码故掉电后密码自动恢复为初始密码

仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


程序流程图:

主程序

  1. #include"KeyBord.h"
  2. #include"LCD1602.h"
  3. #include"Timer.h"
  4. #include"string.h"

  5. sbit Unlock_Led = P2^1;               //开锁显示灯
  6. sbit Beep = P2^2;                     //蜂鸣器

  7. unsigned char Key_Num = 0;            //按键值
  8. unsigned char input_flag = 0;         //输入标志位
  9. unsigned char change_flag = 0;        //修改密码标志位
  10. unsigned char Set_password = 0;       //设定密码

  11. unsigned char Pass_Num[6];              //数组用于存放输入的密码
  12. unsigned char Pass_Temp[6];             //中间变量存储数组
  13. unsigned char Pass_Word[6] = {1,2,3,4,5,6};     //转换成液晶显示的字符

  14. void Key_Control();

  15. void main()
  16. {  
  17.     unsigned char i,j=0,num=0,count=0;

  18.         LCD_Init();                               //显示屏初始化
  19.     Timer0_Init();                            //定时器初始化

  20.     LCD_Write_Cmd(0x0F);                      //光标闪烁
  21.     LCD_Write_Str(0,0,"FireFly Sci&Tech");    //初始显示界面
  22.     LCD_Write_Str(4,1,"Welcome!");


  23.     while(1)
  24.     {        
  25.         Key_Num = KeyPro();

  26.         if(time_flag)                             //定时器计时10S,返回初始界面
  27.         {                                         //关闭定时器
  28.             TR0 = 0;                              //定时标志位清零
  29.             time_flag = 0;
  30.             change_time =10;
  31.             Set_password = 0;
  32.             Unlock_Led = 0;
  33.             Beep = 0;

  34.             LCD_Write_Cmd(0x01);                     //清屏,并返回初始界面
  35.             LCD_Write_Str(0,0,"FireFly Sci&Tech");
  36.             LCD_Write_Str(4,1,"Welcome!");
  37.         }
  38.         if(Key_Num >= 12)                           //按键值是否大于12
  39.         {
  40.             if(Key_Num == 12)                       //输入按键是否按下
  41.             {
  42.                 LCD_Write_Cmd(0x01);                //清屏,并进入输入界面
  43.                 DelayMs(5);   
  44.                 LCD_Write_Str(1,0,"PassWord:");

  45.                 TR0 = 0;                            //关闭定时器,重新设定定时时间,
  46.                 time_flag = 0;
  47.                 change_time =10;
  48.                 input_flag = 1;                      //输入标志位置1
  49.                 Unlock_Led = 0;                      //开锁显示灯灭
  50.                 num = 0;
  51.                 i = 0;     
  52.             }
  53.             else if(Key_Num == 13)                     //确认按键是否被按下
  54.             {
  55.                 if(num == 6)                           //输入密码长度是否为6位
  56.                 {
  57.                     if(change_flag)                    //修改密码标志位真
  58.                     {
  59.                         change_flag = 0;

  60.                         for(j = 0; j < 6; j++)             //将密码从中间数组导入密码存储数组
  61.                         {
  62.                             Pass_Word[j] = Pass_Temp[j];
  63.                         }

  64.                         LCD_Write_Cmd(0x01);                //清屏,并进入密码修改成功界面
  65.                         LCD_Write_Str(2, 0, "SET Success!");
  66.                     }
  67.                     else if(input_flag)
  68.                     {
  69.                         if(memcmp(Pass_Num, Pass_Word, 6) == 0)      //将输入的密码与设置的密码进行比对
  70.                         {
  71.                             LCD_Write_Cmd(0x01);                       //清屏,并进入密码输入正确界面
  72.                             LCD_Write_Str(1, 0, "PassWord Right");
  73.                             LCD_Write_Str(2, 1, "Door unlock");

  74.                             Set_password = 1;                          //设定密码,10秒内可修改
  75.                             Unlock_Led = 1;                            //开锁显示灯亮
  76.                             input_flag = 0;
  77.                         }
  78.                         else
  79.                         {
  80.                             LCD_Write_Cmd(0x01);                   //清屏,并进入密码输入错误界面
  81.                             DelayMs(5);
  82.                             LCD_Write_Str(1, 0, "PassWord Error");
  83.                             change_time =10;
  84.                             TR0 = 1;
  85.                             Unlock_Led = 0;                           

  86.                             while(!time_flag)
  87.                             {
  88.                                 Unlock_Led = ~Unlock_Led;
  89.                                 Beep = ~Beep;         //板子为无源蜂鸣器
  90.                                 DelayUs2x(100);
  91.                             }   
  92.                         }
  93.                     }
  94.                     change_time =10;      //重新赋值定时时间,开定时器,输入计数和显示位置计数清零
  95.                     TR0 = 1;
  96.                     num = 0;
  97.                     i = 0;   
  98.                 }
  99.             }
  100.             else if(Key_Num == 14)         //修改密码按键
  101.             {
  102.                 if(Set_password)           //如果在设定密码时间内
  103.                 {
  104.                     LCD_Write_Cmd(0x01);        //清屏,进入修改密码界面
  105.                     DelayMs(5);
  106.                     LCD_Write_Str(1, 0, "New PassWord:");
  107.                     TR0 = 0;
  108.                     time_flag = 0;
  109.                     change_time =10;
  110.                     change_flag = 1;
  111.                     input_flag = 0;
  112.                     Set_password = 0;
  113.                     num = 0;
  114.                     i = 0;     
  115.                 }   
  116.             }
  117.             else if(Key_Num == 15)             //取消修改密码
  118.             {
  119.                 if(change_flag)
  120.                 {
  121.                     LCD_Write_Cmd(0x01);
  122.                     DelayMs(5);
  123.                     LCD_Write_Str(1, 0, "Cancel Change!");
  124.                     TR0 = 1;
  125.                     change_flag = 0;
  126.                     num = 0;
  127.                     i = 0;   
  128.                 }   
  129.             }

  130.         }
  131.         else if(Key_Num <= 9)
  132.         {
  133.             if(num < PASS_NUM)              //输入密码计数小于6
  134.             {
  135.                 if(input_flag)               //输入密码标志位
  136.                 {   
  137.                     Pass_Num[num] = Key_Num;
  138.                     LCD_Write_Char(3 + i, 1, '*');//依次显示输入字符
  139.                 }
  140.                 else if(change_flag)            //修改密码标志位
  141.                 {
  142.                     Pass_Temp[num] = Key_Num;
  143.                     LCD_Write_Char(3 + i, 1, ('0' + Pass_Temp[num]));//依次显示输入字符
  144.                 }

  145.                 num++;
  146.                 i++;
  147.             }        
  148.         }
  149.     }
  150. }
复制代码

Keil代码与Proteus8.8仿真下载: 电子密码锁.rar (542.69 KB, 下载次数: 280)

评分

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

查看全部评分

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

使用道具 举报

沙发
ID:1053794 发表于 2022-11-24 19:55 | 只看该作者
逻辑很清楚,容易理解
回复

使用道具 举报

板凳
ID:1054493 发表于 2022-11-28 21:10 | 只看该作者
大佬的作品
回复

使用道具 举报

地板
ID:1054627 发表于 2022-11-29 14:17 | 只看该作者
大佬的作品好理解
回复

使用道具 举报

5#
ID:1054697 发表于 2022-12-2 12:54 | 只看该作者
怎么开机界面不一样呀仿真用不了
回复

使用道具 举报

6#
ID:262 发表于 2022-12-2 16:24 | 只看该作者
无敌飞猫 发表于 2022-12-2 12:54
怎么开机界面不一样呀仿真用不了

我打开可以用 你版本不行吧 用Proteus8.13
回复

使用道具 举报

7#
ID:1055296 发表于 2022-12-2 20:37 | 只看该作者
附件里面有lcd1602.h文件
回复

使用道具 举报

8#
ID:1055296 发表于 2022-12-3 00:23 | 只看该作者
为什么打开后lcd显示屏没有开机界面,只会亮,请问什么情况?
回复

使用道具 举报

9#
ID:262 发表于 2022-12-3 04:43 | 只看该作者
ENXXXXTONEW 发表于 2022-12-3 00:23
为什么打开后lcd显示屏没有开机界面,只会亮,请问什么情况?

可能是你没有采用楼主的8.8版本吧 我打开和楼主的图是一样的
回复

使用道具 举报

10#
ID:1055296 发表于 2022-12-3 22:32 | 只看该作者
输入密码的时候不会显示星号,什么问题?跪求!

回复

使用道具 举报

11#
ID:1025912 发表于 2022-12-5 15:03 | 只看该作者
非常有用,学习,收藏了,谢谢
回复

使用道具 举报

12#
ID:1056587 发表于 2022-12-9 10:49 | 只看该作者
heicad 发表于 2022-12-3 04:43
可能是你没有采用楼主的8.8版本吧 我打开和楼主的图是一样的

我用的8.9版本为什么还是没有开机界面呢,求解
回复

使用道具 举报

13#
ID:932294 发表于 2022-12-9 13:55 | 只看该作者
led安在哪里了请问
回复

使用道具 举报

14#
ID:92810 发表于 2023-1-9 16:31 | 只看该作者
谢谢楼主分享了,下载学习先
回复

使用道具 举报

15#
ID:1107797 发表于 2024-1-4 15:33 | 只看该作者
大神写的软件就是好,可惜我看不懂,软件太难了!
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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