基于AT89C51型单片机电子密码锁的设计.docx
《基于AT89C51型单片机电子密码锁的设计.docx》由会员分享,可在线阅读,更多相关《基于AT89C51型单片机电子密码锁的设计.docx(18页珍藏版)》请在冰豆网上搜索。
基于AT89C51型单片机电子密码锁的设计
基于AT89C51型单片机电子密码锁的设计
摘要:
我们的生活中,锁时一种常见的生活用品,从普通的钥匙锁到保险箱的密码锁,锁给我们的生活带来了极便利。
但机械式密码锁体积比较庞大不便在其他小地方使用,这时体积小而且方便快捷的密码锁就为我们解决了这个问题。
本文介绍了一个由AT89C51单片机为核心的数字电子密码锁,该密码锁通过适当的程序实现了对密码的认证的过程,通过液晶显示器显示输入过程,实现人机对话的友好界面,当输入的密码为已设定好的密码时,电子锁将会自动打开,否则系统将会提醒再次重新输入,当三次输入的密码错误系统自动报警。
在输入过程中,可通过功能键修改输入数字,具有重新输入密码的功能,方便修改误输入的数字
关键词:
电子密码锁,密码检验,自动报警,单片机,液晶显示
1.目的意义
经过了一个学期单片机的的学习,通过本次课程设计,了解电子锁的基本工作原理,通过对已学习的AT89C51型单片机,熟悉AT89C51并行接口的各种工作方式和应用,并且掌握AT89C51计数器/定时器的工作方式和应用编程外部中断的方法,以及对液晶显示问题的解决。
掌握单片机的设计步骤方法,继而达到能设计单片机实际应用的目的。
2国外进展情况
目前,单片机正朝着高性能和多品种方向发展趋势将是进一步向着CMOS化、低功耗、小体积、大容量、高性能、低价格和外围电路装化等几个方面发展。
下面是单片机的主要发展趋势。
CMOS化近年,由于CHMOS技术的进小,大促进了单片机的CMOS化。
CMOS芯片除了低功耗特性之外,还具有功耗的可控性,使单片机可以工作在功耗精细管理状态。
这也是今后以80C51取代8051为标准MCU芯片的原因。
因为单片机芯片多数是采用CMOS(金属栅氧化物)半导体工艺生产。
CMOS电路的特点是低功耗、高密度、低速度、低价格。
采用双极型半导体工艺的TTL电路速度快,但功耗和芯片面积较大。
随着技术和工艺水平的提高,又出现了HMOS(高密度、高速度MOS)和CHMOS工艺。
CHMOS和HMOS工艺的结合。
目前生产的CHMOS电路已达到LSTTL的速度,传输延迟时间小于2ns,它的综合优势已在于TTL电路。
因而,在单片机领域CMOS正在逐渐取代TTL电路。
低功耗化单片机的功耗已从Ma级,甚至1uA以下;使用电压在3~6V之间,完全适应电池工作。
低功耗化的效应不仅是功耗低,而且带来了产品的高可靠性、高抗干扰能力以及产品的便携化。
低电压化几乎所有的单片机都有WAIT、STOP等省电运行方式。
允许使用的电压围越来越宽,一般在3~6V围工作。
低电压供电的单片机电源下限已可达1~2V。
目前0.8V供电的单片机已经问世。
大容量化以往单片机的ROM为1KB~4KB,RAM为64~128B。
但在需要复杂控制的场合,该存储容量是不够的,必须进行外接扩充。
为了适应这种领域的要求,须运用新的工艺,使片存储器大容量化。
目前,单片机ROM最大可达64KB,RAM最大为2KB。
本文所涉及的是市场占有率最高的是MCS—51系列,因为世界上很多知名的IC生产厂家都生产51兼容的芯片。
到目前为止,MCS—51单片机已有数百个品种,还在不断推出功能更强的新产品。
3.设计容及要求
①课程设计中,锁体用LED灯代替。
绿灯亮表示开锁,红灯亮表示闭锁
②其密码为四位,代码自己设定
③开锁指令为串行输入码,当开锁密码与储存密码一致时电子锁才能被打开。
当开锁密码与储存密码不一样时,可重复进行。
若连续三次未能将锁打开,电路则报警并实现自锁
④选择电路方案,完成对确定电路方案的设计。
计算电路元件参数与原件选择,画出总体电路原理图,并阐述基本原理,安装调试设计电路。
4系统的设计
4.1系统设计结构图
如图所示,系统主要有3*4键盘,复位电路,LED灯,蜂鸣器,液晶显示电路组成
4.2系统的工作原理说明
本系统采用AT89C51的单片机为核心的系统,加以3X4矩阵键盘,LED灯,蜂鸣器等。
矩阵键盘分别为0,1,2,3,4,5,6,7,8,9,重新输入,确认输入。
系统开始显示为“INPUTPASSWORD”提示输入密码;当密码输入完毕按下ENTER键时,若输入密码与设定密码相同时,即密码正确,液晶显示为“MISSIONSUCCESS”提示锁打开。
同时LED绿灯亮,若密码不正确LED显示,电路显示提示“FORGOTPASSWORD”LED红灯亮,若连续三次输入不正确则发生报警同时锁定键盘密码,不能进行任何操作。
若再输入过程中发现输入错误数字,可通过重新输入AC键清除所有数字。
为了防止恶意尝试,若连续输入3次密码输入错误则发生报警。
5.系统硬件设计
5.1复位以及振荡电路
本设计晶振选择频率为12MHZ
5.23X4矩阵键盘
如图所示,本系统采用3X4矩阵键盘,12个按键分为输入数字键:
0.1.2.3.4.5.6.7.8.9;功能键:
确认输入ENTER.重新输入AC。
键盘与单片机相连,其方式为前三行分别p1.0-1.3连接:
后四行分别与p1.5-1.8连接分别控制
图5.1.2主程序流程图
5.3报警器
报警部分由瓷压电发生装置机外围电路组成
5.4液晶显示电路
为了时该电子锁能人性化显示输入密码的状态以及密码输入的正确与否添加了液晶显示放弃了数码管显示。
本设计使用JHD1602A液晶显示自带英文库,各引脚分别接入p2.0
图6.1.2电路原理图
5.5串口输入电路图
为了方便写入程序,分别加入了串口输入电路
6.程序流程图
7原理图
8.调试与仿真
1.电路通电
2开始输入密码
3输入密码
4输入成功
5重新输入
6输入错误
9程序
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
uchartable[]="INPUTPASSWORD:
";
uchartable1[]="*";
uchartable2[]="MissionSuccess!
";
uchartable3[]="ForgotPassword?
";
ucharnew[4];
ucharpassword[]={1,3,1,4};//原始码
sbitP30=P3^0;
sbitP31=P3^1;
sbitP35=P3^5;
sbitP36=P3^6;
uchark=0;
ucharj=0;
/*键盘简介(4*3)
012
345
678
9重输确认
*/
voiddelay(uintms)
{
uintm,s;
for(m=0;m{
for(s=0;s<1141;s++);
}
}
voidwrite_(uchar)//写指令
{
P30=0;
P2=;
delay
(1);
P31=1;
delay
(1);
P31=0;
}
voidwrite_dat(uchardat)//写数据
{
P30=1;
P2=dat;
P31=1;
delay
(1);
P31=0;
}
voidjiaodui()//密码校对
{
uchari=0;
while(password[i]==new[i])
{
i++;
if(i==4)break;
}
if(i==4)
{
P36=1;//开锁
write_(0X80+0X40);
delay(5);
for(i=0;i<17;i++)
{
write_dat(table2[i]);
delay(20);
}
}
else//密码错误
{
j++;
if(j==3)
{P35=1;
write_(0X80+0X40);
delay(5);
for(i=0;i<16;i++)
{
write_dat(table3[i]);
delay(20);
}
while
(1);
}
elseif(j!
=3)
{
k=0;
write_(0X80+0X40);
}
}
}
ucharkey_press()//检查是否有按键按下
{
uchari;
P1=0Xf0;
delay(20);
i=P1;
if(i==0Xf0)
{
return0;
}
else
{
return1;
}
}
voidkey_scan()//确认所按按键的具体位置,及对应数据
{
ucharkey,i=0X7F,j;
delay(10);
if(key_press())
{
do{
i=(i<<1)|(i>>7);
P1=i;
key=P1;
j=key&0Xf0;
}while(j==0XF0);
while(key_press());
switch(key)
{
case0X7E:
key=0;break;
case0XBE:
key=1;break;
case0XDE:
key=2;break;
case0X7D:
key=3;break;
case0XBD:
key=4;break;
case0XDD:
key=5;break;
case0X7B:
key=6;break;
case0XBB:
key=7;break;
case0XDB:
key=8;break;
case0X77:
key=9;break;
case0XB7:
key=10;break;
case0XD7:
key=11;break;
}
if(key<10)
{
new[k]=key;k++;
write_dat(table1[0]);
}
elseif(key==11)jiaodui();
elseif(key==10)
{
k=0;
write_(0X80+0X40);
}
}
}
voidmain()
{
uinti,j;
P30=1;
P31=0;
P35=0;
P36=0;
write_(0X38);
delay(5);
write_(0X01);
delay(5);
write_(0x0f);
delay(5);
write_(0x80+0x00);
delay(5);
for(i=0;i<15;i++)
{
write_dat(table[i]);
delay(20);
}
write_(0Xc0);
delay(5);
while
(1)
{
if(key_press())
{
key_scan();
}
}
}