1、摘要选用STC89C52单片机为核心的系统来实现按键输入、开锁和密码识别。采用具备I2C总线接口的E2PROM 的AT24C02芯片来完成密码的存储,通过1602液晶显示器提示程序运行状态和使用步骤,利用蜂鸣器模拟报警,发光二极管模拟锁的开关。该系统用C语言编写程序,与汇编语言相比具有更好的移植性和可读性,便于修改和增减功能。其中加入了门铃,语音,温度检测,时钟,烟雾检测(小型的火警报警器),音乐播放等实用功能。关键词:密码锁、多功能、STC89C52、温度、时钟、门铃、烟雾一、 前言随着社会物质财富的日益增长和人们生活水平的提高,安全成为现代居民最关心的问题之一。而锁自古以来就是把守门的铁将
2、军,人们对它要求甚高,即要求可靠地防盗,又要使用方便。传统的门锁既要备有大量的钥匙,又要担心钥匙丢失后的麻烦。随着单片机的问世,出现了电子密码锁,其保密性高,使用灵活性好,安全系数高,故受到广大用户的青睐。电子密码锁通常使用单片机控制1,单片机相对ARM来说成本较低,实现较为简单,功能较为完善,因此使用单片机控制较多。用单片机控制的密码锁通常使用汇编语言来编写程序,数码管做显示器 ,但本设计使用移植性及可读性强的C语言编写,同时采用显示清楚、功率消耗小而且寿命长的1602液晶显示器,从经济实用的角度出发,采用STC89C52单片机设计出一种具有密码设置、报警等功能的电子密码锁。电子密码锁的附加
3、功能有温度检测,可以时时检测当前温度;电子时钟,可以显示当前的时间,为人们的生活提供便利;门铃系统,可以替代传统的敲门并且还能够与房间内进行通话;防火报警器,利用温度传感器和烟雾传感器,对周围环境进行实时监控,对业主财产安全起到一定的防卫作用。终上所述,我们努力用最低的成本实现最全面的功能,使本密码锁不仅仅作为一个作品展现在人们面前,而且能够实实在在运用到实际生活当中,对解决实际生活中的困难起到一定作用。总之,我们努力用最小的成本,实现最多,最稳定的功能,这就要求我们对各个器件、电路相当了解。 二、 总体方案设计以STC89C52单片机为电子密码锁系统核心,协调和控制各个模块正常工作;使用4*
4、4矩阵键盘对本密码锁的多种功能进行控制;并驱动1602A显示器提示程序运行过程和开锁的步骤;利用AT24C02芯片实现密码掉电存储和密码的读取;通过DS1802温度传感器及MQ-2烟雾传感器对周围环境实时监控并传回数据,当温度过高或有害气体浓度超标时及时发出警报;由蜂鸣器为门铃,TDA2822实现声音的放大功能使房内主人可清晰听到客人的喊话。其中MQ-2烟雾报警模块与语音模块作为独立模块,使其实用更加方便和人性化。图1为单片机控制密码锁的系统原理框图。电源模块矩阵键盘模块 STC 89C521602 LCD 显示模块LED指示模块DS1820温度传感器蜂鸣器报警模块24C02存储模块MQ-2烟
5、雾报警系统语音模块图1 单片机控制密码锁的系统原理框图由于利用单片机灵活的编程设计和强大的I/O端口,及其控制的准确性,不但能实现基本的密码锁功能,还可以增添掉电存储、声光提示等功能。因此,这个方案比较合理化。三、 单元模块设计3.1硬件支持使用的元器件有:核心芯片STC89C52、存储芯片AT24C02、液晶显示1602、44矩阵键盘、报警蜂鸣器、独立按键、DS1802温度传感器、MQ-2烟雾传感器、TDA2822、LM7805、NE555、MAX232芯片、DB9、电容、晶振、电阻、发光二极管、三极管和继电器。3.2功能单元模块设计3.2.1 开锁机构通过单片机送给开锁执行机构,电路驱动电
6、磁锁(电磁锁用LED发光二极管代替)吸合,从而达到开锁的目的。如图3所示,为密码锁开锁电路原理图。当用户输入的密码正确时,单片机便输出开门信号,送到开锁驱动电路,然后驱动电磁锁(由LED代替),达到开门的目的。本次设计中,基于节省成本考虑,用发光二极管代替电磁锁,信息通过LCD显示,并利用蜂鸣器和二极管声光指示。其中,绿发光二极管亮,表示开锁;否则,表示密码输入错误并开启报警电路。开锁驱动电路STC89C52单片机密码正确超次锁定电磁锁是否图3 密码锁开锁电路原理图3.2.2 矩阵键盘设计电路每一条水平(行线)与垂直线(列线)的交叉处不相通,而是通过一个按键来连通,利用这种行列式矩阵结构只需要
7、M条行线和N条列线,即可组成具有MN个按键的键盘。由于本设计中要求使用16个按键输入,为减少键盘与单片机接口时所占用的I/O线的数目,故使用矩阵键盘。本设计中,矩阵键盘行线和单片机P1.0-P1.3相连,列线与单片机P1.4-P1.7相连。矩阵键盘设计电路图,如图4所示。键盘扫描采用行扫描法,即依次置行线中的每一行为低电平,其余均为高电平,扫描列线电平状态,为低电平即表示该键按下。1234567890*#DCBA图4 矩阵键盘设计电路图3.2.3 声音提示电路设计声音提示电路采用小蜂鸣器提示。蜂鸣器能够根据脉冲信号,以及信号的频率发出各种不同的声音,这样可以根据系统要求在密码出入正确和密码输入
8、错误时发出不同的声音提示,已达到报警的要求。蜂鸣器电路,如图5所示。图5 蜂鸣器电路3.2.4 显示模块设计本设计中,显示电路采用1602A液晶显示器显示。如下所示,图6为1602A液晶显示器的接口示意图,表1为接口说明。图6 1602A液晶显示器的接口示意图表1 1602A液晶显示器接口说明管脚序名称电平功能描述1VSS0V接地2VCC5.0V电源输入3V0LCD驱动电压输入4RSH/L寄存器选择:RS=H,选择数据寄存器;RS=L,选择指令寄存器5R/WH/L读写信号线:R/W=H,读操作;R/W=L,写操作6EH,HL使能信号7DB0H/L数据线8DB1H/L数据线9DB2H/L数据线1
9、0DB3H/L数据线11DB4H/L数据线12DB5H/L数据线13DB6H/L数据线14DB7H/L数据线15BLA5.0V背光电源正极16BLK0V背光电源负极本设计中液晶串口一共用到11根导线与单片机相连, 具体连接情况如表2显示模块与MCU连接说明所示。表2 显示模块与MCU连接说明序号1602A液晶显示器引脚STC89C52单片机引脚1RS引脚P2.72R/W引脚接地3E引脚P2.64D0引脚P0.05D1引脚P0.16D2引脚P0.27D3引脚P0.38D4引脚P0.49D5引脚P0.510D6引脚P0.611D7引脚P0.73.2.5 AT24C02掉电存储单元的设计本设计中掉电
10、存储单元采用AT24C02外部存储器,其作用是在系统电源断开的时候,存储当前设定的密码数据。AT24C02是一个2K位串行CMOS E2PROM,内部含有256个8位字节, 含一个16字节页写缓冲器,具有写保护功能。其采用两线串行的总线和单片机通讯,电压最低可以到2.5V,额定电流为1mA,静态电流10Ua(5.5V),芯片内的资料可以在断电的情况下保存40年以上,而且采用8脚的DIP封装,使用方便。如下所示,图7为AT24C02管脚示意图,表3为AT24C02管脚说明。图7 AT24C02管脚示意图表3 AT24C02管脚说明管脚名称功能管脚名称功能A0 A1 A2器件地址选择SDA串行数据
11、/地址SCL串行时钟信号WP写保护VCC1.8V-6.0V工作电压GND接地3.2.6 语音模块设计 此功能模块中采用驻极体话筒做音频输入,TDA2822芯片做功率放大器。电路图如下:图8 语音模块电路图驻极体话筒具有体积小、结构简单、电声性能好、价格低的特点,广泛用于盒式录音机、无线话筒及声控等电路中。属于最常用的电容话筒。TDA2822是意法半导体(ST)开发的双通道单片功率放大集成电路,通常在袖珍式盒式放音机(WALKMAN)、收录机和多媒体有源音箱中作音频放大器。具有电路简单、音质好、电压范围宽等特点,可工作于立体声以及桥式放大(BTL)的电路形式下。若将音频信号接到TDA2822输入
12、端,可轻松实现音乐播放功能。3.2.7 烟雾报警器模块及电源设计烟雾报警器由MQ-2可燃性气体传感器和可控多谐振荡器组成。MQ-2可燃性气体传感器特点,探测范围广、灵敏度高(快速响应回复)、稳定性优异以及寿命较长。NE555,只需简单的电阻器、电容器,即可组成可控的多谐振荡器。烟雾报警器及电源电路: 图9 烟雾报警器及电源电路 当空气中可燃性气体、烟雾浓度超标时,MQ-2传感器两端电阻骤减,555的4脚电压上升,当大于1V时,555多谐振荡器开始震荡,蜂鸣器发出报警。当可燃性气体、烟雾散去,MQ-2传感器两端电阻增加,555的4脚电压降低,555多谐振荡器停止震荡,报警停止。四、 程序设计与系
13、统仿真4.1 模块介绍与硬件电路相关联,本系统软件包括主程序模块、密码比较判断模块、键盘扫描模块、修改密码模块、1602A液晶显示模块等。系统程序流程如图9所示:开始系统初始化调用E2PROM密码显示主界面输入密码判断密码确定密码开锁模拟声光锁定键盘YN返回Y判断次数N超过N次未超过3次再次输入密码密码设置完毕N设置新密码Y按键N判断按键值返回主界面NY设置解码次数产生随机密码输入密码N=0x84N=0x82N=0x11图9 系统程序流程图4.1.1 主程序模块主程序主要用于定义全局变量,给全局变量赋初值,初始化E2PROM,启动定时器以及从AT24C02中读取密码,为整个程序提供数据;检测按
14、键;调用显示等功能。4.1.2 密码比较判断模块该模块的功能是将键盘输入的密码利用if语句与设定的密码进行逐个比较,若密码完全正确则开锁;若不正确,则开启报警电路,复位后重新输入密码。其密码输入和比较判决流程图如图10所示。输入密码核对键盘锁定,开启报警电路开锁,灯亮,可密码修改NY复位图10 密码输入和比较判决流程图4.1.3 键盘扫描模块键盘使用矩阵式键盘,由行和列组成,CPU对所有键盘进行监视,从而实现逐列扫描键盘确定被按键的具体位置、判断键盘上有无键按下、消除去抖动、判断闭合的键是否释放等功能。如图11所示,为键盘扫描流程图。开始延时去抖动计算输入键值键值送入单片机有按键输入?有按键输
15、入?有按键输入?返回NNYY图11 键盘扫描流程图4.1.4 修改密码模块在密码输入正确情况下,可以按下“重置密码”对密码进行重新设置,每设定一位就将密码送给AT24C02存储起来,当设置6位密码完毕后,系统将自动跳到程序开始,调用新设置的密码。图12为修改密码流程图。开始输入原密码密码比较比较正确?输入新密码再次输入新密码调用AT24C02中密码比较正确修改成功返回菜单键盘锁定,启动报警电路复位YN图12 修改密码流程图4.1.5 1602A液晶显示模块此模块包括液晶初始化、命令的输入等。五、系统功能5.1 实现功能本设计中系统可实现功能如下:(1)通过输入密码控制开关;(2)通过发光二极管
16、和蜂鸣器,对解密正确或者错误进行声光报警;(3)6位密码修改;(4)在密码遗失情况下,通过初始密码进行密码再设置;(5)采用AT24C02外部存储器,完成断电密码保护功能;(6)采用DS1802温度传感器,时时检测温度;(7)采用TDA2822的语音模块;(8)采用MQ-2烟雾报警;(9)音乐播放;(10)时钟;(11)键盘照明;此外设计留有扩展口,用户可根据自身不同需求进行扩展、完善功能。5.2 系统运行待机状态:(1) 电磁锁闭合;(2) LCD显示欢迎界面;(3) 烟雾报警器及温度传感器处于工作状态,以便及时发现险情;(4) 可通过按键接通门铃和语音模块与主人对话;工作状态流程:进入系统
17、( * )功 能 选 择 界 面开锁菜单(A)改密开锁密码验证时钟菜单(B)温度查看菜单(D)六设计总结从基本方案的制定,到硬件电路的选择,再到电路的焊接,最后进行程序调试在此期间我们遇到很多困难,但经过团队的不懈努力,终于击破了各个难点,达到的所需要的效果。在这次设计中,我们深刻认识到自身的不足缺少实战经验。与此同时,也因为这次设计,我们得到一定的锻炼,体会到理论与实践相结合的重要意义。由于本次设计时间有限,一些设想没有完全实现,比如说:无线遥控控制、电子密码锁的网络通信扩展,人机界面智能化。期待以后有机会对以上设想进行进一步研究实践。参考文献1张毅刚.单片机原理及应用M.北京:高等教育出版
18、社,2003.2谭浩强.C程序设计M.北京:清华大学出版社,20053杨章伟,韩雪,张浩然.跟我学C程序设计M.北京:清华大学出版社,20104张培仁.基于C语言编程MCS-51单片机原理与应用M.北京:清华大学出版社,20025AT24C02DB/OL. 6at24c02中文资料DB/OL. 附录:A、 元器件清单器件名称规格型号数量备注MCUSTC89C521外部存储器AT24C021DIP封装LCD1602A1发光二极管3mm2白光普亮3mm4绿光普亮3mm2红光普亮三极管90133电阻4.721K54.7K310K136K3变阻器10K2话筒10MM1带两只脚咪头烟雾传感器MQ-21音
19、频功率放大TDA28221DIP封装MAX232MAX232CPE1DIP封装NE555NE5551DIP封装温度传感器DS18B201晶振12MHz1瓷介电容30P310411电解电容10uF4100uF11000uf2按键开关6*6*5mm21自锁开关26脚单排插座4单排针2.54mm8双头杜邦线2.54mm20排线有源蜂鸣器2稳压器L78051变压器10W 220V/9V1转串口线USB-RS2321万用板7*917*1219*151C、密码锁源程序1、主程序#include#define uchar unsigned char#define uint unsigned int#defi
20、ne WriteDeviceAddress 0xa0 /定义器件在 IIC 总线中的地址 #define ReadDviceAddress 0xa1 extern TemperatuerResult();/声明引用外部函数extern unsigned int idata Temperature;void Start();void M24c02();void Write24c02();void Change();void Welcome();void MMinput();sbit E=P26;sbit RS=P27;sbit light=P25;sbit s1=P30;sbit s2=P31;
21、sbit s3=P32;sbit rd=P37;sbit SCL=P21; sbit SDA=P20; sbit beep=P22;sbit green=P24;sbit red=P23;uchar key;uchar temp;uchar dis_buf;uchar turn;uchar count,s1num;uchar miao,shi,fen;uchar mima6;uchar code tab=0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08;uchar code wel1= Welcome! ;uchar code wel2=Press * To En
22、ter;uchar code star=Please To Chose!;uchar code a=123A456B789C*0#D;uchar code b=0x01,0x02,0x03,0x00,0x04,0x05,0x06,0x00,0x07,0x08,0x09,0x00,0x00,0x00,0x00;uchar minp246=0;uchar timeinp4=0;uchar code times=The Time Input;uchar code timen= Password! ;uchar code error= Error! ;uchar code ok= Unlocked!
23、;uchar code old= Old Password! ;uchar code new= New password! ;uchar code new1= Press Again! ;uchar code ok1= Saved! ;uchar code table=Time:;uchar code table1= 00:00;/定时函数 void delay(uint z)int i,j;for(i=z;i0;i-)for(j=112;j0;j-);/开始总线 void SStart() SDA=1; SCL=1; SDA=0; SCL=0; /结束总线 void Stop() SCL=0
24、; SDA=0; SCL=1; SDA=1; /发 ACK0 void NoAck() SDA=1; SCL=1; SCL=0; /测试 ACK bit TestAck() bit ErrorBit; SDA=1; SCL=1; ErrorBit=SDA; SCL=0; return(ErrorBit); /写入 8 个 bit 到 24c02 void Write8Bit(unsigned char input) unsigned char temp; for(temp=8;temp!=0;temp-) SDA=(bit)(input&0x80); SCL=1; SCL=0; input=i
25、nput1; /写入一个字节到 24c02 中 void Write24c02(uchar ch,uchar address) SStart(); Write8Bit(WriteDeviceAddress); TestAck(); Write8Bit(address); TestAck(); Write8Bit(ch); TestAck(); Stop(); delay(10); /从 24c02 中读出 8 个 bit uchar Read8Bit() unsigned char temp,rbyte=0; for(temp=8;temp!=0;temp-) SCL=1; rbyte=rby
26、te1; rbyte=rbyte|(unsigned char)(SDA); SCL=0; return(rbyte); /从 24c02 中读出 1 个字节 uchar Read24c02(uchar address) uchar ch; SStart(); Write8Bit(WriteDeviceAddress); TestAck(); Write8Bit(address); TestAck(); SStart(); Write8Bit(ReadDviceAddress); TestAck(); ch=Read8Bit(); NoAck(); Stop(); return(ch); /写
27、入按键次数到 24c02void M24c02() / 24c02主程序 uint i;uchar c1;for(i=0;i6;i+) c1=Read24c02(tabi);mimai=c1; /LCD命令函数void RS_com(uchar com)RS=0;P0=com;delay(5);E=1;delay(5);E=0;/LCD数据函数void RS_dat(uchar dat)RS=1;P0=dat;delay(5);E=1;delay(5);E=0;/LCD初始化void LCDinit()E=0;RS_com(0x38);RS_com(0x0c);RS_com(0x06);RS_
28、com(0x01);RS_com(0x80);/Time显示初始化void Timeinit()uchar num;E=0;RS_com(0x38);RS_com(0x0c);RS_com(0x06);RS_com(0x01);RS_com(0x80);for(num=0;num5;num+)RS_dat(tablenum);delay(5);RS_com(0x80+0x40);for(num=0;num4)|0xF0); if(temp=1) / p1.4 被拉低 key=0; else if(temp=2) / p1.5 被拉低 key=1; else if(temp=4) / p1.6
29、被拉低 key=2; else if(temp=8) / p1.7 被拉低 key=3; else key=16; P1=0x0F; /低四位输入 列为高电平 行为低电平 delay(1);temp=P1; /读P1口 temp=temp&0x0F; temp=(temp|0xF0); if(temp=1) / p1.0 被拉低 key=key+0; else if(temp=2) / p1.1 被拉低 key=key+4; else if(temp=4)/ p1.2 被拉低 key=key+8;else if(temp=8)/ p1.3 被拉低 key=key+12; else key=16
30、; dis_buf=akey; turn=bkey; /键值入显示缓存 /判断键是否按下 void keydown(void) P1=0xF0;if(P1!=0xF0) /判断按键是否按下 如果按钮按下 会拉低P1其中的一个端口 keyscan(); P1=0xF0; /密码输入void MMinputmenu()int j;RS_com(0x01);RS_com(0x80);for(j=0;j16;j+)RS_dat(new1j);delay(20);delay(200);MMinput();void MMinput() uint x=0,i;for(i=0;i6;i+) minp24i=0
31、;LCDinit();RS_com(0x80+0x40);while(1)while(P1!=0xf0)keydown();if(key=3) break;if(key=7) MMinputmenu(); delay(300);RS_dat(*);delay(5);minp24x+=turn;if(x=5) break;if(key=3) break;/更改密码void Change() int i,j;uchar comp6;LCDinit();for(i=0;i16;i+)RS_dat(oldi);delay(20);while(P1=0xf0);MMinput();M24c02();fo
32、r(i=0;i6;i+)RS_com(0x80);if(minp24i!=mimai)for(j=0;j16;j+)RS_dat(errorj);delay(20);while(P1=0xf0);Change();if(i=5) RS_com(0x80);RS_com(0x01);for(j=0;j16;j+)RS_dat(newj);delay(20);while(P1=0xf0);MMinput();for(j=0;j6;j+) compj=minp24j;RS_com(0x01);RS_com(0x80);for(j=0;j16;j+)RS_dat(new1j);delay(20);while(P1=0xf0);MMinput();RS_com(0x01);for(j=0;j6;j+) if(minp24j!=compj)RS_com(0x80);for(j=0;j16;j+)RS_dat(errorj);delay(20);while(P1=0xf0); Change(); if(j=5) for(j=0;j6;j+)Write24c02(minp24j,tabj);RS_com(0x80);