单片机密码锁实验报告
单片机电子密码锁报告

目录第1章概述1第2章系统总体方案设计2第3章硬件电路设计33.1 键盘电路设计33.2LED显示电路53.3 开锁电路73.4报警电路9第4章软件设计94.1软件设计思路94.2 各子程序设计10第5章系统调试16第6章心得体会17第7章参考文献18第8章附录198.1源程序清单198.2硬件原理图26第1章概述随着科技的发展,单片机已不是一个陌生的名词,它的出现是近代计算机技术发展史上的一个重要里程碑,因为单片机的诞生标志着计算机正式形成了通用计算机系统和嵌入式计算机系统两大分支。
单片机单芯片的微小体积和低的成本,可广泛地嵌入到如玩具、家用电器、机器人、仪器仪表、汽车电子系统、工业控制单元、办公自动化设备、金融电子系统、舰船、个人信息终端及通讯产品中,成为现代电子系统中最重要的智能化工具。
本文所涉及的是市场占有率最高的是MCS—51系列,因为世界上很多知名的IC生产厂家都生产51兼容的芯片。
到目前为止,MCS—51单片机已有数百个品种,还在不断推出功能更强的新产品。
本设计是基于单片机的密码锁设计方案,根据要求,给出了该单片XX码锁的硬件电路和软件程序,同时给出了单片机型号的选择、硬件设计、软件流程图、单片机存储单元的分配、汇编语言源程序及详细注释等内容。
第2章系统总体方案设计系统总体设计方案框图2.1:图2.1系统总体设计方案框本方案采用一种是用以89S51为核心的单片机控制方案。
利用单片机灵活的编程设计和丰富的I/O端口,及其控制的准确性,实现基本的密码锁功能。
初步设计思路如下:1.输入密码用矩形键盘,包括数字键和功能键。
2.LED数码管显示输入密码,用74JS247驱动数码管发光显示数码,用74LS138控制各位显示器分时进行显示。
3.用发光二极管代替开锁的电路,发光表示开锁。
4.输入密码错误次数超过3次,系统报警。
5.打开电源后,显示器显示“000000”,设原始密码为“123456”,只要输入此密码便了开门。
单片机密码锁课题设计报告

单片机开发与应用工程报告题目:电子密码锁设计学号:学生姓名:专业:信息工程年级:2010级课程名称:单片机开发与应用工程训练指导老师:年月日一、设计目的:用单片机实现一个电子密码锁二、设计要求:设计一个电子密码锁系统,用4位数码管显示设定密码.输入密码正确时,用绿色发光管显示。
错误时,用红色发光管闪动显示。
三次输入错误,发出蜂鸣报警。
可进行密码修改。
a)4位数码管显示:设置密码时显示数字,输入密码时显示“----”b)存储密码功能:密码设置及修改c)报警功能:蜂鸣器报警加红色发光管闪烁显示三、设计分析【系统的主要功能】本课题实际是设计一个电子密码锁,可以设置4位密码,用2个发光二极管和一个蜂鸣器来显示输入密码的错误与正确,另外还可以有秒表的功能。
一、时间模块:正常状态显示时钟,小时和分钟。
24小时制循环。
在温度模块时,长按set键,切换进入时间模块。
1、在时钟正常显示状态下按动KSET按钮,进入时钟调整:1)调整位闪烁,此时按动KADD键进行递增,按动KSUB键进行递减2)循环按动KSET键,调整位循环闪烁,一圈以后回到正常时钟状态3)在调整时钟状态按动KFUN键,确认时钟调整有效,并保存2、时钟正常状态按动KFUN键进入倒顺计时1)上电后首次进入计时状态则为默认的正向计时,此时时间不能调整,最大计时为99秒,计时精度为0.01秒2)在停止计时状态持续按动KSET键1秒,可进行倒顺计时转换3)倒计时状态默认的时间为30分钟,最大可定时100分钟,计时精度为1秒4)在倒计时状态复位情况下,可通过按动KADD或KSUB键进行时间的递增或递减调整,调整步长为10秒。
当数值小于10以后,下调步长为1秒。
5)在计时状态停止时按动KFUN键可复位计时时间6)按动KFUN键可启动或停止计时7)在计时过程中按动KADD或KSUB键,可暂停计时和连续计时8)倒顺计时的任意情况下按动KSET键,可退出计时回到正常的时钟状态二、密码模块:如果没得存储芯片或者存储芯片坏了上电时就自动进入时钟模块1、上电时显示----,红灯亮起,系统锁定2、输入正确密码,按Kfun键确认,红绿灯亮起,系统开放10秒然后红灯熄灭3、双灯亮起时,按动Kset键,相应位闪烁,按动Kadd或Ksub进行密码修改4、密码修改后,按动Kfun键,确定密码修改完成,嘟嘟嘟蜂鸣三声,红灯熄灭,系统显示----5、单灯亮时,需要输入正确密码,亮起双灯才能修改密码6、长按Kset键,系统锁定,红灯亮起【硬件电路分析】1.晶振电路单片机晶振的作用是为系统提供基本的时钟信号。
基于51单片机的密码锁设计报告

