基于单片机的四位电子密码锁的设计Word下载.docx

上传人:b****6 文档编号:16773537 上传时间:2022-11-26 格式:DOCX 页数:46 大小:408.58KB
下载 相关 举报
基于单片机的四位电子密码锁的设计Word下载.docx_第1页
第1页 / 共46页
基于单片机的四位电子密码锁的设计Word下载.docx_第2页
第2页 / 共46页
基于单片机的四位电子密码锁的设计Word下载.docx_第3页
第3页 / 共46页
基于单片机的四位电子密码锁的设计Word下载.docx_第4页
第4页 / 共46页
基于单片机的四位电子密码锁的设计Word下载.docx_第5页
第5页 / 共46页
点击查看更多>>
下载资源
资源描述

基于单片机的四位电子密码锁的设计Word下载.docx

《基于单片机的四位电子密码锁的设计Word下载.docx》由会员分享,可在线阅读,更多相关《基于单片机的四位电子密码锁的设计Word下载.docx(46页珍藏版)》请在冰豆网上搜索。

基于单片机的四位电子密码锁的设计Word下载.docx

本设计选用单片机AT89C52作为本设计的核心元件,利用单片机灵活的编程设计和丰富的I/O端口,及其控制的准确性,实现基本的密码锁功能。

在单片机的外围电路外接输入键盘用于密码的输入和一些功能的控制,外接AT24C02芯片用于密码的存储,外接LCD1602显示器用于显示作用。

当用户需要开锁时,先按键盘开锁键之后按键盘的数字键0-9输入密码。

密码输完后按下确认键,如果密码输入正确则开锁,不正确显示密码错误重新输入密码,当n9(次数可改)次密码错误则发出报警;

当用户需要修改密码时,先按下键盘设置键后输入原来的密码,只有当输入的原密码正确后才能设置新密码。

新密码输入无误后按确认键使新密码将得到存储,密码修改成功。

可以看出方案二控制灵活准确性好且保密性强还具有声光提示、掉电存储、无线遥控等扩展功能,根据现实生活的需要此次设计采用此方案,如图1-1所示。

矩阵

键盘

控制

89C52

单片机

输入错误锁定键盘

延时报警控制电路

无线遥控控制电路

AT24C02掉电存储

指示电路

串口显示电路

图1-1单片机控制方案

1.2系统结构

图1-2

如图1-2所示系统主要由AT89C52、AT24C02液晶显示屏、蜂鸣器、LCD、4×

4矩阵键盘、复位电路、无线收发模块、无线发射键盘组成。

第2章硬件电路设计

2.189C52单片机最小系统

图2-1-1AT89S52最小工作系统

1、时钟电路:

单片机工作的时间基准,决定单片机工作速度。

时钟电路就是振荡电路,向单片机提供一个正弦波信号作为基准,决定单片机的执行速度。

AT89S51单片机时钟频率范围:

0—33MHz。

本设计晶振选择频率为12MHZ,电容选择30pF如图(3-4)。

经计算得单片机工作胡机器周期为:

12×

(1÷

12M)=1us。

时钟电路连接方式为:

图2-1-2时钟电路

3、复位电路:

确定单片机工作的起始状态,完成单片机的启动过程。

单片机接通电源时产生复位信号,完成单片机启动,确定单片机起始工作状态。

手动按键产生复位信号,完成单片机启动,确定单片机的初始状态。

通常在单片机工作出现混乱或“死机”时,使用手动复位可实现单片机“重启”。

图2-1-3复位电路

2.24×

4矩阵键盘

如图所示,本系统采用4×

4矩阵键盘,16个按键分为输入数字键:

*、0、#、1、2、3、4、5、6、7、8、9;

功能键lock、modify、cel、Enter。

矩阵键盘。

图2-2-1

注:

其中,【0—9】为数字键,用于输入相应的密码,【*】号键为取消当前操作【#】号键为确认【D】键为修改密码【C】产生随机密码【B】修改密码输入次数

2.3液晶显示屏LCD1602

1602是指显示的内容为16*2,即可以显示两行,每行16个字符。

现在的字符型液晶模块已经是单片机应用设计中最常用的信息显示器件了。

1602型LCD显示模块具有体积小,功耗低,显示内容丰富等特点。

1602型LCD可以显示2行16个字符,有8位数据总线D0~D7和RS,R/W,EN三个控制端口,工作电压为5V,并且具有字符对比

