本文章是基于51单片机的简易密码锁,无掉电保护,所以没有用到I^C总线协议,仅用到数码管显示,矩阵键盘扫描,led显示。

本例程主要实现功能为:定义一个六位数的初始密码,用矩阵输入,输入正确后led被点亮,错误不点亮;摁下任意一个按键蜂鸣器发出声音,松下按键蜂鸣器关闭;按下更改按键可以改密码,改密码时数码管实时显示。按下重试键可以重新输入密码,按下关闭键所有数据清零。

使用步骤,打开电源,输入6位数初始密码,输入正确锁打开,led亮起;输入正确后,按下更改键后,可以更改密码,改密码时数码管会显示所要更改的密码,更改完成过后按下ok键,新密码被记住,按下close键,重新输入新密码,输入正确后会开锁并且可以重新更改密码。

(参考自清翔51单片机)

下面来看一下程序,在程序里有相应的注释

#include<reg52.h>                       //定义头文件
#define uchar unsigned char             //定义两个数据类型
#define uint unsigned int         uchar old1=0,old2=1,old3=2,old4=3,old5=4,old6=5;    //原始密码,可以任意设置0~9
uchar new1,new2,new3,new4,new5,new6;     //定义new,是每次按键按下的数值
uchar a=16,b=16,c=16,d=16,e=16,f=16;     //送入数码管显示的变量
uchar wei,key,temp;                      //定义三个变量,在后面引用bit allow,genggai,ok,wanbi,retry,close;    //定义六个非零即一的状态位sbit dula=P2^6;                         //定义段选端口
sbit wela=P2^7;                         //定义位选端口
sbit beep=P2^3;                         //定义蜂鸣器端口unsigned char code table[]=                     //声明段选数据
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,
0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00,0x40};void delay(unsigned char i)               //定义延时函数,以便后面直接引用
{uchar j,k;for(j=i;j>0;j--)for(k=125;k>0;k--);
}void display(uchar a,uchar b,uchar c,uchar d,uchar e,uchar f)     //数码管显示函数,对数码管进行赋值
{dula=0;P0=table[a];dula=1;dula=0;wela=0;P0=0xfe;wela=1;wela=0;delay(5);P0=table[b];dula=1;dula=0;P0=0xfd;wela=1;wela=0;delay(5);P0=table[c];dula=1;dula=0;P0=0xfb;wela=1;wela=0;delay(5);P0=table[d];dula=1;dula=0;P0=0xf7;wela=1;wela=0;delay(5);P0=table[e];dula=1;dula=0;P0=0xef;wela=1;wela=0;delay(5);P0=table[f];dula=1;dula=0;P0=0xdf;wela=1;wela=0;delay(5);
}void keyscan()                                   //矩阵键盘扫描函数
{{  P3=0xfe;                                     //对第一行赋0,即低电平temp=P3;                                     //定义P3口即矩阵口为temptemp=temp&0xf0;                              //将temp和0xf0进行“与”运算后再次赋予tempif(temp!=0xf0)                               /*如果temp不等于0xf0时,说明第一行有按键被按下,下面的检测第一行哪一个被按下的检测函数*/{                                            delay(10);                                 //按键消抖if(temp!=0xf0)                             //再次检测,确保第一行确实有被摁下的按键{ temp=P3;                               //将P3口的状态赋值给tempswitch(temp)                        //把temp和下面case后的数值进行比较,如果相同执行相应操作{case 0xee:                        //如果temp=0xee,那么key=0;                        //那木key=0,wei++;                             //wei加一break;                       //退出,再次扫描case 0xde:key=1;wei++;break;case 0xbe:key=2;                       //同上wei++;break;case 0x7e:key=3;wei++;break;}while(temp!=0xf0)                   //松手检测,只有当temp不等于0xf0时进入,持续扫描{temp=P3;temp=temp&0xf0;beep=0;                          //在不松手时蜂鸣器响起}beep=1;                            //松手后蜂鸣器关闭}}P3=0xfd;                                //对矩阵扫描第二行,方法同第一行temp=P3;temp=temp&0xf0;if(temp!=0xf0){delay(10);if(temp!=0xf0){temp=P3;switch(temp){case 0xed:key=4;wei++;break;case 0xdd:key=5;wei++;break;case 0xbd:key=6;wei++;break;case 0x7d:key=7;wei++;break;}while(temp!=0xf0){temp=P3;temp=temp&0xf0;beep=0;}beep=1;}}P3=0xfb;                               //对矩阵扫描第三行,方法同第一行temp=P3;temp=temp&0xf0;if(temp!=0xf0){delay(10);if(temp!=0xf0){temp=P3;switch(temp){case 0xeb:key=8;wei++;break;case 0xdb:key=9;wei++;break;到现在为止0~9十个键已经扫描完成,接下来配置四个功能按键           case 0xbb:                 //如果第三行第3个键被按下,genggai=1;            //genggai=1wei=0;                      //将wei归零break;case 0x7b:                //如果第三行第四个键被按下if(allow)                //并且allow等于1时ok=1;               //将ok=1break;}while(temp!=0xf0)                 //松手检测{temp=P3;temp=temp&0xf0;             beep=0;}beep=1;}}P3=0xf7;                           //对第四行进行扫描temp=P3;temp=temp&0xf0;if(temp!=0xf0){delay(10);if(temp!=0xf0){temp=P3;switch(temp){case 0xe7:                     //如果第四行第一个按键被按下retry=1;                      //那木retry=1break;case 0xd7:                    //如果第四行第二个按键被按下,close=1;                     //那么close=1break;}while(temp!=0xf0){temp=P3;temp=temp&0xf0;beep=0;}beep=1;}}
}
}void shumima()                     //对按键采集来的数据进行分配
{                                 //这个子函数分析密码是否输入完成,并且让数码管逐渐亮起来if(!wanbi)                      //如果wanbi不等于一,进入这个if循环{switch(wei)                     //将wei和下面的数值比较,完成相应程序{case 1:new1=key;                //如果等于一,将key赋值new1,即刚刚按下的值,if(!allow)    a=17;         //如果密码没有输入完成且正确,那么将a赋值17else a=key;  break;        //如果没有完成上面的操作,那木让a=key,这一步是改密码的操作case 2:new2=key;                //同上if(a==17) b=17;else b=key;   break;case 3:new3=key; if(a==17) c=17;else c=key;  break;case 4:new4=key;if(a==17) d=17;else d=key;   break;case 5:new5=key; if(a==17) e=17;else e=key;  break;case 6:new6=key; if(a==17) f=17;else f=key;wanbi=1; break;                 //完成后wanbi=1,所以可以跳出这个while循环}}
}void yanzheng()                      //验证密码是否正确
{if(wanbi)                        //只有当六位密码均输入完毕后方进行验证{if((new1==old1)&(new2==old2)&(new3==old3)&(new4==old4)&(new5==old5)&(new6==old6))allow=1;                          //当上面全部成立,证明输入的密码正确,会得到allowe=1}
}void main()                  //主函数
{while(1)                   //大循环{keyscan();                //不停的扫描矩阵键盘shumima();                //数码管显示子函数yanzheng();               //验证密码是否输入正确if(allow)                  //验证完后,若allow为1,则开锁{P1=0x00;                //开锁后的指令,让所有led都亮起来if(!genggai)            //如果没有按下更改键,wanbi会被置0wanbi=0;                }if(genggai)                  //当更改密码键被按下,genggai会被置一{if(allow)                  //判断密码锁是否打开,如果打开,才有更改密码的权限{while(!wanbi)             //当新的六位密码没有设定完,则一直在这里循环{keyscan();           //持续扫描shumima();if(retry|close)      //当检测到retry或close任意一个被按下,那木会让wanbi=1,即跳出数码管显示子函数{  wanbi=1;break;}display(a,b,c,d,e,f);         //更改密码时数码管显示要更改的密码}}}if(ok)      ///更改完成后,按下ok,结束并保存{                    //其他时间按下此键无效ok=0; wei=0;genggai=0;old1=new1;old2=new2;old3=new3;       //此时,旧的密码将被代替old4=new4;old5=new5;old6=new6;a=16;b=16;c=16;d=16;e=16;f=16;}if(retry)                         //当retry被按下,相当于重新输入密码,无论是在改密码还是输密码时{retry=0; wei=0;wanbi=0;a=16;b=16;c=16;d=16;e=16;f=16;new1=0;new2=0;new3=0;new4=0;new5=0;new6=0;      }if(close)                    //当close被摁下时,所有密码清零{close=0;genggai=0;//所有变量均被清零。wei=0; wanbi=0;allow=0;P1=0xff;a=16;b=16;c=16;d=16;e=16;f=16;new1=0;new2=0;new3=0;new4=0;new5=0;new6=0;}display(a,b,c,d,e,f); //实时显示}
}