基于51单片机的密码锁设计报告课程:单片机原理学院:电子与信息工程学院专业:班级:姓名:学号:指导老师:完成日期:目录一、矩阵按键 (1)(1)按键接口 (1)(2)按键开关的抖动问题 (1)二、LCD1602液晶 (2)(1)1602 液晶的介绍 (2)(2)液晶的读写时序介绍 (4)(3)1602 液晶的指令介绍 (6)三、设计 (7)(1)输出密码后,显示LCD1602 (7)(2)输出密码后,交替亮灭显示LED (7)四、程序设计 (7)(1)主程序 (7)(二)LCD1602程序 (9)(3)矩阵键盘程序 (10)五、仿真截图 (12)(1)输出密码后,显示LCD1602 (12)(2)输出密码后,交替亮灭显示LED (15)基于51单片机的密码锁设计一、矩阵按键(1)按键接口键盘是由若干按键组成的开关矩阵,它是微型计算机最常用的输入设备,用户可以通过键盘向单片机输入指令、地址和数据。
一般单片机系统中采和非编码键盘,非编码键盘是由软件来识别键盘上的闭合键,它具有结构简单,使用灵活等特点,因此被广泛应用于单片机系统。
(2)按键开关的抖动问题组成键盘的按键有触点式和非触点式两种,单片机中应用的一般是由机械触点构成的。
在下图1、图2中,当按键被按下时,P1.0输入为高电平;当按键按下后,P1.0输入为低电平。
由于按键是机械触点,当机械触点断开、闭合时,会有抖动动,P1.0输入端的波形如图2所示。
这种抖动对于人来说是感觉不到的,但对单片机来说,则是完全可以感应到的,因为单片机处理的速度是在微秒级,而机械抖动的时间至少是毫秒级,对单片机而言,这已是一个“漫长”的时间。
图1图2按键抖动波形为使CPU能正确地读出P1口的状态,对每一次按键只作一次响应,就必须考虑如何去除抖动,常用的去抖动的方法有两种:硬件方法和软件方法。
单片机中常用软件法,因此,对于硬件方法我们不介绍。
软件法,就是在单片机获得P1.0口为低的信息后,不是立即认定按键已被按下,而是延时10毫秒或更长一些时间后再次检测P1.0口,如果仍为低,说明按键的确按下了,这实际上是避开了按键按下时的抖动时间。
51单片机电子密码锁报告

