简易电子密码锁制作

看到电影里面的保险箱用到的密码锁,于是心血来潮动手做了一个简单的密码锁,其有3次输入的机会,全错的话便进入死循环,一直警报,任何操作都无效,除了复位操作哈。所需素材:51单片机、1602液晶、蜂鸣器、按键、继电器、三极管、电磁锁等。话不多说,直接上代码:

#include<reg52.h>#define  ucharunsigned  char
#define  uintunsigned  int
#define  LCD1602_DATAPINS  P0
#define MbtrixButtons  P1
#define  size  4               //设置密码的位数     char  possword[size]={1,2,3,4};//密码,自行设定,可以设置更多位密码
char  check[size];             //寄存按键后的密码
char  KeyValue,j=0;
char  title[]="shu ru mi ma :";
char  tishi1[]="mi ma cuo wu !!!";
char  tishi2[]="ji hui : ";
char  tishi3[]="mi ma zheng que!";
char  tishi4[]="   suo yi kai ";
char  tishi5[]="   jin  bao";
char  arr[]="0123456789";        uint xdata  num=0,num1=0,num3=3,time=4,sleep=20;sbit  relay=P2^0;                  //继电器输入端,用来控制电磁锁
sbit  confirm=P2^1;              //确认密码按键
sbit  delet=P2^2;                 //删除键,清零
sbit  blak=P2^3;                  //使单片机休眠时液晶屏熄灭,接液晶的背光源正极,最好用三极管驱动
sbit  buzz=P2^4;                 //蜂鸣器
sbit  RW=P2^5;                   //读写选择端
sbit  RS=P2^6;                   //数据命令选择端
sbit  E=P2^7;                     //使能端void Delay1ms(uinti)           //延时,误差 0us
{uchar j;for (; i>0; i--)for (j=200;j>0;j--);   
}void  LcdWriteCom(uchar com)   //写入命令
{E = 0;       //使能RS = 0;    //选择发送命令RW = 0;    //选择写入LCD1602_DATAPINS = com;     //放入命令Delay1ms(1);       //等待数据稳定E = 1;            //写入时序Delay1ms(5);      //保持时间E = 0;
}   void  LcdWriteData(uchar dat)            //写入数据
{E = 0;  //使能清零RS = 1; //选择输入数据RW = 0; //选择写   LCD1602_DATAPINS = dat; //写入数Delay1ms(1);E = 1;  //写入时序Delay1ms(5);   //保持时间E = 0;
}void LcdInit()                       //LCD初始化子程序
{LcdWriteCom(0x38);  //开显示LcdWriteCom(0x0f);  //开显示不显示光标LcdWriteCom(0x06);  //写一个指针加1LcdWriteCom(0x01);  //清屏LcdWriteCom(0x80);  //设置数据指针起点
}void delay(uint i)
{while(i--);
}void KeyDown()         //矩阵按键
{char a=0;MbtrixButtons=0x0f;if(MbtrixButtons!=0x0f)       //读取按键是否按下{delay(1000);                //延时10ms进行消抖if(MbtrixButtons!=0x0f)        //再次检测键盘是否按下{   //测试列MbtrixButtons=0X0F;switch(MbtrixButtons){case(0X07):     KeyValue=0;break;case(0X0b):     KeyValue=1;break;case(0X0d):     KeyValue=2;break;case(0X0e):     KeyValue=3;break;}//测试行MbtrixButtons=0XF0;switch(MbtrixButtons){case(0X70):     KeyValue=KeyValue;break;case(0Xb0):     KeyValue=KeyValue+4;break;case(0Xd0):     KeyValue=KeyValue+8;break;case(0Xe0):     KeyValue=KeyValue+12;break;}while((a<500)&&(MbtrixButtons!=0xf0))    //检测按键松手检测{delay(1000);a++;}   LcdWriteData(arr[KeyValue]);    }check[j]=KeyValue;          //将按下的数值赋给checkj++;if(j>size-1)                //当按下size-1位数后再按只改变check[size-1]的值j=size-1;num1=0; }
}void confirmkey()                //确认按键
{    int i,k=1; if(sizeof(check)/sizeof(char)==size)     //判断寄存数组的密码位数与设定的密码位数是否相同{for(i=0;i<size;i++){if(possword[i]==check[i])        //判断寄存数组的密码与设定的密码是否相等{k++;                    }else{break;}if(k==size)                      // 如果寄存数组中每个数都与设定的密码相等,就开锁{relay=1;for(i=0;i<size;i++)          // 开锁后,将寄存数组清零{check[i]=0;}LcdWriteCom(0x01);             //清屏LcdWriteCom(0x80);             //显示液晶屏第一行for(i=0;i<17;i++)LcdWriteData(tishi3[i]);LcdWriteCom(0x80+0x40);        //显示液晶屏第二行for(i=0;i<15;i++)LcdWriteData(tishi4[i]);LcdWriteCom(0x0c);for(i=0;i<10*time;i++)delay(10000);               //延时4秒关锁relay=0;LcdWriteCom(0x01);LcdWriteCom(0x80);for(i=0;i<14;i++)LcdWriteData(title[i]);LcdWriteCom(0x80+0x40);LcdWriteCom(0x0f);num3=3;                         //开锁后重置开锁的次数return;                         //开锁就跳出该函数}           }           }else                   //如果寄存数组的密码位数与设定的密码位数不相同则不开锁relay=0;LcdWriteCom(0x80);for(i=0;i<16;i++)LcdWriteData(tishi1[i]);LcdWriteCom(0x80+0x40);for(i=0;i<9;i++)       
LcdWriteData(tishi2[i]);num3--;                          //开锁失败次数减一LcdWriteData(arr[num3]);LcdWriteCom(0x0c);if(num3==0)                       //当3次全用完时就陷入死循环并报警{while(1){buzz=1;LcdWriteCom(0x01);LcdWriteCom(0x80);for(i=0;i<11;i++)LcdWriteData(tishi5[i]);for(i=0;i<10;i++)delay(10000);LcdWriteCom(0x01);for(i=0;i<10;i++)delay(10000);if(delet==0)           
{delay(10);if(delet==0);while(!delet);}}}for(i=0;i<3*time;i++)delay(10000);LcdWriteCom(0x01);LcdWriteCom(0x80);for(i=0;i<14;i++)LcdWriteData(title[i]);LcdWriteCom(0x80+0x40);LcdWriteCom(0x0f);
}void  deletkey()                       //清屏按键,删除键
{LcdWriteCom(0x01);relay=0;
}void  init()
{TMOD=0x01;TH0=(65536-50000)/256;TL0=(65536-50000)%256;EA=1;ET0=1;EX0=1;EX1=1;TR0=1;      
}void main(void)
{uchar i=0;LcdInit();init();blak=1;relay=0;buzz=0;LcdWriteCom(0x80);biaoshi:for(i=0;i<14;i++)LcdWriteData(title[i]);LcdWriteCom(0x80+0x40); while(1){ KeyDown();  if(confirm==0){delay(10);if(confirm==0){confirmkey();num1=0;j=0;}while(!confirm);}if(delet==0){delay(10);if(delet==0){deletkey();num1=0;j=0;              }while(!delet);goto biaoshi;}if(num>=20)                  //计时20秒{num=0;num1++;if(num1==sleep)        //判断20秒内有无操作{ET0=0;blak=0; LcdWriteCom(0x08);PCON=0x02;            //单片机进入休眠}}
}
}void  timer0()  interrupt  1
{TH0=(65536-50000)/256;TL0=(65536-50000)%256;num++;
}void   ex_int1()  interrupt 2             //P3^3口唤醒单片机
{PCON=0;ET0=1;num1=0;blak=1;LcdWriteCom(0x0f);  
}   

