1 引言 设计目的
随着电子技术的发展,各类电子产品
应运而生,电子密码锁就是其中之一。 电子密码锁就是通过键盘输入一组密码完成开锁过程。研究这种锁的初衷,就是 为提高锁的安全性。 目前,国内自行研制开发的电子锁,应用还不广泛。国内的不少企业也引进 了世界上先进的技术,发展前景非常可观。希望通过不断的努力,使电子密码锁 在我国也能得到广泛应用。
设计要求 本次课程设计要求使我
们能够掌握并且实际运用课本知识。 通过利用所学的 电子技术知识正确分析并设计电路 , 将适当电路运用到实际电路中 , 将课本知识转 化为实际能力。
设计方法
(1)系能够从键盘中输入密码,并相
应地在显示器上显示, *;能够判断密码是 否正确,正确则开锁,错误则输出相应信息。 (2)密码由程序直接设定,不可用户自己设定。 (3)具有自动报警功能。密码不正确,相应红灯亮,蜂鸣器发出报警声来提示。 (4)具有手动复位功能。 2 设计方案及原理
系统总体设计 根据以上分析,本次电子密码锁设计
的主要重点是以下几个部分: 4x3 矩阵 键盘设计、 LCD 信息显示和密码的比较和处理。当然,除了这几个部分外还 有报警等功能模块。其中矩阵键盘用于输入数字密码和进行各种功能的实现。由 用户通过连接单片机的矩阵键盘输入密码,后经过单片机对用户输入的密码与自 己保存的密码进行对比,从而判断密码是否正确,然后控制引脚的高低电平传到 开锁电路或者报警电路是报警。系统整体框图如图 1 所示。
本设计硬件资源分配
~用于 LCD 液晶显示作用。 、用
于蜂鸣器和报警灯的控制。 用于开锁电路的控制。 ~用于键盘电路的控制。 ~用于LCD显示模块的控制端口的控制。
3 硬件设计 芯片选择
本次设计采用 ATC51 贴片芯片,
ATC51是一个低电压,高性能 CMOS 8 位单片机,通过用 Keil 软件编写程序,然后装到单片机里面去,然后让它对整个 系统进行信息的处理,如可以让它处理矩阵键盘传过来的信息,并根据编好的程 序来确定哪个按键按下,并处理相应按键对应的功能,然后把相应的信息反应到 单片机的各个引脚,来实现按键实现的现象,如:显示是否开启锁,报警等。 ATC51 提供以下标准功能: 4k 字节 Flash 闪速存储器 128 字节内部 RAM,32 个 I/O 口线两个 16 位定时 /计数器,一个 5 向量两级中断结构,一个全双工串行 通信口,片内振荡器及时钟电路。同时, ATC51 可降至 0Hz 的静态逻辑操作, 并支持两种软件可选的节电工作模式。空闲方式停止 CPU 的工作,但允许 RAM, 定时/计数器,串行通信口及中断系统继续工作。掉电方式保存 RAM 中的内容, 但振荡器停止工作并禁止其它所有部件工作直到下一个硬件复位。
ATC51 的引脚图如图 2 所示。
工作的最少的器件构成的系统。因
程序存储器,所以只要在其外部加上时钟电路
系统。
频率,时钟电路就是给单片机提供晶振频
路 的 PROTEUS 仿 真 图 。
24MHz之间选择,一般为 ,电容
定性、 大小及振荡电路起振速度有一定的影响,
30pF
系统中的其他部件都必须要有一个确定
机复位电路仿真图。
片机在上电瞬间 C1充电,RST引脚端出现正
期(大约 10ms)以上的高电平,单片机就能复
复位,只需按下开关,单片机就能重新变成
12MHz时,RC的典型值为 C=10μF,R=Ω。
电路和 CPU相连接, CPU可以采用查
键被按下,并检查是哪个键被按下。无论是查
机的 I/O口。由于单片机 I/O口较少的原因, 当系更合理更有效地利用单片机的 I/O口,一般采
功能。
单片机最小系统设计
单片机最小系统就是指能使单片机
为单片机已经包含了数据存储器和
和复位电路就可以构成单片机最小
(1)单片机工作需要晶振给 CPU提供
率 的 电 路 。 图 3 是 时 钟 电
单片机允许的振荡晶体可在 ~
C2,C3的取值对振荡频率输出的稳
可在20~100pF之间选择,典型值位(2)计算机每次开始工作, CPU和
的初值,即复位状态。图 4是单片
单片机 RST引脚是高电平有效。 单
脉冲,只要 RST断保持两个机械周
位。在单片机工作后,如果还想再次
复位状态。当晶体振荡频率为
矩阵键盘设计
一组键或者一个键盘,需要通过接口
询接口或者中断的方式了解有没有
询方式还是中断方式都要用到单片
统中需要用到较多按键时,为了能够
用矩阵键盘的方式来实现多按键的
图 5 是 4x3 矩 阵 键 盘 在
PROTEUS 中 的 电 路 原 理 仿 真 图 。
键盘的硬件结构比较简单,由行输出口
置在行、列交点上。只有当键被按下时相应
行和列是否相连就可以知道是否有键按下。
列分别连接到按键开关的两端,平时
列线为低电平,当有键按下时,按下的键就
行线被列线拉低,也变为低电平。这就是识
描,读出 I/O口的值可以知道哪一行的值被
按键所在行。同时,由于每个键都有它的行
个按键的编码,当算法一定时,每个按键的
不相同,所有通过读 I/O的值还能具体知道是
的识别。
是一种专门用于显示字母、数字、符号等的
示容量为 16x2个字符(可以显示 2行,每行显示
工作电流为 (),模块最佳
LCD1602的有关设计中,主要是通过编写程序控制
或者指令的写入和执行,再通过数据或者指令
LCD1602的显示功能。 查资料了解在仿真库中用
中显示模块的仿真图。
的电流,因此在实际应用为了保证显示器能够
矩阵键盘又叫做行列式键盘。行列式
和列输出口构成行列式键盘,按键设
的行和列才能相连。如此,只要检测
由于按键设置在行、列线交点上,行、
无键按下时,行线处于高电平,假设
会将相应的行和列连通,使得对应的
别矩阵键盘是否有键被按下的关键。 当确定有键被按下时,通过逐行扫
改变了,被改变了的行即是被按下的
值和列值,行值和列值得组合就是这
编码是固定的,且各个按键的编码互
哪一个键被按下,这样就实现了键盘
LCD显示模块设计
LCD1602是一种字符型液晶显示器,
点阵式液晶显示器。 LCD1602的显
16个字符),芯片工作电压为 ~,
工作电压是 。
LCD1602具有 16个引脚。在
LCD1602的4、5、6引脚来实现数据
的写入和执行来进一步实现
lm016l代替LCD602图6是PROTEUS
由于 LCD要正常工作必须提供足够
正常工作,应在数据端口接一上拉电
阻,不过此次仿真就没有另外加上拉电阻。
报警模块、开锁模块以及表示模块 开锁模块用继电器带一个 LED管代
替电磁锁。电路如图 7所示;
报警模块用蜂鸣器表示,电路如图 8
所示;
表示模块用发光二极管表示开锁与
否。
硬件连接图
根据电路原理,在 PROTEUS中画出
各功能模块的仿真图,各个功能 模块验证正确后,将所有模块集合到一个电路设计图中,画出具有所有功能的总 体硬件仿真图。
在设计过程中,采用单片机
ATC51作为主控芯片,结合键盘输入、显示电路、 报警电路、开锁电路、时钟电路、晶振电路,利用合理的连线接成硬件连接图, 在Proteus软件平台上选中合适的 ATC51芯片, LCD显示器,键盘,以及其它电 子元件,接成电路。 设计原理
系统工作时,用户通过按键输入 6
位密码,单片机将输入密码与设定密码进 行比较,若密码正确,则相应绿灯闪烁,同时发出开锁信号,将门打开,系统不 报警;若密码不正确,则相应的红灯亮闪烁,同时蜂鸣器发出报警声音。 4 软件设计
程序设计
C 语言编程,源程序清单如附录 1
所示。 程序流程图
流程图如图 4。
5 系统仿真及实际调试 仿真图
仿真结果密码正确, LCD 显示器显
示 “open”,绿灯亮。仿真图如附录 2 所示。
问题分析
电源、晶振电路和复位电路都无异
常, LCD 显示时出现问题: (1)刚开始蜂鸣器声音太小几乎听不清楚,后来加了一个三极管放大后声音变
大。
(2)接通电源开门灯和报警电路就会
工作,分析原因是单片机刚开始各个管脚 输出低电平。 (3)开锁电路完成后继电器不吸起,后来经过调试加三极管等等方法后实现 了继电器吸起 LED 灯亮。
6 总结
本次设计,采用单片机 ATC51 作
为主控芯片, 结合外围的键盘输入、 显示、 报警、开锁等电路,用 C 语言编写主控芯片的控制程序,设计了一款具有报警功 能的电子密码锁。 对于本次单片机课程设计,我觉得十分有意义且很有必要。课堂上,我们大 多数接触的仅仅是专业课的理论知识,如何去锻炼我们的实践能力如何把我们 所学的专业基础课理论知识运用到实践中去呢像此次课程设计就为我们提供了 良好的实践平台。过程中我发现了很多问题,看似很简单的电路,要动手把它给 设计出来,是很难的一件事,主要原因是我没有经常动手设计过电路,还有资
料 的查找也是一大难题,这就要求我在以后的学习中,应该注意到这一点,更重要 的是我要学会把从书本中学到的知识和实际的电路联系起来,这不论是对我以后 就业还是学习,都会起到很大的促进和帮助,我相信,通过这次的毕业设计,在 以后的学习中我会更加努力,力争把这门课学好,学精。同时,通过本次毕业设 计,巩固了我学习过的专业知识,也使我们把理论与实践从真正意义。另外,通 过这两周对电子密码锁的研究和学习,我认为本次设计中使用的这种键盘输入密 码的方式可以进行改革。在越来越高科技化的今天,遥控控制显的愈发重要,今 后的电子密码锁应该具有以红外技术或无线电技术为辅助的密码按键输入远程交 互技术,这样就能远程输入密码完成操作。也可以放弃传统的按键输入密码模式, 借助传感器技术运用声控来实现密码输入,又或者使用人脸识别技术,或者用户 指纹识别技术代替传统的按键输入,这些都可以使开锁的时间更短更方便,同时 使锁更安全。 最后也感谢指导老师这两周对我课设中存在的问题进行详细的解答 与帮助。
参考文献
[1] 谢自美 .电子线路设计实验测试
[M]. 武汉 :华中理工大学出版社 ,1992.
[2] 刘湘涛 .江世明 .单片机原理与
应用 [M]. 北京 :电子工业出版社 ,2006.
[3] 李光才 .单片机课程设计实例指
导 [M]. 北京:北京航空航天大学出版社 ,2004.
[4] 王思明等编著 .单片机原理及应
用系统设计 .北京:科学出版社, 2012.
附录 1 源程序 #include<> #include<>
#define uchar unsigned char
sbit rs=P1^0; //寄存器选择位 将 rs
定义为 的引脚
sbit rw=P1^1; //读写选择位将 rw
定义为 的引脚
sbit en=P1^2; //使能信号位将 en定
义为 的引脚
sbit ledg=P2^0; sbit ledr=P2^1; sbit relay=P1^4; sbit buzz=P1^5;
char table0[]=\"error\"; char table1[]=\"open\";
char table2[]=\"password:\"; // int
temp,ch,m0,m1,p,n0,n1,n2,n3,n4,n5;
void delay(int z) {
int x,c;
for(x=z;x>0;x--) for(c=100;c>0;c--); }
keyscan() {
temp=P1&0xf0; P1=0xfe; delay(1);
temp=P1&0xf0; while(temp!=0xf0) { switch(temp) {
case 0xe0:ch='7'; break;
case 0xd0:ch='8'; break;
case 0xb0:ch='9'; break;
default:ch=p; break; }
while(temp!=0xf0) {
temp=P1;
temp=temp&0xf0; } }
P1=0xfd; delay(1);
temp=P1&0xf0; while(temp!=0xf0) {
switch(temp) {
case 0xe0:ch='4'; break;
case 0xd0:ch='5'; break;
case 0xb0:ch='6'; break;
default:ch=p; break; }
while(temp!=0xf0) { temp=P1;
temp=temp&0xf0; } }
P1=0xfb; delay(1);
temp=P1&0xf0; while(temp!=0xf0) {
switch(temp) {
case 0xe0:ch='1'; break;
case 0xd0:ch='2'; break;
case 0xb0:ch='3'; break;
default:ch=p; break; }
while(temp!=0xf0) {
temp=P1;
temp=temp&0xf0; } }
P1=0xf7; delay(1);
temp=P1&0xf0; while(temp!=0xf0) {
switch(temp) {
case 0xe0:ch='A';break; case 0xd0:ch='0';break; case 0xb0:ch='B';break; default:ch=p;break; }
while(temp!=0xf0) {
temp=P1; temp=temp&0xf0; }
1
少为 4
}
return ch; }
void wcom(uchar com) { rs=0; P0=com;
delay(1); //写命令延时可以为 1 en=1;
delay(1); //写命令延时可以为 1 en=0; }
void wdat(uchar dat) { rs=1; P0=dat;
delay(1); //此处写数据延时可以为
en=1; delay(4); //此处写数据延时至
en=0; }
void init() { en=0;
wcom(0x38); wcom(0x0c); wcom(0x06); wcom(0x01); }
void error() {
char m2; wcom(0xc6);
for(m2=0;m2<5;m2++) {
wdat(table0[m2]); } }
void open() {
char m2; wcom(0xc6);
for(m2=0;m2<4;m2++)
{
wdat(table1[m2]); } }
void pass() {
char m2; wcom(0x80);
for(m2=0;m2<9;m2++) {
wdat(table2[m2]); } }
change(int m) {
delay(500); wcom(m); wdat('*'); }
main() { rw=0; ledg=0; ledr=0; relay=0; buzz=0; init(); delay(5); pass();
wcom(0x);
while(keyscan()==p) {
delay(3); keyscan(); }
wdat(keyscan()); n0=keyscan(); change(0x); delay(10); ch=p;
while(keyscan()==p) {
delay(3); keyscan();
='4'&&n4=='1'&&n5=='9')
}
wdat(keyscan()); n1=keyscan(); change(0x8a); ch=p;
while(keyscan()==p) {
delay(3); keyscan(); }
wdat(keyscan()); n2=keyscan(); change(0x8b); ch=p;
while(keyscan()==p) {
delay(3); keyscan(); }
wdat(keyscan()); n3=keyscan(); change(0x8c); ch=p;
while(keyscan()==p) {
delay(3); keyscan(); }
wdat(keyscan()); n4=keyscan(); change(0x8d); ch=p;
while(keyscan()==p) {
delay(3); keyscan(); }
wdat(keyscan()); n5=keyscan(); change(0x8e);
if(n0=='2'&&n1=='0'&&n2=='1'&&n3=
{
int m3=1;
open(); relay=1; delay(3000); relay=0; while(m3) {
int m4,m5; ledg=0;
for(m4=200;m4>0;m4--) {
keyscan();
if(keyscan()=='A') {
m4=0; m3=0; }
} ledg=1; if(m3!=0) {
for(m5=200;m5>0;m5--) {
keyscan();
if(keyscan()=='A') {
m3=0; } } } } } else {
ledr=1; error(); buzz=1; delay(5000); }
} 精心搜集整理,只为你的需要