51单片机控制的万能密码锁(附仿真文件+源代码)
前几天有小伙伴留言说想知道单片机是怎么样控制密码锁的,正好做过一个类似的实验,下面我分享出来,希望对你们有所帮助。
51单片机控制的万能密码锁系统,PROTEUS仿真文件
初始密码:12345678
此程序用51单片机控制74LS164锁存器来实现
单片机与存储器之间通过IIC 通过通讯来建立密码系统通讯
仿真启动开始设置密码
万能密码锁参考程序源代码:
#include<AT89x51.h>
#include"intrins.h"
#include"key.h"
#include"xsh.h"
#include"24c02.h"
#define ulong unsigned long
bit BJCB=0;//报警标志
XG=0,//修改密码标志位
BJ=0,//报警标志位
SJ=0;//锁键盘标志位
// xg=0;//修改密码标志位
uchar PSWD0_0[16]={0};//密码输入缓存存储单元
//uchar code PSWD0_1[16]={1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8};//用户初始密码存储单元
//uchar PSWD1_0[16]={0};//读出密码缓存存储单元
uchar PSWD1_1[16]={1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8};////管理员初始密码存储单元
sbit OUT=P3^5;//输出端口
sbit L1=P0^2;//上电指示
sbit L2=P0^1;//开锁指示
sbit L3=P0^0;//报警指示
uint mg=0,//密码个数
KSC=0,//开锁次数
BJC=0,//报警次数
TCNTY=0,//用户按键定时次数累加
TCNTG=0,//管理员输入密码定时次数
yhsh,//用户输入标志位
glsh,//管理员输标志位
shw;//密码输入标志位
void yhmimaxig();//密码修改程序
void glmimaxig();//管理员修改程序
void bjyin(ulong t)
{
ulong c;
uint n;
for(c=0;c<t;c++)
{
for(n=0;n<50;n++); //延时
BEEP=~BEEP; //取反输出到喇叭的信号
}
}
void delay_10ms(void)
{
uint i = 1000;
while(i--);
}
//////////////定时中断服务函数//////////////////////////////////////
void timer0() interrupt 1
{
uint i;
TH0=(65536-50000)/256; //对TH0 TL0赋值50MS定时
TL0=(65536-50000)%256; //重装计数初值
if(yhsh==1)
{
TCNTY++;//用户定时计数
if(shw==1)
{
TR0=0;
TCNTY=0;
}
if(TCNTY==400)
{
TR0=0;//关闭T0定时器
TCNTY=0;
mg=0;//密码个数清零
L1=1;
for(i=0;i<2;i++)//声光报警电路
{
L3=0;
bjyin(1000);
L3=1;
delay(1000);
}
L1=0;
}
}
else if(glsh==1)
{
TCNTG++;//管理员定时计数
if(shw==1)
{
TR0=0;
TCNTG=0;
}
if(TCNTG==400)
{
TR0=0;//关闭T0定时器
TCNTG=0;
mg=0;//密码个数清零
L1=1;
for(i=0;i<2;i++)//声光报警电路
{
L3=0;
bjyin(1000);
L3=1;
delay(1000);
}
L1=0;
}
}
}
void main()
{
uint i;
TMOD=0x01; //定时器工作在方式1
ET0=1;
EA=1;
TH0=(65536-50000)/256; //对TH0 TL0赋值
TL0=(65536-50000)%256; //使定时器0.05秒中断一次
//Read_page24c02(0x00,PSWD1_1,16);//向24c02里读用户初始密码
//i2cWrite24LC16B(0,0X20);
/////////////第一次向24c02里写入初始管理员密码、用户密码、开锁次数/////////////////////
for(i=0;i<16;i++) //用一次写一个向24c02里写
{
i2cWrite24LC16B(PSWD1_1[i],i);
delay_10ms;
}
for(i=0;i<16;i++) //用一次写一个向24c02里写
{
i2cWrite24LC16B(PSWD1_1[i],0x10+i);
delay_10ms;
} //proteus仿真时用,烧程序时,第一次用,第二次不用。
KSC=i2cRead24LC16B(0X20);
loop: L1=0;//上电红灯亮
L2=1;//开锁成功后绿灯亮
L3=1;//输错时黄灯亮报警
OUT=0;//开信号关闭
display_0(KSC);//开锁前显示
///////////密码输入/////////////////
if(SJ==0)//锁键盘标志位为0
{
do
{
flag=0;//键盘标志位
key();
if(flag==1&&num==12) //判断是否为管理员功能键按下
{
goto gl;
}
if(flag==1&&num<=9)
{
PSWD0_0[mg]=num;
mg++;//密码个数
}
if(flag==1&&num==14&&mg>=1)//输入错误删除
{
mg=mg-1;
}
if(mg==1) //有密码键按下开定时器限时
{
TR0=1;
yhsh=1;
}
}
while(num!=15);
if(mg!=16)
{
for(i=mg;i<16;i++)
{
PSWD0_0[i]=0;
}
}
/////////////////密码比较电路////////////////////////////
if(flag==1&&num==15)
{ flag=0;
yhsh=0;
shw=1;
num=0;
for(i=0;i<16;i++) //从24c02里读出16个密码
{
PSWD1_1[i]=i2cRead24LC16B(i);
delay_10ms;
}
for(i=0;i<16;i++)
{
if(PSWD1_1[i]!=PSWD0_0[i])
{
BJCB=1;
break;
}
else
BJCB=0;
}
}
if(BJCB!=0)
{
BJC++;
if(BJC!=3)
{
BJCB=0; //第一次和第二次报警
delay(500);
mg=0;//密码个数清零
L1=1;
for(i=0;i<3;i++)//声光报警电路
{
L3=0;
display_3();
bjyin(1000);
L3=1;
delay(1000);
}
goto loop;
}
else if(BJC==3)
{
BJC=0;
BJCB=0;
display_5();//三次输入密码失败,自锁
SJ=1;//锁键盘标志位
mg=0;//密码个数清零
L1=1;
for(i=0;i<2;i++)//声光报警电路
{
L3=0;
bjyin(1000);
L3=1;
delay(1000);
}
goto loop;
}
}
else
if(BJCB==0)
{
KSC++;
display_1(KSC);
i2cWrite24LC16B(KSC,0X20);
if(KSC==100)
{
SJ=1;
}
L2=0;
L1=1;
OUT=1;
mg=0;//密码个数清零
loop1:do //键盘扫描等待功能键按下
{
flag=0;
key();
if(flag)
{
flag=0;
switch(num)
{
case 13:
{
display_2();
do
{
flag=0;//键盘标志位
key();
if(flag==1&&num<=9)
{
PSWD0_0[mg]=num;
mg++;//密码个数
}
if(flag==1&&num==14&&mg>=1)//输入错误删除
{
mg=mg-1;
}
if(mg==16)
{
do //键盘扫描等待功能键按下
{
flag=0;
key();
}
while(num!=15);
}
}
while(num!=15);
if(mg!=16&&num==15)
{
for(i=mg;i<16;i++)
{
PSWD0_0[i]=0;
}
}
if(flag==1&&num==15)
{
flag=0;
mg=0;
for(i=0;i<16;i++) //用一次写一个向24c02里写
{
i2cWrite24LC16B(PSWD0_0[i],i);
delay_10ms;
}
display_1(KSC);
do //键盘扫描等待功能键按下
{
flag=0;
key();
}
while(num!=11); //按下返回键,锁锁返回
{
goto loop;
}
}
};break;
case 11: {
goto loop;
//break;
}
}
}
}
while(flag!=0);//如果设置密码键按下
goto loop1;
// i2cWrite24c02_page(0x00,PSWD1_1,mg);
}
}
else
{
do
{
flag=0;
key();
}
while(num!=12);//判断是否为管理员功能键按下
gl:do//管理员输入密码
{
flag=0;
key();
if(flag==1&&num<=9)
{
PSWD0_0[mg]=num;
mg++;//密码个数
}
if(flag==1&&num==14&&mg>=1)//删除键按下
{
mg=mg-1;
}
if(mg==1)
{
TR0=1;
}//开定时器TO限5秒开锁
}
while(num!=15);
if(mg!=16&&num==15)
{
for(i=mg;i<16;i++)
{
PSWD0_0[i]=0;
}
}
//////////管理员密码比较///////////////////////
//Read_page24c02(0x10,PSWD0_1,16)
for(i=0;i<16;i++) //从24c02里读出16个密码
{
PSWD1_1[i]=i2cRead24LC16B((0x10+i));
delay_10ms;
}
if(flag==1&&num==15)
{ flag=0;
shw=1;
num=0;
for(i=0;i<mg;i++)
{
if(PSWD1_1[i]!=PSWD0_0[i])
{ BJCB=1;
break;
}
else
BJCB=0;
}
}
if(BJCB!=0)
{
BJC++;
if(BJC!=3)
{
BJCB=0; //第一次和第二次报警
mg=0;//密码个数清零
L1=1;
for(i=0;i<2;i++)//声光报警电路
{
L3=0;
display_3();
bjyin(1000);
L3=1;
delay(1000);
}
display_1(KSC);
goto loop;
}
else
{
BJCB=0;
display_5();//三次输入密码失败,自锁
mg=0;//密码个数清零
delay(10000);
display_1(KSC);
goto loop;
}
}
else
{
SJ=0;
display_4();//管理员开锁显示
mg=0;
L2=0;
L1=1;
L3=0;//密码个数清零
do //键盘扫描等待功能键按下
{
flag=0;
key();
}
while(flag==0); //如果设置密码键按下
if(flag==1&&num==13)
{
flag=0;
display_2();
do
{
flag=0;//键盘标志位
key();
if(flag==1&&num<=9)
{
PSWD0_0[mg]=num;
mg++;//密码个数
}
if(flag==1&&num==14&&mg>=1)//输入错误删除
{
mg=mg-1;
}
if(mg==16)
{
do //键盘扫描等待功能键按下
{
flag=0;
key();
}
while(num!=15);
}
}
while(num!=15);
if(mg!=16&&num==15)
{
for(i=mg;i<16;i++)
{
PSWD0_0[i]=0;
}
}
if(flag==1&&num==15)
{
flag=0;
mg=0;
for(i=0;i<16;i++) //用一次写一个向24c02里写
{
i2cWrite24LC16B(PSWD0_0[i],(0x10+i));
delay_10ms;
}
display_4();
do //键盘扫描等待功能键按下
{
flag=0;
key();
}
while(num!=11); //按下返回键,锁锁返回
{
goto loop;
}
}
}
if(flag==1&&num==10)
{
KSC=0;
i2cWrite24LC16B(KSC,0X20);
display_1(KSC);
do //键盘扫描等待功能键按下
{
flag=0;
key();
}
while(num!=11);//按下返回键,锁锁返回
goto loop;
}
if(flag==1&&num==11)//按下返回键,锁锁返回
{
goto loop;
}
}
}
}
最后,如果有什么意见或者建议欢迎您留言给我,让我们共同学习一起进步,
如果需要 完整代码或设计文件,请在下方留言或者私信我,看到后会第一时间回复。
谢谢大家!
如果喜欢我的文章请评论转发加关注哦。
基于51单片机的电子密码锁
继续分享51单片机Proteus仿真设计。今天带来的是基于51单片机的电子密码锁。电子密码锁也应该是不少小伙伴课程设计的题目之一了,今天分享的51单片机密码锁仿真来源于网络,希望今天分享的仿真能够帮助到大家。
还是老规矩,贴一张图简单分析一下电路。
密码锁Proteus仿真
仿真软件使用的是Proteus8,如果有小伙伴想要使用该仿真建议使用Proteus8.8来进行操作。整体的仿真图如上图,密码锁显示部分采用的是LCD1602,数据端口使用的是51单片机的P0口,控制端口使用的是P2口;密码输入部分使用的是矩阵键盘,矩阵键盘的接口为单片机的P1口;该仿真密码存储部分使用的是EEPROM 24C02,通过51单片机的P26和P27引脚来模拟I2C接口实现对24C02芯片的读写控制;密码锁指示部分包括两个LED指示灯和虚拟串口终端;密码锁控制部分采用一个5V继电器。
接下来对密码锁的功能进行一下简单的介绍。
仿真运行图
运行仿真后,首先弹出的是虚拟串口终端,在虚拟串口终端上显示有相应的提示信息。在液晶显示屏上显示有密码输入和错误次数两个部分。根据仿真上的文字提示,该密码锁支持3个用户,用户密码是4位的,密码分别是0001,0002,0003。
当通过矩阵键盘输入密码时,可以看到液晶显示屏上将输入的密码显示为星号,而在虚拟串口显示终端上则对用户输入的数字进行提示。
当4位密码都输入进去后,如果没有去按功能按键,而是继续按了数字按键的话,之前所有输入的密码都将清除,需要再次重新输入。
当输入密码后,按下'-'键,此时用户输入的密码都会清除,同时在虚拟串口显示终端上会给出相应的提示符。
当密码输入后,按下'X'按键,如果密码输入正确,则绿色LED指示灯会亮起,继电器吸合,同时在虚拟串口显示终端上会出现相应的提示符,密码正确时,按下'-'按键可以使密码锁复位;当输入的密码错误时,红色的LED指示灯亮起,液晶显示器上的会显示相应的错误次数。如果错误的次数达到3次,则会提示密码锁已经锁定,然后下方显示对应的联系方式。
在进行密码修改时,需要先安心'+'按键,此时显示屏和虚拟串口显示终端上会提示输入旧的密码,当输入正确的旧密码后按下'X'键,此时会提示输入新密码。在输入新密码时需要注意,密码的4位数应该在0000-0255之间,如果输入的新密码不在此范围内,会提示输入的密码错误。输入正确的新密码后再次按下'X'按键,新密码就已经将旧密码替换掉了。
上面简单的介绍了一下这个密码锁仿真的使用方法。
密码锁部分程序
如果需要仿真和源程序可以联系作者。
相关问答
浴室柜 密码锁 钥匙原理?以51系列单片机(AT89051)为核心,配以相应硬件电路,完成密码的设置、存贮、识别和显示、驱动电磁执行器并检测其驱动电流值、接收传感器送来的报警信号、发送数...
怎么做 密码锁 ?1、制作密码锁的方法有很多种,可以用编程语言编写程序或者通过硬件组装,所以可以根据需要选择不同的方法来实现密码锁。2、一个简单的密码锁的实现方法是通过A...
求一个三菱plc4位 密码锁 程序-ZOL问答发个红包帮你做51单片机4位电子密码锁我经常做这个,可以帮你,密码忘记了不用刷机的,刷机太麻烦了,如果你只是想解密码,那就简单了,关机同时按音量...
全民 电子锁 一般多少钱-设计本有问必答全民智能锁价格大概是250-3000元左右,智能锁是指区别于传统机械锁,在用户识别、安全性、管理性方面更加智能化的锁具,门禁系统中锁门的执行部件。智...
在座的同志 有人知道吗!有设计感的 电子密码锁 招商, 电子密码 ...[回答]基于单片机的电子密码锁设计这个真的有。篇一:电子密码锁设计报告电子技术课程设计题目名称:电子密码锁重庆大学电气工程学院2011年6月电...
门锁的 方法是什么智能密码锁软件采用51系列单片机汇编语言对智能监控器和电子锁具分别编程。智能监控器软件包括键盘扫描和LCD显示程序、蜂鸣器驱动程序、时钟修改和读取程序...
豪诺智能锁技术原理是什么呢? - tinayu1007 的回答 - 懂得在安全技术防范领域,具有防盗报警功能的电子密码锁代替传统的机械式密码锁,克服了机械式密码锁密码量少、安全性能差的缺点,使密码锁无论在技术上还...
迷你 电子锁的 价格如何-设计本有问必答迷你电子锁一般价格是30-80元左右,贵的好的话要上百元,zucon旗舰店卖的电子门禁迷你60KG电子锁价格是38元左右,产品质量还不错,物美价廉,顾客评价高...
三防设计指的是哪三方面-ZOL问答外壳防护等级1.外壳防护等级(IP代码),指电气设备(额定电压≤72.5kV)的外壳,对下述内容的防护能力:1.1防止人体接近壳内危险部件;1.2防止固体异物...
门锁原理及种类电子门锁是我们家居生活中经常会用到的一种锁具,下面我们来为大家介绍下电子门锁原理及种类。电子门锁简介电子门锁是一种通过密码输入来控制电路或是芯片工作...