电子密码锁课程设计2Word文档下载推荐.docx
- 文档编号:19145632
- 上传时间:2023-01-04
- 格式:DOCX
- 页数:22
- 大小:243.53KB
电子密码锁课程设计2Word文档下载推荐.docx
《电子密码锁课程设计2Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《电子密码锁课程设计2Word文档下载推荐.docx(22页珍藏版)》请在冰豆网上搜索。
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密码暂存区
提示输入新密码
第一个
LED亮
提示出错
将新密码写入AT24C02
提示密码修改成功
3.2.3程序代码
1、预定义部分
#include<
reg52.h>
string.h>
intrins.h>
#include<
lcd_1602.h>
key.h>
IIC_24C04.h>
#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!
IS_Valid_User=1;
}
else
LED_OPEN=1;
//关闭LED
ERROR!
IS_Valid_User=0;
i=0;
break;
case11:
//按B键上锁
display_string(Title_Text,0x00);
case12:
//按C键设置新密码
//如果是合法用户则提示输入新密码
if(!
IS_Valid_User)
display_string("
Norights!
"
NewPassword:
0x00);
case13:
//按D键保存新密码
IS_Valid_User)display_string("
sendstring(0xa0,0,userpassword,6);
//重新读入刚写的密码
recstring(0xa0,0,IIC_Password,6);
IIC_Password[6]='
PasswordSaved!
}
case14:
//按E键消除所有输入
}
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;
SCL=0;
delay4us();
returnrd;
}
//----------------------向芯片发送一个字节
ucharsendbyte(ucharwd)
uchari;
bitACK0;
SDA=(bit)(wd&
0x80);
_nop_();
_nop_();
SCL=1;
wd<
ACK0=!
SDA;
returnACK0;
//发送多字节数据函数
ucharsendstring(ucharslave,ucharsubaddr,uchar*buffer,ucharN)
start();
if(!
sendbyte(slave))
return0;
sendbyte(subaddr))
N-1;
if(!
sendbyte(buffer[i]))return0;
stop();
return1;
//-------------------接收多字节数据函数
ucharrecstring(ucharslave,ucharsubaddr,uchar*buffer,ucharN)
sendbyte(slave))
sendbyte(slave+1))
buffer[i]=recbyte();
ACK();
buffer[N-1]=recbyte();
no_ACK();
4、LCD1602显示部分
//测试LCD忙状态返回result
bitlcd_bz()
bitresult;
rs=0;
rw=1;
eq=1;
_nop_();
result=(bit)(P0&
eq=0;
returnresult;
}
//写指令数据到LCD
voidlcd_wcmd(ucharcmd)
rw=0;
P0=cmd;
delay_lcd
(1);
//写入显示数据到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位数据接口
lcd_wcmd(0x0c);
//显示开及光标设置不显示
lcd_wcmd(0x06);
//显示光标移动设置
lcd_wcmd(0x01);
//显示清屏
voiddisplay_string(uchar*str,ucharlineno)//在液晶指定行显示字符串
lcd_wcmd(0x80+lineno);
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;
case4:
k=2;
case8:
k=3;
default:
break;
P1=0xf0;
temp=(P1>
>
4)^0x0f;
k+=0;
k+=4;
k+=8;
k+=12;
//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文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 电子 密码锁 课程设计