基于51单片机的简易6位密码锁(数码管 led 矩阵)相关推荐

  1. 基于51单片机的简易游戏机

    基于51单片机的简易游戏机 目录 基于51单片机的简易游戏机 一.绪论 二.设计方案 三.系统原理框图及模块的作用 四.硬件设计及说明 五.实际的程序流程图,写清楚程序模块的功能 六.系统使用说明 七 ...

  2. 【C51】基于51单片机的简易频率计(附代码、无需外设、小白简单易上手)

    基于51单片机的简易频率计(无需外设.小白简单易上手)   代码较为简单,大概思路是通过定时器单位时间内外部中断上升沿触发的次数来计算实际频率. /基于51单片机的简易频率计#include<r ...

  3. c语言51单片机计算器,新基于51单片机的简易计算器

    <新基于51单片机的简易计算器>由会员分享,可在线阅读,更多相关<新基于51单片机的简易计算器(24页珍藏版)>请在人人文库网上搜索. 1.基于51单片机的简易计算器1.前言: ...

  4. 基于51单片机的简易抢答器设计

    基于51单片机的简易抢答器 具体功能: 1.主持人按下抢答开始按键,抢答者才可以开始抢答,数码管抢答倒计时20S. 2.抢答者按下按键,数码管显示抢答者的编号. 3.可以通过按键修改倒计时时间. 部分 ...

  5. 基于51单片机的简易电子计算器——有温度显示和万年历等额外功能

    基于51单片机的简易电子计算器--有温度显示和万年历等额外功能 设计实际所实现的功能 模式一可显示日期.时钟.温度,模式二可进行计算器的计算,且显示日期温度模式和计算器模式可随意切换,模式三可以滚动显 ...

  6. 基于51单片机的简易mp3的制作

    基于51单片机的简易mp3制作原理 1.  项目要求 基于AT89C51系列单片机的音乐播放器,采用AT89C51作为主控芯片,采用12864LCD作为液晶显示屏,通过按键实现播放器对应按键功能. 2 ...

  7. 两位数码管30秒倒计时c语言,基于51单片机共阴两位数码管显示倒计时

    <基于51单片机共阴两位数码管显示倒计时>由会员分享,可在线阅读,更多相关<基于51单片机共阴两位数码管显示倒计时(2页珍藏版)>请在人人文库网上搜索. 1.基于51单片机共阴 ...

  8. 基于51单片机的简易太阳能追踪系统

    基于51单片机的简易太阳能追踪系统Proteus仿真如图所示. 系统主控核心为AT89C51单片机: 动作执行部分为两个0-360度舵机: 4个电位器模拟光敏电阻检测阵列: 模拟电压采集部分使用74H ...

  9. 【039】基于51单片机的简易门铃Proteus仿真设计

    一.压缩包资料内容 (1).基于51单片机的简易门铃proteus仿真设计一份: (2).基于51单片机的简易门铃proteus仿真设计keli源代码一份: (3).基于51单片机的简易门铃prote ...

