电子密码锁制作及源代码.docx
- 文档编号:12485914
- 上传时间:2023-04-19
- 格式:DOCX
- 页数:25
- 大小:716.47KB
电子密码锁制作及源代码.docx
《电子密码锁制作及源代码.docx》由会员分享,可在线阅读,更多相关《电子密码锁制作及源代码.docx(25页珍藏版)》请在冰豆网上搜索。
电子密码锁制作及源代码
电子密码锁
【摘要】
随着如今智能家居的发展,电子密码锁的兴起也随着得以发展,同时也由于其安全、方便、快捷、美观等特点被广大用户所接受。
单片机在此方面的控制也得以普及。
本设计是一个电子密码锁成品的模型,共可分为八个模块:
主控芯片模块、电源模块、报警电路模块、无线遥控模块、液晶显示模块、键盘扫描、电磁锁模块、照明电路模块。
本设计输入正确密码后即可开锁,门便会打开,只有门打开后才可修改密码,同时有密码验证功能。
同时密码输入错误三次便会激活报警。
为了节约电能,设备无操作一分钟时将会进入省电模式,按任意键后可激活设备。
【关键字】
密码锁单片机报警无线遥控继电器液晶屏电磁锁
一、总体方案设计
本设备模仿了真实的电子密码锁设计,采用了搞强度角铝及铝板作为骨架,也就是我们说的门框。
采用双层结构化电路板作为门。
焊接工艺全部采用拉焊,提高电气性能以及设备稳定性。
采用高磁性电磁锁,输入密码正确后锁会自动打开,锁门时不需上电即可完成。
主控芯片采用宏晶科技公司的51核心的STC89C52单片机用于采集矩阵键盘的输入和对液晶屏的输出以及对外设的控制。
具有保存密码功能,断电后仍然可以将修改后的密码烧录到单片机自带的2K的E2PROM中,1分钟无按键自动进入节电模式,工作电流≤40mA(注:
正常工作电流>200mA),按任意键可激活设备,大大节省了电能。
具有无线复位,无线开关照明,无线开锁功能,设计更加人性化。
图一
二、硬件电路方案设计
1、电源模块设计
电源采用4节5号干电池(6V)供电,通过三端集成稳压芯片7805将电压降到单片机等电路工作的5V电压。
图二
2、矩阵键盘检测模块
4*4的矩阵键盘采用行列扫描方式进行检测,16个按键轮流扫描。
利用相与的原理即有按键时输出低电平。
图三
3、液晶显示模块
128*64图形液晶,采用ST7920控制器,内置20000字中文字库,工作时通过三极管的开关作用控制液晶背光的开与关,以及液晶的休眠功能和关显示功能来达到节电的目的。
其中3脚为液晶偏压信号输入端,通过调节电位器,即可调节液晶的对比度。
图四
注释:
当FM端为低电平时,三极管(S8550PNP管)处于饱和区,此时三极管相当于开关作用,即液晶屏背光点亮,同理,相反FM为高电平时,背光熄灭。
4、报警模块设计
报警模块采用蜂鸣器和LED照明灯组成,其中蜂鸣器用三极管驱动,LED由于其工作电流比较大,所以用继电器驱动,利用一定的延时来控制蜂鸣器响鸣的频率和LED闪烁的频率,电路如下:
图五
注释:
左图为继电器驱动灯光报警及照明电路图,右图为蜂鸣器报警电路原理图。
5、电磁锁模块设计
电磁锁是本设备中比较重要的电气及机械设备之一,其同样采用继电器驱动,但是由于其功率比较大,所以决定了其工作电流会比正常工作状态要大5倍左右,所以断电瞬间会产生很高的自感电动势,反馈到继电器线圈上,同时其强大的磁场会对单片机的工作造成影响,为了解决这个问题,最好是在单片机输出端加上光耦合器,以起到隔离的目的,但是为了不破坏电路布线的整体性,这里我们在电磁锁两端反向并联了一只高压二极管(1N4148),这样就消除了干扰。
三、软件方案设计
如果说硬件是身体,那么软件就是灵魂,软件是建立在硬件基础上的,同样的硬件设备,如果采用优质的算法就可以充分的发挥其性能,可以使其做更多的事。
这里我们采用C语言编写,使用的是KeilC编译软件。
程序具体实现的功能是:
1、开机初始化,开启闪灯,出现欢迎画面,从内部存储器中读取6位密码放到RAM中,同时蜂鸣器出现“滴滴”声,代表正常启动。
2、提示输入密码,密码为六位数,初始密码为“456789”,“*”代表确定键,“#”代表取消键,按“*”可以表示确定密码输入,按“#”表示重新输入密码。
3、如果密码输入正确则开启电磁锁,同时提示按“A”键可以修改密码,同时开始倒计时,如果无按键按下,5秒钟倒计时后电磁锁自动释放,重新上锁。
4、如果在倒计时期间按下“A”键,则进入修改密码界面,密码的要求是4~6位的0~9任何数字,如果输入不符合要求会出现相应提示,输入第一遍密码后会出现再次输入密码提示,然后进行密码验证,如果两次密码一致,将新密码写入单片机自带的内部E2PROM存储器中,同时提示修改密码成功,电磁锁上锁。
否则提示重新输入密码。
5、如果输入密码错误三次,则启动报警,蜂鸣器发出报警音,LED不断闪烁。
6、如果一分钟无按键操作,则设备自动进入节电模式,关闭液晶屏,关闭背光,关闭闪灯,直到再次有按键按下,又恢复进入节电前的状态。
7、遥控功能,遥控器A键可以开启和关闭照明,B键可以开启和关闭电磁锁,D键可以实现远程复位单片机。
注释:
键盘的B、C、D键和遥控器的C键尚未用于设备中,也就是以上按键在设备中不起作用。
作品整体结构:
程序流程图:
无按键
是
否
是
提示相关信息
否
提示修改密码失败
否
提示密码输入成功,向单片机中写入密码
倒计时结束,电磁锁关闭
程序初始化,读取密码
液晶显示开机画面
提示输入密码
输入密码
取消键
开启电磁锁,开始倒计时,提示A键修改密码
提示密码错误,是否错误3次
否
开始声光报警
进入修改密码界面
创新部分:
1、采用128*64液晶屏显示界面,支持中文,更加人性化。
2、具有密码保存功能,将修改后的密码写入到单片机自带的E2PROM中。
3、漂亮的五彩闪灯,增加视觉享受。
4、采用具体的电磁锁和真正的骨架,密码正确后会自动开锁。
5、密码输入错误三次后,开启声光报警,更加真实趣味。
6、节能睡眠功能,大大节省电能。
7、采用4~6位密码均可,修改密码会进行密码格式和重复密码验证。
8、无线遥控功能,遥控器A键可以开启和关闭照明,B键可以开启和关闭电磁锁,D键可以实现远程复位单片机。
【附录】
/*电子密码锁C语言源程序*/
/*主函数*/
/*******************电子密码锁设计*********************
主程序入口
*******************************************************/
#include
#include
#include"word.h"
#include"lcd.h"
#include"eprom.h"
#include"key_scan.h"
uinta,j;
/*按键声音*/
voiddidi()
{beep=0;
delay1(70);
beep=1;
delay1(70);
}
/*灯光闪烁*/
voidflash()
{led=0;
delay1(70);
led=1;
delay1(70);
led=0;
delay1(70);
led=1;
delay1(70);}
/*密码响应程序*/
pass_word()
{ucharj,m,i,k,l,p=0,n=0,key1=1;
loop:
start();
//SectorErase(0x2000);//擦除扇区
//writeROM();
//delay1(10);
readROM();
m=0;
for(i=0;i<7;i++)
{key[i]='z';}
while
(1)
{j=keyscan();
wireless();//无线遥控响应程序
if(j>='0'&&j<='9')
{key[m++]=j;
write_x();//输入密码}
if(j=='#')
{gotoloop;}
if(j=='*')
{n=0;
for(k=0;k<6;k++)
{if(pw[k]==key[k])//比较密码
n++;}
if(n!
=6)
{p++;
write_com(0x01);
write_com(0x0c);
write_com(0x90);
for(i=0;i<16;i++)
write_date(tab4[i]);//密码输入错误
write_com(0x88);
for(i=0;i<16;i++)
write_date(tab4[16+i]);//请重新输入
didi();
delay1(500);
if(p==3)
{p=0;
for(i=0;i<8;i++)
{didi();
flash();}}
gotoloop;
}
if(n==6)
{l=5;
p=0;//避免出现正确前的的错误累加bug
rg_key();
didi();
lock=0;
while(l--)
{write_com(0x9e);
write_date(0x30+l);//正在倒计时
for(i=0;i<40;i++)
{if(modify_pw())
{key1=0;
break;}
delay1(25);}
if(key1==0)
{key1=1;
break;}}
lock=1;
gotoloop;}}}
}
/*修改密码程序*/
ucharmodify_pw()
{uchari,m,n,k,flag=0,flag1;
j=keyscan();
if(j=='A')
{flag=1;
loop1:
start();
m=0;
flag1=0;
for(i=0;i<6;i++)
{pw[i]='z';
pw1[i]='z';
}
while
(1)
{j=keyscan();
if(j>='0'&&j<='9')
{
if(flag1==0)//判断是第一次密码
pw[m++]=j;
if(flag1==1)
pw1[m++]=j;//第二次密码
write_x();
}
if(j=='#')
{gotoloop1;
}
if(j=='*')
{if(m<5&&flag1==0)//第一次进入输入密码
{
write_com(0x01);
write_com(0x0c);//关光标
write_com(0x90);
for(i=0;i<16;i++)
write_date(tab8[i]);//密码不能小于4位
write_com(0x88);
for(i=0;i<16;i++)
write_date(tab4[16+i]);//请重新输入
didi();
delay1(700);
gotoloop1;
}
elseif(m==7&&flag1==0)
{write_com(0x01);
write_com(0x0c);//关光标
write_com(0x90);
for(i=0;i<8;i++)
write_date(tab8[i]);//密码不能
for(i=0;i<8;i++)
write_date(tab11[i]);//大于11位
write_com(0x88);
for(i=0;i<16;i++)
write_date(tab4[16+i]);//请重新输入
didi();
delay1(700);
gotoloop1;
}
elseif(flag1==0)//再次输入密码
{write_com(0x01);
write_com(0x80);
for(i=0;i<6;i++)
write_date(tab7[i]);//请再次
for(i=0;i<10;i++)
write_date(tab3[i+2]);//输入密码
write_com(0x98);
for(i=0;i<4;i++)
write_date(enter[i]);//确定
write_com(0x98+0x06);
for(i=0;i<4;i++)
write_date(reset[i]);//取消
write_com(0x90);
write_com(0x0f);//显示光标
flag1=1;
m=0;
}
elseif(flag1==1)//两次输入结束开始对比两次密码
{n=0;
for(k=0;k<6;k++)
{if(pw1[k]==pw[k])//比较密码
n++;}
if(n==6)
{write_com(0x01);
write_com(0x0c);
write_com(0x90);
for(i=0;i<16;i++)
write_date(tab9[i]);//密码修改成功
SectorErase(0x2000);//擦除扇区
delay1(10);
writeROM();
didi();
delay1(500);
lock=1;
break;
}
if(n!
=6)
{write_com(0x01);
write_com(0x0c);
write_com(0x90);
for(i=0;i<16;i++)
write_date(tab10[i]);//密码不一致
write_com(0x88);
for(i=0;i<16;i++)
write_date(tab10[16+i]);//修改失败
didi();
didi();
delay1(500);
gotoloop1;}}}}
}
returnflag;
}
/*主函数*/
voidmain()
{init();
kai_lcd(tab2);
kai_lcd2(tab1);
didi();
pass_word();
}
voidtime0()interrupt1//定时器中断0
{TH0=0x3c;
TL0=0xb0;
a++;
if(a==1200)
{a=0;
TR0=0;
write_com(0x08);//关显示
write_com(0x34);
write_com(0x08);//进入睡眠
lcdlig=1;
shan=1;
led=1;
lock=1;
while
(1)
{if(keyscan()!
='Z')
{TR0=1;
write_com(0x0c);//脱离睡眠
write_com(0x30);
write_com(0x0f);//显示开
lcdlig=0;
shan=0;
//led=0;
break;
}}}}
/*word文件,用于存放相关数组等*/
/*延时子函数*/
voiddelay(uchari)
{for(;i>0;i--);
}
/*延时子函数1*/
voiddelay1(uintz)
{uintx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
/*lcd.h文件*/
/********************液晶显示模块*************************/
/*12864忙检测*/
voidbuys()
{P1=0xff;
lcdrs=0;
lcdrw=1;
lcdne=1;
delay1(5);
//while(busy==1);
lcdne=0;}
/*12864写命令*/
voidwrite_com(ucharcom)
{buys();
lcdrw=0;
lcdrs=0;
lcdne=1;
P1=com;
delay1(5);
lcdne=0;
P1=0xff;}
/*12864写数据*/
voidwrite_date(uchardate)
{buys();
lcdrw=0;
lcdrs=1;
lcdne=1;
P1=date;
delay1(5);
lcdne=0;
P1=0xff;
}
/*初始化函数*/
voidinit()
{TMOD=0x01;//设置定时器0为工作方式1
TH0=0x3c;//初值50ms
TL0=0xb0;
EA=1;//开总中断IE
ET0=1;//开定时器中断0IE1IE
TR0=1;//启动定时器0TCON
shan=0;//开闪灯
lcdlig=0;//开背光
write_com(0x01);/*待命模式,清屏,地址指针指向00H*/
write_com(0x30);/*30---基本指令动作,基本指令集*/
write_com(0x06);
write_com(0x0c);/*开显示,关游标*/
write_com(0x00);
write_com(0x06);/*光标的移动方向*/
}
/*进入系统选择功能*/
start()
{uchari;
write_com(0x01);//清屏,地址指针指向00H
write_com(0x80);
for(i=0;i<12;i++)
write_date(tab3[i]);//请输入密码
write_com(0x98);
for(i=0;i<4;i++)
write_date(enter[i]);//确定
write_com(0x98+0x06);
for(i=0;i<4;i++)
write_date(reset[i]);//取消
write_com(0x90);
write_com(0x0f);//显示光标
}
/*eprom.h文件*/
/*打开ISP.IAP功能*/
voidISP_IAP_enable()
{EA=0;//关中断
ISP_CONTR=ISP_CONTR&0x18;//0001.1000
ISP_CONTR=ISP_CONTR|WaitTime;//写入硬件延时
ISP_CONTR=ISP_CONTR|0x80;//ISPEN=1
}
/*关闭ISP.IAP功能*/
voidISP_IAP_disable()
{ISP_CONTR=ISP_CONTR&0x7f;//ISPEN=0
ISP_TRIG=0x00;
EA=1;//开中断
}
/*公用触发代码*/
voidISPgoon(void)
{ISP_IAP_enable();//打开ISP.IAP功能
ISP_TRIG=0x46;//触发ISP.IAP命令字节1
ISP_TRIG=0xb9;//触发ISP.IAP命令字节2
_nop_();
}
/*字节读*/
ucharbyte_read(uintbyte_addr)
{ISP_ADDRH=(uchar)(byte_addr>>8);//地址赋值
ISP_ADDRL=(uchar)(byte_addr&0x00ff);
ISP_CMD=ISP_CMD&0xf8;//清除低3位
ISP_CMD=ISP_CMD|RdCommand;//写入读命令
ISPgoon();//触发执行
ISP_IAP_disable();//关闭ISP,IAP功能
returnISP_DATA;//返回读到的数据
}
/*扇区擦除*/
voidSectorErase(uintsector_addr)
{uintiSectorAddr;
iSectorAddr=(sector_addr&0xfe00);//取扇区地址
ISP_ADDRH=(uchar)(iSectorAddr>>8);
ISP_ADDRL=0x00;
ISP_CMD&=0xf8;//清空低3位*
ISP_CMD|=EraseCommand;//*擦除命令3
ISPgoon();//触发执行
ISP_IAP_disable();//关闭ISP,IAP功能
}
/*字节写*/
voidbyte_write(uintbyte_addr,ucharoriginal_data)
{ISP_ADDRH=(uchar)(byte_addr>>8);/*取地址*/
ISP_ADDRL=(uchar)(byte_addr&0x00ff);
ISP_CMD&=0xf8;/*清低3位*/
ISP_CMD|=PrgCommand;/*写命令2*/
ISP_DATA=original_data;/*写入数据准备*/
ISPgoon();/*触发执行*/
ISP_IAP_disable();/*关闭IAP功能*/
}
/*写入数据*/
voidwriteROM()
{byte_write(0x2000,pw[0]);
byte_write(0x2001,pw[1]);
byte_write(0x2002,pw[2]);
byte_write(0x2003,pw[3]);
byte_write(0x2004,pw[4]);
byte_write(0x2005,pw[5]);
}
/*读取数据*/
voidreadROM()
{pw[0]=byte_read(0x2000);
pw[1]=byte_read(0x2001);
pw[2]=byte_read(0x2002);
pw[3]=byte_read(0x2003);
pw[4]=byte_rea
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 电子 密码锁 制作 源代码