技术文档

基于单片机的电子密码锁 51单片机控制的万能密码锁(附仿真文件+源代码)

小编 2024-10-06 技术文档 23 0

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;

}

}

}

}

最后,如果有什么意见或者建议欢迎您留言给我,让我们共同学习一起进步,

如果需要 完整代码或设计文件,请在下方留言或者私信我,看到后会第一时间回复。

谢谢大家!

如果喜欢我的文章请评论转发加关注哦。

基于单片机指纹锁电子密码锁——总体设计方案

1系统功能描述

本系统是根据指纹采集,识别模块开发出的指纹识别电子密码锁系统。该系统使用一个搜索手指指纹模块,一旦搜索到手指,立即采集手指指纹图像,并且将所收集的图像以数据形式发送。它利用人类指纹各向异性和不变性,为用户提供加密。只需把你的手指平放在指纹采集仪的采集窗口上完成指纹采集,操作十分方便。其主要功能是通过液晶显示屏显示出了各个过程和指纹对比结果。采集指纹图像之前,指纹模块必须检测是否在传感器表面上出现手指,所以应该有这种指纹录入的功能。简单的描述本次设计的功能即使用指纹模块检测、录入指纹,将比对的数据显示在液晶屏幕上。 本系统拥有一次最多录入300个指纹的能力。但是由于AS608的处理速度的限制,对于编号靠后的指纹查询需要很长时间,所以对于需要录入大量指纹的识别系统,应选用处理速度更快的指纹模块。

该系统的主要功能有以下几个方面:

1.录入指纹:系统预先要有录入指纹的功能,即将个人的指纹通过指纹采集器采集用户指纹的特征信息。

2.合成指纹模板并存储:通过光电转换后,将指纹特征值和对应的 ID 号存储到存储器中。只要有上传指纹的命令,模块可以立即将数据传送到指定位置。

3.搜索指纹库比对指纹:当有指纹录入时,模块会响应搜索指纹库比对指纹,同时液晶显示比对结果,发光二极管亮。

2系统总体框架

系统的总体框架是指根据设计任务要求,对系统所需元件、设备参数进行必要的计算,通过认真研究、分析、比较选定设备型号,再将设备、元件通过可靠的接口电路联系起来构成一个完整的系统。在系统的整体方案确定之前,先要明确设计要求,然后对系统硬件、软件进行设计,其中包括绘制原理框图、电路图,对原理进行必要说明,综合考虑系统的性能和稳定性要求,以保证所设计的系统达到预期的要求。通过查阅文献资料、综合分析考虑。主控芯片选用了STC89C52单片机。系统总体框图如图所示

该系统以STC89C52作为主控单元,指纹模块通过串口通信与其建立联系,采用串口通信协议进行程序的编写,然后根据指纹模块AS608的数据手册进行指纹录入与识别的程序编写。在指纹的录入选择中,可通过矩阵键盘(逐行扫描法)中设定好的按键进入系统的管理选项,管理选项中包含①添加指纹②清空指纹库③修改管理员密码,同时这也可以通过按键进行选择并确认。LCD12864(带中文字库)与主控单元采用的是并口通信,虽然这也占用I/O口较多,但是处理速度更快,对于液晶的中文字的显示,因为自带中文字库,所以可以直接进行中文数组的编写显示。在一个系统中,掉电数据不丢失是一个非常关键的一环,由于该单片机内部没有掉电存储功能,其ROM和RAM的功能分别是,ROM虽然掉电不丢失数据,但是无法进行写操作;RAM虽然能够进行读写,但是数据掉电丢失。所以鉴于此选用了AT24C02芯片进行E2PROM的扩展,AT24C02是IIC接口,由于该单片机没有专门的IIC接口,所以系统采用了模拟IIC通信,并根据IIC通信协议进行了程序编写,能够对数据进行掉电保存。

下次将继续更新系统硬件设计......

相关问答

求一份 基于单片机的电子密码锁 实习报告有日志更好..._求职实...

实习报告格式和基本要求(一)要求观点明确,论据详实,条理清楚,文字简练,格式规范,具有鲜明的针对性和创新性,正文字数一般不少于2000字。(二)内容...

单片机密码锁 毕设难不难?

单片机密码锁毕设是一个相对较难的项目。首先,它涉及到硬件和软件的结合,需要具备一定的电子电路和编程知识。其次,密码锁的设计需要考虑安全性和可靠性,需...

单片机密码锁 需要的零件?

元件清单:1、PCB板1片2、AT89C51单片机+IC座1套3、1602液晶显示屏1个4、按键17只5、12M晶振1只6、22P、104瓷片电容2只、1只7、470uF电容...

用8051编一 密码锁 程序!200分~!汇编或C都可以~-ZOL问答

单片机控制的智能密码锁本密码锁控制器由AT89C2051单片机组成,工作稳定可靠,保密性高,实用性强,并具有报警控制功能。一、电路组成和原理图工作原理图如...

电子密码锁 设计方案哪位有?_土巴兔装修问答

详细设计方案的选择及设计思路概述如下,希望可以帮到你。1、设计方案的选择本次设计的密码锁在理论上可以利用多种设计方法及原理进行设计,依据设计...

怎么做 密码锁 ?

1、制作密码锁的方法有很多种,可以用编程语言编写程序或者通过硬件组装,所以可以根据需要选择不同的方法来实现密码锁。2、一个简单的密码锁的实现方法是通过A...

求大神。51 单片机的 【倒计时+ 密码锁 】没办法解锁?

这你就钻牛角尖了!解锁何必中断,在倒计时过程中放一句按键检测,有键按下则调用你的解锁子程序,解锁成功关闭定时器不就行了。这你就钻牛角尖了!解锁何必中断,...

智能 电子密码锁 国内外发展现状?

当今智能电子密码锁发展已经到了非常高的境界,由于电子元件特别是单片机应用在这几年得到空前发展,无论功能性,稳定性都比较全面,在保密方面已做到人眼识别,...

三防设计指的是哪三方面-ZOL问答

基于PLC的音乐喷泉的设计基于单片机的电子密码锁设计基于单片机的温度控制系统设计基于PLC的电机测速系统设计这些题目相对可以找到一些实物。如果说你手头...

基于plc 密码锁的 控制编程设计,1到9,设计4位密码,密码正确开门,密码错误3次自动报警,咋编程呀?

不建议使用PLC。姑且不论你能否将PLC塞进密码锁中,从成本上考虑也颇高。建议使用单片机,或者FPGA直接开发。如果一定要使用PLC的话,听您的描述,应该是PLC做...

猜你喜欢