根据AT24C02电子密码锁的设计.docx

上传人:b****5 文档编号:7833729 上传时间:2023-01-26 格式:DOCX 页数:31 大小:848.53KB
下载 相关 举报
根据AT24C02电子密码锁的设计.docx_第1页
第1页 / 共31页
根据AT24C02电子密码锁的设计.docx_第2页
第2页 / 共31页
根据AT24C02电子密码锁的设计.docx_第3页
第3页 / 共31页
根据AT24C02电子密码锁的设计.docx_第4页
第4页 / 共31页
根据AT24C02电子密码锁的设计.docx_第5页
第5页 / 共31页
点击查看更多>>
下载资源
资源描述

根据AT24C02电子密码锁的设计.docx

《根据AT24C02电子密码锁的设计.docx》由会员分享,可在线阅读,更多相关《根据AT24C02电子密码锁的设计.docx(31页珍藏版)》请在冰豆网上搜索。

根据AT24C02电子密码锁的设计.docx

根据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实物调试

5.1实物性能分析

用KEIL编写程序软件编写程序、经过Proteus仿真软件仿真调试之后,确认了此系统可正常运行,在这样的前提下,我们利用一个单片机最小系统、一块用电路板焊接的模块和一个1602液晶显示屏完成了第一次实物仿真。

图9

图9界面显示为输入密码,这时我们按下按键输入密码。

 

当我们输入密码时,下图为密码正确的实物图,如图10所示。

图10

当密码输入正确时,显示屏就会显示OPEN。

 

若密码输入错误,下图为密码输入错误的实物图,如图11所示。

图11

当我们输入错误的密码时,显示屏就会显示error。

 

下图为密码修改成功的实物图,如图12所示。

图12

当密码修改成功时,显示屏就会显示RestPasswordOK。

 

6心得体会

通过此次课程设计,我重新把单片机及相关知识联系在了一起

虽然掌握的知识不是很多,但通过查找资料我还是对单片机有了很好的了解和掌握。

在设计中我才发现单片机虽然体积小但是功能很强大,在生活中很多地方都可以用到它。

单片机这门学科博大精深,在以后的学习中只有多看书,理论与实践结合才能把这门课掌握好。

掌握了LCD的使用方法与编程。

同时我也体会到合作的好处。

让我懂得了如何合作,对不同看法发表自己的意见。

此次设计中最要的一点是,让我知道了,理论联系实践的好处。

不管理论学的再怎么好都必须联系实践,只有在实践中我们才会更加懂得如何运用自己的所学,在实践中将自己的知识实物化。

理论联系实践是我们获取知识的最佳途径。

 

参考文献

[1]谭浩强主编.C程序设计题解与上机指导(第3版)[M].北京,清华大学出版社,2005.16-24

[2]谢维成杨家国董秀成,单片机原理与应用及C51程序设计(第2版)[M],北京,清华大学出版社,2009.7.25-36

 

附录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_1602com(ucharcom)//****液晶写入指令函数****

{

lcd1602_rs=0;//数据/指令选择置为指令

lcd1602_rw=0;//读写选择置为写

P0=com;//送入数据

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_1602com(0x38);//设置液晶工作模式,意思:

16*2行显示,5*7点阵,8位数据

write_1602com(0x0c);//开显示不显示光标

write_1602com(0x06);//整屏不移动,光标自动右移

write_1602com(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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 工学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1