最新文章

  1. 基于Vuejs+ElementUI的答案录入功能的一些总结
  2. 接口与继承字段常量关系
  3. NOJ 20 吝啬的国度
  4. netty为什么性能高
  5. CVPR 2020 | 旷视提出新型人-物交互检测框架,实现当前最佳
  6. centos7.5 源码安装mysql5.7.25
  7. jedis连接池详解(Redis)
  8. 升级至 vCenter Server 6.5 的最佳实践 (2147686)
  9. Javascript s04
  10. 【数学基础】深度学习必须掌握的 13 种概率分布
  11. 【Servlet】web.xml中url-pattern的用法
  12. matlab 三维 作图 坐标轴_matlab三维作图教程
  13. 小甲鱼c语言入门冒泡,小甲鱼 排序算法 冒泡排序
  14. c#中将word转成图片,无水印
  15. You tube music
  16. Springboot搭建文件服务器
  17. Jvav语言(0.1)版
  18. 高中数学数列解题:技巧数列大题—错位相减
  19. 网络舆情信息传播动态监测查询方法
  20. 如何设置编辑QTableView单元格时的字体颜色

热门文章

  1. 【考研高数 武忠祥+880版 自用】高数第三章基础阶段思维导图
  2. A002-185-2537-翁格婉(个人期末作业)
  3. 电脑 台式机 各种连接线图
  4. (Java实现) 拦截导弹
  5. JavaScript面试真题
  6. 统计《三国演义》前15个人名
  7. 梦幻西游玩家最多的服务器,梦幻西游:第54次合服计划公布了,这两个服务器的玩家有福了...
  8. 基于WebRTC实现音视频及数据通信
  9. 汉诺塔(java版)
  10. android小米手机上传图片,android 解决小米手机上选择照片路径为null的问题