电子密码锁课程设计2.docx
- 文档编号:6144874
- 上传时间:2023-01-04
- 格式:DOCX
- 页数:22
- 大小:243.53KB
电子密码锁课程设计2.docx
《电子密码锁课程设计2.docx》由会员分享,可在线阅读,更多相关《电子密码锁课程设计2.docx(22页珍藏版)》请在冰豆网上搜索。
电子密码锁课程设计2
摘要
随着社会的发展进步,密码锁逐渐成为我们生活中很重要的一部分,密码锁是安全的一个很好的保障措施。
本论文设计一个基于单片机和存储器的,能够进行开锁,上锁,修改密码的电子密码锁。
电子密码锁是现代电子科技与安全结合的产物。
它在现代锁业扮演着重要的角色,本文的主要内容是用AT89c52单片机为核心控制元件,用存储器24c04进行存储密码锁的密码,当用户输入的密码与存储器储存的密码相同时,即可开锁成功,并也可以修改密码,若不相同,则不能开锁,并提示密码错误。
关键词:
AT89C52单片机密码锁LCD矩阵键盘
目录
摘要1
目录2
1.引言3
2.总体设计4
2.1基本原理4
2.2系统总体框图及设计思路4
3.详细设计5
3.1硬件设计5
3.2软件设计.8
3.2.1程序设计思路8
3.2.2程序流程图8
3.2.3程序代码9
4.系统调试及分析15
5.心得体会17
参考文献18
1.引言
单片机又称单片微控制器,它不是完成某一个逻辑功能的芯片,而是把一个计算机系统集成到一个芯片上。
相当于一个微型的计算机,和计算机相比,单片机只缺少了I/O设备。
概括的讲:
一块芯片就成了一台计算机。
它的体积小、质量轻、价格便宜、为学习、应用和开发提供了便利条件。
同时,学习使用单片机是了解计算机原理与结构的最佳选择。
密码锁是一种通过密码输入来控制电路或是芯片工作,从而控制机械开关的闭合,完成开锁、闭锁任务的电子产品。
它的种类很多,有简易的电路产品,也有基于芯片的性价比较高的产品。
现在应用较广的数字密码锁是以芯片为核心,通过编程来实现的。
其性能和安全性已大大超过了机械锁。
其特点是保密性好,随机开锁成功率几乎为零。
密码可变,用户可以随时更改密码,防止密码被盗,同时也可以避免因人员的更替而使锁的密级下降。
无活动零件,不会磨损,寿命长。
使用灵活性好,不像机械锁必须佩带钥匙才能开锁。
数字密码锁操作简单易行,一学就会。
2.总体设计
2.1基本原理
电子密码锁是才用存储芯片24C04进行存放密码,单片机可以对24C04进行读取密码和写入密码,本密码锁是事先吧初始密码123456写入24C04中,用户输入密码后,通过对用户输入的密码和24C04中的密码进行比较,若比较相同则提示开锁称成功,开锁后,用户可以修改密码,即把用户输入的新密码写入到24C04当中,并清除之前的密码,按下保存键后,继成功修改密码。
其中24C04的原理如下:
AT24C04是美国Atmel公司的低功耗CMOS型E2PROM,内含256×8位存储空间,具有工作电压宽(2.5~5.5V)、擦写次数多(大于10000次)、写入速度快(小于10ms)、抗干扰能力强、数据不易丢失、体积小等特点。
而且他是采用了I2C总线式进行数据读写的串行器件,占用很少的资源和I/O线,并且支持在线编程,进行数据实时的存取十分方便。
AT24C04中带有的片内地址寄存器。
每写入或读出一个数据字节后,该地址寄存器自动加1,以实现对下一个存储单元的读写。
所有字节均以单一操作方式读取。
为降低总的写入时间,一次操作可写入多达8个字节的数据。
I2C总线是一种用于IC器件之间连接的二线制总线。
他通过SDA(串行数据线)及SCL(串行时钟线)两根线在连到总线上的器件之间传送信息,并根据地址识别每个器件。
AT24C02正是运用了I2C规程,使用主/从机双向通信,主机(通常为单片机)和从机(AT24C04)均可工作于接收器和发送器状态。
主机产生串行时钟信号(通过SCL引脚)并发出控制字,控制总线的传送方向,并产生开始和停止的条件。
无论是主机还是从机,接收到一个字节后必须发出一个确认信号ACK。
AT24C04的控制字由8位二进制数构成,在开始信号发出以后,主机便会发出控制字,以选择从机并控制总线传送的方向。
2.2系统总体框图及设计思路
总体设计思路:
本设计利用单片机灵活的编程设计和丰富的IO端口,及其控制的准确性,不但能实现基本的密码锁功能,还能添加掉电存储。
其中,0-9为用户可以输入密码可选择的数字,10号功能为开锁键,11号功能为上锁,12号功能为输入修改后的密码,13号功能为保存密码,14号功能为重新输入。
利用LCD来显示提示信息,用LED来提示密码锁的状态。
3.详细设计
3.1硬件设计
1.芯片及原理介绍
(一)AT89C52
AT89C52与MCS-51单片机产品兼容、8K字节在系统可编程Flash存储器、1000次擦写周期、全静态操作:
0Hz~33MHz、三级加密程序存储器、32个可编程I/O口线、三个16位定时器/计数器八个中断源、全双工UART串行通道、低功耗空闲和掉电模式、掉电后中断可唤醒、看门狗定时器、双数据指针、掉电标识符。
P1口引脚
特殊功能
P1.0
T2(定时器T2外部输入)
P3口引脚
P3.0
RXD(串行输入口)
P3.1
TXD(串行输出口)
P3.2
(外部中断0)
P3.3
(外部中断1)
P3.4
T0(定时器0外部输入)
P3.5
T1(定时器1外部输入)
P3.6
WR(外部数据存储器写选通)
P3.7
RD(外部数据存储器读先通)
AT89C52的一些特殊功能口,如下表所示:
(二)矩阵键盘
使用矩阵键盘,所以本设计就采用行列式键盘,同时也能减少键盘与单片机接口时所占用的I/O线的数目,在按键比较多的时候,通常采用这样方法。
其原理如图。
本设计中矩阵键盘接在单片机的P1口。
每一条水平(行线)与垂直线(列线)的交叉处不相通,而是通过一个按键来连通,利用这种行列式矩阵结构只需要N条行线和M条列线,即可组成具有N×M个按键的键盘。
在这种行列式矩阵键盘非键盘编码的单片机系统中,键盘处理程序首先执行等待按键并确认有无按键按下的程序段。
当确认有按键按下后,下一步就要识别哪一个按键按下。
对键的识别通常有两种方法:
一种是常用的逐行扫描查询法;另一种是速度较快的线反转法。
(三)LCD1602
本系统设计的显示电路是为了给使用者以提示而设置的。
本系统的显示采用了LCD1602作为显示模块,其能够同时显示16x02即32个字符。
LCD在系统中,其D0-D7引脚分别接单片机的P0口、VSS和VDD分别接电源和地线、VEE为液晶亮度调节按钮(可接电位器)、RS为数据或命令的选择端接P2.0、RW为读写的选择端接P2.1、E为使能信号接P2.2。
如图所示。
(四)24C04
本设计中为了在系统掉电时能够保存系统的设置密码,使用了具有I2C总线接口的E2PROM的24C04芯片来保存密码锁的密码。
SCL串行时钟 AT24C02串行时钟输入管脚用于产生器件所有数据发送或接收的时钟,这是一个输入管脚。
SDA串行数据/地址 AT24C02双向串行数据/地址管脚用于器件所有数据的发送或接收,SDA是一个开漏输出管脚,可与其它开漏输出或集电极开路输出进行线或(wire-OR)。
A0、A1、A2器件地址输入端 这些输入脚用于多个器件级联时设置器件地址,当这些脚悬空时默认值为0。
当使用AT24C02时最大可级联8个器件。
如果只有一个AT24C02被总线寻址,这三个地址输入脚(A0、A1、A2)可悬空或连接到Vss,如果只有一个AT24C02被总线寻址这三个地址输入脚(A0、A1、A2)必须连接到Vss。
WP写保护 如果WP管脚连接到Vcc,所有的内容都被写保护只能读。
当WP管脚连接到Vss或悬空允许器件进行正常的读/写操作
2.硬件原理图
P1口通过连接1个矩阵键盘,作为密码输入和功能选择按键;P0口接LCD1602的8位数据通信线;P2.0,P2.1,P2.2接LCD控制端;P3.2和P3.3接24C04。
3.2软件设计.
3.2.1程序设计思路
电子密码锁工作的主要过程是LCD提示开始选择操作功能(选择开锁还是更改密码),通过10号键盘开锁,13号14号进行密码的修改与保存。
当用户选择开锁时,通过键盘输入开锁密码。
如果密码输入正确,则LCD提示密码正确、LED灯亮表示开锁。
如果密码输入错误则LCD提示密码错误。
当用户选择更改密码功能时,要求用户先输入当前密码。
当密码正确时LCD提示用户进一步操作。
单片机向24C04写入新密码,否则提示错误并返回初状态。
3.2.1程序流程图
功能键盘扫描检测子程序
提示输入开锁密码
LCD用*动态提示已输入数字
提示输入旧密码
将已输入的数字暂存与单片机RAM
N
提示密码错误
Y
清单片机RAM密码暂存区
提示输入新密码
Y
N
第一个
LED亮
N
提示出错
Y
将新密码写入AT24C02
提示密码修改成功
3.2.3程序代码
1、预定义部分
#include
#include
#include
#include
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
//上次按键和当前按键序号,该矩阵中序号范围0~15,16表示无按键
ucharpre_keyno=16,keyno=16;
ucharcodeTitle_Text[]="yourpassword...";//标题字符串
ucharDSY_BUFFER[16]="";//显示缓冲
ucharuserpassword[7]="";//用户输入的密码
ucharIIC_Password[7];
ucharIS_Valid_User=0;
uchari=0;
voidBeep();
ucharClear_Password();
sbitLED_OPEN=P2^0;//开锁灯亮
sbitBEEP=P3^7;//蜂鸣器
2、功能控制
voidkey_main()
{
P1=0xF0;
if(P1!
=0xF0)keyno=keys_scan();//扫描键盘获取键序号KeyNo
if(pre_keyno!
=keyno)
{
if(i<=6)
{
switch(keyno)
{
case0:
case1:
case2:
case3:
case4:
case5:
case6:
case7:
case8:
case9:
if(i==0)display_string("",0x40);
userpassword[i]=keyno+'0';
userpassword[i+1]='';//DSY_BUFFER[i]=userpassword[i];
DSY_BUFFER[i]='*';
DSY_BUFFER[i+1]='';
display_string(DSY_BUFFER,0x40);
i++;break;
case10:
//按A键开锁
if(strcmp(userpassword,IIC_Password)==0)
{
LED_OPEN=0;//点亮LED
Clear_Password();
display_string("UnlockOK!
",0x40);
IS_Valid_User=1;
}
else
{
LED_OPEN=1;//关闭LED
Clear_Password();
display_string("ERROR!
",0x40);
IS_Valid_User=0;
}
i=0;
break;
case11:
//按B键上锁
LED_OPEN=1;
Clear_Password();
display_string(Title_Text,0x00);
display_string("",0x40);
i=0;
IS_Valid_User=0;
break;
case12:
//按C键设置新密码
//如果是合法用户则提示输入新密码
if(!
IS_Valid_User)
display_string("Norights!
",0x40);
else
{
i=0;
display_string("NewPassword:
",0x00);
display_string("",0x40);
}
break;
case13:
//按D键保存新密码
if(!
IS_Valid_User)display_string("Norights!
",0x40);
else
{
sendstring(0xa0,0,userpassword,6);
//重新读入刚写的密码
recstring(0xa0,0,IIC_Password,6);
IIC_Password[6]='';
i=0;
display_string(Title_Text,0x00);
display_string("PasswordSaved!
",0x40);
}
break;
case14:
//按E键消除所有输入
i=0;
Clear_Password();
display_string("",0x40);
}
}
beep();
pre_keyno=keyno;
}
//delay(100);
//Beep();
delay(100);
P1=0xF0;
while(P1!
=0xF0);//如果有键未释放则等待
while(P1==0xF0);//如果没有再次按下按键则等待
}
3、24C04读写程序
//---------------------从芯片读取1字节
ucharrecbyte()
{
uchari,rd;
rd=0x00;
SDA=1;
for(i=0;i<8;i++)
{
SCL=1;rd<<=1;rd|=SDA;delay4us();SCL=0;delay4us();
}
SCL=0;
delay4us();
returnrd;
}
//----------------------向芯片发送一个字节
ucharsendbyte(ucharwd)
{
uchari;
bitACK0;
for(i=0;i<8;i++)
{
SDA=(bit)(wd&0x80);
_nop_();_nop_();SCL=1;delay4us();SCL=0;wd<<=1;
}
delay4us();
SDA=1;
SCL=1;
delay4us();
ACK0=!
SDA;
SCL=0;
delay4us();
returnACK0;
}
//发送多字节数据函数
ucharsendstring(ucharslave,ucharsubaddr,uchar*buffer,ucharN)
{
uchari;
start();
if(!
sendbyte(slave))
return0;
if(!
sendbyte(subaddr))
return0;
for(i=0;i { if(! sendbyte(buffer[i]))return0; } stop(); return1; } //-------------------接收多字节数据函数 ucharrecstring(ucharslave,ucharsubaddr,uchar*buffer,ucharN) { uchari; start(); if(! sendbyte(slave)) return0; if(! sendbyte(subaddr)) return0; start(); if(! sendbyte(slave+1)) return0; for(i=0;i { buffer[i]=recbyte(); ACK(); } buffer[N-1]=recbyte(); no_ACK(); stop(); return1; } 4、LCD1602显示部分 //测试LCD忙状态返回result bitlcd_bz() { bitresult; rs=0; rw=1; eq=1; _nop_();_nop_();_nop_();_nop_(); result=(bit)(P0&0x80); eq=0; returnresult; } //写指令数据到LCD voidlcd_wcmd(ucharcmd) { rs=0; rw=0; eq=0; P0=cmd; eq=1; delay_lcd (1); eq=0; } //写入显示数据到LCD voidlcd_wdat(uchardat) { while(lcd_bz()); rs=1; rw=0; P0=dat; delay_lcd (1); eq=1; eq=0; } //LCD初始化 voidlcd_init() { lcd_wcmd(0x38);//显示模式设置,5*7点阵,8位数据接口 while(lcd_bz()); lcd_wcmd(0x0c);//显示开及光标设置不显示 lcd_wcmd(0x06);//显示光标移动设置 lcd_wcmd(0x01);//显示清屏 } voiddisplay_string(uchar*str,ucharlineno)//在液晶指定行显示字符串 { uchari; lcd_wcmd(0x80+lineno); for(i=0;i<16;i++)//? ? ? length(str)? ? ? ? ? ? ? ? ? { lcd_wdat(str[i]); } } 5、矩阵键盘扫描部分 //-------------------------矩阵键盘扫描 ucharkeys_scan() { uchartemp,k; P1=0x0f; delay_key (2); temp=P1^0x0f; switch(temp) { case1: k=0;break; case2: k=1;break; case4: k=2;break; case8: k=3;break; default: break; } P1=0xf0; delay_key (2); temp=(P1>>4)^0x0f; switch(temp) { case1: k+=0;break; case2: k+=4;break; case4: k+=8;break; case8: k+=12;break; default: break; } //keyno=k; returnk; } 6、主函数 voidmain() { init_main(); display_string(Title_Text,0x00);//在第1行显示标题 //24C04的内容已由初始化BIN文件导入 //将24C04中预先写入的密码读入pass recstring(0xa0,0,IIC_Password,6); IIC_Password[6]='\0'; while (1) { key_main(); } } 4.系统调试及分析 用keil编写程序编译运行通过后,用Proteus仿真结果如下,以下是输入密码正确,开锁成功; 修改密码,提示输入新密码,并保存成功。 5.心得体会 在着手本次课程设计时,通过查阅网络与图书馆搜集到的资料,加上指导老师指点,结合生活中对密码锁的功能特性要求,设计出了这一套电子密码锁系统的主要硬件结构和软件结构,基本完成了课题。 不过由于了解的专业知识尚浅,对课题的研究经验的不足,使得在技术的解决与运用上显得粗糙了一些,特别是功能键的设定。 在设计的过程当中经历和克服了许多困难,暴露我们知识和经验不足的同时也积累了实践经验,检阅了大学所学的知识,使所学的知识得到复习和巩固。 通过这次毕业设计我学到了很多东西,复习了理论知识,特别是单片机外围电路模块电路设计及其应用编程;学会收集和处理资料的一些基本问题,提高获取新知识的能力、分析和解决问题的能力以及交流与合作的能力。 这次课程设计终于顺利完成了,在设计中遇到了很多编程问题,在同学的帮助下,终于游逆而解。 非常感谢! 参考文献 [1]李群芳张士军黄建《单片微型计算机与接口技术》电子工业出版社 [2]周美娟肖来胜《单片机原理及系统设计》清华大学出版社 [3]黄鑫,马善农,赵永科.基于CPLD的电子琴研究与设计[J].科技广场. [4]赵亮,侯国锐.单片机C语言编程与实例[M].北京: 人民邮电出版社. [5]徐新艳.单片机原理、应用与实践[M].北京: 高等教育出版社
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 电子 密码锁 课程设计