度调节和背光功能。

1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,这些字符有:

阿拉伯数字、英文字母大小写、常用符号和日文假名等,每个字符都有一个固定的代码,需要显示是可通过控制指令直接调用。

2.4蜂鸣器、发光二极管

(a)图2-4-1(b)

由于蜂鸣器(a)使用P0口驱动要加上上拉电阻如图2-4-1(a)。

在本设计中,蜂鸣器每当按下一个数字按键短蜂鸣一次,发生错误长蜂鸣一次。

由于LED(b)使用P0口驱动要加上上拉电阻如图2-4-1(b)。

2.5无线收/发模块

发射模块型号:

T1000BS1。

该模块工艺成熟、性能优秀,电磁转换效率高、发射功率大、功耗低,采用声表器件(SAW)稳频,6.5G超高频三极管,编码芯片品种繁多,满足各个方面、层次的应用。

接收模块型号:

R03BS。

接收方式:

超再生、解码芯片:

PT2272-M4(L4)。

有四路并行数据输出,一路解码有效指示输出(非锁)。

八位三态地址码、解码有效时输出TTL高电平。

输出方式:

有两种,一种为非锁(M)方式(即点动或脉冲方式),另一种为互锁(L)方式(即信号锁存方式)。

2.6掉电存储(AT24C02)

AT24C02是美国Atmel公司的低功耗CMOS型E2PROM,内含256×

8位存储空间,具有工作电压宽(2.5~5.5V)、擦写次数多(大于10000次)、写入速度快(小于10ms)、抗干扰能力强、数据不易丢失、体积小等特点。

而且他是采用了I2C总线式进行数据读写的串行器件,占用很少的资源和I/O线,并且支持在线编程,进行数据实时的存取十分方便。

图2-5AT24C02的电路接线图

24C02中带有片内地址寄存器。

每写入或读出一个数据字节后,该地址寄存器自动加1,以实现对下一个存储单元的读写。

所有字节均以单一操作方式读取。

为降低总的写入时间,一次操作可写入多达8个字节的数据。

第3章软件程序的设计

3.1功能设计

本系统程序部分使用C语言编写,C语言是一种高级程序设计语言,它的优点是简洁明了、可移植性高。

主要完成,开始时数码管显示提示“input”输入密码。

输入密码后按下确认键,系统会将所输入与系统密码进行比对。

若输入密码正确则显示“open”开锁。

然后可以选择上锁或者修改密码、产生随机码并任意保存、修改键盘锁定错误次数、出场默认值恢复。

此外,还有声光提示、掉电保护,无线/有线切换控制和密码显示与隐藏等附加功能。

图4-1-1软件设计流程图

3.2总电路图及源程序(见图附)

第4章结束语

通过这电子设计,让我们重新学习了很多学过的旧知识,也锻炼了自己的动手能力和查阅资料的能力,以及发扬了团队的协作精神。

尤其是完成无线键盘的制作过程中,总会遇到大大小小的问题而无法成功。

归其原因,忽略了单片机设计基本的步骤和思路,急于求成。

但值得高兴的是,我们组虚心求教,及时补救,积极面对。

一次次的弯路和失败,并没有让我们感到沮丧,却让我们的知识更加的细化和完善,探索精神也被强烈的激发。

在感叹科技力量的永无止境的同时,也发现了自身知识的欠缺和不足,我们应当在以后的学习和实践过程中,更加努力和善于思考,以应对以后更加激烈的挑战。

附:

总电路图

源程序

#include<

REG51.h>

#include<

intrins.h>

stdio.h>

stdlib.h>

#defineLCM_DataP0

#definewxjcP1

#defineucharunsignedchar

#defineuintunsignedint

//#defineBusy0x80//用于检测LCM状态字中的Busy标识

#definew4//定义密码位数

sbitlcd1602_rs=P2^7;

sbitlcd1602_rw=P2^6;

sbitlcd1602_en=P2^5;

sbitwxbz=P3^6;

sbitScl=P3^4;

//24C02串行时钟

sbitSda=P3^5;

//24C02串行数据

sbitALAM=P2^1;

//报警

sbitKEY=P2^0;

//开锁

sbitmmxs=P3^7;

//密码显示

sbitopen_led=P2^2;

//开锁指示灯

bitoperation=0;

//操作标志位

bitpass=0;

//密码正确标志

bitmmsd=0;

//1~9次密码设定标志

