简易电子密码锁课程设计.docx
《简易电子密码锁课程设计.docx》由会员分享,可在线阅读,更多相关《简易电子密码锁课程设计.docx(21页珍藏版)》请在冰豆网上搜索。
简易电子密码锁课程设计
江西理工大学应用科学学院
微机控制系统课程设计报告
题目:
简易电子密码锁
姓名:
学号:
专业班级:
指导教师:
完成时间:
设计报告
综合测试
平时
总评
格式
(10分)
内容
(10分)
图表
(5分)
功能测试
(35分)
答辩
(20分)
考勤
(20分)
指导教师签名:
1
1
2
3
6
7
8
摘要
随着人们生活水平的提高,如何实现家庭防盗这一问题也变得尤其的突出,传统的机械锁?
由于其构造的简单,被撬的事件也屡见不鲜,因此,人们在日常生活中越来越越离不开密码的使用。
在人们对安全的重视和科技的发展的同时,许多电子智能锁(指纹识别、IC卡辨认)已相继问世,但这类产品是针对特定指纹或有效卡,只能适用于保密要求高且仅供个别人使用的箱、柜、房间等。
另外,卡片式的IC卡易丢失和损坏,加上其成本较高,在一定程度上限制了这类产品的普及和推广。
鉴于目前的技术水平和市场的接收程度,电子密码锁是这类电子防盗产品的主流。
基于以上思路,本次设计使用PHILIPS公司的P89C51实现——基于单片机的电子密码锁的设计。
?
关键字:
P89C51单片机?
密码?
电子锁?
?
with?
the?
improvement?
of?
people?
living?
standards,?
how?
to?
achieve?
security?
of?
this?
family?
also?
changed?
particularly?
prominent,?
the?
traditional?
mechanical?
lock?
because?
of?
its?
simple?
structure,?
the?
incident?
was?
nothing?
new.?
therefore,?
more?
and?
more?
people?
in?
their?
daily?
life?
is?
inseparable?
from?
the?
use?
of?
?
people?
attach?
importance?
to?
security?
and?
the?
development?
of?
technology,?
at?
the?
moment,?
many?
Electronic?
smart?
lock(fingerprint?
IC?
card?
identification)has?
been?
published?
at?
home?
and?
abroad.?
However?
these?
products?
are?
characterized?
by?
specific?
and?
effective?
fingerprint?
cards,?
can?
only?
apply?
to?
the?
confidentiality?
requirements?
of?
the?
box,?
counter,?
doors,?
and?
so?
on.?
And?
fingerprint?
recognition?
knowledge?
for?
use?
in?
public?
places?
if?
there?
easily?
damaged?
machinery,?
C?
card?
there?
are?
still?
easily?
lost,?
damaged,?
and?
so?
on.?
Coupled?
with?
its?
high?
cost,?
to?
some?
extent,?
limited?
the?
popularity?
of?
such?
products?
and?
promotion.?
Given?
the?
current?
level?
of?
technology?
and?
the?
market?
reception?
of?
electronic?
code?
lock?
is?
such?
a?
mainstream?
electronic?
anti-theft?
?
on?
the?
above?
ideas,?
this?
design?
uses?
the?
P89C51?
PHILIPS?
achieve?
an?
electronic?
password—based?
SCM?
lock?
design.?
?
?
?
Key?
words:
?
P89C51SCM?
password?
electronic?
locks
第一章系统概述
本次设计使用P89C51单片机实现简易电子密码锁的设计,其主要具有如下功能:
1.设8置位密码,密码通过键盘输入,此时黄灯亮,若密码正确则绿灯亮。
2.密码可以由用户自己修改设定,绿灯亮后后才能修改密码。
在输入新密码时候需要确认,以防止误操作。
3.报警、锁定键盘功能。
密码输入错误红色发光二极管和蜂鸣器会出现错误提示,若密码输入错误次数超过3次,蜂鸣器报警并且锁定键盘。
电子密码锁的设计主要由三部分组成:
3×4矩阵键盘接口电路、密码锁的控制电路、输出数码显示电路。
另外系统还有LED提示灯,报警蜂鸣器等。
密码锁设计的关键问题是实现密码的输入、确认、更改等功能:
1.密码输入功能:
按下数字键,输入密码长度。
2.密码确认功能:
当按下确认键时,表示密码输入完成。
3.密码设置功能:
将输入的值作为新的密码。
主要的设计实施过程:
首先,选用单片机P89C51,以及选购其他电子元器件。
第二步,使用DXP2004设计硬件电路原理图,并设计PCB图完成人工布线(后因时间和材料准备不充分,所以没做出实物)。
第三步,使用KeiluVision4软件编写单片机的C语言程序、仿真、软件调试。
第四部,使用PROTEUS软件进行模拟软、硬件调试。
最后,联合软、硬件调试电路板,完成本次设计。
第二章基本功能设计
实验任务
通过对本题目的设计掌握单片机控制系统设计的相关方法与技巧。
用P89C51RC2HBP设计一个简单电子密码锁,完成密码的识别功能。
基本设计要求
基本要求
(1)设置(0~9)十个按键和一个设置/确认按键,当系统正常工作时可通过设置/确认按键修改密码,使用时初始密码为,随后可任意设置密码。
(2)当密码输入正确时,用一个发光二极管和蜂鸣器作为指示。
当密码输入错误时,则提示密码输入错误。
(3)当密码连续输入错误3次后锁定键盘,锁定时间为1分钟。
发挥部分
不改变硬件电路,增加蜂鸣器音乐输入功能,即编出三种音乐分别对应密码输入正确、输入错误和键盘锁定三种状态。
主要元件介绍
P89C51芯片
P89C51RB2/RC2/RD2具有16K/32K/64K并行可编程的非易失性FLASH程序,存储器并可实现对器件串行在系统编程ISP和在应用中编程(IAP)在系统编程ISP(In-System?
Programming)。
当MCU安装在用户板上时允许用户下载新的代码,在应用中编程IAP(In-Application?
Programming),MCU可以在系统中获取新代码并对自己重新编程。
这种方法允许通过调制解调器连接进行远程编程片内ROM中,固化的默认的加载程序,Boot?
Loader允许ISP通过UART将程序代码装入Flash存储器而Flash代码中,则不需要加载程序对于IAP用户程序擦除和重编程。
Flash?
Memory的操作是通过使用片内ROM中的标准程序该器件的1个机器周期由6个时钟周期组成因此运行速度是传统80C51的2倍一个OTP配置位可让用户选择传统的12时钟周期该系列单片机是80C51微控制器的派生器件是采用先进CMOS工艺制造的8位微控制器指令系统与80C51完全相同有4组8位I/O口3个16位定时/计数器多个中断源4个中断优先级嵌套中断结构个增强型UART片内振荡器及时序电路新增的特性使得89C51RB2/RC2/RD2成为功能更强大的微控制器更好地支持应用于脉宽调制高速I/O递增/递减计数能力如电机控制等场合。
图P89C51的DIP封装及管脚功能
系统框图
图系统框图
第三章硬件设计
硬件电路的设计
硬件工作接线口
P0口接数码管,用来显示按键是否按下,P1口接报警器和发光二极管。
P3口接3x4矩阵键盘,分别为(0~9)和设置/确认按键。
LED显示器结构与原理
LED显示块是由发光显示二极管显示字段的显示器件。
在单片机中我们通常用七段LED,这种显示共有共阴极和共阳极两种,本设计是用共阴极,如图所示。
图3-1LED数码显示部分
显示字符
共阴极段选码
显示字符
共阴极段选码
0
3FH
A
77H
1
06H
B
7CH
2
5BH
C
39H
3
4FH
D
5EH
4
66H
E
79H
5
6DH
F
71H
6
7DH
7
07H
8
7FH
9
6FH
表LED显示块
通常的七段显示块中共有8个发光二极管,其中7个发光二极管构成七笔字形“8”,一个发光二极管构成小数点。
七段显示块与单片机接口非常容易。
只要将一个8位并行输出与显示块的发光二极管引脚相连即可。
8位并行输出口输出不同的字节数据即可获得不同的数字或字符,通常将控制发光二极管的8位字节数据称为段选码。
复位电路
图复位电路
时钟电路工作后,在REST管脚上加两个机器周期的高电平,芯片内部开始进行初始复位(如图)。
振荡电路
图振荡电路
本设计晶振选择频率为12MHZ,电容选择22pF,如图所示。
按键设置
按键方式有独立式和行列式两种,本设计是采用行列式,共设置12个按键。
能减少键盘与单片机接口时所占用的I/O线的数目。
如图所示:
S1~S10分别为0~9数字按键,S11为设置/确认按键。
如图3-4,当没有键按下时,行线和列线之间是不相连的,若第N行与第M列的键被按下,那么第N行与第M列的线就被接通。
本系统的键盘扫描方法是利用P3口的低四位作为行扫描线,P3口的高四位作为列回扫线。
具体实施方法为:
先使口输出低电平,P3口其他口输出高电平,然后对、、三个口分别作判断。
若此三口都为高电平,则没有键按下;若有键按下,、、三个口必定有一个口输入为低电平,再判断、、哪个口为低电平则可判断按键在哪列上。
如、、没有低电平,再使为低电平,其他口为高电平,依次扫描下去,找到按键所在的行,再判断P3口的高四位哪一位为低,便可知道键在哪一列上。
图按键设置
报警器和发光二极管
图报警器与发光二极管
如果按下设置/确认按键,则黄灯亮。
当密码输入正确时,绿灯亮。
输入密码错误时,红灯亮且蜂鸣器响。
当第三次输入错误时,锁定键盘一分钟。
硬件电路图
图硬件电路Protel图
图硬件电路PCB图
图硬件电路PCB3D图
第四章软件设计
本系统程序部分使用C语言编写,C语言是一种高级程序设计语言,它的优点是简洁明了、可移植性高。
主要完成,先按下设置/确认键输入密码,系统会将所输入与系统密码进行比对。
若输入密码正确则绿灯亮。
然后可以任意设置密码。
每设置完一次都要按确认键。
期间操作出现失误,红灯亮蜂鸣器响,操作错误超过3次,系统会锁定键盘一分钟,并报警用以防止恶意试探密码。
系统软件设计
本系统软件设计由主程序、初始化程序、数码显示程序、键盘扫描程序、键功能程序、密码设置程序、EEPROM读写程序和延时程序等组成。
主要程序设计流程图如下所示:
图程序设计流程图
图开锁流程图
密码开锁功能
本系统使用数组PASSW[]存储密码,系统初始化对数组赋值PASSW[]={1,2,3,4,5,6,7,8}。
输入密码的时候,先将输入的每一位密码分别放置在数组PASST[]中,然后再将PASST[]与PASSW[]的每一位分别对照。
若每一位都相等,密码检查通过。
第五章系统PROTUSE仿真图
图PROTUES仿真图
图PROTUES仿真加载HEX文件
在下图中,当按下设置/确认键时,黄灯亮,然后输入密码。
如密码输入正确,则绿灯亮。
如输入错误,红灯亮且蜂鸣器响。
当出现三次错误时,同时要锁定键盘一分钟。
经调试,所需要的功能都能实现。
图按下设置/确认键黄灯亮
图密码正确时绿灯亮
图当密码错误时红灯亮
图设置新密码时黄灯绿灯同时亮
第6章设计总结
通过这次课程设计,掌握了单片机的一些基本知识,并将计算机控制以及所有关知识联系起来,本来有些原理还是懵懂的,但是在找电子密码锁的基本知识时,我发现只有动手做才会掌握一些技巧。
通过这次的设计,我们熟悉并熟练掌握了Protel和Protues的技巧;在C语言程序设计中,学到了如何使用C语言对单片机进行编写程序,熟悉了使用KEIL软件,并且加深了对单片机的编程技巧。
在做这个设计的过程中,我遇到了不少的问题。
这锻炼了我们筛选、查阅资料,并将理论结合到自己的设计中的能力。
一步一步的排除故障原因,找到故障的原因并解决故障。
这次的设计使我们对模拟电子、数字电子知识加深了了解,尤其是在对电路进行调试以及对C语言程序的编写和调试的时候,出现了很多这些方面的问题,通过对以往知识的复习巩固,将问题解决。
在此设计中,学到了很多知识,不仅对于技术有了更深入的学习,而且对于一个项目的完成的工作时序、任务分配也有了一定的了解。
通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。
这次课程设计终于顺利完成了,在设计中遇到了些问题,最后在老师和各位同学的辛勤指导下终于解决了。
我们学得到很多实用的知识,在此表示感谢!
同时,对给过我们帮助的所有同学和指导老师再次表示忠心的感谢!
参考文献
[1]当方.微型计算机控制技术[M].中国水利水电出版社,2001年
[2]胡汉才.单片机原理及其借口技术[M].清华大学出版社,1996年
[3]赵新民.智能仪器设计基础[M].哈尔滨工业大学出版社,1999年
[4]潘新,民王,燕芳.微型计算机控制技术[M].电子工业出版社,2003年
[5]李钟实.实用电子报警器精选百例[M].北京:
科技技术文献出版社,2002年
[6]陈爱弟.Protel99se实用培训教程[M].人民邮电出版社,2000年。
[7]阎石.数字电子技术基础[M].高等教育出版社,1998年
[8]童诗白.模拟电子技术基础[M].高等教育出版涉,1998年
附录
1.源程序
#include<>
#defineucharunsignedchar
#defineuintunsignedint
uchari,j,num,temp,wrong;
ucharpassw[]={1,2,3,4,5,6,7,8};
ucharpasst[]={0,0,0,0,0,0,0,0};
ucharcodetable[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,
0x76,0x79,0x38,0x3f,0};
bitlockflag;
biteditflag;
bitcmpflag;
bitpressflag;
sbitalarm=P1^3;
sbitrled=P1^0;
sbitgled=P1^1;
sbityled=P1^2;
uintt0,a;
ucharright;
voiddelay(uintz)
{uintx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
voidlock()
{
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
ET0=1;
EA=1;
TR0=1;
while
(1)
{if(t0<1200)
{
alarm=0;
for(a=2000;a>0;a--)
{
}
rled=~rled;
delay(1000);
}
else
{
alarm=0;
rled=1;
TR0=0;
t0=0;
break;
}
}
}
voidtimer0()interrupt1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
t0++;
}
ucharkeyscan()
{
P3=0xfe;
temp=P3;
temp=P3&0xf0;
while(temp!
=0xf0)
{
delay(50);
if(temp!
=0xf0)
{
temp=P3;
switch(temp)
{
case0xee:
{num=0;pressflag=1;}//11101110
break;
case0xde:
{num=1;pressflag=1;}//11011110
break;
case0xbe:
{num=2;pressflag=1;}//10101110
break;
case0x7e:
{num=3;pressflag=1;}//01111110
break;
}
while(temp!
=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
}
}
P3=0xfd;
temp=P3;
temp=P3&0xf0;
while(temp!
=0xf0)
{
delay(50);
if(temp!
=0xf0)
{
temp=P3;
switch(temp)
{
case0xed:
{num=4;pressflag=1;}
break;
case0xdd:
{num=5;pressflag=1;}
break;
case0xbd:
{num=6;pressflag=1;}
break;
case0x7d:
{num=7;pressflag=1;}
break;
}
while(temp!
=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
}
}
P3=0xfb;
temp=P3;
temp=P3&0xf0;
while(temp!
=0xf0)
{
delay(50);
if(temp!
=0xf0)
{
temp=P3;
switch(temp)
{
case0xeb:
{num=8;pressflag=1;}
break;
case0xdb:
{num=9;pressflag=1;}
break;
case0xbb:
{num=10;pressflag=1;}
break;
}
while(temp!
=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
}
}
returnnum;
}
voidinput()
{
while(num!
=10)
{
keyscan();
}
if(num==10)
{
pressflag=0;
yled=0;
for(i=0;i<8;i++)
{
while(!
pressflag)
{
keyscan();
}
pressflag=0;
temp=num;
if(temp!
=10)
{
if(!
editflag)
passt[i]=temp;
else
passw[i]=temp;
P0=table[num];
}
else
break;
}
yled=1;
cmpflag=~editflag;
delay(200);
P0=0;
num=0;
}
}
main()
{
i=0;
j=0;
lockflag=0;
editflag=0;
pressflag=0;
P0=0;
while
(1)
{
input();
if(cmpflag)
{
cmpflag=0;
for(j=0;j<8;j++)
{
if(passw[j]!
=passt[j])
{
if(wrong==2)
{
wrong=0;
lock();
}
else
{
gled=1;
rled=0;
alarm=0;
for(a=5000;a>0;a--)
{
}
delay(500);
rled=1;
alarm=1;
wrong++;
}
break;
}
else
{
if(j==7)
{
rled=1;
gled=0;
editflag=1;
input();
editflag=0;
gled=1;
wrong=0;
}
}
}
}
}
}