信息工程学院51单片机的密码锁控制器的设计实验报告专业:电气工程及其自动化班级:10040921基于51单片机的密码锁控制器设计一、设计目的:要求设计的电子密码锁的密码用键盘上的数字按键产生的6位数字码构成的密码。
如果输入密码正确开锁(发光二极管量),如果密码不正确,发出报警信号。
二、实验要求:1、显示位数:6位密码显示2、键盘设置密码三、设计方案:本设计包括矩阵键盘接口电路、密码锁的控制电路和输出显示电路等三部分。
键盘部分包括键盘扫描时序产生电路;键盘扫描;弹跳消除;键盘译码;按键存储。
程序控制包括数字按键的数字输入;存储及清除;功能按键的功能设计;移位寄存器的设计与控制;密码清除、变更、存储;激活开锁电路;密码核对;解除电锁电路。
输出显示电路的设计包括:数据选择;BCD对显示译码;七段显示扫描。
(1)密码数据输入:每按一个数字键,在显示器上显示一个“-”最多可设置6位密码。
(2)密码设置:每按一个数字键,就输入一个数值,并在显示器上的最右方显示出该数值,并将先前已经输入的数据依序左移一个数字位置。
注意:密码设置必须是在开锁状态下设置。
(3)数码清除:按下此键可清除前面所有的输入值,清除成为“000000”。
(4)密码更改:按下此键时将目前的数字设定成新的密码。
(5)激活电锁:按下此键可将密码锁上锁。
(6)解除电锁:按下此键会检查输入的密码是否正确,密码正确即开锁。
(7)密码错误:声光报警四、实验电路及连线:1、实验接线2、LED电平显示电路实验仪上装有8只发光二极管及相应驱动电路。
见下图,L0―L7为相应发光二极管驱动信号输入端,该输入端为高电压电平“1”时发光二极管点亮。
我们可以通过P1口对其直接进行控制,点亮或者熄灭发光二极管。
LED电平显示电路3、键盘及LED显示电路键盘和LED显示的地址译码见下图,做键盘和LED实验时,需要将KEY/LED CS接到相应的地址译码上。
位码输出的地址为0X002H,段码输出的地址为0X004H,键盘行码读回的地址为0X001H,此处X是由KEY/LED CS决定,参见地址译码。
单片机密码锁实习报告

单片机密码锁实习报告一、前言随着科技的不断发展,单片机技术在各个领域得到了广泛的应用。
本次实习,我选择了单片机密码锁的设计与实现作为课题,旨在掌握单片机的原理与应用,提高自己的动手实践能力。
二、实习目的1. 学习单片机的原理与编程方法,了解单片机在实际应用中的优势。
2. 掌握密码锁的设计原理,学会使用单片机实现密码锁功能。
3. 培养自己的团队协作能力和解决问题的能力。
三、实习内容1. 单片机密码锁的原理与功能介绍2. 单片机密码锁的硬件设计3. 单片机密码锁的软件编程4. 单片机密码锁的系统调试与优化四、实习过程1. 单片机密码锁的原理与功能介绍单片机密码锁是一种利用单片机作为控制核心,通过密码输入来控制电路或芯片工作的安全设备。
它具有安全性高、成本低、功耗低、易操作等优点,广泛应用于各种场合。
本次设计的单片机密码锁采用4x4矩阵键盘输入密码,当密码输入正确时,锁打开,否则锁定按键3秒钟并发出报警。
2. 单片机密码锁的硬件设计硬件设计是实现单片机密码锁功能的基础。
本次设计中,硬件部分主要包括4x4矩阵键盘、LED显示、蜂鸣器报警、电磁锁等。
其中,4x4矩阵键盘用于输入密码,LED显示用于显示输入的密码,蜂鸣器报警用于发出报警声音,电磁锁用于实现锁的开关。
3. 单片机密码锁的软件编程软件编程是实现单片机密码锁功能的关键。
本次设计中,软件部分主要实现以下功能:(1)键盘扫描:检测按键是否按下,并获取按键值。
(2)密码输入:将键盘输入的按键值转换为密码,并在LED显示上显示。
(3)密码判断:判断输入的密码是否正确,正确则开锁,错误则锁定按键3秒钟并发出报警。
(4)密码修改:提供一种方式修改密码,以提高安全性。
4. 单片机密码锁的系统调试与优化在完成硬件设计和软件编程后,进行系统调试与优化。
通过反复测试,发现并解决可能存在的问题,提高系统的稳定性和可靠性。
五、实习收获通过本次实习,我学到了很多关于单片机密码锁的知识,收获如下:1. 掌握了单片机的原理与编程方法,了解了单片机在实际应用中的优势。
单片机实习报告-密码锁

