基于键入控制与无线遥控相结合的密码锁模拟系统的描述
及研究
摘要:本产品采用51单片机为控制系统, 通过密码输入来控制电路工作,同时具备键盘开锁与无线遥控开锁双重功能,本机开锁配有0—9及A,B,C,D 十六个按键,密码正确开锁,错误不开锁,并发出报警,无线开锁时,本机按键自动封锁,手执遥控按下,与遥控相对应的模块会接收其信号,执行指令开锁。
⑴ 系统简介:
硬件框图
系统方案:本系统采用单片机AT89C51作为本设计的核心控制器,利用无线遥控原理和单片机串行发射、接收等功能而设计的一款有本机开锁和遥控开锁双重功能的电子密码锁。
功能与指标:
密码锁的基本设计主要分为如下五个部分:
1. 选择密码:我们将编好的密码程序存储在单片机内部存储中,例如,预先设置其密码为123A ,作为正确密码。
2. 密码键入有效保护:为了帮助用户确信是否有键按下,我们特在电路中设置了模拟提示电路;而为了防止密码外泄, 提示时,并不是通过提示屏提示用户按下的按键数字, 而是以发光二极管的亮灭与蜂鸣器来提醒用户是否有键按下。如果有键按下,发光二极管闪亮,并且伴随着蜂鸣器发出“滴滴”声, 如果没有键按下,发光二极管灭,且无响声。这样既巧妙地提醒了用户又保护了用户密码,此为本设计可靠性优点之一。
3. 键盘扫描, 检测密码:当用户键入密码后,单片机会执行中断对按键进行扫描与判断,如果外部键入密码与预先设置密码相同,即123A ,单片机会通过控制正确开锁,二极管亮如果外部键入错误密码,二极管灭,伴随蜂鸣器的报警声,开锁失败。
4. 密码错误报警:当用户键入错误密码时,系统就会报警,一次键入错误,则报警一次,两次键入错误,则报警两次,当连续三次出现密码错误时,爆鸣器会长期报警不止, 这时必须按复位报警声方可停止。此设计大大增加了密码锁的安全可靠性。
5. 遥控开锁:当此密码锁用于私家车库或仓库时,用户可以不用上车,只要手执遥控器,键入正确密码,便会自动开锁,如果密码错误,同样也会报警。此设计使本锁更加方便快捷。 实现原理: 主控制器:
系统主控制器AT89C51单片机, 主控制其它模块的协调工作。其简介为:
AT89C51单片机内部包括:一个8位的微型处理器CPU ;一个256的片内数据存储器RAM ;片内程序存储器ROM ;四个8位的并行I/O接口P0~P3,每个接口即可以输入也可以输出;两个定时/记数器;五个中断源的中断控制系统;一个UART 的串行I/O接口。 单片机的各个I/O口工作如下:
p.0口:通过外接上拉电阻接收指令字节进行程序交验控制步进电机.
p.1口:通过驱动4个TTL 逻辑门电路对键盘进行扫描, 判断是否有键按下. p.2口:接收控制信号, 进行遥控输入密码.
p.3口:利用p3口第二功能中的外中断0进行关锁和报警, 当有键按下时执行中断, 蜂鸣器发出报警, 密码锁进行关闭.
复位电路:
AT89C51,晶振和两个电容组成的时钟脉冲,一个电阻和一个电解电容和一个按键组成的复位电路,按下复位键后清除所有数值,控制寄存器返回初值状态,蜂鸣器停止爆鸣。 晶振电路:
单片机XIAL1和XIAL2分别接30PF 的电容,中间再并个12MHZ 的晶振,形成单片机 的晶振电路,提供电路工作所需要的频率,并控制时钟。
驱动电路:
步进电机是将电脉冲信号转变为角位移或线位移的开环控制元件。在非超载的情况下,电动机的转速、停止的位置只取决于脉冲信号胡频率和脉冲数,而不受负载变化的影响。当步进驱动器接收到一个脉冲信号,它就驱动步进电机按设定的方向转动一个固定的角度(称为“步距角”),它的旋转是以固定的角度一步一步运行的。可以通过控制脉冲个数来控制角
位移量,从而达到准确定位的目的;同时可以通过控制脉冲频率来控制电机转动的速度和加速度,从而达到调速的目的。步进电机可以作为一种控制用的特种电机,利用其没有积累误差(精度为100%)的特点,广泛应用于各种开环控制。本模拟系统所用电机为通过软件设计来实现电机的正反转,从而来控制开关锁。 无线遥控原理
无线发射/接收控制电路均采用AT89C51单片机来实现, 通过AT89C51模拟总线实现密码控制,此电路简单,输出控制方式可选择,实用性强。其工作过程如下:
发射时:在单片机内部设置无线开锁密码,开锁时需输入的密码与预先设置的密码相符,如预先设置密码为:”qq ”。则遥控器必须依次按顺序按下”qq ”(遥控的四输入设为L 对应q,R 对应w,G 对应e ,B 对应r, ) ,即密码相符,开锁成功, 否则,开锁失败。
接收时:在电子锁旁有与无线遥控相配套的无线接收模块,当遥控器发射出的信号被模块接收,并且将接收的信号传入单片机内部,单片机执行遥控程序,对键盘的控制停止扫描,这时执行无线接收程序,按键解锁自动被锁。无线遥控接收器把接收到的遥控发射信号接收后,通过与内部程序的对比与处理,若接收信号与原定信号相符则正确开锁,否则,开锁失败。(当在遥控有按键按下则不执行遥控——保证开锁方式的单一方式。) 键盘控制原理
为了减少键盘与的单片机接口时所占用I/O的数目,此次设计中将普通按键做成4*4矩阵键盘,并与单片机的p1口相连,作为外部按键电路。矩阵键盘扫描原理为: 首先判断键盘中有无键按下,由单片机I/O口想键盘送入扫描字,然后读入列线状态来判断,判断键盘中哪一个键被按下时通过将行线逐行置低电平后,检查列输入状态实现的。方法是:依次给行线送低电平,然后查所有列线状态,称行扫描。如果全为1,则所按下的键不在此行;如果不为1,则所按下的键必在此行,而且是在与零电平列线相交的交点上的那个键。然后进行行扫描,判断是哪一个键按下,若有键按下,则调用延时子程序去抖动,最后按键的位置码,将按键的位置转换成键值。扫描完成的键值送给单片机。
根据设定好的密码, 采用矩阵式按键实现密码的输入功能, 当密码输入后,通过键盘扫描,并与预设密码对比若相符,则通过内部控制,实现其正确开锁。如果输连续三次密码输入不正确,则不能实现正确开锁,并且蜂鸣器发出长时间报报警。
⑵ 系统适用范围:
该密码锁具有设计方法合理,简单易行,成本低,安全使用等特点,主要适用于家居私人车库的应用,当汽车出入库时可以在车上通过遥控器就可以实现锁的开关。此锁还可以应用在日常生活和现代办公中,住宅安全防范、单位的文件档案、财务报表以及一些个人资料的保存等多种场合使用,符合商店车站等公共场合,家庭居室各防盗等使用要求。该锁大大提高了主人物资的安全性,可以代替老式机械锁。
⑶特色列举:
第一、按键解锁,无线解锁相结合,二者优点相结合,简单快捷方便; 第二、可以设置多位密码,提高了锁的安全性; 第三、操作简单方便,遥控器容易携带;
第四、若遥控器意外丢失,则可通过设置来屏蔽遥控器功能,使其作用失效;
第五、利用单片机进行密码的控制与检测,改变了以往的密码被盗以及钥匙被复制的问题。 ⑷技术说明:
本机通过单片机控制扫描键盘是否有键按下,若有键按下,执行外部中断,点亮发光二极管,将键值输入单片机,与设定密码相比较,如果相同,单片机控制输出设备执行开锁,如果不正确则控制蜂鸣报警。遥控开锁时,按键解锁自动被锁,遥控输入密码若与预设密码相符则正确开锁。否则,开锁失败。 ⑸实现功能:
在发射模块上按下遥控,接收模块将收到的数据传给单片机, 在单片机上
(1)系统设置4位密码,密码通过键盘输入,若密码正确,则将锁打开。 (2)密码由用户自己设定,在开锁状态下,用户可自行修改密码。 (3)具有自动报警功能,现场报警由扬声器发出报警声。
(4)两种情况下可报警:一是密码输入错误则报警,3次输入错误则报警不止。系统工作 时,用户通过按键输入4位密码,单片机将输入密码与设定密码进行比较,若密码正确, 则发出开锁信号,将门打开,系统不报警;若密码不正确,蜂鸣器报警,爆鸣重新输入密码的次数不能超过3次,若3次输入的密码都不正确,则发出报警信号。通过单片机送给开锁执行机构,电路驱动电磁锁吸合,从而达到开锁的目的。本设计当用户输入的密码正确单片机便输出开门信号,送到开锁驱动电路,然后驱动电磁锁,达到开门的目的。 ⑹模拟系统所需设备元件: 单片机 AT89C51 步进电机与驱动模块
电阻R1 10K*2,R2:1K*4 电解电容C3 :100F 无极电容C1: 30UF*2 5V 蜂鸣器 一只 晶振 12MHZ
三极管9014 一个 复位按键*17
LED *5(4个普通,1个高亮) 2极管4007*4
电源适配器,开发板平台一套
主控制程序
#include
#define uchar unsigned char #define uint unsigned int
//bit key_flag;
sbit xuan=P2^7;
unsigned char Key_Number=0; unsigned char Key_Number1=0;
unsigned char cishu=0;//密码输入错误次数连续总计 //unsigned char yao=0;
sbit Speaker=P3^7;//蜂鸣器连接端
unsigned char mima[]="123A";//键盘密码 unsigned char mima1[]="qq"; //摇控密码
unsigned char shurumima[4]; //键盘输入暂存 unsigned char shurumima1[2]; //摇控输入暂存 sbit row1=P1^0; //行 sbit row2=P1^1; sbit row3=P1^2; sbit row4=P1^3; sbit column1=P1^4; sbit column2=P1^5; sbit column3=P1^6; sbit column4=P1^7; sbit Y0=P2^3; sbit Y1=P2^2; sbit Y2=P2^1; sbit Y3=P2^0;
//列
//摇控
void Delay_ms(uint ms) //延迟 {
uchar t; while(ms--) {
t=120; while(t--); } }
uchar Str_cmp(uchar *str_a,uchar *str_b) //输入密码对比 {uchar i;
for(i=0;i
if(str_a[i]!=str_b[i]) return 0; }
return 1; //对反回1,不对反回0 }
uchar Str_cmp1(uchar *str_a,uchar *str_b) //输入密码对比 {
uchar i;
for(i=0;i
if(str_a[i]!=str_b[i]) return 0; }
return 1; //对反回1,不对反回0 }
uchar keyscan_str(void)
{
column1=1; //将列一设置为输入 column2=1; //将列二设置为输入 column3=1; //将列三设置为输入 column4=1; //将列四设置为输入
row1=0; //先将第一排拉低, 检查第一排有按键按下否 Key_Number=0;
if(column1==0) //如果第一排第一列按下 Key_Number='1';
if(column2==0) //如果第一排第二列按下 Key_Number='2';
if(column3==0) //如果第一排第三列按下 Key_Number='3';
if(column4==0) //如果第一排第四列按下 Key_Number='A'; row1=1; row2=0;
if(column1==0) Key_Number='4'; if(column2==0) Key_Number='5'; if(column3==0) Key_Number='6'; if(column4==0) Key_Number='B'; row2=1; row3=0;
if(column1==0) Key_Number='7'; if(column2==0) Key_Number='8'; if(column3==0) Key_Number='9'; if(column4==0) Key_Number='C'; row3=1; row4=0;
if(column1==0) Key_Number='*'; if(column2==0) Key_Number='0'; if(column3==0) Key_Number='#'; if(column4==0)
Key_Number='D'; row4=1;
if(Key_Number) return 1; else
return 0; }
uchar keyscan_str1(void) {
P2=0xff;
Key_Number=0; if(Y0==0);
Key_Number1='q'; if(Y1==0);
Key_Number1='w'; if(Y2==0);
Key_Number1='e'; if(Y3==0);
Key_Number1='r'; P2=0xff;
if(Key_Number1) return 1; else return 0 ; }
void speak(uchar t,uint ms) {
uchar temp; while(ms--)
{Speaker=!Speaker; //无源蜂鸣器必须输出一个波才可以出声, 这里为了输出一个2Khz 方波驱动出声 temp=t; while(temp--); }
Speaker=0; }
void open(uchar a) {uchar x,y; for (;a>0;a--) for(x=5;x>0;x--) for(y=20;y>0;y--)
{P0=0xef; Delay_ms(5);
P0=0xdf; Delay_ms(5); P0=0xbf; Delay_ms(5); P0=0x7f; Delay_ms(5); P0=0xff;} }
void close1(char b) {uchar x,y ; for (;b>0;b--) for(x=5;x>0;x--) for(y=10;y>0;y--)
{P0=0x7f; Delay_ms(5); P0=0xbf; Delay_ms(5); P0=0xdf; Delay_ms(5); P0=0xef; Delay_ms(5); P0=0xff;}}
void baojing(void) {speak(53,800); speak(66,800); speak(53,800); speak(66,800); speak(53,800); speak(66,800); speak(53,800); speak(66,800); }
void han2(void) {
uchar i=0; xuan=0; //P3=0xf7; for(i=0;i
while(keyscan_str1()==0); Delay_ms(20); while(keyscan_str1()==0); shurumima1[i]=Key_Number1; speak(60,300);}
if(Str_cmp1(shurumima1,mima1))//进行密码比对, 如果密码相同则Str_cmp函数返回1 {
speak(50,300); Delay_ms(100);
speak(50,300); open(200); cishu=0; }
else{ cishu++; if(cishu>2) while(1) baojing(); else baojing(); }
xuan=1; }
void han1(void) {uchar i=0;
for(i=0;i
{while(keyscan_str()==0) if(xuan==0) if(i!=0) han2();
Delay_ms(10);
while(keyscan_str()==0); shurumima[i]=Key_Number; speak(60,300);}
if(Str_cmp(shurumima,mima))//进行密码比对, 如果密码相同则Str_cmp函数返回1 {
speak(50,300); Delay_ms(100); speak(50,300); open(10); cishu=0; } else{
cishu++; if(cishu>2) while(1) baojing(); else
baojing(); } }
void main (void)
{ Speaker=0;
EA=1;
EX0=1;
EX1=1;
IT1=1;
IT0=1;
while(1)
{
han1();
/*if(key_flag==0) {
han1();
}
else
{
han2();
}*/}
}
void close(void) interrupt 0 {
close1(10);
}
/*void yaokong(void) interrupt 2 {
key_flag=~key_flag;
}*/