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;
}
}
}
}
最后,如果有什么意见或者建议欢迎您留言给我,让我们共同学习一起进步,
如果需要 完整代码或设计文件,请在下方留言或者私信我,看到后会第一时间回复。
谢谢大家!
如果喜欢我的文章请评论转发加关注哦。
一种单片机和物联网平台的电子密码锁教程
基于STM32单片机和机智云物联网云平台设计了一种电子密码锁。该系统主要将开放的云平台和当下流行STM32单片机相结合实现本地和远端双重解密的功能,从而实现方便的本地解锁与灵活的远程解锁相结合,在本地解锁不及时或客观原因未能完成本地解锁的情况下利用开放的云平台远程解锁。
本地解锁通过本地密码的正确输入来实现,同时包含修改密码、错误报警等功能。远程解锁功能主要通过云平台和WiFi模块配合实现,WiFi模块将接收到的信息传输给单片机进行解码,解码正确将执行开锁功能,否则返回错误代码。该系统将云技术、手机通信技术等先进技术应用至密码锁中,可以起到提高密码锁的应用的能力。
当前的电子密码锁在居住环境安全领域有一定的先进性,且大多数电子密码锁会辅助本地报警等功能,有逐渐取代传统机械锁的趋势。但是当前的电子密码锁也存在着一下缺陷如灵活性不足。因此设计了一种单片机和物联网开发平台的电子密码锁设计。
1 系统组成及工作过程
该系统的硬件框图如图1所示。
该系统的核心器件为STM32单片机,采用的STM32F103C8T6是一款基于ARM Cortex-M 内核32位微控制器,程序存储器容量是64KB,需要电压2V~3.6V,属于低功耗单片机。该单片机在系统中的主要作用是核心控制,对本地输入的指令进行分析并处理,对处理结果作出响应。通信模块采用HLK-RM58S 5g双频WiFi模块,支持2.4GHz和5.8GHz双频频段通信,可以方便连入个人局域网。
云平台采用机智云Aiot开发平台,该平台具有开放的大量资源可利用。输入的矩阵键盘采用成熟的4乘4矩阵键盘。为保证该系统正常运行采用5V和3.3V双供电。当该电子密码锁系统检测到本地输入正确密码或通过WIFI通信模块接收到远端授权的指令后通过电机解锁。并通过提示、报警模块语音播报解码成功。当接收到3次密码错误信息通过本地提示、报警模块语音报警并向远端反馈错误信息。
2 电路实现
2.1 单片机介绍
该系统采用的STM32F103C8T6单片机属于嵌入式-微控制器,其总线宽度最高可达32-位,速度为72MHz,程序存储器类型为FLASH,RAM容量达到20K乘以8。加之目前的单片机模块已经微型化且价格较低,因此改款单片机从功能和性价比各方面考虑均是首选。
其主要功能是对远程通过通信模块发来的信息或本地矩阵键盘输入密码的信息进行正确性验证,若密码正确则执行解密开锁操作,若密码不正确则拒绝执行解密开锁操作,并记录输入错误的次数同时对比错误次数是否大于等于3,若条件满足则实施本地报警并通过通信模块将错误信息发送至指定手机。同时通过单片机内部程序实现修改密码、撤销密码、退格、报警等相关功能。
2.2 提示、报警模块
本地报警电路采用电磁式有源蜂鸣器,当触发报警后由单片机向蜂鸣器发送信号发出单音一长一短的交替报警声,目的是起到提示附近人员此处有异常,对非法操作人员起到警示和震慑作用。同时通信模块将信息发送至远端,用以提醒主人现在有人进行非法输入密码,便于主人及时作出相关应对措施,更好的起到安全保护的作用。
2.3 机智云平台
机智云是做物联网开发和云服务平台的一家企业,有着开放应用平台,可实现自助开发工具、后台支持服务、设备远程操控、数据存储及分析、软/硬件社交化等技术服务,该系统通过机智云将远端发送的信息接收进本系统,用单片机对接收的信息进行解码并识别。
因此机智云在该系统中的主要作用是远程信息交换,可以实现广域网范围的数据通信不局限于局域网。通过通信模块将该系统中的含错误次数、剩余次数以及目标掉线等相关信息存储在云端,并实时发送给客户端。客户端可以通过网络查看后台相关数据不会出现由于客户端网络问题而出现信息丢失。更适合本系统的灵活性的要求。
2.4 通信模块
通信模块采用的是Hi-Link品牌中的HLK-RM58S,其有效通信距离可达到100m,且支持2.4GHz和5.8GHz的双频通信,同时可支持蓝牙通信,同时具有一键配置网络的功能,通过一键配置功能可以方便连入个人局域网,个人局域网通过运营商提供的网络服务将该系统间接连入广域网,可以实现局域网和广域网的远程操作,不局限于仅局域网可用。使用方便灵活适用于本系统。
2.5 显示屏
本系统的显示屏采用市面上最普遍的LCD1602。该系统的显示屏主要用来显示输入的密码,因此选择了由字符型液晶显示屏、控制驱动主电路及其扩展驱动电路组成LCD1602模块。该模块正常工作所需**元件少让该系统电路更加简洁。
3 软件
软件主要检测现场键盘输入的密码是否正确,若正确直接开锁,若不正确,错误次数从0开始加”1”,当错误次数达到3次则启动本地报警模块发出警报声,同时通过通信模块与机智云向主人端发送报警信息。同时提供修改密码、撤销密码、退格等功能。
远程解锁通过云平台和WiFi模块配合实现,WiFi模块将接收到的信息传输给单片机进行解码,解码正确将执行开锁功能,否则返回错误代码,并记录错误次数当错误次数达到3次则启动本地报警模块发出警报声,同时通过通信模块与机智云向主人端反馈错误信息及错误次数、剩余次数等相关信息。流程图如2所示。
4 系统工作原理
基于STM32单片机和机智云物联网平台设计了一种电子密码锁,可以实现方便的本地解锁与灵活的远程解锁相结合,配合通信模块、提示报警模块等既可以实现本地解锁与远程解锁相结合又可以实现防盗作用,若有客人来访还可以实现远程无人授权开锁,方便程度大大提升且防止了人为密码泄露。从而完成由于客观原因不能完成本地解锁的情况下的远程解锁功能。
该系统还可以进行修改密码、撤销密码、退格、错误报警等相关操作,但是必须是管理员身份或经管理员授权。通过通信模块在远端实现信息反馈包含错误次数、剩余次数以及目标掉线等相关信息。若将该系统应用至公众场合尤其是人流量大使用频繁的高校及中小学教室。当有课时可通过机智云平台或现场输入密码的方式实现立即解锁并将门锁状态返回至客户端,给授课教师和教室管理人员带来了很大的便利,也节省了人员的时间成本。
同时管理员可通过云平台的后台数据清楚的查看各个房间的具体使用情况,根据后台数据可以进行线上分析,便于优化教室使用和分配。
图2软件流程图
该系统将基于STM32单片机的电子密码锁和云平台的远程智能密码锁相结合。实现了方便与灵活的结合,同时根据该系统的特点可将其应用至中小学、高校的教室管理,也可将其应用至家庭和酒店管理系统,达到方便开锁且不泄露密码的目的。这样既减少了管理人员的工作量同时还可以通过后台数据优化房间分配。实现智能管理的目的。
相关问答
单片机 密码锁毕设难不难?单片机密码锁毕设是一个相对较难的项目。首先,它涉及到硬件和软件的结合,需要具备一定的电子电路和编程知识。其次,密码锁的设计需要考虑安全性和可靠性,需...
指纹锁就一个 单片机 系统加锁头,成本不到不到一百块,为啥能卖好几千?这样吧,我给你举个例子假如你多研究,多了解,你买智能锁的时候就知道什么叫FPC、CPU、CNC、IML拉丝,电镀、太空铝、锌合金,触摸感应,虚位密码,指纹或人脸...这样...
单片机 中的寄存器有锁存功能吗?谢谢![最佳回答]首先你要理解锁存器的含义:锁存,就是把信号暂存以维持某种电平状态。锁存器的最主要作用是缓存,就是有记忆功能,单片机只要不掉电,肯定能保存过去的...
电子 密码锁设计方案哪位有?_土巴兔装修问答详细设计方案的选择及设计思路概述如下,希望可以帮到你。1、设计方案的选择本次设计的密码锁在理论上可以利用多种设计方法及原理进行设计,依据设计...
防火 电子锁 的价格是多少?-设计本有问必答防火智能电子锁价格在100元左右,电子锁具,它也是以51系列单片机(AT89051)为核心,配以相应硬件电路,完成密码的设置、存贮、识别和显示、驱动电磁执...
电子锁 可以去钥匙店配吗?可以。各种电子锁(国内)都配备有机械钥匙开锁功能(因是公安部明确规定的)。1、电子锁的种类、原理(按输入密码方式分):(1)按键式电子锁...可以。各种电...
哪里可以做 单片机 芯片解密,有知道的请帮帮忙吧???[最佳回答]解密难找,找了个加密原理的,望对你有帮助。AT89cxx加密原理单片机解密简单就是擦除单片机片内的加密锁定位。由于AT89C系列单片机擦除操作时序设计...
怎样使用 单片机 锁存器编程?锁存,顾名思义,存数据进来,锁住,输出端口保持锁住的值。只要锁存端口不使能,输入端口是什么数据都不影响输出。锁存端口使能后,赋新的值到输入端口,...
51 单片机 地址锁存信号输出端是哪个引脚?51单片机地址锁存信号输出端是PSEN引脚。PSEN是ProgramStoreEnable的缩写,意为程序存储器使能信号。当PSEN引脚为低电平时,表示要读取程序存储器中的指令,此...
cisa 电子锁 怎么样?-设计本有问必答cisa电子锁采用光学指纹头,安全可靠、性能稳定、经久耐用,适用于智能电子锁等户外安全防护领域。产品使用4.5MM双层金属混合装甲,真材实料,锁体双层...