基于某AT24C02电子密码锁地设计.docx
- 文档编号:7602809
- 上传时间:2023-01-25
- 格式:DOCX
- 页数:31
- 大小:849.44KB
基于某AT24C02电子密码锁地设计.docx
《基于某AT24C02电子密码锁地设计.docx》由会员分享,可在线阅读,更多相关《基于某AT24C02电子密码锁地设计.docx(31页珍藏版)》请在冰豆网上搜索。
基于某AT24C02电子密码锁地设计
单片机应用课程设计
设计题目:
基于AT24C02电子密码锁的设计
1.设计任务
根本要求:
采用AT24C02与单片机STC89C52相结合设计电子密码锁,然后通过矩阵键盘按键进展密码的输入、去除、更改、开锁等功能。
2.系统总体方案设计
2.1各个模块方案讨论
2.1.1芯片选择
由于设计的是电子密码锁,而单片机AT89C52为8位通用微处理器,采用工业标准的C51内核,在内部功能与管脚排布上与通用的8xc52一样,其主要用于会聚调整时的功能控制。
功能包括对会聚主IC内部存放器、数据RAM与外部接口等功能部件的初始化,会聚调整控制,会聚测试图控制,红外遥控信号IR的接收解码与与主板CPU通信等。
主要管脚有:
XTAL1〔19脚〕和XTAL2〔18脚〕为振荡器输入输出端口,外接12MHz晶振。
RST/Vpd〔9脚〕为复位输入端口,外接电阻电容组成的复位电路。
VCC〔40脚〕和VSS〔20脚〕为供电端口,分别接+5V电源的正负端。
P0~P3为可编程通用I/O脚,其功能用途由软件定义,在本设计中,P0端口〔32~39脚〕被定义为N1功能控制端口,分别与N1的相应功能管脚相连接,13脚定义为IR输入端,10脚和11脚定义为I2C总线控制端口,分别连接N1的SDAS〔18脚〕和SCLS〔19脚〕端口,12脚、27脚与28脚定义为握手信号功能端口,连接主板CPU的相应功能端,用于当前制式的检测与会聚调整状态进入的控制功能。
所以我们以此单片机为核心,采用AT24C02作为储存密码芯片,利用单片机进展控制,外加显示电路和键盘电路,即构成一个根本的电子密码锁系统。
2.1.2显示器的选择
LCD1602具有微功耗、体积小、显示内容丰富、超薄轻巧,比照度可调、内含复位电路、提供各种控制命令等特点,完全满足本次设计的需要,因此,选择LCD1602作为显示器进展使用。
2.2总体方案设计
密码锁设计的关键问题是实现密码的输入、去除、更改、开锁等功能:
1、密码输入功能:
插上电源后,第一次使用或忘记密码时可以用111111对其密码初始化,LCD提示输入密码,输入密码时在1602LCD上显示“*〞每输入一个数字,LCD上向右移一格,同时“*〞加一个。
值到输入6个“*〞为此,假如一次性输入大于6个密码,如此只保存前6位密码,按“确定〞生效。
假如按取消键,锁关闭,所有输入去除错误。
输入计数达三次时,报警并锁定键盘。
2、密码更改功能:
密码锁在打开的状态再次输入原密码,会有提示输入新密码,输入新密码后按修改键再次输入新密码后就能成功修改密码〔初始密码是6个1〕。
3、当密码输入成功后,或者密码修改成功后,LCD上有提示成功字符LED灯亮,同时蜂鸣器响两声作为提示。
AT24C02电子密码锁总体设计方案如图1所示。
图1总体设计方案
3.系统硬件电路设计
3.1单片机最小系统
单片机是电子时钟系统的主控制器。
其最小系统主要由STC89C52单片机、晶振电路与单片机复位电路组成。
晶振系统由两个30pf的陶瓷电容和一个12MHz的晶振组成,分别接在XTAL1、XTAL2上,在单片机内部,这两个端口是一个反相放大器的输入端,这个放大器构成了片内振荡器,它决定了单片机的时钟周期。
单片机有一个复位引脚RST,高电平有效,只要RST保持高电平,单片机将循环复位,复位期间,ALE、PSEN输出高电平。
RST从高电平变为低电平之后,PC指针变为0000H,使单片机从程序存储器地址为0000H的单元开始执行。
当单片机执行程序出错或进入死循环时,也可按复位按钮重新启动。
单片机最小系统如图2所示。
图2
3.2AT24C02储存密码电路.
为了保存用户设置的密码,本系统使用AT24C02用来保存用户设置的密码,它的SCL、SDA端分别接单片机的T0、T1端,用于与单片机之间读写操作的数据传输;WP接低电平表示单片机可以对器件进展正常的读/写操作;E0、E1、E2是器件地址输入端,都接低电平表示只有一个AT24C02被器件寻址。
该电路要注意的是SCL、SDA必须加上一上接电阻,阻值为4.7K。
用户设置的密码存放在ST24C02中,当需要更改或读取用户密码时,只需对ST24C02里的数据更改或读取。
ST24C02储存密码电路如图3所示。
图3
3.3矩阵键盘电路
矩阵键盘电路主要作用就是输入密码,它由行线和列线组成,按键位于行、列的交叉点上,行列分别连接到按键开关的两端。
无按键按动作时列线处于高电平状态;
有按键按下时,交点的行线和列线相通,列线电平状态将由与此列线相连的行线电平决定。
行线电平如果低,如此列线电平为低;行线电平如果为高,如此列线电平也为高。
这是识别矩阵式键盘按键是否被按下的关键所在。
由于矩阵键盘中行、列线为多键公用,各按键均影响该键所在的行和列的电平,所以必须将行、列线信号配合起来作适当的处理,才能确定闭合键所在的位置。
矩阵式键盘节省了好多的I/O口,适用于按键数量比拟多的场合。
本设计的4*4键盘即采用矩阵式键盘。
矩阵键盘电路图如图4所示
图4
3.4液晶显示电路
1602的引脚功能:
第1脚:
为地电源。
第2脚:
VCC接5V正电源。
第3脚:
为液晶显示器比照度调整端,接正电源时比照度最弱,接地电源时比照度最高,比照度过高时会产生“鬼影〞,使用时可以通过一个20K的电位器调整比照度。
第4脚:
RS为存放器选择,高电平时选择数据存放器、低电平时选择指令存放器。
第5脚:
RW为读写信号线,高电平时进展读操作,低电平时进展写操作。
当RS和RW共同为低电平时可以写入指令或者显示地址,
当RS为低电平RW为高电平时可以读忙信号,当RS为高电平RW为低电平时可以写入数据。
第6脚:
E端为使能端,E端由高电平跳变成低电平时,液晶模块执行命令。
第7~14脚:
D0~D7为8位双向数据线。
第15~16脚:
15脚接VCC,16脚接地。
1602电路图如图5所示。
图5
4系统软件设计
由于单片机是可编程控制器,故采用C语言对单片机进展程序的编写。
主程序主要由矩阵键盘程序、1602液晶屏程序与AT24C02程序组成。
4.1主程序流程图
图6
上图6为主程序流程图。
开始先初始化,然后屏幕显示password先扫描按键,确认是否可以按键按出密码,如果没有按键按下,如此重新扫描按键,假如有键按下如此按下修改键并保存密码就会出现新的密码,假如不按下修改键如此还是原来刚设置的初始密码,按下输入键并输入密码,不按下输入键如此重新回到扫描按键步骤,假如密码正确如此开锁。
密码错误如此报警显示错误。
4.2子程序流程图
4.2.1AT24C02子程序流程图
图7
图7展示了AT24C02的一个工作流程:
首先是对AT24C02进展初始化,方便密码的输入,当输入的密码正确,就会解锁,显示屏显示open,否如此显示error并重新输入密码。
4.2.21602子程序流程图
图8
1602显示器的工作流程图展示了1602的工作流程:
启动时,首先对1602进展初始化,然后检测有没有数据写入,当有数据写入时,1602便读出数据并显示,没有数据写入时,1602就一直处于等待中,直至有数据写入。
1602子程序流程图如图8所示。
5实物调试
用KEIL编写程序软件编写程序、经过Proteus仿真软件仿真调试之后,确认了此系统可正常运行,在这样的前提下,我们利用一个单片机最小系统、一块用电路板焊接的模块和一个1602液晶显示屏完成了第一次实物仿真。
图9
图9界面显示为输入密码,这时我们按下按键输入密码。
当我们输入密码时,如下图为密码正确的实物图,如图10所示。
图10
当密码输入正确时,显示屏就会显示OPEN。
假如密码输入错误,如下图为密码输入错误的实物图,如图11所示。
图11
当我们输入错误的密码时,显示屏就会显示error。
如下图为密码修改成功的实物图,如图12所示。
图12
当密码修改成功时,显示屏就会显示RestPasswordOK。
6心得体会
通过此次课程设计,我重新把单片机与相关知识联系在了一起虽然掌握的知识不是很多,但通过查找资料我还是对单片机有了很好的了解和掌握。
在设计中我才发现单片机虽然体积小但是功能很强大,在生活中很多地方都可以用到它。
单片机这门学科博大精深,在以后的学习中只有多看书,理论与实践结合才能把这门课掌握好。
掌握了LCD的使用方法与编程。
同时我也体会到合作的好处。
让我懂得了如何合作,对不同看法发表自己的意见。
此次设计中最要的一点是,让我知道了,理论联系实践的好处。
不管理论学的再怎么好都必须联系实践,只有在实践中我们才会更加懂得如何运用自己的所学,在实践中将自己的知识实物化。
理论联系实践是我们获取知识的最优途径。
参考文献
[1]谭浩强主编.C程序设计题解与上机指导〔第3版〕[M].,清华大学,2005.16-24
附录1
(1)系统总电路图
系统总电路图,如图12所示。
图13
〔2〕系统仿真图
系统仿真图,如图13所示。
图14
〔3〕PCB板
设计使用的PCB如图14所示
图15
附录2
程序清单
#include
#include
#defineLCM_DataP0
#defineucharunsignedchar
#defineuintunsignedint//
#defineBusy0x80//用于检测LCM状态字中的Busy标识
#definew6//定义密码位数
sbitlcd1602_rs=P2^5;
sbitlcd1602_rw=P2^6;
sbitlcd1602_en=P2^7;
sbitScl=P3^4;//24C02串行时钟
sbitSda=P3^5;//24C02串行数据
sbitALAM=P2^1;//报警
sbitKEY=P2^0;//开锁
sbitopen_led=P2^2;//开锁指示灯
bitoperation=0;//操作标志位
bitpass=0;//密码正确标志
//bitResetEn=0;//重设密码充〔允〕许标志
bitReInputEn=0;//重置输入充〔允〕许标志
bits3_keydown=0;//3秒按键标志位
bitkey_disable=0;//锁定键盘标志
unsignedcharcountt0,second;//t0中断计数器,秒计数器
voidDelay5Ms(void);
unsignedcharcodea[]={0xFE,0xFD,0xFB,0xF7};//控盘扫描控制表
unsignedcharcodestart_line[]={"password:
"};
unsignedcharcodename[]={"2===CodedLock==="};//显示名称
unsignedcharcodeCorrect[]={"correct"};//输入正确
unsignedcharcodeError[]={"error"};//输入错误
unsignedcharcodecodepass[]={"pass"};
unsignedcharcodeLockOpen[]={"open"};//OPEN
unsignedcharcodeSetNew[]={"SetNewWordEnable"};
unsignedcharcodeInput[]={"input:
"};//INPUT
unsignedcharcodeResetOK[]={"ResetPasswordOK"};
unsignedcharcodeinitword[]={"Initpassword..."};
unsignedcharcodeEr_try[]={"error,tryagain!
"};
unsignedcharcodeagain[]={"inputagain"};
unsignedcharInputData[6];//输入密码暂存区
unsignedcharCurrentPassword[6]={1,1,1,1,1,1};//当前密码值
unsignedcharTempPassword[6];
unsignedcharN=0;//密码输入位数记数
unsignedcharErrorCont;//错误次数计数
unsignedcharCorrectCont;//正确输入计数
unsignedcharReInputCont;//重新输入计数
unsignedcharcodeinitpassword[6]={1,1,1,1,1,1};
//=====================5ms延时==============================
voidDelay5Ms(void){
unsignedintTempCyc=5552;
while(TempCyc--);}
//===================400ms延时==============================
voidDelay400Ms(void)
{unsignedcharTempCycA=5;
unsignedintTempCycB;
while(TempCycA--){
TempCycB=7269;
while(TempCycB--);}}
//============================24C02============================
voidmDelay(uintt)//延时
{
uchari;
while(t--)
{
for(i=0;i<125;i++)
{;}}}
voidNop(void)//空操作
{
_nop_();
_nop_();
_nop_();
_nop_();}/*起始条件*/
voidStart(void){
Sda=1;
Scl=1;
Nop();
Sda=0;
Nop();}/*停止条件*/
voidStop(void){
Sda=0;
Scl=1;
Nop();
Sda=1;
Nop();}/*应答位*/
voidAck(void)
{Sda=0;Nop();Scl=1;Nop();
Scl=0;}/*反向应答位*/
voidNoAck(void){
Sda=1;Nop();Scl=1;Nop();
Scl=0;}/*发送数据子程序,Data为要求发送的数据*/
voidSend(ucharData){
ucharBitCounter=8;
chartemp;
do{
temp=Data;
Scl=0;
Nop();
if((temp&0x80)==0x80)
Sda=1;
else
Sda=0;
Scl=1;
temp=Data<<1;
Data=temp;
BitCounter--;}
while(BitCounter);
Scl=0;}/*读一字节的数据,并返回该字节值*/
ucharRead(void){
uchartemp=0;
uchartemp1=0;
ucharBitCounter=8;
Sda=1;
do{Scl=0;
Nop();
Scl=1;
Nop();
if(Sda)
temp=temp|0x01;
else
temp=temp&0xfe;
if(BitCounter-1){
temp1=temp<<1;
temp=temp1;}
BitCounter--;}
while(BitCounter);
return(temp);}
voidWrToROM(ucharData[],ucharAddress,ucharNum){
uchari;
uchar*PData;
PData=Data;
for(i=0;i Start(); Send(0xa0); Ack(); Send(Address+i); Ack(); Send(*(PData+i)); Ack(); Stop(); mDelay(20);}} voidRdFromROM(ucharData[],ucharAddress,ucharNum){ uchari; uchar*PData; PData=Data; for(i=0;i Start(); Send(0xa0); Ack(); Send(Address+i); Ack(); Start(); Send(0xa1); Ack(); *(PData+i)=Read(); Scl=0; NoAck(); Stop();}} //============================LCD1602=================== #defineyi0x80 #defineer0x80+0x40 //----------------延时函数---------------------- voiddelay(uintxms)//延时函数,有参函数 { uintx,y; for(x=xms;x>0;x--) for(y=110;y>0;y--);} //--------------------------写指令--------------------------- voidwrite_1602(uchar)//****液晶写入指令函数**** { lcd1602_rs=0;//数据/指令选择置为指令 lcd1602_rw=0;//读写选择置为写 P0=;//送入数据 delay (1); lcd1602_en=1;//拉高使能端,为制造有效的下降沿做准备 delay (1); lcd1602_en=0;//en由高变低,产生下降沿,液晶执行命令 return;} //-------------------------写数据----------------------------- voidwrite_1602dat(uchardat)//***液晶写入数据函数**** { lcd1602_rs=1;//数据/指令选择置为数据 lcd1602_rw=0;//读写选择置为写 P0=dat;//送入数据 delay (1); lcd1602_en=1;//en置高电平,为制造下降沿做准备 delay (1); lcd1602_en=0;//en由高变低,产生下降沿,液晶执行命令 return;} //-------------------------初始化------------------------- voidlcd_init(void) { write_1602(0x38);//设置液晶工作模式,意思: 16*2行显示,5*7点阵,8位数据 write_1602(0x0c);//开显示不显示光标 write_1602(0x06);//整屏不移动,光标自动右移 write_1602(0x01);//清显示 } //==============将按键值编码为数值========================= unsignedcharcoding(unsignedcharm){ unsignedchark; switch(m){ case(0x18): k=1;break; case(0x28): k=2;break; case(0x48): k=3;break; case(0x88): k='A';break; case(0x14): k=4;break; case(0x24): k=5;break; case(0x44): k=6;break; case(0x84): k='B';break; case(0x12): k=7;break; case(0x22): k=8;break; case(0x42): k=9;break; case(0x82): k='C';break; case(0x11): k='*';break; case(0x21): k=0;break; case(0x41): k='#';break; case(0x81): k='D';break;} return(k);} //=============按键检测并返回按键值============================ unsignedcharkeynum(void){ unsignedcharrow,col,i;P1=0xf0; if((P1&0xf0)! =0xf0){ Delay5Ms(); Delay5Ms(); if((P1&0xf0)! =0xf0){ row=P1^0xf0;//确定行线 i=0; P1=a[i];//准确定位 while(i<4){ if((P1&0xf0)! =0xf0) { col=~(P1&0xff);//确定列线 break;//已定位后提前退出 } else{ i++; P1=a[i];}}} else{ return0;} while((P1&0xf0)! =0xf0); return(row|col);//行线与列线组合后返回 } elsereturn0;//无键按下时返回0 } //==================一声提示音,表示有效输入======================== voidOneAlam(void){ ALAM=0; Delay5Ms(); ALAM=1;} //==================二声提示音,表示操作成功====================
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 AT24C02 电子 密码锁 设计