基于C语言STC89C52单片机电子密码锁设计.docx
- 文档编号:26384608
- 上传时间:2023-06-18
- 格式:DOCX
- 页数:47
- 大小:249.83KB
基于C语言STC89C52单片机电子密码锁设计.docx
《基于C语言STC89C52单片机电子密码锁设计.docx》由会员分享,可在线阅读,更多相关《基于C语言STC89C52单片机电子密码锁设计.docx(47页珍藏版)》请在冰豆网上搜索。
基于C语言STC89C52单片机电子密码锁设计
基于C语言STC89C52单片机电子密码锁的设计
摘要:
本设计阐述通过Proteus软件成功仿真的电子密码锁的实现过程,选用STC89C52单片机为核心的系统来实现按键输入、开锁和密码识别。
采用具备I2C总线接口的E2PROM芯片来完成密码的存储,通过1602A液晶显示器提示程序运行状态和使用步骤,利用蜂鸣器模拟报警,发光二极管模拟锁的开关。
该系统用C语言编写程序,与汇编语言相比具有更好的移植性和可读性,便于修改和增减功能。
关键词:
Proteus;密码锁;单片机;C语言
DesignofElectronicCodeLockUsingSTC89C52MCUBasedonCLanguage
Abstract:
ThepaperintroducestheimplementationoftheelectroniccodelockwhichwassuccessfullysimulatedbyProteus.ItusesSTC89C52single-chipmicrocomputertoachievekeyinput,theunlockingandidentificationofthecode.ItadoptsI2CbusbasedE2PROMchiptocompletethecode'sstorage,usingLCD1602Atoprompttheprogram'srunningstateandworkingprocedures,adoptingbuzzertoimitatethealarmandLEDtoimitatetheswitch.ItisconvenienttomodifyandaddfuncticcconbyusingClanguageprogram,whichismoretransplantableandreliablecomparedtoassemblylanguage.
Keywords:
Proteus;codelock;single-chipmicrocomputer;Clanguage
一、前言
随着社会物质财富的日益增长和人们生活水平的提高,安全成为现代居民最关心的问题之一。
而锁自古以来就是把守门的铁将军,人们对它要求甚高,即要求可靠地防盗,又要使用方便。
传统的门锁既要备有大量的钥匙,又要担心钥匙丢失后的麻烦。
随着单片机的问世,出现了电子密码锁,其保密性高,使用灵活性好,安全系数高,故受到广大用户的青睐。
电子密码锁通常使用ARM和单片机控制[1],单片机相对ARM实现较为简单,功能较为完善,因此使用单片机控制较多。
用单片机控制的密码锁常使用汇编语言编写程序,数码管做显示器[2]。
但本设计使用移植性及可读性强的C语言[3-5]编写;同时采用显示清楚、功率消耗小而且寿命长的1602A液晶显示器。
从经济实用的角度出发,采用STC89C52单片机设计出一种具有密码设置、报警等功能的电子密码锁,并通过Proteus[6]软件成功地进行了仿真。
二、总体方案设计
2.1方案论证与比较
方案一:
以STC89C52单片机为电子密码锁系统核心,使用4*4矩阵键盘作为数据输入方式,驱动1602A显示器提示程序运行过程和开锁的步骤,利用AT24C02芯片实现掉电存储。
图1为单片机控制密码锁的系统原理框图。
图1单片机控制密码锁的系统原理框图
方案二:
以74LS112双JK触发器构成的数字逻辑电路控制方案,如图2。
图2数字逻辑控制方案电子密码锁原理框图
2.2方案选择
由于利用单片机灵活的编程设计和强大的I/O端口,及其控制的准确性,不但能实现基本的密码锁功能,还可以增添掉电存储、声光提示等功能,故选用方案一。
三、单元模块设计
3.1硬件支持
使用的元器件有:
核心芯片STC89C52、存储芯片AT24C02、液晶显示1602A、4×4矩阵键盘、报警蜂鸣器、发光二极管和三极管。
3.2功能单元模块设计
3.2.1开锁机构
通过单片机送给开锁执行机构,电路驱动电磁锁吸合,从而达到开锁的目的。
如图3所示,为密码锁开锁电路原理图。
当用户输入的密码正确时,单片机便输出开门信号,送到开锁驱动电路,然后驱动电磁锁,达到开门的目的。
本次设计中,基于节省成本考虑,用发光二极管代替电磁锁,信息通过LCD显示,并利用蜂鸣器和二极管声光指示。
其中,绿发光二极管亮,表示开锁;否则,表示密码输入错误并开启报警电路。
图3密码锁开锁电路原理图
3.2.2矩阵键盘设计电路
每一条水平(行线)与垂直线(列线)的交叉处不相通,而是通过一个按键来连通,利用这种行列式矩阵结构只需要M条行线和N条列线,即可组成具有M×N个按键的键盘。
由于本设计中要求使用16个按键输入,为减少键盘与单片机接口时所占用的I/O线的数目,故使用矩阵键盘。
本设计中,矩阵键盘行线和单片机P1.0-P1.3相连,列线与单片机P1.4-P1.7相连。
矩阵键盘设计电路图,如图4所示。
键盘扫描采用行扫描法,即依次置行线中的每一行为低电平,其余均为高电平,扫描列线电平状态,为低电平即表示该键按下。
图4矩阵键盘设计电路图
3.2.3声音提示电路设计
声音提示电路采用小蜂鸣器提示。
蜂鸣器能够根据脉冲信号,以及信号的频率发出各种不同的声音,这样可以根据系统要求在密码出入正确和密码输入错误时发出不同的声音提示,已达到报警的要求。
蜂鸣器电路,如图5所示。
图5蜂鸣器电路
3.2.4显示模块设计
本设计中,显示电路采用1602A液晶显示器显示[7]。
如下所示,图6为1602A液晶显示器的接口示意图,表1为接口说明。
图61602A液晶显示器的接口示意图
表1接口说明
管脚序
名称
电平
功能描述
1
VSS
0V
接地
2
VCC
5.0V
电源输入
3
V0
—
LCD驱动电压输入
4
RS
H/L
寄存器选择:
RS=H,选择数据寄存器;
RS=L,选择指令寄存器
5
R/W
H/L
读写信号线:
R/W=H,读操作;R/W=L,写操作
6
E
H,H→L
使能信号
7
DB0
H/L
数据线
8
DB1
H/L
数据线
9
DB2
H/L
数据线
10
DB3
H/L
数据线
11
DB4
H/L
数据线
12
DB5
H/L
数据线
13
DB6
H/L
数据线
14
DB7
H/L
数据线
15
BLA
5.0V
背光电源正极
16
BLK
0V
背光电源负极
本设计中液晶串口一共用到11根导线与单片机相连,具体连接情况如表2显示模块与MCU连接说明所示。
表2显示模块与MCU连接说明
序号
1602A液晶显示器引脚
STC89C52单片机引脚
1
RS引脚
P2.5(A13)
2
R/W引脚
P2.6(A14)
3
E引脚
P2.7(A15)
4
D0引脚
P0.0(AD0)
5
D1引脚
P0.1(AD1)
6
D2引脚
P0.2(AD2)
7
D3引脚
P0.3(AD3)
8
D4引脚
P0.4(AD4)
9
D5引脚
P0.5(AD5)
10
D6引脚
P0.6(AD6)
11
D7引脚
P0.7(AD7)
3.2.5AT24C02掉电存储单元的设计
本设计中掉电存储单元采用AT24C02外部存储器[8-9],其作用是在系统电源断开的时候,存储当前设定的密码数据。
AT24C02是一个2K位串行CMOSE2PROM,内部含有256个8位字节,含一个16字节页写缓冲器,具有写保护功能。
其采用两线串行的总线和单片机通讯,电压最低可以到2.5V,额定电流为1mA,静态电流10Ua(5.5V),芯片内的资料可以在断电的情况下保存40年以上,而且采用8脚的DIP封装,使用方便。
如下所示,图7为AT24C02管脚示意图,表3为AT24C02管脚说明。
图7AT24C02管脚示意图
表3AT24C02管脚说明
管脚名称
功能
管脚名称
功能
A0A1A2
器件地址选择
SDA
串行数据/地址
SCL
串行时钟信号
WP
写保护
VCC
1.8V-6.0V工作电压
VSS
接地
本设计中,AT24C02的SCL和SDA引脚接上拉电阻后与单片机的P3.4(T0)和P3.5(T1)脚相连,其电路图如图8所示。
图8AT24C02掉电存储单元设计图
4、程序设计与系统仿真
4.1模块介绍
与硬件电路相关联,本系统软件包括主程序模块、密码比较判断模块、键盘扫描模块、修改密码模块、1602A液晶显示模块等[10]。
系统程序流程如图9所示。
图9系统程序流程图
4.1.1主程序模块
主程序主要用于定义全局变量,给全局变量赋初值,初始化E2PROM,启动定时器以及从AT24C02中读取密码,为整个程序提供数据;检测按键;调用显示等功能。
4.1.2密码比较判断模块
该模块的功能是将键盘输入的密码利用if语句与设定的密码进行逐个比较,若密码完全正确则开锁;若不正确,则开启报警电路,复位后重新输入密码。
其密码输入和比较判决流程图如图10所示。
图10密码输入和比较判决流程图
4.1.3键盘扫描模块
键盘使用矩阵式键盘,由行和列组成,CPU对所有键盘进行监视,从而实现逐列扫描键盘确定被按键的具体位置、判断键盘上有无键按下、消除去抖动、判断闭合的键是否释放等功能。
如图11所示,为键盘扫描流程图。
图11键盘扫描流程图
4.1.4修改密码模块
在密码输入正确情况下,可以按下“重置密码”对密码进行重新设置,每设定一位就将密码送给AT24C02存储起来,当设置6位密码完毕后,系统将自动跳到程序开始,调用新设置的密码。
图12为修改密码流程图。
图12修改密码流程图
4.1.51602A液晶显示模块
此模块包括液晶初始化、命令的输入等。
4.2Proteus仿真电路
图13电子密码锁仿真图
五、系统功能
本设计中系统可实现功能如下:
(1)通过切换,对输入的4位密码进行显示或隐藏;
(2)通过发光二极管和蜂鸣器,对解密正确或者错误进行声光报警;
(3)4位密码修改;
(4)在密码遗失情况下,通过初始密码进行密码再设置;
(5)采用AT24C02外部存储器,完成断电密码保护功能;
(6)具有1-9次的解锁次数任意设定功能;
(7)模拟密码箱随机产生密码,并进行解码。
六.设计总结
从基本方案的制定,到硬件电路的选择,再到电路的焊接,最后进行程序调试——在此期间我们遇到很多困难,但经过团队的不懈努力,终于击破了各个难点,达到的所需要的效果。
在这次设计中,我们深刻认识到自身的不足——缺少实战经验。
与此同时,也因为这次设计,我们得到一定的锻炼,体会到理论与实践相结合的重要意义。
由于本次设计时间有限,一些设想没有完全实现,比如说:
电子密码锁的网络通信扩展,人机界面智能化等。
期待以后有机会对以上设想进行进一步研究实践。
参考文献
[1]郭海英.基于单片机的电子安全密码锁的设计[J].现代电子技术,2005,28(13):
95-97.
[2]张毅刚.单片机原理及应用[M].北京:
高等教育出版社,2003.
[3]谭浩强.C程序设计[M].北京:
清华大学出版社,2005
[4]杨章伟,韩雪,张浩然.跟我学C程序设计[M].北京:
清华大学出版社,2010
[5]张培仁.基于C语言编程MCS-51单片机原理与应用[M].北京:
清华大学出版社,2002
[6]周润景,张丽娜,丁莉.基于PROTEUS的电路及单片机设计与仿真[M].北京:
北京航天航空大学出版社,2010
[7]20070711.亚斌YB1602A液晶模块使用说明书[DB/OL].
[8]AT24C02[DB/OL].
[9]at24c02中文资料[DB/OL].
[10]金桂,向国梁.基于C语言STC89C52单片机电子密码锁的设计与仿真[J].现代电子技术,2010,19:
176-182.
附录:
a、器件清单
器件名称
规格型号
编号
数量
单价(元)
总价(元)
备注
MCU
STC89C52
U1
1
7
7
外部存储器
AT24C02
U2
1
0.43
0.43
LCD
1602A
LCD1
1
20
20
发光二极管
3mm
D1
1
0.05
0.05
绿光
普亮
3mm
D2
1
0.05
0.05
红光
普亮
三极管
8550
Q1
1
0.2
0.2
晶振
12MHz
X1
1
0.5
0.5
电阻
4.7kΩ
4
0.02
0.08
10kΩ
2
0.02
0.04
10K排阻
RP1
1
0.5
0.5
电容
22P
C1C2
2
0.05
0.1
10μF
C3
1
0.05
0.5
IC座
8脚IC座
1
0.35
0.35
40脚IC座
1
0.3
0.3
单排插座
1
0.5
0.5
蜂鸣器
LS1
1
0.65
0.65
电池盒
5V电池盒
1
4
4
焊锡
2
1
2
导线
1
1
1
电路板
9×15cm万用板
1
1.5
1.5
合计:
39.75元
b、源程序
#include
#include
#include
#include
#defineLCM_DataP0
#defineucharunsignedchar
#defineuintunsignedint
#definew4
sbitkey=P2^0;
sbitalam=P2^1;
sbitopen_led=P2^2;
sbitlcd1602_rs=P2^5;
sbitlcd1602_rw=P2^6;
sbitlcd1602_en=P2^7;
sbitScl=P3^4;
sbitSda=P3^5;
sbitxianshi=P3^7;
bitoperation=0;
bitpass=0;
bitmmsd=0;
voidDelay5Ms(void)
{
unsignedintTempCyc=5552;
while(TempCyc--);
}
voidDelay400Ms(void)
{
unsignedcharTempCycA=5;
unsignedintTempCycB;
while(TempCycA--)
{
TempCycB=7269;
while(TempCycB--);
}
}
bitReInputEn=0;
bits3_keydown=0;
bitkey_disable=0;
unsignedcharcountt0,second;
voidDelay5Ms(void);
staticunsignedchartmp2=80;
unsignedcharm,d,sjmbz=0;
unsignedcharcodea[]={0xFE,0xFD,0xFB,0xF7};
unsignedcharcodename[]={"TongXin08"};
unsignedcharcodeCorrect[]={"right"};unsignedcharcodeError[]={"wrong"};
unsignedcharcodesuijishu[]={"RandNumber:
"};
unsignedcharcodeset[]={"setting:
"};
unsignedcharcodesjp[]={"keypadlocked"};
unsignedcharcodestart_line[]={"password:
"};
unsignedcharcodecodepass[]={"success"};
unsignedcharcodeLockOpen[]={"open"};
unsignedcharcodeSetNew[]={"SetNewWord"};
unsignedcharcodeInput[]={"input:
"};
unsignedcharcodeResetOK[]={"ResetOK"};
unsignedcharcodeEr_try[]={"tryagain!
"};
unsignedcharcodeagain[]={"inputagain"};
unsignedcharcodeinitword[]={"chushihua"};
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};
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;
}
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);
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(); } } #defineyi0x80 #defineer0x80+0x40 voiddelay(uintxms) { uintx,y; for(x=xms;x>0;x--) for(y=110;y>0;y--); } write_1602com(ucharcom) { lcd1602_rs=0; lcd1602_rw=0; P0=com; delay (1); lcd1602_en=1; delay (1); lcd1602_en=0; } write_1602dat(uchardat) { lcd1602_rs=1; lcd1602_rw=0; P0=dat; delay (1); lcd1602_en=1; delay (1); lcd1602_en=0; } voidlcd_init(void) { write_
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 语言 STC89C52 单片机 电子 密码锁 设计