看完程序可能会有人问矩阵按键有多余的为什么还要增加几个独立按键,我只想说很方便,哈哈,因为我是在开发板中做的,矩阵按键的按键太多,有时候自己都不知到哪个是那个键了,不方便调试。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/545854.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

漫画:什么是红黑树?(整合版)

前段时间&#xff0c;小灰发布了红黑树相关的文章&#xff0c;分成上下篇来讲解。这一次&#xff0c;小灰把两篇文章做了整合&#xff0c;并且修正了红黑树删除部分的图片错误&#xff0c;感谢大家的指正。————— 第二天 —————————————————二叉查找树&a…

PHP高并发高负载系统架构

2019独角兽企业重金招聘Python工程师标准>>> 一、高并发和高负载的约束条件 硬件部署操作系统Web 服务器PHPMySQL测试二、解决之道——硬件篇 处理能力的提升&#xff1a;部署多颗CPU&#xff0c;选择多核心、具备更高运算频率、更大高速缓存的CPU&#xff1b; 处理…

Java ObjectInputStream registerValidation()方法与示例

ObjectInputStream类registerValidation()方法 (ObjectInputStream Class registerValidation() method) registerValidation() method is available in java.io package. registerValidation()方法在java.io包中可用。 registerValidation() method is used to register an ob…

电脑系统越来越慢,怎么删除临时文件

1.关闭"休眠"方法:打开[控制面板]→[电源选项]→[休眠],把"启用休眠"前面的勾去掉说明:休眠是系统长时间一种待机状态,使您在长时间离开电脑时保存操作状态,如果您不是经常开着电脑到别处去的话,那就把它关了吧!☆立即节省:256M2.关闭"系统还原"…

线性方程组的矩阵表示_用矩阵表示线性方程组

线性方程组的矩阵表示A Linear Equation can be represented in matrix form using a: 线性方程可以使用以下形式以矩阵形式表示 &#xff1a; Coefficient Matrix 系数矩阵 Variable Matrix and 可变矩阵和 Constant Matrix 常数矩阵 The System of linear equation in three…

为easyui添加多条件验证

easyui的验证框架&#xff0c;validatebox不能有效的支持多个条件的验证&#xff0c;比如中文用户名&#xff0c;既要验证其是中文&#xff0c;又要验证其长度不超过6位时便显得很繁琐&#xff0c;需要反复的为easyui添加验证规则。 在此实现一个多个条件验证的验证规则&#x…

