电子系统设计密码锁.docx
- 文档编号:16756776
- 上传时间:2023-07-17
- 格式:DOCX
- 页数:20
- 大小:2.18MB
电子系统设计密码锁.docx
《电子系统设计密码锁.docx》由会员分享,可在线阅读,更多相关《电子系统设计密码锁.docx(20页珍藏版)》请在冰点文库上搜索。
电子系统设计密码锁
电子系统综合设计
实训报告
题目:
电子密码锁
指导老师:
完成时间:
2014.10.25
姓名
班级
学号
专业
组员一
王波
0111201
2012211412
通信工程
组员二
许世玲
0111201
2012210616
通信工程
组员三
吴丰
0111206
2012211442
通信工程
引言
本系统由单片机系统、矩阵键盘、LCD显示、密码掉电保护和继电器开锁系统组成,系统能完成开锁、报警等基本的密码锁的功能。
此设计具有安全性高、价格低廉、便于实现、易于改进等优点。
关键词:
单片机、电子密码锁、矩阵键盘、LCD显示、掉电保护
一、需求分析
随着人们生活水平的提高,如何实现防盗、安全这一问题也变的尤其的突出,传统的机械锁由于其构造的简单,被撬的事件屡见不鲜,电子锁由于其保密性高,使用灵活性好,安全系数高,受到了广大用户的亲呢。
电子密码锁可以在日常生活和现代办公来完成,住宅与办公室的安全防范,单位的文件档案财务报表以及一些个人资料的保存等多种场合使用。
大大提高了主人物资的安全性。
目前使用的密码锁种类多,各具特色。
二、总体设计
1、设置6位密码,密码通过键盘输入,若密码正确,则将锁打开。
2、报警功能。
密码输入错误显示器会出现“errortryagain”提示,若密码错误,蜂鸣器持续相应以示报警。
3、保存密码。
支持掉电保存功能。
4、LCD显示功能。
初始显示“inputthecode”,输入密码显示“******”,输入密码正确显示“open(^_^)”,若密码错误,显示屏显示“errortryagain”。
5、插上电源后,程序自动调入初始密码,此时依次输入:
123456,然后按任意键确认,此时锁打开,液晶屏显示“open(^_^)”,并且led灯全亮且常亮。
若输入其他密码,此时锁任然处于关闭状态,液晶屏显示“errortryagain”,并且蜂鸣器报警,led灯闪烁。
四、硬件电路设计
1、MCU控制器介绍
MCS-51 系列中的各种芯片引脚是互相兼容的,其中8051单片机是高性能的单片机,它具有8位微处理器,128B片内RAM,4K的片内ROM,4个八位的并行I/O接口P0-P3,两个定时/计数器及五个中断源的中断控制系统。
再不接任何外围电路的情况下可以实现大部分较为复杂的逻辑控制功能,进行外部RAM扩展还可以用于数据采集,点阵显示屏控制等方面应用。
对于存储量要求不高的实际应用,8051是一种不可多得高性能的单片机,被广泛应用于各个领域。
2、矩阵键盘说明
矩阵键盘包括0~9数字键和A、B、C、D、*、#六个功能键。
“*”为输入确认功能键。
电路原理图如下:
如图示:
采用
键盘输入,键盘对应名称如下:
123A其中,A、B、C、D、#为无用键,
456B“*”为确认功能键。
789C
*0#D
3、LCD显示
电路原理图如下:
4、密码存储电路
原理图如下:
5、总原理图
五、程序设计
1、框图及流程图
A、系统框图
B、开锁流程图
C、功能流程图
五、调试情况
遇到的问题
1、键盘最左边一列键(1、4、7、*)按下无反应
解决方法:
重新更换一块开发板,问题解决。
问题所在即原开发板端口出现异常。
2、代码编译错误(如字符格式、形参未正确定义、所定义函数有些许错误)
解决方法:
逐个解决,逐个审查错误。
3、代码所生成hex文件下载失败
解决方法:
重新安装端口驱动,并换取一条传输功能正常的下载线进行下载。
六、测试分析
(1)进入系统。
此时程序已被下载到系统中,LCD显示如下:
(2)开锁。
当输入密码后,系统会判定密码的正确与否,LCD会根据密码的正确与否给出相应的回应:
A.若密码输入正确,如下:
此时,LCD不仅有“open(^_^)”的显示,如上图,LED灯全亮且常亮。
B.若密码输入错误,如下:
此时,LCD不仅有“errortryagain”字样的显示,如上图,LED灯闪烁且蜂鸣器持续发声。
七、心得体会及总结
1、特点总结
以上便是本组设计的电子密码锁电路。
该设计本着便捷、经济的特征,采用STC89C52RC结合的一系列电路设计,并用C语言编写的控制程序,通过多次调整、修改、调试以及整理所得出的简易电子密码锁,它具有保护密码、自动报警等功能,在达到基本要求的同时,还具有成本低、可靠性强、灵敏度高、操作简便等特点。
从按键出发,方便易懂,以LCD及LED为切入点,可提供有效提示,灵活性强,且便于操作。
2、心得体会
单片机是我们所学专业的主要课程之一,因此,我认为单片机课程设计是十分必要而且十分重要的。
尽管刚刚拿到课程设计题目时有点迷惘,不知道如何着手,但通过上网和图书馆查阅相关资料,自己认真钻研以及虚心询问同学、老师,终于解决了一个又一个的困难和障碍,成功完成了任务。
通过本次的单片机课程设计,我们受益匪浅。
一方面,本次课程设计极大地丰富了我的理论知识,此次单片机课程设计需要运用到许多之前所学过的知识,令我认识到自己以前学习的一些不足之处,例如对以前所学知识的理解不够深刻,掌握得不够牢固,运用不够灵活。
这让我懂得了认真学习的重要性,以及要孜孜不倦地钻研所学过的知识,做得融会贯通,不能一览而过,不求甚解。
同时,我还体会到动手解决问题的重要,在边学习边动手的过程中,我对电子密码锁的构造以及原理有了进一步的了解,同时也加深和巩固了我对单片机编程的认识。
另一方面,由于是第一次做单片机,因此在此次课程设计的过程中,无论是电路绘制还是C语言编写都难免遇到了不少困难和障碍,例如C语言编写出错、电路元件无从入手等。
在面对困难和障碍时,我们组非但没有退缩、逃避,反而通过各种方法,迎难而上,以坚持、耐心和努力勇敢无畏地面对困难,克服困难,解决困难。
让我发现问题、分析问题、解决问题以及动手实践的能力都有了很大的提高,并了解到理论知识与实践相结合的重要意义。
从这次的课程设计中,我们真真正正的意识到,在以后的学习中,要理论联系实际,把我们所学的理论知识用到实际当中,学习单机片机更是如此,程序只有在经常的练习的过程中才能提高。
本次课程设计尽管时间不长,但从中所获,将令我受益终生,是一次非常有价值的体验。
附录:
源代码
名称:
矩阵键盘模拟密码锁,解锁密码1-9
内容:
模拟密码锁,密码固化到ROM不能通过按键输入更改
------------------------------------------------*/
#include
#include
sbitRS=P1^5;//定义端口0写指令,1写数据
sbitRW=P1^6;//写入信号?
0写数据,1读数据
sbitEN=P1^7;//片选信号?
#defineRS_CLRRS=0
#defineRS_SETRS=1
#defineRW_CLRRW=0
#defineRW_SETRW=1
#defineEN_CLREN=0
#defineEN_SETEN=1
unsignedcharcodedofly_code[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};//转换成液晶显示的字符
#defineDataPortP0//定义数据端口程序中遇到DataPort则用P0替换
#defineKeyPortP3
sbitLEDSWITCH=P2^0;//LED总开关
sbitbuzzer=P2^1;//控制蜂鸣器
sbitDUAN=P2^6;//定义锁存使能端口段锁存
sbitWEI=P2^7;//位锁存
unsignedcharcodepassword[8]={1,2,3,4,5,6};
//可以更改此密码做多组测试
voidDelayUs2x(unsignedchart);//us级延时函数声明
voidDelayMs(unsignedchart);//ms级延时
//voidDisplay(unsignedcharFirstBit,unsignedcharNum);//数码管显示函数
unsignedcharKeyScan(void);//键盘扫描
unsignedcharKeyPro(void);
voidInit_Timer0(void);//定时器初始化
/*------------------------------------------------
判忙函数
------------------------------------------------*/
bitLCD_Check_Busy(void)
{
DataPort=0xFF;
RS_CLR;
RW_SET;
EN_CLR;
_nop_();//?
?
?
?
EN_SET;
return(bit)(DataPort&0x80);
}
/*------------------------------------------------
写入命令函数
------------------------------------------------*/
voidLCD_Write_Com(unsignedcharcom)
{
while(LCD_Check_Busy());//忙则等待
RS_CLR;
RW_CLR;
EN_SET;
DataPort=com;
_nop_();
EN_CLR;
}
/*------------------------------------------------
写入数据函数
------------------------------------------------*/
voidLCD_Write_Data(unsignedcharData)
{
while(LCD_Check_Busy());//忙则等待
RS_SET;
RW_CLR;
EN_SET;
DataPort=Data;
_nop_();
EN_CLR;
}
/*------------------------------------------------
清屏函数
------------------------------------------------*/
voidLCD_Clear(void)
{
LCD_Write_Com(0x01);//?
?
?
DelayMs(10);
}
/*------------------------------------------------
写入字符串函数
------------------------------------------------*/
voidLCD_Write_String(unsignedcharx,unsignedchary,unsignedchar*s)
{
if(y==0)
{
LCD_Write_Com(0x80+x);
}
else
{
LCD_Write_Com(0xC0+x);
}
while(*s)
{
LCD_Write_Data(*s);
s++;
}
}
/*------------------------------------------------
写入字符函数
------------------------------------------------*/
voidLCD_Write_Char(unsignedcharx,unsignedchary,unsignedcharData)
{
if(y==0)
{
LCD_Write_Com(0x80+x);
}
else
{
LCD_Write_Com(0xC0+x);
}
LCD_Write_Data(Data);
}
/*------------------------------------------------
初始化函数
------------------------------------------------*/
voidLCD_Init(void)
{
LCD_Write_Com(0x38);/*显示模式设置*/
DelayMs(5);
LCD_Write_Com(0x38);
DelayMs(5);
LCD_Write_Com(0x38);
DelayMs(5);
LCD_Write_Com(0x38);
LCD_Write_Com(0x08);/*显示关闭*/
LCD_Write_Com(0x01);/*显示清屏*/
LCD_Write_Com(0x06);/*显示光标移动设置*/
DelayMs(5);
LCD_Write_Com(0x0C);/*显示开及光标设置*/
}
/*------------------------------------------------
主函数
------------------------------------------------*/
voidmain(void)
{
unsignedcharnum,i,j;
unsignedchartemp[8];
bitFlag;
//Init_Timer0();
LCD_Init();
LCD_Write_String(i,0,"inputthecode");
while
(1)//主循环
{
num=KeyPro();
if(num!
=0xff)
{
if(i==0)
{
LCD_Clear();
//for(j=0;j<8;j++)//清屏
//TempData[j]=0;
}
if(i<6)
{
temp[i]=num;
LCD_Write_String(i,0,"*");
}
i++;//输入数值累加
if(i==7)//正常等于8即可,由于我们需要空一个用于清屏,
//清屏时的按键不做输入值
{
i=0;
Flag=1;//先把比较位置1
for(j=0;j<8;j++)//循环比较8个数值,
//如果有一个不等则最终Flag值为0
Flag=Flag&&(temp[j]==password[j]);
//Flag=Flag&&(temp[j]==dofly_DuanMa[password[j]]);
//比较输入值和已有密码
//for(j=0;j<8;j++)//清屏
//TempData[j]=0;
if(Flag)//如果比较全部相同,标志位置1
{
LCD_Clear();
LCD_Write_String(0,0,"open(^_^)");
LEDSWITCH=0;
while
(1)
{
P0=0;
}
}
else
{
LCD_Clear();
LCD_Write_String(0,0,"errortryagain");
LEDSWITCH=0;//打开LED开关低电平有效
while
(1)//大循环
{
P0=0xff;
DelayMs(500);
P0=0x00;
DelayMs(500);
buzzer=~buzzer;
DelayMs
(1);//延时1MS
}
}
}
}
}
}
/*------------------------------------------------
uS延时函数,含有输入参数unsignedchart,无返回值
unsignedchar是定义无符号字符变量,其值的范围是
0~255这里使用晶振12M,精确延时请使用汇编,大致延时
长度如下T=tx2+5uS
------------------------------------------------*/
voidDelayUs2x(unsignedchart)
{
while(--t);
}
/*------------------------------------------------
mS延时函数,含有输入参数unsignedchart,无返回值
unsignedchar是定义无符号字符变量,其值的范围是
0~255这里使用晶振12M,精确延时请使用汇编
------------------------------------------------*/
voidDelayMs(unsignedchart)
{
while(t--)
{
//大致延时1mS
DelayUs2x(245);
DelayUs2x(245);
}
}
/*------------------------------------------------
显示函数,用于动态扫描数码管
输入参数FirstBit表示需要显示的第一位,如赋值2表示从第三个数码管开始显示
如输入0表示从第一个显示。
Num表示需要显示的位数,如需要显示99两位数值则该值输入2
------------------------------------------------*/
/*------------------------------------------------
按键扫描函数,返回扫描键值
------------------------------------------------*/
unsignedcharKeyScan(void)//键盘扫描函数,使用行列反转扫描法
{
unsignedcharcord_h,cord_l;//行列值中间变量
KeyPort=0x0f;//行线输出全为0
cord_h=KeyPort&0x0f;//读入列线值
if(cord_h!
=0x0f)//先检测有无按键按下
{
DelayMs(10);//去抖
if((KeyPort&0x0f)!
=0x0f)
{
cord_h=KeyPort&0x0f;//读入列线值
KeyPort=cord_h|0xf0;//输出当前列线值
cord_l=KeyPort&0xf0;//读入行线值
while((KeyPort&0xf0)!
=0xf0);//等待松开并输出
return(cord_h+cord_l);//键盘最后组合码值
}
}return(0xff);//返回该值
}
/*------------------------------------------------
按键值处理函数,返回扫键值
------------------------------------------------*/
unsignedcharKeyPro(void)
{
switch(KeyScan())
{
case0xee:
return1;break;//0按下相应的键显示相对应的码值
case0xde:
return2;break;//1
case0xbe:
return3;break;//2
case0x7e:
return'A';break;//3
case0xed:
return4;break;//4
case0xdd:
return5;break;//5
case0xbd:
return6;break;//6
case0x7d:
return'B';break;//7
case0xeb:
return7;break;//8
case0xdb:
return8;break;//9
case0xbb:
return9;break;//a
case0x7b:
return'C';break;//b
case0xe7:
return'*';break;//c
case0xd7:
return0;break;//d
case0xb7:
return'#';break;//e
case0x77:
return'D';break;//f
}
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 电子 系统 设计 密码锁