《毕业设计(论文)-基于单片机的电子密码锁设计(23页).doc》由会员分享,可在线阅读,更多相关《毕业设计(论文)-基于单片机的电子密码锁设计(23页).doc(23页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、-毕业设计(论文)-基于单片机的电子密码锁设计-第 20 页基于单片机的电子密码锁设计摘 要电子密码锁是一种通过密码输入来控制电路或是芯片工作,从而控制机械开关的闭合,完成开锁、闭锁任务的电子产品。它的种类很多,有简易的电路产品,也有基于芯片的性价比较高的产品。现在应用较广的电子密码锁是以芯片为核心,通过编程来实现的。本文以STC89C52单片机为核心器件,结合按键电路、LED数码管显示电路、报警指示电路和开锁机构,利用单片机灵活的编程设计和丰富的I/O端口,及其控制的准确性通过软件程序来控制整个系统实现电子密码锁的基本功能。关键词:STC89C52 ; 电子密码锁 ; LED数码管目 录1
2、绪 论12 系统的总体设计和主要元器件介绍12.1设计要求12.2系统的总体思路设计22.3主要元器件介绍22.3.1 STC89C52介绍22.3.2 继电器介绍42.3.3 LED数码管介绍53、硬件设计63.1 单片机主控制模块63.2键盘输入模块63.3显示模块73.4 报警和开锁模块84、软件设计94.1系统框图94.2 系统程序设计95、系统仿真设计155.1 Proteus 软件介绍155.2 Proteus 仿真图16总 结17致 谢18参考文献19附录201 绪 论随着人们生活水平的提高, 日常生活和工作中的住宅与部门的安全防范、单位的文件档案、财务报表以及一些个人资料的保存
3、等一系列安全防盗问题变的尤其突出。传统的机械锁由于其构造的简单,被撬的事件屡见不鲜,且人们常需携带多把钥匙, 使用极不方便, 一旦钥匙丢失安全性即大打折扣。随着科学技术的不断发展,人们对日常生活中的安全保险器件的要求越来越高。为满足人们对锁的使用要求,增加其安全性,用密码代替钥匙的密码锁应运而生。密码锁因具有安全性高、成本低、功耗低、易操作等优点,受到了广大用户的青睐。现今常见的密码锁设计主要有两种方案,一种是中规模集成电路控制的方案,另一种是单片机控制的方案。本文以STC89C52单片机为核心器件,结合按键电路、LED数码管显示电路、报警指示电路和开锁机构,利用单片机灵活的编程设计和丰富的I
4、/O端口,及其控制的准确性通过软件程序来控制整个系统实现电子密码锁的基本功能。系统能实现如下的功能。(1)密码通过键盘输入,若密码正确,则将锁打开(2)密码输入错误,蜂鸣器将报警提示(3)用户可以自由设定密码系统功能实用,成本低廉,具有一定的实用价值。2 系统的总体设计和主要元器件介绍2.1设计要求以STC89C52单片机为核心器件,结合按键电路、LED数码管显示电路、报警指示电路和开锁机构,利用单片机灵活的编程设计和丰富的I/O端口,及其控制的准确性通过软件程序来控制整个系统实现电子密码锁的以下基本功能:(1)输入密码时不显示所输入的数字,有一定的防偷窥特点(2)密码通过键盘输入,若密码正确
5、,则显示灯发光,将锁打开(3)密码输入错误,蜂鸣器将报警提示(4)用户可以自由设定密码本密码锁具有设计方法合理,简单易行成本低,安全实用等特点,具有一定的推广价值。2.2系统的总体思路设计以STC89C52单片机为主控制单元,键盘为主要输入单元,结合开锁装置、报警器和显示器完成整个系统设计。系统的运行过程大致如下。假设初始状态为闭锁,此时整个系统只等待按键输入,数码管也不显示。每按下一个数据键(即每输入一个密码),数码管相应的显示一个“-”标志,当密码全部输入完成后,需按下确认键“#”,此时系统判断密码是否正确,正确则开锁(仿真中以继电器动作导致发光二级管点亮为标志),错误则报警,此后数码管熄
6、灭继续等待按键;若按下密码重置键“*”,则需先输入原密码,正确后请输入新密码,输入密码过程中,数码管显示如上“-”。2.3主要元器件介绍2.3.1 STC89C52介绍本次毕业设计选用的是STC89C52,STC89C52是一种带4K字节FLASH存储器的低电压、高性能CMOS 8位微处理器,俗称单片机,引脚图如图2.1所示。单片机的可擦除只读存储器可以反复擦除1000次。该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的STC89C52是一种高效微控制器。STC89C52单片机为
7、很多嵌入式控制系统提供了一种灵活性高且价廉的方案。图2.1 STC89C52引脚图STC89C52单片机引脚。VCC:供电电压。 GND:接地。 P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。当P0口的管脚第一次写1时,被定义为高阻输入。P0能够用于外部程序数据存储器,它可以被定义为数据/地址的低八位。在FIASH编程时,P0 口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须接上拉电阻。 P1口:P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉
8、为低电平时,将输出电流,这是由于内部上拉的缘故。在FLASH编程和校验时,P1口作为低八位地址接收。 P2口:P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。并因此作为输入时,P2口的管脚被外部拉低,将输出电流。这是由于内部上拉的缘故。P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。P2口在FLASH编程和校验时接收高八位地址信号和控制信号。 P3
9、口:P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。 P3口也可作为STC89C52的一些特殊功能口,如下所示。 口管脚 备选功能 P3.0 RXD(串行输入口) P3.1 TXD(串行输出口) P3.2 /INT0(外部中断0) P3.3 /INT1(外部中断1) P3.4 T0(记时器0外部输入) P3.5 T1(记时器1外部输入) P3.6 /WR(外部数据存储器写选通) P3.7 /RD(外部数据存储器读选通) P3口同时为闪
10、烁编程和编程校验接收一些控制信号。 RST:复位输入。当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。 ALE/PROG:当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。在FLASH编程期间,此引脚用于输入编程脉冲。在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。因此它可用作对外部输出的脉冲或用于定时目的。然而要注意的是:每当用作外部数据存储器时,将跳过一个ALE脉冲。如想禁止ALE的输出可在SFR8EH地址上置0。此时, ALE只有在执行MOVX,MOVC指令是ALE才起作用。另外,该引脚被略微拉高。如果微处理器在外部执行状态ALE禁
11、止,置位无效。 /PSEN:外部程序存储器的选通信号。在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。 /EA/VPP:当/EA保持低电平时,则在此期间外部程序存储器(0000H-FFFFH),不管是否有内部程序存储器。注意加密方式1时,/EA将内部锁定为RESET;当/EA端保持高电平时,此间内部程序存储器。在FLASH编程期间,此引脚也用于施加12V编程电源(VPP)。 XTAL1:反向振荡放大器的输入及内部时钟工作电路的输入。 XTAL2:来自反向振荡器的输出。 振荡器特性: XTAL1和XTAL2分别为反向放大器
12、的输入和输出。该反向放大器可以配置为片内振荡器。石晶振荡和陶瓷振荡均可采用。如采用外部时钟源驱动器件,XTAL2应不接。有余输入至内部时钟信号要通过一个二分频触发器,因此对外部时钟信号的脉宽无任何要求,但必须保证脉冲的高低电平要求的宽度。2.3.2 继电器介绍继电器是一种电控制器件,其电路图如图2.2所示。它具有控制系统(又称输入回路)和被控制系统(又称输出回路)之间的互动关系。通常应用于自动化的控制电路中,它实际上是用小电流去控制大电流运作的一种“自动开关”。故在电路中起着自动调节、安全保护、转换电路等作用。 当输入量(如电压、电流、温度等)达到规定值时,继电器被所控制的输出电路导通或断开。
13、输入量可分为电气量(如电流、电压、频率、功率等)及非电气量(如温度、压力、速度等)两大类。继电器具有动作快、工作稳定、使用寿命长、体积小等优点。广泛应用于电力保护、自动化、运动、遥控、测量和通信等装置中。 电磁继电器工作原理和特性。图2.2 继电器原理图电磁继电器一般由铁芯、线圈、衔铁、触点簧片等组成的。只要在线圈两端加上一定的电压,线圈中就会流过一定的电流,从而产生电磁效应,衔铁就会在电磁力吸引的作用下克服返回弹簧的拉力吸向铁芯,从而带动衔铁的动触点与静触点(常开触点)吸合。当线圈断电后,电磁的吸力也随之消失,衔铁就会在弹簧的反作用力返回原来的位置,使动触点与原来的静触点(常闭触点)释放。这
14、样吸合、释放,从而达到了在电路中的导通、切断的目的。对于继电器的“常开、常闭”触点,可以这样来区分:继电器线圈未通电时处于断开状态的静触点,称为“常开触点”;处于接通状态的静触点称为“常闭触点”。继电器一般有两股电路,为低压控制电路和高压工作电路。 2.3.3 LED数码管介绍LED数码管实际上是由七个发光管组成8字形构成的,加上小数点就是8个。这些段分别由字母a,b,c,d,e,f,g,dp来表示。当数码管特定的段加上电压后,这些特定段就会发亮,以形成我们眼睛看到的样子。 以“2”为例,应当是a亮b亮g亮e亮d亮f不亮c不亮dp不亮。LED数码管有一般亮和超亮等不同之分,也有0.5寸、1寸等
15、不同的尺寸。小尺寸数码管的显示笔画常用一个发光二极管组成,而大尺寸的数码管由二个或多个发光二极管组成,一般情况下,单个发光二极管的管压降为1.8V左右,电流不超过30mA。发光二极管的阳极连接到一起连接到电源正极的称为共阳数码管,发光二极管的阴极连接到一起连接到电源负极的称为共阴数码管。常用LED数码管显示的数字和字符是0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F。图2.3为LED数码管组成图。图2.3 LED数码管在本次实验中我们用的是四位一体的数码管,如下图2.4所示:图2.4 数码管3、硬件设计3.1 单片机主控制模块如图3.1是主控制模块的电路图,主要包括含晶振、复位
16、基本工作电路。图3.1 主控制模块3.2键盘输入模块在键盘中按键数量较多时,为了减少I/O口的占用,通常将按键排列成矩阵形式,如图3.2所示,在矩阵式键盘中,每条水平线和垂直线在交叉处不直接连通,而是通过一个按键加以连接。这样,一个端口(如P1口)就可以构成3*4=12个按键,比之直接将端口线用于键盘多出了一倍,而且线数越多,区别越明显,比如再多加一条线就可以构成20键的键盘,而直接用端口线则只能多出一键(9键)。由此可见,在需要的键数比较多时,采用矩阵法来做键盘是合理的。矩阵式结构的键盘显然比直接法要复杂一些,识别也要复杂一些,上图中,列线通过电阻接正电源,并将行线所接的单片机的I/O口作为
17、输出端,而列线所接的I/O口则作为输入。这样,当按键没有按下时,所有的输入端都是高电平,代表无键按下。行线输出是低电平,一旦有键按下,则输入线就会被拉低,这样,通过读入输入线的状态就可得知是否有键按下了。图3.2 矩阵键盘按键功能如表3.3介绍。第一行自左至右依次是1,2,3键, 第二行自左至右依次是4,5,6键, 第三行自左至右依次是7,8,9键, 第四行自左至右依次是*,0,#键。表3.3 按键功能按 键键 名功 能 说 明09键数 字 键输 入 密 码* 键重 设 密 码 键设 定 新 密 码# 键确认键确认密码输入完毕3.3显示模块此设计中,使用了四个共阴极数码管,使用动态显示技术控制
18、数码管。电路图如图3.4所示,其4个位选信号与P2.0-P2.3相连,当其中某位为低电平时表示选中该位;8段段选信号与P0口相连,当其中某段为高电平时导通该段,特殊的,由于STC89C52的P0口的驱动能力较弱,不足以驱动数码管点亮,故在此又引入上拉电阻以驱动数码管。 图3.4 显示模块关于上拉电阻有如下介绍:1、 当TTL电路驱动CMOS电路时,如果电路输出的高电平低于CMOS电路的最低高电平(一般为3.5V), 这时就需要在TTL的输出端接上拉电阻,以提高输出高电平的值。 2、OC门电路必须加上拉电阻,以提高输出的高电平值。3、为加大输出引脚的驱动能力,有的单片机管脚上也常使用上拉电阻。4
19、、在CMOS芯片上,为了防止静电造成损坏,不用的管脚不能悬空,一般接上拉电阻产生降低输入阻抗, 提供泄荷通路。5、芯片的管脚加上拉电阻来提高输出电平,从而提高芯片输入信号的噪声容限增强抗干扰能力。6、提高总线的抗电磁干扰能力。管脚悬空就比较容易接受外界的电磁干扰 。7、长线传输中电阻不匹配容易引起反射波干扰,加上下拉电阻是电阻匹配,有效的抑制反射波干扰。 3.4 报警和开锁模块报警模块由蜂鸣器、PNP三极管和单片机组成,电路图如图3.5所示。选择一只压电式蜂鸣器,压电式蜂鸣器工作时约需要100mA驱动电流。特殊的,此处为加强驱动能力,选用三极管来放大电流驱动蜂鸣器。当STC89C52的P3.0
20、口输出为低电平时,三极管导通,蜂鸣器产生蜂鸣音,STC89C52输出为高电平时,蜂鸣器不发声。此处以继电器的动作来模拟锁的开闭。同样,为了增强驱动能力添加了PNP三极管以放大电流,当P3.1口为低电平时,三极管导通,此时继电器动作(锁开),灯亮;二极管具有续流作用以保护器件安全。图3.5 报警和开锁模块4、软件设计4.1系统框图单片机时钟电路复位电路矩阵键盘掉电存储开锁机构报警机构图4.1系统框图4.2 系统程序设计重要端口定义说明:sbit buzzer=P30;sbit relay=P31;uchar code table2=0x40,0x00 ; /共阴极数码管编码 显示-和 熄灭uch
21、ar keyword4=1,1,1,1;uchar keycmp4;uchar key=0,num=0,flg=0;报警子程序:(通过控制buzzer端口的高低电平来控制三极管的通断,从而控制蜂鸣器)void alarm() num=0; buzzer=0;delay(100);buzzer=1;数码管显示子程序:LED显示器工作方式有两种:静态显示方式和动态显示方式。静态显示的特点是每个数码管的段选必须接一个8位数据线来保持显示的字形码。当送入一次字形码后,显示字形可一直保持,直到送入新字形码为止。这种方法的优点是占用CPU时间少,显示便于监测和控制。缺点是硬件电路比较复杂,成本较高;动态显
22、示的特点是将所有位数码管的段选线并联在一起,由位选线控制是哪一位数码管有效。选亮数码管采用动态扫描显示。所谓动态扫描显示即轮流向各位数码管送出字形码和相应的位选,利用发光管的余辉和人眼视觉暂留作用,使人的感觉好像各位数码管同时都在显示。动态显示的亮度比静态显示要差一些。本设计使用动态显示方法。void display() uchar i,j,cs=0x7f; for(i=num;i0;i-) P0=table0; cs=_crol_(cs,1); P2=cs; delay(10);for(j=4-num;j0;j-) P0=table1; cs=_crol_(cs,1); P2=cs; del
23、ay(10);按下确认键后执行功能子程序:(使用标志变量flg,根据其值来选择执行相应的功能)。void ok() uchar i=0; display(); / P0=(flg+1);delay(1000); if(flg=0) for(i=0;i4;i+) if(keywordi!=keycmpi) alarm();break;if(num=4) relay=0;num=0; if(flg=2) num=0; for(i=0;i4;i+) keywordi=keycmpi; flg=0; if(flg=1) for(i=0;i4;i+) if(keywordi!=keycmpi) alar
24、m();break;if(num=4) num=0; display(); / P0=0x07;delay(1000); flg=2;键盘扫描子程序:(运用矩阵键盘逐行逐列扫描法,一次检测各个按键)。键盘是单片机常用输入设备,在按键数量较多时,为了节省I/O口等单片机资源,一般采取扫描的方式来识别到底是哪一个键被按下。即通过确定被按下的键处在哪一行哪一列来确定该键的位置,获取键值以启动相应的功能程序。查找哪个按键被按下的方法为:一个一个地查找。 先第一行输出0,检查列线是否非全高;否则第二行输出0,检查列线是否非全高;否则第三行输出0,检查列线是否非全高;如果某行输出0时,查到列线非全高,则该
25、行有按键按下;根据第几行线输出0与第几列线读入为0,即可判断在具体什么位置的按键按下。void keyscan() uchar temp1,temp2; P1=0xfe;/令第一列为低电平,检测第1列 temp1=P1; if(temp1!=0xfe) delay(5);/去抖 temp2=P1;if(temp1=temp2) switch(temp2) case 0xf6: if(num4)key=1;keycmpnum=key;num+;display(); else alarm(); break;case 0xee: if(num4)key=4;keycmpnum=key;num+;di
26、splay(); else alarm(); break;case 0xde: if(num4)key=7;keycmpnum=key;num+;display(); else alarm(); break;case 0xbe: set();break;while(temp1!=0xfe)temp1=P1;/等待按键释放 P1=0xfd;/检测第2列 temp1=P1; if(temp1!=0xfd) delay(5);/去抖 temp2=P1;if(temp1=temp2) switch(temp2) case 0xf5: if(num4)key=2;keycmpnum=key;num+;d
27、isplay(); else alarm(); break;case 0xed: if(num4)key=5;keycmpnum=key;num+;display(); else alarm(); break;case 0xdd: if(num4)key=8;keycmpnum=key;num+;display(); else alarm(); break;case 0xbd: if(num4)key=0;keycmpnum=key;num+;display(); else alarm(); break;while(temp1!=0xfd)temp1=P1;/等待按键释放P1=0xfb;/检测
28、第3列 temp1=P1; if(temp1!=0xfb) delay(5);/去抖 temp2=P1;if(temp1=temp2) switch(temp2) case 0xf3: if(num4)key=3;keycmpnum=key;num+;display(); else alarm(); break;case 0xeb: if(num4)key=6;keycmpnum=key;num+;display(); else alarm(); break;case 0xdb: if(num4)key=9;keycmpnum=key;num+;display(); else alarm();
29、 break;case 0xbb: if(num=4) ok(); else alarm(); break;while(temp1!=0xfb)temp1=P1;/等待按键释放 display();中断服务函数:(当通过机械手段关锁时,将通过外部中断的形式使程序初始化恢复原状态)void Int0() interrupt 0 relay=1;整个系统的完整程序设计详见附录。5、系统仿真设计5.1 Proteus 软件介绍Proteus软件是英国Labcenter electronics公司出版的EDA工具软件(该软件中国总代理为广州风标电子技术有限公司)。它不仅具有其它EDA工具软件的仿真功能
30、,还能仿真单片机及外围器件。它是目前最好的仿真单片机及外围器件的工具。虽然目前国内推广刚起步,但已受到单片机爱好者、从事单片机教学的教师、致力于单片机开发应用的科技工作者的青睐。Proteus是世界上著名的EDA工具(仿真软件),从原理图布图、代码调试到单片机与外围电路协同仿真,一键切换到PCB设计,真正实现了从概念到产品的完整设计。是目前世界上唯一将电路仿真软件、PCB设计软件和虚拟模型仿真软件三合一的设计平台,其处理器模型支持8051、HC11、PIC10/12/16/18/24/30/DsPIC33、AVR、ARM、8086和MSP430等,2010年又增加了Cortex和DSP系列处理
31、器,并持续增加其他系列处理器模型。在编译方面,它也支持IAR、Keil和MPLAB等多种编译器。PROTEUS 是单片机课堂教学的先进助手。 PROTEUS不仅可将许多单片机实例功能形象化,也可将许多单片机实例运行过程形象化。前者可在相当程度上得到实物演示实验的效果,后者则是实物演示实验难以达到的效果。 课程设计、毕业设计是学生走向就业的重要实践环节。由于PROTEUS提供了实验室无法相比的大量的元器件库,提供了修改电路设计的灵活性、提供了实验室在数量、质量上难以相比的虚拟仪器、仪表,因而也提供了培养学生实践精神、创造精神的平台。 随着科技的发展,“计算机仿真技术”已成为许多设计部门重要的前期
32、设计手段。它具有设计灵活,结果、过程的统一的特点。可使设计时间大为缩短、耗资大为减少,也可降低工程制造的风险。相信在单片机开发应用中PROTEUS也能茯得愈来愈广泛的应用。 使用Proteus 软件进行单片机系统仿真设计,是虚拟仿真技术和计算机多媒体技术相结合的综合运用,有利于培养学生的电路设计能力及仿真软件的操作能力;在单片机课程设计和全国大学生电子设计竞赛中,我们使用 Proteus 开发环境对学生进行培训,在不需要硬件投入的条件下,学生普遍反映,对单片机的学习比单纯学习书本知识更容易接受,更容易提高。实践证明,在使用 Proteus 进行系统仿真开发成功之后再进行实际制作,能极大提高单片
33、机系统设计效率。因此,Proteus 有较高的推广利用价值。 5.2 Proteus 仿真图图5.1是利用PROTEUS制作的仿真电路图。图5.1系统仿真图总 结使用单片机制作的电子密码锁具有软硬件设计简单,易于开发,成本较低,安全可靠,操作方便等特点。本实训在设计之初认真分析了几种方案的优缺点,正是由于单片机的众多优良特性的吸引,最终从经济实用的角度出发,采用单片机STC89C52作为主控芯片,结合外围的键盘输入、显示、报警、开锁等电路,用C语言编写主控芯片的控制程序,设计了一款可以多次更改密码具有报警功能的电子密码锁。致 谢在吴老师的耐心指导和同学们的热情帮助下,经过两个星期的不懈努力,本
34、设计终于基本完成。在做课程设计的这段时间里,吴老师给我提供了极大的帮助和指导。从设计方向的分析到报告的撰写,从具体程序的设计到器件的选择,吴老师都给了我很多很有用的建议。另外,吴老师亲切和善、能和学生们打成一片的工作态度和认真负责的治学作风也给了我很深的印象。在此,对吴老师表达最真诚的谢意和最崇高的敬意。参考文献:1 于殿泓,王新年单片机原理与程序设计实验教程M西安:西安电子科技大学出版社,2007,82 赵文博,刘文涛单片机语言C51程序设计M北京:人民邮电出版社,2005,103 李爱秋红外线遥控12位电子密码锁的设计J 温州职业技术学院学报第8卷第一期,20084 陈杰,黄鸿传感器与检测
35、技术M北京:高等教育出版社,2010,85 周航慈. 单片机应用程序设计技术M. 北京:北京航空航天大学出版社,2011,26 李朝青. 单片机原理及接口技术M. 北京:北京航空航天大学出版社, 2005,107 孙育才. MCS-51系列单片微型计算机及其应用M. 东南大学出版社, 2004,68 沈红卫. 单片机应用系统设计实力与分析M. 北京:北京航空航天大学出版社,2003.9 徐爱钧, 彭秀华. 单片机高级语言C51应用程序设计M.北京航空航天大学出版社,200610 曾一江. 单片微机原理与接口技术M. 北京:科技出版社,2009,1211 康华光. 电子技术基础(模拟部分)M.
36、北京:高等教育出版社, 2004,4 附录: #include #include#define uint unsigned int#define uchar unsigned charsbit buzzer=P30;sbit relay=P31;uchar code table2=0x40,0x00 ; /共阴极数码管编码 显示-和 熄灭uchar keyword4=1,1,1,1;uchar keycmp4;uchar key=0,num=0,flg=0;/=延迟程序 延时x毫秒void delay(uint x) uint i,j; for(i=x;i0;i-) for(j=110;j0;
37、j-);/=报警程序 void alarm() int i; num=0;for(i=0;i0;i-) P0=table0; cs=_crol_(cs,1); P2=cs; delay(10);for(j=4-num;j0;j-) P0=table1; cs=_crol_(cs,1); P2=cs; delay(10);/=密码重置程序void set() num=0;display();flg=1;/=确认键程序void ok() uchar i=0; display(); / P0=(flg+1);delay(1000); if(flg=0) for(i=0;i4;i+) if(keywo
38、rdi!=keycmpi) alarm();if(num=4) relay=0;num=0; if(flg=2) num=0; for(i=0;i4;i+) keywordi=keycmpi; flg=0; if(flg=1) for(i=0;i4;i+) if(keywordi!=keycmpi) alarm();break;if(num=4) num=0; display(); / P0=0x07;delay(1000); flg=2;/=键盘扫描程序void keyscan() uchar temp1,temp2; P1=0xfe;/令第一列为低电平,检测第1列 temp1=P1; if
39、(temp1!=0xfe) delay(5);/去抖 temp2=P1;if(temp1=temp2) switch(temp2) case 0xf6: if(num4)key=1;keycmpnum=key;num+;display(); else alarm(); break;case 0xee: if(num4)key=4;keycmpnum=key;num+;display(); else alarm(); break;case 0xde: if(num4)key=7;keycmpnum=key;num+;display(); else alarm(); break;case 0xbe
40、: set();break;while(temp1!=0xfe)temp1=P1;/等待按键释放 P1=0xfd;/检测第2列 temp1=P1; if(temp1!=0xfd) delay(5);/去抖 temp2=P1;if(temp1=temp2) switch(temp2) case 0xf5: if(num4)key=2;keycmpnum=key;num+;display(); else alarm(); break;case 0xed: if(num4)key=5;keycmpnum=key;num+;display(); else alarm(); break;case 0xd
41、d: if(num4)key=8;keycmpnum=key;num+;display(); else alarm(); break;case 0xbd: if(num4)key=0;keycmpnum=key;num+;display(); else alarm(); break;while(temp1!=0xfd)temp1=P1;/等待按键释放P1=0xfb;/检测第3列 temp1=P1; if(temp1!=0xfb) delay(5);/去抖 temp2=P1;if(temp1=temp2) switch(temp2) case 0xf3: if(num4)key=3;keycmpnum=key;num+;display(); else alarm();