图解|查找数组中最大值的5种方法!

作者 | 王磊来源 | Java中文社群&#xff08;ID&#xff1a;javacn666&#xff09;转载请联系授权&#xff08;微信ID&#xff1a;GG_Stone&#xff09;我们在一些特定场景下&#xff0c;例如查询公司员工的最高薪资&#xff0c;以及班级的最高成绩又或者是面试中都会遇到查找最…

学习C语言,要从入门到精通

1、学习C语言&#xff0c;要从入门到精通&#xff0c;需要读哪些书&#xff08;从简单的到难的排序&#xff0c;越详细越好&#xff0c;最好都能注释下选择这本书的理由&#xff09;&#xff1f; 入门阶段&#xff1a;还是老谭那本。 、、理由&#xff1a;虽然不能说它写得有多…

程序设计爬楼梯问题_楼梯案例:解决楼梯问题的C ++程序

程序设计爬楼梯问题A child is running up a staircase with N steps, and can hop 1 step, 2 steps or 3 steps at a time. Implement a method to count how many possible ways the child can run up to the stairs? You need to return number of possible ways W. 一个孩…

JDK15正式发布,新增功能预览!

作者 | 王磊来源 | Java中文社群&#xff08;ID&#xff1a;javacn666&#xff09;转载请联系授权&#xff08;微信ID&#xff1a;GG_Stone&#xff09;JDK 15 在 2020 年 9 月 15 号正式发布了&#xff0c;这次发布的主要功能有&#xff1a;JEP 339&#xff1a;EdDSA 数字签名…

[LeetCode] Longest Consecutive Sequence 求解

为什么80%的码农都做不了架构师&#xff1f;>>> 题目 Given an unsorted array of integers, find the length of the longest consecutive elements sequence. For example, Given [100, 4, 200, 1, 3, 2], The longest consecutive elements sequence is [1, 2, …

怎么在Word中插入歌曲

1、菜单栏 -> 插入 -> 对象 -> windows media player -> 右键 -> 属性 -> 自定义 -> 选择歌曲完整路径 -> 选择模式 -> invisible&#xff08;使视频框隐藏&#xff09;退出设计模式最后别忘了保存2、菜单栏 -> 工具 -> 宏 -> 宏 -> 宏…

双向循环链表

双向循环链表是一种较为特殊的链表&#xff0c;也是一种常见的数据结构&#xff0c;其头尾相连&#xff0c;各节点之间可互相访问&#xff0c;在单链表中&#xff0c;只能依次向后访问&#xff0c;无法访问上一个节点&#xff0c;而双链表可以依次向下访问也可向上访问。 链表…

OkHttp透明压缩,收获性能10倍,外加故障一枚

要使用OkHttp&#xff0c;一定要知道它的透明压缩&#xff0c;否则死都不知道怎么死的&#xff1b;或者活也不知道为什么活的不舒坦。反正不是好事。什么叫透明压缩呢&#xff1f;OkHttp在发送请求的时候&#xff0c;会自动加入gzip请求头Accept-Encoding:gzip。所以&#xff0…

块元素、行内块和内联元素_如何删除内联块元素之间的空间?

块元素、行内块和内联元素Introduction: 介绍&#xff1a; This question has become rather popular. How does one remove whitespaces between the inline-block elements? The interesting thing is there are numerous solutions to this but not all of them are easy …

Spring--quartz中cronExpression 的配置方法

Spring--quartz中cronExpression Java代码 字段 允许值 允许的特殊字符 秒 0-59 , - * / 分 0-59 , - * / 小时 0-23 , - * / 日期 1-31 , - * ? / L W C 月份 1-12 或者 JAN-DEC , - * /…

C语言图形库——EasyX基本贴图

在C语言的学习过程中&#xff0c;接触最多的就是黑乎乎的DOS窗口&#xff0c;这也是在消磨学习者的兴趣&#xff0c;学到最后可能还不知道C语言到底能做什么&#xff0c;难道就是输入输出数据吗&#xff1f;当然不是&#xff0c;C的用处很广泛&#xff0c;这里不做讨论。我们能…

HTML5-特效

HTML5-特效-跟随鼠标的粒子<!DOCTYPE html> <html lang"en"><head><meta charsetutf-8><title>Liquid Particles - spielzeugz.de canvas experiment </title><meta name"description" content"HTML5/canvas …

一气之下,手撸了一个抖音去水印的工具!

百因必有果说一下我为什么要做个抖音视频去水印工具&#xff0c;其实是因为我的沙雕女友&#xff0c;她居然刚我~有天晚上她在抖音看见一个非常具有 教育意义 的视频&#xff0c;“男人疼媳妇就该承包全部家务活”&#xff0c;然后它就想把视频下载下来&#xff0c;分享到她的姐…

css 隐藏元素 显示元素_使用CSS打印时如何隐藏元素?

css 隐藏元素 显示元素Introduction: 介绍&#xff1a; We have come across many challenges while developing a website or web page and every challenge comes with new learnings. It is a trait of a good developer who develops or creates websites or web pages by…