《单片机密码锁课程设计.doc》由会员分享,可在线阅读,更多相关《单片机密码锁课程设计.doc(23页珍藏版)》请在三一办公上搜索。
1、目 录1 引言12主要元器件介绍22.1主控芯片AT89S5122.1.1 AT89S51性能简介22.1.2 AT89S51引脚功能说明32.2 LCD1602显示器52.2.1接口信号说明52.2.2主要技术参数52.2.3 1602基本操作步骤53系统硬件73.1设计原理73.2电路总体构成73.3键盘输入部分83.4 LCD1602显示84系统软件设计104.1主程序模块104.2按键功能模块114.3修改密码模块134.4开锁模块14参考文献16附录171 引言锁任务的电子产品。它的种类很多,有简易的电路产品,也有基于芯片的性价比较高的产品。现在应用电子密码锁是一种通过密码输入来控制
2、电路或是芯片工作,从而控制机械开关的闭合,完成开锁、闭锁的电子密码锁是以芯片为核心,通过编程来实现的。其性能和安全性已大大超过了机械锁。在日常生活和工作中,住宅与部门的安全防范、单位的文件档案、财务报表以及一些个人资料的保存多以加锁的办法来解决。目前门锁主要用弹子锁,其钥匙容易丢失;保险箱主要用机械密码锁,其结构较为复杂,制造精度要求高,成本高,且易出现故障,人们常需携带多把钥匙,使用极不方便,且钥匙丢失后安全性即大打折扣。针对这些锁具给人们带来的不便若使用机械式钥匙开锁,为满足人们对锁的使用要求,增加其安全性,用密码代替钥匙的密码锁应运而生。它的出现为人们的生活带来了很大的方便,有很广阔的市
3、场前景。由于电子器件所限,以前开发的电子密码锁,其种类不多,保密性差,最基本的就是只依靠最简单的模拟电子开关来实现的,制作简单但很不安全,在后为多是基于EDA来实现的,其电路结构复杂,电子元件繁多,也有使用早先的20引脚的2051系列单片机来实现的,但密码简单,易破解。随着电子元件的进一步发展,电子密码锁也出现了很多的种类,功能日益强大,使用更加方便,安全保密性更强,由以前的单密码输入发展到现在的,密码加感应元件,实现了真正的电子加密,用户只有密码或电子钥匙中的一样,是打不开锁的,随着电子元件的发展及人们对保密性需求的提高出现了越来越多的电子密码锁。本设计采用单片机为主控芯片,结合外围电路,组
4、成电子密码锁,用户想要打开锁,必先通过提供的键盘输入正确的密码才能将锁打开,密码输入错误有提示,为了提高安全性,当密码输入错误三次将报警。密码可以由用户自己修改设定。修改密码之前必须再次输入密码,以防止误操作。2 主要元器件介绍2.1主控芯片AT89S512.1.1 AT89S51性能简介AT89S51具有如下特点:40个引脚,4k Bytes Flash片内程序存储器,128 bytes的随机存取数据存储器(RAM),32个外部双向输入/输出(I/O)口,5个中断优先级2层中断嵌套中断,2个16位可编程定时计数器,2个全双工串行通信口,看门狗(WDT)电路,片内时钟振荡器。此外,AT89S5
5、1设计和配置了振荡频率可为0Hz并可通过软件设置省电模式。空闲模式下,CPU暂停工作,而RAM定时计数器,串行口,外中断系统可继续工作,掉电模式冻结振荡器而保存RAM的数据,停止芯片其它功能直至外中断激活或硬件复位。同时该芯片还具有PDIP、TQFP和PLCC等三种封装形式,以适应不同产品的需求。图2-1 AT89S51 芯片引脚图其主要功能特性: 兼容MCS-51指令系统 4k可反复擦写ISP Flash ROM 32个双向I/O口 4.5-5.5V工作电压 2个16位可编程定时/计数器 时钟频率0-33MHz 全双工UART串行中断口线 128x8 bit内部RAM 2个外部中断源 低功耗
6、空闲和省电模式 中断唤醒省电模式 3级加密位 看门狗(WDT)电路 软件设置空闲和省电功能 灵活的ISP字节和分页编程 双数据寄存器指针 可以看出AT89S51提供以下标准功能:4K字节Flash闪速存储器,128字节内部RAM,32个I/O口线,看门狗(WDT),两个数据指针,两个16位定时器/计数器,一个5向量两级中断结构,一个全双工串行通信口,片内振荡器及时钟。同时, AT89S51可降至0Hz的静态逻辑操作,并支持两种软件可选的节电工作模式。空闲方式停止CPU的工作,但允许RAM,定时/计数器,串行通信口及中断系统继续工作。掉电方式保存在RAM中的内容,但振荡器停止工作并禁止其它所有部
7、件工作直接到一个硬件复位。2.1.2 AT89S51引脚功能说明Vcc:电源电压GND:地P0口:P0口是一组8位漏极开路型双向I/O口,也即地址/数据总线复用口,作为输出口用时,每位能驱动8个TTL逻辑门电路,对端口写“1”可作为高阻抗输入端口。在访问外部数据存储器或程序存储器时,这组口线分时转换地址(低8位)和数据总线复用,在访问期间激活内部上拉电阻。在Flash编程时,P0口接收指令字节,而在程序校验时,输出指令字节,校验时,要求外接上拉电阻。P1口:P1是一个带内部上拉电阻的8位双向I/O口,P1的输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。对端口写“1”,通过内部的上拉电
8、阻把端口拉到高电平,此时可作输入口。作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号校验期间,P1接收低8位地址。表2-2为P1口第二功能。端口引脚第二功能P1.5MOSI(用于ISP编程)P1.6MISO(用于ISP编程)P1.7SCK(用于ISP编程)图2-2 P1口第二功能P2口:P2是一个带有内部上拉电阻的8位双向I/O口,P2的输出缓冲级可驱动4个TTL逻辑门电路。对端口写“1”,通过内部的上拉电阻把端口拉到高电平,此时可作输入口,作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流I。在访问8位地址的外部数据存储器(如执行:MOVX Ri 指令)时,
9、P2口线上的内(也即特殊功能寄存器,在整个访问期间不改变。Flash 编程或校验时,P2也接收高位地址和其它控制信号。P3口:P3口是一组带有内部上拉电阻的8位双向I/O口。P3口输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。对P3口写入“1”时,它们被内部上拉电阻拉高并可作为输入端口。作输入端口时,被外部拉低的P3口将用上拉电阻输出电流I。P3口除了作为一般的I/O口线外,更重要的用途是它的第二功能,P3口的第二功能如下表2-3。 端口功能 第二功能端口引脚第二功能RXD(P3.0)串行输入口T0(P3.4)定时/计数器0外部输入TXD(P3.1)串行输出口T1(P3.5)定时/计
10、数器1外部输入INT0(P3.2)外中断0WR(P3.6)外部数据存储器写选通INT1(P3.3)外中断1RD(P3.7)外部数据存储器读选通图2-3 P3口的第二功能RST:复位输入。当振荡工作时,RST引脚出现两个机器周期上高电平将使单片机复位。WDT溢出将使该引脚输出高电平,设置SFR AUXR 的 DISRTO 位(地址8EH)可打开或关闭该功能。DISRTO 位缺省为RESET输出高电平打开状态。ALE/PROG:当访问外部程序存储器或数据存储器时,ALE(地址锁存允许)输出脉冲用于锁存地址的低8位字节。即使不访问外部存储器,ALE仍以时钟振荡频率的1/6输出的正脉冲信号,因此它可对
11、外输出时钟或用于定时目地,要注意的是:当访问外部数据存储器时将跳过一个ALE脉冲。PSEN:程序储存允许(PSEN)输出是外部程序存储器的读选通信号,当AT89S51由外部程序存储器取指令(或数据)时,每个机器周期两次PSEN有效,即输出两个脉冲。当访问外部数据存储器,高有两次有效的PSEN信号。EA/VPP:外部访问允许。欲使CPU公访问外部程序存储器(地址0000HFFFFH),EA端必须保持低电平(接地)。需注意的是:如果加密位LB1被编程,复位时内部会锁存EA端状态。如EA端为高电平(接Vcc端),CPU则执行内部程序存储器中的指令。Flash存储器编程时,该引脚加上12V的编程电压V
12、pp。XTAL1:振荡器反相放大器及内部时钟发生器的输入端。XTAL2:振荡器反相放大器的输出端。2.2 LCD1602显示器 现在的字符型液晶模块已经是单片机应用设计中最常用的信息显示器件了。1602型LCD显示模块具有体积小,功耗低,显示内容丰富等特点。1602型LCD可以显示2行16个字符,有8位数据总线D0-D7和RS,R/W,EN三个控制端口,工作电压为5V,并且具有字符对比度调节和背光功能。2.2.1接口信号说明1602型LCD的接口信号说明如表2-4所示: 编号符号引脚说明编号符号引脚说明1VSS电源地9D2Data I/O2VDD电源正极10D3Data I/O3V0液晶显示偏
13、压信号11D4Data I/O4RS数据/命令选择端(H/L)12D5Data I/O5R/W读写选择端(H/L)13D6Data I/O6E使能信号14D7Data I/O7D0Data I/O15BLA背光源正极8D1Data I/O16BLK背光源负极图2-4 1602型LCD的接口信号说明2.2.2主要技术参数1602型LCD的主要技术参数如下表所示:显示容量16X2个字符芯片工作电压4.55.5V工作电流2.0mA(5.0V)模块最佳工作电压5.0V字符尺寸2.95X4.35(WXH)mm图2-5 1602型LCD的主要技术参数2.2.3 1602基本操作步骤读状态:输入:RS=L,
14、RW=L,E=H 输出:D0-D7=状态字读数据:输入:RS=H,RW=H,E=H 输出:无写指令:输入:RS=L,RW=L,D0-D7=指令码,E=高脉冲 输出:D0-D7=数据写数据:输入:RS=H,RW=L,D0-D7=数据, E=高脉冲 输出:无3 系统硬件3.1 设计原理本设计主要由单片机、矩阵键盘、液晶显示器等部分组成。其中矩阵键盘用于输入数字密码和进行各种功能的实现。由用户通过连接单片机的矩阵键盘输入密码,后经过单片机对用户输入的密码与自己保存的密码进行对比,从而判断密码是否正确。本系统共有两部分构成,即硬件部分与软件部分。其中硬件部分由键盘输入部分、显示部分组成,软件部分对应的
15、由主程序、初始化程序、LCD显示程序、键盘扫描程序、启动程序、关闭程序、按键功能程序、密码设置程序、EEPROM读写程序和延时程序等组成。3.2电路总体构成在确定了选用什么型号的单片机后,就要确定在外围电路,其外围电路包括电源输入部分、键盘输入部分、显示部分组成,根据实际情况键盘输入部分选择4*4矩阵键盘,显示部分选择字符型液晶显示LCD1602。其仿真图如图3-1所示:图3-1 电路仿真图3.3键盘输入部分由于本设计所用到的按键数量较多而不适合用独立按键式键盘。采用的是矩阵式按键键盘,它由行线和列线组成,也称行列式键盘,按键位于行列的交叉点上,密码锁的密码由键盘输入完成,与独立式按键键盘相比
16、,要节省很多I/O口。本设计中使用的这个4*4键盘不但能完成密码的输入还能作特别功能键使用,比如清空显示功能等。键盘的每个按键功能在程序设计中设置。其大体功能(看键盘按键上的标记)及与单片机引脚接法如图3-2所示:图3-2 键盘按键引脚图 3.4显示部分为了提高密码锁的密码显示效果能力。本设计的显示部分由液晶显示器LCD1602取代普通的数码管来完成。只有按下键盘上的开启按键后,显示器才处于开启状态。同理只有按下关闭按键后显示器才处于关闭状态。否则显示器将一直处于初始状态,当需要对密码锁进行开锁时,按下键盘上的开锁按键后利用键盘上的数字键09输入密码,每按下一个数字键后在显示器上显示一个*,输
17、入多少位就显示多少个*。当密码输入完成时,按下确认键,如果输入的密码正确的话, LCD子显示“RIGHT”,单片机其中P2.0引脚会输出低电平,使三极管T2导通,电磁铁吸合,电子密码锁被打开,如果密码不正确,LCD显示屏会显示“ERROR”,P2.0输出的是高电平,电子密码锁不能被打开。通过LCD显示屏,可以清楚的判断出锁所处的状态。其显示部分引脚接口如图3-3所示:图3-3 1602显示屏引脚图4 系统软件设计本系统软件设计由主程序模块、初始化模块、LCD显示模块、键盘扫描模块、键功能程序、密码设置程序等组成。4.1主程序模块主程序流程图如图4-1所示:开始初始化键盘扫描启动程序键盘扫描键功
18、能程序结束关闭程序 图4-1 主程序流程图主程序代码如下所示:main() L1602_init(); while(1) keydown(); 4.2按键功能模块按键功能流程图如图4-2所示:键功能程序键值09?键值开锁?键值退格?键值修改?键值显示?密码输入程序修改程序退格程序开锁程序显示程序YYYYYNNNN返回N图4-2 按键功能流程图按键功能程序代码如下所示:if(key=11) L1602_string(1,1,input old code );L1602_string(2,1, );i=0;j=1;flag2=1;if(key=12) L1602_string(1,1,input
19、your code ) ; L1602_string(2,1, );i=0;j=1;if(key=13) L1602_string(1,1,show password ) ;for(k=0;k6;k+)L1602_char(2,k+1,init_valk+48);delayms(255);delayms(255); delayms(255);delayms(255);L1602_string(2,1, );if(key=14) if(flag=1) if(m!=0) L1602_char(2,n-1,0);delayms(255);m-;n-; else if(i!=0) L1602_char
20、(2,j-1,0);delayms(255);i-;j-; if(key=15) L1602_string(1,1,already reset );L1602_string(2,1, );for(i=0;i6;i+)init_vali=1; show_vali=0; i=0,j=1,m=0,n=1,flag=0,flag2=0;4.3修改密码模块修改密码程序流程图如图4-3所示。设置程序初始化按下设置键输旧密码确认程序输新密码设置成功确认程序图4-3 密码设置流程图修改密码程序代码如下所示:if(key=10) if(check_input_pw()=1) L1602_string(1,1,
21、input error );L1602_string(2,1, );i=0;j=1;delayms(255);times+;if (times=3) P3=0xfe;L1602_string(1,1,system clocked );while(1);L1602_string(1,1,input code again);L1602_string(2,1, );else L1602_string(1,1, door open );L1602_string(2,1, );P3=0X7F;delayms(255);delayms(255);P3=0XFF;4.4开锁模块开锁程序流程图如图4-4所示:
22、初始化按开锁键输入密码确认程序开锁成功开锁程序图4-4 开锁流程图开锁程序代码如下所示:if(check_input_pw()=1) L1602_string(1,1, input error );L1602_string(2,1, );i=0;j=1;delayms(255);times+;if (times=3) P3=0xfe;L1602_string(1,1,system clocked );while(1);L1602_string(1,1,input code again );L1602_string(2,1, );else L1602_string(1,1, door open
23、);L1602_string(2,1, );P3=0X7F;delayms(255);delayms(255);P3=0XFF;参考文献1 石文轩,宋薇.基于单片机MCS-51的智能密码锁设计M.武汉工程职业技术学院学报,2004,(01)2 袁新燕。浅谈单片机应用系统的调试J。自动化与仪器仪表,2000,(03)3 童诗白,华成英,模拟电子技术基础M,北京:高等教育出版社,20004 阎石主.数字电子技术基础M,北京:高等教育出版社,19985 吴春国,李文石。单片机控制电子锁技术剖析S。东北林业大学学报,2002,(05)6 李景宏,马学文。电子技术实验教程M。沈阳:东北大学出版社,200
24、47 贾正松。单片机系统复位电路设计J。科技资讯,2007,(36)附录#include #include #include #define uchar unsigned char#define uint unsigned intstatic uchar show_val6;static uchar init_val6=1,1,1,1,1,1; uchar key,times=0;unsigned char code key_code=0Xee,0Xed,0Xeb,0Xe7,0Xde,0Xdd,0Xdb,0Xd7,0Xbe, 0Xbd,0Xbb,0Xb7,0x7e,0x7d,0x7b,0x77
25、 ;/以下是1602程序sbit E=P22;/1602使能引脚sbit RW=P21;/1602读写引脚sbit RS=P20;/1602数据/命令选择引脚void delay()int i,j;for(i=0; i=100; i+)for(j=0; j=20; j+);void enable(uchar del)P0 = del;RS = 0;RW = 0;E = 0;delay();E = 1;delay();void write(uchar del)P0 = del;RS = 1;RW = 0;E = 0;delay();E = 1;delay();void L1602_init(vo
26、id)enable(0x01);enable(0x38);enable(0x0c);enable(0x06);enable(0xd0);void L1602_char(uchar hang,uchar lie,char sign)uchar a;if(hang = 1) a = 0x80;if(hang = 2) a = 0xc0;a = a + lie - 1;enable(a);write(sign);void L1602_string(uchar hang,uchar lie,uchar *p)uchar a;if(hang = 1) a = 0x80;if(hang = 2) a =
27、0xc0;a = a + lie - 1;enable(a);while(1)if(*p = 0) break;write(*p);p+;/以上是1602显示程序void delayms(uint ms) uchar t; while(ms-) for(t = 0; t 120; t+); uint check_input_pw() uint i,k; k=0; for(i=0;i6;i+) if (show_vali!=init_vali) k=1;return k;uchar keyscan() uchar scan1,scan2,keycode,j; P1=0xf0; scan1=P1;
28、 if(scan1&0xf0)!=0xf0) /判键是否按下 delayms(30); /延时30ms scan1=P1; if(scan1&0xf0)!=0xf0) /二次判键是否按下 P1=0x0f; scan2=P1; keycode=scan1|scan2;/组合成键编码 for(j=0;j=15;j+) if(keycode= key_codej) key=j; return key; else P1=0xff;void keydown() static uchar i=0,j=1,m=0,n=1,flag=0,flag2=0;uchar k;P1=0xf0;if(P1&0xf0)!
29、=0xf0)keyscan();if(key10) if(flag=1) init_valm=key; L1602_char(2,n,key+48);delayms(255); m+; n+; if(m=6) m=0;n=1;flag=0; L1602_string(1,1,get new code ); L1602_string(2,1, ); else L1602_string(1,1,inputting code ); L1602_string(2,j,*); show_vali=key; i+; j+; if(i=6) i=0;j=1; if(flag2=1) if(check_inp
30、ut_pw()=0) L1602_string(1,1, code right ); delayms(255); flag=1;flag2=0; L1602_string(1,1,input new code ); L1602_string(2,1, ); else L1602_string(1,1, code wrong ); L1602_string(2,1,input code again); if(key=10) if(check_input_pw()=1) L1602_string(1,1, input error );L1602_string(2,1, );i=0;j=1;dela
31、yms(255);times+;if (times=3) P3=0xfe;L1602_string(1,1,system clocked );while(1);L1602_string(1,1,input code again);L1602_string(2,1, );else L1602_string(1,1, door open );L1602_string(2,1, );P3=0X7F;delayms(255);delayms(255);P3=0XFF;if(key=11) L1602_string(1,1,input old code );L1602_string(2,1, );i=0
32、;j=1;flag2=1;if(key=12) L1602_string(1,1,input your code ) ; L1602_string(2,1, );i=0;j=1;if(key=13) L1602_string(1,1,show password ) ;for(k=0;k6;k+)L1602_char(2,k+1,init_valk+48);delayms(255);delayms(255); delayms(255);delayms(255);L1602_string(2,1, );if(key=14) if(flag=1) if(m!=0) L1602_char(2,n-1,0);delayms(255);m-;n-; else if(i!=0) L1602_char(2,j-1,0);delayms(255);i-;j-; if(key=15) L1602_string(1,1,already reset );L1602_string(2,1, );for(i=0;i6;i+)init_vali=1; show_vali=0; i=0,j=1,m=0,n=1,flag=0,flag2=0;main() L1602_init(); while(1) keydown();