电子密码锁的设计.docx
- 文档编号:13405189
- 上传时间:2023-06-13
- 格式:DOCX
- 页数:33
- 大小:141.21KB
电子密码锁的设计.docx
《电子密码锁的设计.docx》由会员分享,可在线阅读,更多相关《电子密码锁的设计.docx(33页珍藏版)》请在冰点文库上搜索。
电子密码锁的设计
单片机课程设计报告书
课题名称
电子密码锁的设计
姓名
学号
院系
物理与电信工程系
专业
电子信息工程
指导教师
2012年6月14日
一、设计任务及要求:
1、利用AT89C52、按键及LCD,来控制密码锁;
2、矩阵键盘作为数字输入及控制电路;
3、LCD显示部分密码信息;
4、密码输入正确时,则LCD提示解锁成功,LED闪烁三下,蜂鸣器响三声;
5、输入密码错误,则LCD提示解锁失败,LED常亮,蜂鸣器一直响。
指导教师签名:
2012年5月28日
二、指导教师评语:
指导教师签名:
2012年6月26日
三、成绩
验收盖章
2012年6月26日
电子密码锁的设计
(湖南城市学院通信与电子工程学院电子信息工程专业,湖南益阳,41300)
1设计目的
(1)进一步掌握AT89C52等芯片的引脚功能及使用方法;
(2)进一步掌握单片机系统的设计和单片机系统功能的测试方法;
(3)进一步掌握基于单片机技术的原理电路图的绘画及布线方法;
(4)同时了解proteus及Keil等软件的使用方法。
2设计的主要内容和要求
利用AT89C52、按键及LCD,来控制密码锁。
矩阵键盘作为数字输入及控制电路;LCD显示部分密码信息;密码输入正确时,则LCD提示解锁成功,LED闪烁三下,蜂鸣器响三声;输入密码错误,则LCD提示解锁失败,LED常亮,蜂鸣器一直响。
并学习AT89C2单片机的使用和单片机编程基础语言C语言的应用。
3整体设计方案
基本设计方案:
电子密码锁要实现的功能是每按下一个键,要求在LCD上显示并依次右移一位,输入密码,就可以确定密码输入是否正确。
整体方框图如图3.1所示。
电子密码锁采用AT89C52单片机进行智能控制,用4×4组成0-F数字键;用液晶显示屏组成显示电路提示信息,当密码位数输入完毕时,对输入的密码与设定的密码进行比较。
若输入密码正确,则LCD提示解锁成功,LED闪烁三下,蜂鸣器响三声。
若输入密码错误,则LCD提示解锁失败,LED常亮,蜂鸣器一直响;重新输入密码时,直接按下密码所代表的按键即可。
图3.1整体设计方框图
4硬件电路的设计
采用4×4键盘即采用矩阵式键盘,通过行列键盘扫描的方法可获取键盘输入的键值,从而得知按下的是哪个键。
具体过程如下:
首先查询是否有按键按下。
单片机向行扫描出为“0”的扫描码,然后从列检测口检测信号,只要有一列信号不为“1”,则表示有键按下,且不为“1”的列即对应为按下的键所在的列,然后查询按下键所在的行、列位置。
前面已经取得了按下键的列号,接下来要确定键所在行,这需要进行逐行扫描。
单片机首先使第一行为“0”,其余各行为“1”,接着进行列检测,若为全“1”,表示不在第1行,否则在第一行;然后是第二行为“0”,其余各行为“1”,再进行列检测,若为全“1”,表示不在第2行;这样逐行检测,知道检测到按下键所在的行。
当各行都扫描以后仍没有找到,则放弃扫描,认为是键的误动作。
最后对得到的行号和列号译码,得到键值。
对于4×4的行列式键盘,因为按键的位置由行号和列号唯一确定,且行列各4位,所以用一个字节(8位)来对键值编码是很合适的。
本设计中,将字节的高4位(D7、D6、D5、D4)表示列号(4、3、2、1),低4位(D3、D2、D1、D0)表示行号(4、3、2、1)。
键盘矩阵模块采用4×4的阵行列式键盘作为输入模块。
矩阵式行列式键盘由行线和列线组成,按键位于行、列的交叉点上,行、列分别连接到按键开关的两端,行线通过上拉电阻接到高电平。
无按键动作时,行线处于高电平状态;有按键按下时,交点的行线列线接通,行线电平状态将由与此行线相连的列线电平决定
采用液晶显示屏来实时显示输入密码的数值,第一行显示“湖南城市学院“,第二行显示“通电院”,第三行显示“请输入密码”;输入密码时,第四行以‘*’来表示一位密码;不仅硬件电路连接简便,而且观看起来比较清晰方便。
声光报警两种形式来表示密码锁解锁。
采用LED指示灯、液晶显示屏和蜂鸣器来提示密码输入正确。
当密码为数输入完毕时,若密码输入正确,则LCD提示解锁成功,LED闪烁三下,蜂鸣器响三声;输入密码错误,则LCD提示解锁失败,LED常亮,蜂鸣器一直响。
将主芯片、矩阵键盘、声光报警模块、液晶显示屏等几个模块连接起来,就是总电路原理图,如图4.1所示。
图4.1基于单片机的电子密码锁电路原理图
5软件设计
液晶显示屏显示,初始化时,第一行显示“湖南城市学院“,第二行显示”通电院“,第三行显示”请输入密码“;当密码输入完后,进行密码比较,然后给出相应的信息。
六位密码输完后就直接显示结果,若输入错误,则要在六位密码全输完,显示解锁失败后,才可重新输入正确的密码。
源程序见附件1。
程序流程图如图5.1。
图5.1程序流程图
6系统调试与仿真
(1)打开KeilμVision3,新建Keil项目,选择AT89C52单片机作为CPU,新建汇编文件,编写程序,并将其导入到“sourcegroup1”中。
在optionfortarget对话窗口中,选中output选项卡中的creatHEXfile选项和dubeg选项卡中的“use:
proteusVSMsimulator”选项。
编译汇编源程序,改正程序中的错误。
(2)在ProteusISIS中,画好电路原理图,选中AT89C52并单击,打开“editcomponent”对话窗口,设置单片机晶振频率为12MHz,在此窗口中的programfile栏中,选择先前用keil生成的.HEX文件。
在ProteusISIS的菜单栏中选择file→savedesign,保存设计。
的菜单栏中,打开“debug”的下拉菜单,在菜单中选中“useremotedebugmonitor”选项,以支持与keil的联合调试。
(3)在keil的菜单栏中选择debug→Start/stopdebugsession或者直接单击工具栏中的“debug→Start/stopdebugsession”图标,进入程序调试环境。
按F5键,
顺序运行程序。
调出ProteusISIS界面,验证程序功能。
(4)界面显示“PCD”,密码输入正确的显示,如图6.1。
图6.1密码输入正确仿真图密码输入错误的显示,如图6.2。
图6.2密码输入错误仿真图
7使用说明
(1)初始密码为“123456”;
(2)密码输入完毕后,对输入的密码与设定的密码做比较;
(3)若在输入过程中有输入错误,则要在六位密码全输完,显示解锁失败后,才可重新输入正确的密码。
8设计总结
在本次课程设计的过程中,我认识到只有将所学的跟实践操作结合起来才能更好地巩固所学,才能提高自己的实践能力。
因为设计过程中有时看似简单的问题都要发很多时间去解决,正所谓实践是检验真理的唯一标准。
在本次实践中,我发现了很多不足,比如说基本功不扎实,比如说某些基本的理论都不知道。
而且在实践过程中通过查找资料、分析资料和写课程设计报告书,加强了我对文档的使用、对资料的搜索、整理、归类、总结、保存的能力,这在生活和以后的工作都是很有影响的。
当然最关键的还是要靠自己亲自去领会思考如何解决问题,掌握独自面对问题分析问题的方法。
在程序设计和算法实现上要最好画好程序流程图,这样能达到事半功倍的效果。
更进一步的熟悉了Proteus和KeilC,同时也使我们认识到自身存在的不足之处,无论是理论上还是遇到问题的处理能力上都还有待提高,而且这也激发了我们今后努力学习的兴趣。
我们每一个人永远不能满足于现有的成就,人生就像在爬山,一座山峰的后面还有更高的山峰在等着你。
挫折是一份财富,经历是一份拥有。
生活中还有许多我们不知道的等着我们去探索,只有真正经历过,才会深刻的体会。
参考文献
[1]张润景、周丽娜、丁莉.基于PROTEUS的电路及单片机设计与仿真(第2版)[J].北京:
北京航空大学出版社,2010:
317-325.
[2]单片机原理及应用:
基于Proteus和KeilC/林立等编著。
—北京:
电子工业出版社,2009.7.
[3]吴健.AVR单片机实用C语言程序设计与典型实例[M].北京:
中国电力出版社,2008.
[4]基于AVR单片机的电子密码锁的设计报告[J].武汉理工大学,2009.
[5]郭天祥.《新概念51单片机C语言教程》.北京:
电子工业出版社
附件1:
源程序:
/******************************************************************************
主程序main.c
******************************************************************************/
//头文件
#include
#include
#include"LCD12864.h"
#include"ziku.h"
#include"delay.h"
#include"key44scan.h"
sbitLED=P2^5;//定义LED端口
sbitBEEP=P2^6;//定义蜂鸣器端口
//全局变量定义
unsignedcharkey,count=0;//存放键值
unsignedcharpassword[6]={0};//存放输入的密码
unsignedcharcodepw[6]={1,2,3,4,5,6};//设定的密码
//主函数
voidmain()
{
unsignedchari,j;
LED=1;
BEEP=0;
init_12864();//LCD12864初始化
clearscreen(0);
display_HZ(4,16*2,HzTAB[19]);//显示欢迎使用的界面
display_HZ(4,16*3,HzTAB[20]);
display_HZ(4,16*4,HzTAB[21]);
display_HZ(4,16*5,HzTAB[22]);
delay_ms(30000);
delay_ms(30000);
delay_ms(30000);
clearscreen(0);
for(i=0;i<6;i++)//第一行显示“湖南城市学院”
display_HZ(0,16*(i+1),HzTAB[i]);
display_HZ(2,16*2,HzTAB[6]);//第二行显示“通电院”
display_HZ(2,16*3,HzTAB[7]);
display_HZ(2,16*4,HzTAB[5]);
display_HZ(4,16*0,HzTAB[9]);//第三行显示“请输入密码:
”
display_HZ(4,16*1,HzTAB[10]);
display_HZ(4,16*2,HzTAB[11]);
display_HZ(4,16*3,HzTAB[12]);
display_ZM(4,16*4,CharTAB[17]);
while
(1)
{
key=matrixkeyscan();
if(key&&count<6)
{
password[count]=key-1;//保存输入的密码
display_ZM(6,16*3+8*count,CharTAB[16]);//显示“*”
count++;
}
if(count==6)
{
count=0;
for(i=0;i<6;i++)//比较输入的密码与设定的密码是否一致
{
if(password[i]!
=pw[i])
break;
}
if(i==6)
{
display_HZ(6,16*2,HzTAB[13]);//第四行显示“解锁成功!
”
display_HZ(6,16*3,HzTAB[14]);
display_HZ(6,16*4,HzTAB[15]);
display_HZ(6,16*5,HzTAB[16]);
display_ZM(6,16*6,CharTAB[19]);
for(i=0;i<3;i++)//解码成功,蜂鸣器响三声,LED闪烁三下
{
BEEP=1;
LED=0;
delay_ms(4000);
BEEP=0;
LED=1;
delay_ms(4000);
}
}
else
{
display_HZ(6,16*2,HzTAB[13]);//第四行显示“解锁失败!
”
display_HZ(6,16*3,HzTAB[14]);
display_HZ(6,16*4,HzTAB[17]);
display_HZ(6,16*5,HzTAB[18]);
display_ZM(6,16*6,CharTAB[19]);
BEEP=1;//LED长亮,蜂鸣器长鸣
LED=0;
}
}
}
}
/******************************************************************************
LCD12864底层驱动程序main.c
******************************************************************************/
//头文件
#include
#include
#include"LCD12864.h"
#include"delay.h"
//常量变量定义*******************************************
#defineLCD_CMD_COL0X40
#defineLCD_CMD_PAGE0XB8
#defineLCD_LEFT0
#defineLCD_TOP0
#defineLCD_RIGHT127
#defineLCD_BOTTOM63
//IO定义*******************************************
sbitCS1=P2^0;//LCD的CS1端P2^0
sbitCS2=P2^1;//LCD的CS2端P2^1
sbitRS=P2^2;//LCD的RS端P2^2
sbitRW=P2^3;//LCD的RW端P2^3
sbitE=P2^4;//LCD的E端P2^4
#defineDataP0//LCD的并行数据端P0
externcodeucharCharTAB[][16];
externcodeucharHzTAB[][32];
//向LCD12864写数据
voidWrite_cmd(ucharcmd)
{
RS=0;
RW=0;
E=1;
Data=cmd;
delay_ms
(2);
E=0;
}
voidWrite_data(uchardat)
{
RS=1;
RW=0;
E=1;
Data=dat;
delay_ms
(2);
E=0;
}
voidWriteStr(uchar*s)
{
while(*s)
{
Write_data(*s++);
delay_ms(5);
}
}
//lcd12864初始化函数
voidinit_12864()
{
Data=0XFF;
RS=1;RW=1;E=1;CS1=1;CS2=1;
delay_ms(5);
Write_cmd(0x30);//8位数据接口,1行显示。
5*7点阵,选择基本指令集
delay_us(5);
Write_cmd(0x0f);//开显示(光标显示。
闪烁)
delay_ms(5);
Write_cmd(0x01);//清除显示,并且设定地址指针为00H
delay_ms(5);
Write_cmd(0x06);//指定在资料的读取及写入时,设定游标的移动方向及指定显示的移位
delay_ms(5);
}
//设定行的函数
//line->0->7
voidSetLine(ucharline)
{
line=line&0x07;
line=line|0xb8;//10111xxx
Write_cmd(line);
}
//设定列的函数
//colum->0:
63
voidSetColum(ucharcolum)
{
colum=colum&0x3f;
colum=colum|0x40;//01xxxxxx
Write_cmd(colum);
}
//选择屏幕的函数
//0全屏,1左平,2右屏
voidSelectScreen(ucharscreen)
{
switch(screen)
{
case0:
CS1=0;CS2=0;
break;
case1:
CS1=0;CS2=1;
break;
case2:
CS1=1;CS2=0;
break;
default:
break;
}
}
//显示一个16*8字母的函数
//page:
0->7
//col:
0->63
//*temp:
对应汉字取模数组的地址
voiddisplay_HZ(ucharpage,ucharcol,uchar*temp)//显示汉字子程序
{
ucharj;
SelectScreen
(1);//从左半屏开始若列数超过128改右
if(col>=64)
{
SelectScreen
(2);
col-=0x40;
}
SetLine(page);//按要求写入页地址
SetColum(col);//按要求从相应列开始写数据
for(j=0;j<16;j++)//写入一个汉字的上半部分,共16字节
{
Write_data(temp[j]);
delay_ms
(1);
}
SetLine(page+1);//从下一页开始显示汉字的下半部分要求从相应的列开始写数据
SetColum(col);
for(j=16;j<32;j++)
{
Write_data(temp[j]);
delay_ms
(1);
}
}
//显示一个16*8字母的函数
//page:
0->7
//col:
0->63
//*temp:
对应字母取模数组的地址
voiddisplay_ZM(ucharpage,ucharcol,uchar*temp)//显示字母子程序
{
ucharj;
SelectScreen
(1);//从左半屏开始若列数超过128改右
if(col>=64)
{
SelectScreen
(2);
col-=64;
}
SetLine(page);//按要求写入页地址
SetColum(col);//按要求从相应列开始写数据
for(j=0;j<8;j++)//写入一个汉字的上半部分,共16字节
{
Write_data(temp[j]);
delay_ms
(1);
}
SetLine(page+1);//从下一页开始显示汉字的下半部分要求从相应的列开始写数据
SetColum(col);
for(j=8;j<16;j++)
{
Write_data(temp[j]);
delay_ms
(1);
}
}
//清屏函数0——全屏1——左屏2——右屏
voidclearscreen(ucharn)
{
uchari,j;
SelectScreen(n);
for(i=0;i<8;i++)
{
SetLine(i);
SetColum(0);
for(j=0;j<64;j++)
Write_data(0x00);//置零为清屏
}
}
/******************************************************************************
头文件名:
LCD12864接口函数头文件LCD12864.h
******************************************************************************/
#ifndef_LCD12864_H_
#define_LCD12864_H_
//宏定义
#defineucharunsignedchar
#defineuintunsignedint
//函数声明**************************************************
externvoidWrite_cmd(ucharcmd);
externvoidWrite_data(uchardat);
externvoidwriteStr(uchar*s);
externvoidinit_12864();
externvoidSetLine(ucharline);//line->0:
7
externvoidSetColum(ucharcolum);//colum->0:
63
externvoidSelectScreen(ucharscreen);//0全屏,1左平,2右屏
externvoiddisplay_HZ(ucharpage,ucharcol,uchar*temp);//显示汉字子程序
externvoiddisplay_ZM(ucharpage,ucharcol,uchar*temp);//显示字母子程序
externvoidclearscreen(ucharn);//清屏
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 电子 密码锁 设计