ALE/PROG:当访问外部程序存储器或数据存储器时,ALE(地址锁存允许)输出脉冲用于锁存地址的低8位字节。即使不访问外部存储器,ALE仍以时钟振荡频率的1/6输出的正脉冲信号,因此它可对外输出时钟或用于定时目地,要注意的是:第当访问外部数据存储器时将跳过一个ALE脉冲。如有必要,可通过对特殊功能寄存器(SFR)区中的8EH单元的D0位置位,可禁止ALE操作。该位禁位后,只有一条MOVX和MOVC指令ALE才会被激活。此外,该引脚伎被微弱拉高,单片机执行外部程序时,应设置ALE无效。
存储器结构:MCS-51单片机内核采用程序存储器和数据存储器空间分开的结构,均具有64KB外部程序和数据的寻址空间。
程序存储器:如果EA引脚接地(GND),全部程序均执行外部存储器。在AT89C54,假如接至Vcc(电源+),程序首先执行从地址0000H-0FFFH(4KB)内部程序存储器,再执行地址为1000H-FFFFH(60KB)的外部程序存储器。
2.
AT89C54具有如下特点:40个引脚,4k Bytes Flash片内程序存储器,128 bytes的随机存取数据存储器(RAM),32个外部双向输入/输出(I/O)口,5个中断优先级2层中断嵌套中断,2个16位可编程定时计数器,2个全双工串行通信口,看门狗(WDT)电路,片内时钟振荡器。
此外,AT89C54设计和配置了振荡频率可为0Hz并可通过软件设置省电模式。空闲模式下,CPU暂停工作,而RAM定时计数器,串行口,外中断系统可继续工作,掉电模式冻结振荡器而保存RAM的数据,停止芯片其它功能直至外中断激活或硬件复位。同时该芯片还具有PDIP、TQFP和PLCC等三种封装形式,以适应不同产品的需求。
密码锁单片机实习报告

一、前言随着科技的不断发展,单片机技术在各个领域得到了广泛的应用。
密码锁作为一种安全可靠的开锁方式,也逐渐成为了人们生活中不可或缺的一部分。
本报告主要介绍了我在单片机实习期间,基于51单片机设计的电子密码锁的过程和实践。
二、实习目的和意义本次实习的目的是学习和掌握单片机原理及应用,提高自己的动手能力和创新能力。
通过设计电子密码锁,了解并掌握单片机在实际应用中的电路设计、编程和调试技巧。
此外,电子密码锁在生活中的应用广泛,具有较高的实用价值,可以为人们提供便捷、安全的生活环境。
三、实习内容1. 电路设计本次实习的电子密码锁主要由51单片机、4x4矩阵键盘、LCD1602液晶显示屏、AT24C02存储模块、报警系统和继电器等组成。
电路设计过程中,首先对各个模块进行选型,然后绘制原理图,最后搭建实物电路。
2. 编程设计根据电路设计,编写相应的程序代码,实现密码的输入、存储、比较和报警等功能。
程序设计过程中,采用C语言进行编程,通过Keil软件进行编译和调试。
3. 系统调试将编写好的程序烧录到单片机中,对整个系统进行调试。
调试过程中,检查各个模块是否正常工作,并对可能出现的问题进行排查和优化。
四、实习过程1. 电路设计首先,根据实习要求,选用AT89C52型51单片机作为核心控制器。
然后,设计4x4矩阵键盘,用于密码的输入。
接着,选用LCD1602液晶显示屏,显示密码输入界面和开锁状态。
为了实现密码的存储,选用了AT24C02存储模块。
最后,设计报警系统和继电器,实现密码错误报警和开锁功能。
2. 编程设计根据电路设计,编写相应的程序代码。
首先,实现矩阵键盘扫描函数,用于检测按键输入。
然后,编写密码存储和读取函数,将输入的密码存储到AT24C02模块中,并在下次开机时读取。
接下来,实现密码比较函数,判断输入的密码是否正确。
最后,编写报警和开锁函数,当密码错误时发出报警,正确时驱动继电器开锁。
3. 系统调试将编写好的程序烧录到单片机中,对整个系统进行调试。
基于单片机的电子密码锁实验报告