//bitResetEn=0;

//重设密码充许标志

bitReInputEn=0;

//重置输入充许标志

bits3_keydown=0;

//3秒按键标志位

bitkey_disable=0;

//锁定键盘标志

unsignedcharcountt0,second;

//t0中断计数器,秒计数器

voidDelay5Ms(void);

staticunsignedchartmp2=80;

unsignedcharm,d,sjmbz=0;

unsignedcharcodea[]={0xFE,0xFD,0xFB,0xF7};

//控盘扫描控制表

unsignedcharcodesuijishu[]={"

RandNumber:

"

};

//随机码

unsignedcharcodeset[]={"

setting:

unsignedcharcodecwcs[]={"

Numberoferrors"

//1~9次随机码任意设定

unsignedcharcodesjp[]={"

Lockthekeypad"

unsignedcharcodestart_line[]={"

password:

----"

unsignedcharcodename[]={"

===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[4];

//输入密码暂存区

unsignedcharCurrentPassword[4]={1,3,1,4};

//当前密码值

unsignedcharTempPassword[4];

unsignedcharN=0;

//密码输入位数记数

unsignedcharcun[1];

unsignedcharC=3;

unsignedcharErrorCont;

//错误次数计数

unsignedcharCorrectCont;

//正确输入计数

unsignedcharReInputCont;

//重新输入计数

unsignedcharcodeinitpassword[4]={0,0,0,0};

//=====================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;

Nop();

Scl=1;

Scl=0;

/*反向应答位*/

voidNoAck(void)

Scl=0;

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

voidSend(ucharData)

ucharBitCounter=8;

uchartemp;

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);

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

ucharRead(void)

uchartemp=0;

uchartemp1=0;

ucharBitCounter=8;

Sda=1;

do{

if(Sda)

temp=temp|0x01;

else

temp=temp&

0xfe;

if(BitCounter-1)

temp1=temp<

temp=temp1;

BitCounter--;

while(BitCounter);

return(temp);

voidWrToROM(ucharData[],ucharAddress,ucharNum)

uchar*PData;

PData=Data;

for(i=0;

Num;

Start();

Send(0xa0);

Ack();

Send(Address+i);

Send(*(PData+i));

Stop();

mDelay(20);

voidRdFromROM(ucharData[],ucharAddress,ucharNum)

Send(0xa1);

*(PData+i)=Read();

NoAck();

//===================================================================================================

//=========================================LCM1602===================================================

//读数据

/*

unsignedcharReadDataLCM(void)

LCM_RS=1;

LCM_RW=1;

LCM_E=0;

LCM_E=1;

return(LCM_Data);

*/

//读状态

unsignedcharReadStatusLCM(void)

LCM_Data=0xFF;

LCM_RS=0;

LCM_Data=LCM_Data&

Busy;

while(LCM_Data&

Busy);

//检测忙信号

//写数据

voidWriteDataLCM(unsignedcharWDLCM)

ReadStatusLCM();

//检测忙

LCM_Data=WDLCM;

LCM_RS=1;

LCM_RW=0;

LCM_E=0;

//若晶振速度太高可以在这后加小的延时

//延时

LCM_E=1;

//写指令

voidWriteCommandLCM(unsignedcharWCLCM,BuysC)//BuysC为0时忽略忙检测

if(BuysC)ReadStatusLCM();

//根据需要检测忙

LCM_Data=WCLCM;

LCM_RW=0;

//=============================LCM初始化=============================

voidLCMInit(void)

LCM_Data=0;

WriteCommandLCM(0x38,0);

//三次显示模式设置,不检测忙信号

Delay5Ms();

WriteCommandLCM(0x38,1);

//显示模式设置,开始要求每次检测忙信号

WriteCommandLCM(0x08,1);

//关闭显示

WriteCommandLCM(0x01,1);

//显示清屏

WriteCommandLCM(0x06,1);

//显示光标移动设置

WriteCommandLCM(0x0C,1);

//显示开及光标设置

//===================按指定位置显示一个字符================================

voidDisplayOneChar(unsignedcharX,unsignedcharY,unsignedcharDData)

Y&

=0x1;

X&

=0xF;

//限制X不能大于15,Y不能大于1

if(Y)X|=0x40;

//当要显示第二行时地址码+0x40;

X|=0x80;

//算出指令码

WriteCommandLCM(X,

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

当前位置:首页 > 工程科技 > 能源化工

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

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