基于某AT24C02电子密码锁地设计Word文档下载推荐.docx

上传人:b****5 文档编号:20720458 上传时间:2023-01-25 格式:DOCX 页数:31 大小:849.44KB
下载 相关 举报
基于某AT24C02电子密码锁地设计Word文档下载推荐.docx_第1页
第1页 / 共31页
基于某AT24C02电子密码锁地设计Word文档下载推荐.docx_第2页
第2页 / 共31页
基于某AT24C02电子密码锁地设计Word文档下载推荐.docx_第3页
第3页 / 共31页
基于某AT24C02电子密码锁地设计Word文档下载推荐.docx_第4页
第4页 / 共31页
基于某AT24C02电子密码锁地设计Word文档下载推荐.docx_第5页
第5页 / 共31页
点击查看更多>>
下载资源
资源描述

基于某AT24C02电子密码锁地设计Word文档下载推荐.docx

《基于某AT24C02电子密码锁地设计Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《基于某AT24C02电子密码锁地设计Word文档下载推荐.docx(31页珍藏版)》请在冰豆网上搜索。

基于某AT24C02电子密码锁地设计Word文档下载推荐.docx

为了保存用户设置的密码,本系统使用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<

reg51.h>

#include<

intrins.h>

#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_();

}/*起始条件*/

voidStart(void){

Sda=1;

Scl=1;

Nop();

Sda=0;

}/*停止条件*/

voidStop(void){

}/*应答位*/

voidAck(void)

{Sda=0;

Scl=0;

}/*反向应答位*/

voidNoAck(void){

Sda=1;

Scl=0;

}/*发送数据子程序,Data为要求发送的数据*/

voidSend(ucharData){

ucharBitCounter=8;

chartemp;

do{

temp=Data;

if((temp&

0x80)==0x80)

else

Sda=0;

Scl=1;

temp=Data<

<

1;

Data=temp;

BitCounter--;

while(BitCounter);

}/*读一字节的数据,并返回该字节值*/

ucharRead(void){

uchartemp=0;

uchartemp1=0;

ucharBitCounter=8;

do{Scl=0;

if(Sda)

temp=temp|0x01;

else

temp=temp&

0xfe;

if(BitCounter-1){

temp1=temp<

temp=temp1;

while(BitCounter);

return(temp);

voidWrToROM(ucharData[],ucharAddress,ucharNum){

uchar*PData;

PData=Data;

Num;

i++){

Start();

Send(0xa0);

Ack();

Send(Address+i);

Send(*(PData+i));

Stop();

mDelay(20);

voidRdFromROM(ucharData[],ucharAddress,ucharNum){

Start();

Send(0xa1);

*(PData+i)=Read();

NoAck();

//============================LCD1602===================

#defineyi0x80

#defineer0x80+0x40

//----------------延时函数----------------------

voiddelay(uintxms)//延时函数,有参函数

uintx,y;

for(x=xms;

x>

0;

x--)

for(y=110;

y>

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;

//数据/指令选择置为数据

P0=dat;

//en置高电平,为制造下降沿做准备

//en由高变低,产生下降沿,液晶执行命令

//-------------------------初始化-------------------------

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;

case(0x48):

k=3;

case(0x88):

k='

A'

;

case(0x14):

k=4;

case(0x24):

k=5;

case(0x44):

k=6;

case(0x84):

B'

case(0x12):

k=7;

case(0x22):

k=8;

case(0x42):

k=9;

case(0x82):

C'

case(0x11):

*'

case(0x21):

k=0;

case(0x41):

#'

case(0x81):

D'

return(k);

//=============按键检测并返回按键值============================

unsignedcharkeynum(void){

unsignedcharrow,col,i;

P1=0xf0;

if((P1&

0xf0)!

=0xf0){

Delay5Ms();

Delay5Ms();

row=P1^0xf0;

//确定行线

i=0;

P1=a[i];

//准确定位

while(i<

4){

=0xf0)

col=~(P1&

0xff);

//确定列线

break;

//已定位后提前退出

else{

i++;

}}}

return0;

while((P1&

=0xf0);

return(row|col);

//行线与列线组合后返回

elsereturn0;

//无键按下时返回0

//==================一声提示音,表示有效输入========================

voidOneAlam(void){

ALAM=0;

ALAM=1;

//==================二声提示音,表示操作成功====================

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

当前位置:首页 > 求职职场 > 职业规划

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

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