201X年小学期单片机设计实验报告题目:基于16F877的电子密码锁班级:班内序号:实验组号:学生姓名:指导教师:基于16F877的电子密码锁实验摘要在日常的生活和工作中, 住宅与部门的安全防范、单位的文件档案、财务报表以及一些个人资料的保存多以加锁的办法来解决。
若使用传统的机械式钥匙开锁,人们常需携带多把钥匙, 使用极不方便, 且钥匙丢失后安全性即大打折扣。
具有防盗报警等功能的电子密码锁代替密码量少、安全性差的机械式密码锁已是必然趋势。
随着科学技术的不断发展,人们对日常生活中的安全保险器件的要求越来越高。
为满足人们对锁的使用要求,增加其安全性,用密码代替钥匙的密码锁应运而生。
密码锁具有安全性高、成本低、功耗低、易操作、记住密码即可开锁等优点。
目前使用的电子密码锁大部分是基于单片机技术,以单片机为主要器件,其编码器与解码器的生成为软件方式。
本系统由16F877单片机系统(主要是16F877单片机最小系统)、4×4矩阵键盘、LCD1602显示和报警系统等组成,具有设置、修改四位用户密码、输入提示音、密码错误报警等功能(本设计由单片机控制LCD显示,密码正确显示password ok!密码错误显示wrong,please reset!用户reset后进行重新输入。
由单片机控制矩阵键盘含有0-9数字键和A-F功能键。
按F键,则进行密码重置功能)。
本系统成本低廉,功能实用。
(宋体五号)A b s t r a c tIn daily life and work, the department of housing and security, unit documents, financial statements and some personal information to save more in order to lock the ways to solve. If use the traditional mechanical key to open the lock, people often need to carry multiple keys, use very convenient, and the key missing after security is compromised. With anti-theft alarm function such as electronic combination lock instead of password quantity is little, security, poor mechanical combination lock is inevitable trend. With the continuous development of science and technology, people in daily life the demand is higher and higher safety insurance device. To meet the requirements of people on the use of the lock, increase its safety, use the password instead of the key combination lock arises at the historic moment. Combination lock with high safety, low cost, low power consumption, easy operation, remember password lock, etc.Currently use electronic combination lock is mostly based on single chip microcomputer technology, single chip microcomputer as the main device, the encoder and decoder for software.This system consists of 16 f877 microcontroller system (mainly minimum 16 f877 microcontroller system), 4 * 4 matrix keyboard, LCD1602 display and alarm system, etc, and has set up four, modify user password, password, input prompt error alarm functions (this design by the single chip microcomputer control LCD display, the password correctly display the password ok! Wrong password shows wrong, both please reset! The user to enter again after reset. By single-chip microcomputer control matrix keyboard contains 0-9 number keys and A - F function keys. Press the F key, then carries on the password reset function). This system is low cost, function and practical.WM function to control its turn. And this is so called navigating aptitudinally .关键字单片机——microcontroller 芯片——CMOS chip16F877一、PIC16F877系列单片机简介PIC16F87X ( 含873P874P876P877) 是美国微芯(Microchip) 公司推出的高性能单片机,除具有单片机的通用资源外,该系列单片机还采用哈佛总线结构、二级指令流水线取指方式、精简指令集(RISC)和内部具有E2 PROM 数据存储器及FLASH 结构的程序存储器、仅35 条单字节单周期指令、在系统串行编程技术和在线调试技术。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
二○一六~二○一七学年第一学期电子信息工程系电子综合设计II报告书班级:电信(产业)1401班设计时间:2016/12/29学生姓名:学号:指导教师:二○一六年十二月一、设计要求.题目内容:设计一个基于51单片机的电子密码锁:1.可以使用4*4的矩阵键盘与红外遥控器输入密码。
2.可以通过按特殊组合键重设开锁密码。
3.显示通过1602液晶屏显示电子密码锁界面,输入密码时显示输入个数显示为‘*’,如果密码正确,进入欢迎界面。
4.密码连续输入3次错误报警,LCD显示报警,倒计时十秒后重新进入密码输入界面。
5.可以通过特殊的按键组合跳过输入界面直接进入欢迎界面。
实现方法:1.通过红外接收头,连接单片机的P3.2外部中断INT0口,可以实现单片机接收遥控器的信号输入。
2.通过矩阵键盘扫描函数,可以实现对键盘输入的响应。
3.通过引脚的高低电平变化频率,控制蜂鸣器的输入占空比和频率(低电平时间固定,通过输入给函数值的不同改变高电平时间,固定响300个周期),对不同按键实现不同声音响应。
4.1602显示屏有16*2个单元格,每个单元格由5*8个像素点组成,可以很好的显示数字,符号,英文字符。
功能需求分析:液晶屏显示:根据题意,需要设计并显示输入密码界面、修改密码界面、欢迎界面、错误警告界面密码输入:根据题意,每次输入一个数字,则显示一个‘*’符号代替,只能看出输入的位数,若输入密码位数达到六位,则与正确密码比较,若正确,进入系统。
根据日常的手机使用习惯,默认长度为6位,且第六位输入之后立即判断,正确则进入,错误则清空重输。
组合键实现密码修改:密码修改必须通过不易被他人发现的特殊方法改变,所以设计为,若同时按住矩阵键盘的5,10 或6,9两个键,则进入密码修改函数。
输入密码错误三次则报错:一般的密码系统对密码输入错误次数过多的情况进行了限制,所以在密码锁里设置,若密码输入错误三次,则进入警报界面,显示10s倒计时,必须在倒计时结束后才能再次输入密码。
组合键实现跳过密码:如果系统主人临时忘记了密码,则需要一些补救的备用措施,所以在电子锁里设计了,如果同时按下0,15或3,12键,则跳过密码输入阶段,直接进入欢迎界面。
红外控制:在很多时候,需要通过远程通信输入密码,进入某个远程服务器系统。
所以,通过红外设备模拟远程通信就显得很有必要。
再此系统中,通过把红外接收引脚接到外部中断INT0口,实现接收红外遥控器的数据。
重新输入:如果密码输入的过程中,发现输错了一位数,方便起见,要设置重新输入的功能,即矩阵按键为11,或红外遥控键值为12时,重新输入密码,并且不计入输错次数。
二、 系统总体设计框架系统模块分布图:电子密码锁系统密码输入及显示蜂鸣器模块重设密码跳过密码输入过程警告音1602显示模块按键音管理员模块输入密码界面警告界面重设密码界面欢迎界面详细流程框图:开始若为重置密码指令红外外部中断键盘扫描错误警报进入欢迎界面输入界面是否为特殊组合键输入是否达到6位是否与正确密码相同错误次数达到三次?系统锁定,并倒计时十秒将输入密码暂存在数组用*显示密码位数是否是否是否是否将输入的六位六位密码数组与正确值比较若为跳过密码指令输入密码界面重置密码界面输入是否达到6位将输入密码存入正确密码数组中,完成重置否是三、运行结果密码输入:每次输入一个数字,则显示一个‘*’符号。
密码修改:通过特殊组合按键,进入密码修改函数。
三次报错:若密码输入错误三次,则进入警报界面。
特殊键清除:通过特殊组合按键,进入密码修改函数。
红外控制:通过红外遥控器输入密码。
重新输入:通过红外遥控器的12号按键或矩阵键盘的11号按键可以重新输入密码。
四、实验小结本次实验,用51单片机实现了电子密码锁系统,虽然内容较基础,但是还是新学到了一些新知识,如红外线的数据传输方式,外部中断的合理使用。
同时也遇到了一些问题:用红外遥控器输入密码的时候,总会在短时间内把一个键值发给单片机发送两次,但是原因不是太清楚,可能是红外遥控器的抬起也算一个命令,然后我再判断主函数的红外线标志位判断的地方,加了0.5秒的延迟,解决了问题。
以后有时间再把红外接收器的数据手册详细看看,研究问题出在哪里。
总体来说,这一次的动手设计还是让自身能力提高了不少,但其实我学习的东西还远远不够,在以后的学习里,我会抓紧课外时间多学习知识,才能将自身解决实际问题的能力快速提高。
五、参考文献[1] 谭浩强,C语言程序设计,清华大学出版社,2005[2] 张毅刚,单片机原理及接口技术,人民邮电出版社,2011六、附录:源程序/******************************************************************************* * 电子密码锁系统 Designed By 曹子龙 2016/12/29 * *******************************************************************************/#include<reg51.h>#include"lcd.h" //包含控制1602的初始化程序及写入命令的程序#define GPIO_KEY P1 //矩阵键盘接口sbit IRIN=P3^2; //红外线接口sbit Beep = P2^0; //蜂鸣器接口unsigned char code CDIS0[16]={" Set Code: "}; //用来初始化1602屏幕显示内容的字符串数组unsigned char code CDIS1[16]={" Enter Code: "};unsigned char code CDIS2[16]={" Code: "};unsigned char code CDIS3[16]={" Welcome to "};unsigned char code CDIS4[16]={" My System!"};unsigned char code CDIS5[16]={" Warning: "};unsigned char code CDIS6[16]={" Please Wait s!"};unsigned int RIGHTCODE[6]={9,7,0,2,2,9};//初始正确密码unsigned int Code[6]; //用来存放输入密码unsigned int KeyValue; //用来储存键值unsigned int Key_Flag=0; //有按键按下时置为1unsigned int HongwaiValue; //用来储存键值unsigned int Hongwai_Flag=0; //有红外信号时置为1unsigned int Annum=0; //用来储存按键次数unsigned int Wrongnum=0; //用来储存错误次数unsigned int CodeFlag=0; //用来标识密码是否输入正确unsigned int CodeDel=0; //特殊组合键可以清除密码unsigned char IrValue[6]; //暂存接收到的红外信号unsigned char Time;unsigned char WrongTime; //用来储存错误等待时间void SetCode(); //重置密码函数void hongwai(); //将红外接收的值变为对应的按键值void IrInit(); //红外初始化void DelayMs(unsigned int );void beep(unsigned int); //可让蜂鸣器实现不同频率声音的函数void KeyScan(); //键盘扫描函数/******************************************************************************* * 函数名 : main* 函数功能 : 主函数*******************************************************************************/void main(){unsigned char i;IrInit();LcdInit();LcdWriteCom(0x80); //初始化LCD1602显示,展示密码输入界面for(i=0;i<16;i++){LcdWriteData(CDIS1[i]);}LcdWriteCom(0x80+0x40);for(i=0;i<16;i++){LcdWriteData(CDIS2[i]);}while(1){KeyScan(); //扫描键盘if(CodeDel==4) //若输入正确的组合按键,可重设密码SetCode();else if(CodeDel==2) //若输入正确的组合按键,则清除密码,直接进入系统{Wrongnum=0; //若输入正确,错误次数清零Annum=0; //密码计数器清零CodeDel=0; //组合键标志位清0Key_Flag=0; //按键标志位清0Hongwai_Flag=0; //红外标志位清0LcdWriteCom(0x80); //进入欢迎界面 5sfor(i=0;i<16;i++){LcdWriteData(CDIS3[i]);}LcdWriteCom(0x80+0x40);for(i=0;i<16;i++){LcdWriteData(CDIS4[i]);}DelayMs(50000);LcdWriteCom(0x80);for(i=0;i<16;i++) //等待结束后,次数清零,显示输入密码界面{LcdWriteData(CDIS1[i]);}LcdWriteCom(0x80+0x40);for(i=0;i<16;i++){LcdWriteData(CDIS2[i]);}}if(Key_Flag==1){Key_Flag=0;Code[Annum-1]=KeyValue; //将输入值存入密码数组中beep(KeyValue * 30);LcdWriteCom(0xc0+6+Annum);LcdWriteData(42);}if(Hongwai_Flag==1) //若接受到了红外数据{DelayMs(500);if(Hongwai_Flag==1) //不知道因为什么原因,红外接收的中断会开启两次,为了防止数据重复,写了此次延时判断{Annum++; //按键次数加1Hongwai_Flag=0;Code[Annum-1]=HongwaiValue;//将输入值存入密码数组中beep(HongwaiValue * 40);LcdWriteCom(0xc0+6+Annum);LcdWriteData(42);}}if(Annum>=6) //6位密码输入完毕或检测到特殊组合按键{CodeFlag=1; //暂时令标志位为1,若密码有错误,则再置0for(i=0;i<6;i++){if(Code[i]!=RIGHTCODE[i]) //若密码与正确密码不相等CodeFlag=0;}if(CodeFlag==0) //若输入错误,清零重新输入,并将错误输入次数加一{Wrongnum++;if(Wrongnum==3) //若错误次数达到三次{beep(100); //警报LcdWriteCom(0x80); //显示错误信息,等待10sfor(i=0;i<16;i++){LcdWriteData(CDIS5[i]);}LcdWriteCom(0x80+0x40);for(i=0;i<16;i++){LcdWriteData(CDIS6[i]);}WrongTime='9'; //等待时间while(WrongTime!='0'){LcdWriteCom(0x80+0x40+13);LcdWriteData(WrongTime);DelayMs(10000);WrongTime--;}Wrongnum=0;}Annum=0;Key_Flag=0; //按键标志位清0Hongwai_Flag=0; //红外标志位清0LcdWriteCom(0x80);for(i=0;i<16;i++) //等待结束后,次数清零,显示输入密码界面{LcdWriteData(CDIS1[i]);}LcdWriteCom(0x80+0x40);for(i=0;i<16;i++){LcdWriteData(CDIS2[i]);}}if(CodeFlag==1) //密码输入正确{Wrongnum=0; //若输入正确,错误次数清零Annum=0; //密码计数器清零LcdWriteCom(0x80); //进入欢迎界面 5sfor(i=0;i<16;i++){LcdWriteData(CDIS3[i]);}LcdWriteCom(0x80+0x40);for(i=0;i<16;i++){LcdWriteData(CDIS4[i]);}DelayMs(50000);LcdWriteCom(0x80);for(i=0;i<16;i++) //等待结束后,次数清零,显示输入密码界面{LcdWriteData(CDIS1[i]);}LcdWriteCom(0x80+0x40);for(i=0;i<16;i++){LcdWriteData(CDIS2[i]);}/*标志清零需放在后面,因为在密码输入正确后的显示时间内,外部中断或按键都会使标志位为1,进而在再次显示密码时弹出一位密码值*/Key_Flag=0; //按键标志位清0Hongwai_Flag=0; //红外标志位清0}}}}/******************************************************************************* * 函数名 : SetCode()* 函数功能: 设置密码*******************************************************************************/ void SetCode(){int i,j=0;Wrongnum=0; //错误次数清零Annum=0; //密码计数器清零CodeDel=0; //组合键标志位清0Key_Flag=0; //按键标志位清0Hongwai_Flag=0; //红外标志位清0LcdWriteCom(0x80);for(i=0;i<16;i++) //初始化LCD1602显示,显示设置密码界面{LcdWriteData(CDIS0[i]);}LcdWriteCom(0x80+0x40);for(i=0;i<16;i++){LcdWriteData(CDIS2[i]);}DelayMs(1000);while(j<6){KeyScan(); //扫描键盘if(Key_Flag==1){Key_Flag=0;RIGHTCODE[j]=KeyValue;beep(KeyValue * 30);LcdWriteCom(0xc0+7+j);LcdWriteData(42);j++;DelayMs(1000);}if(Hongwai_Flag==1) //若接受到了红外数据{DelayMs(500);if(Hongwai_Flag==1) //不知道因为什么原因,红外接收的中断会开启两次,为了防止数据重复,写了此次延时判断{Hongwai_Flag=0;RIGHTCODE[j]=HongwaiValue;beep(HongwaiValue * 40);LcdWriteCom(0xc0+7+j);LcdWriteData(42);j++;DelayMs(1000);}}}LcdWriteCom(0x80);for(i=0;i<16;i++) //初始化LCD1602显示,展示密码输入界面{LcdWriteData(CDIS1[i]);}LcdWriteCom(0x80+0x40);for(i=0;i<16;i++){LcdWriteData(CDIS2[i]);}Wrongnum=0; //错误次数清零Annum=0; //密码计数器清零Key_Flag=0; //按键标志位清0Hongwai_Flag=0; //红外标志位清0}/******************************************************************************* * 函数名 : DelayMs()* 函数功能 : 延时*******************************************************************************/void DelayMs(unsigned int x) //0.14ms误差 0us{unsigned char i;while(x--){for (i = 0; i<13; i++){}}}/******************************************************************************* * 函数名 : IrInit()* 函数功能 : 初始化红外线接收*******************************************************************************/void IrInit(){IT0=1;//下降沿触发EX0=1;//打开中断0允许EA=1; //打开总中断IRIN=1;//初始化端口}/******************************************************************************* * 函数名 : ReadIr()* 函数功能 : 读取红外数值的中断函数*******************************************************************************/void ReadIr() interrupt 0{unsigned char j,k;unsigned int err;Time=0;DelayMs(70);if(IRIN==0) //确认是否真的接收到正确的信号{err=1000; //1000*10us=10ms,超过说明接收到错误的信号/*当两个条件都为真是循环,如果有一个条件为假的时候跳出循环,免得程序出错的时侯,程序死在这里*/while((IRIN==0)&&(err>0)) //等待前面9ms的低电平过去{DelayMs(1);err--;}if(IRIN==1) //如果正确等到9ms低电平{Hongwai_Flag=1; //正确收到信号,标志位置1err=500;while((IRIN==1)&&(err>0)) //等待4.5ms的起始高电平过去{DelayMs(1);err--;}for(k=0;k<4;k++) //共有4组数据{for(j=0;j<8;j++) //接收一组数据{err=60;while((IRIN==0)&&(err>0))//等待信号前面的560us低电平过去{DelayMs(1);err--;}err=500;while((IRIN==1)&&(err>0)) //计算高电平的时间长度。