基于单片机红外密码锁毕业论文

更新时间:2024-04-03 13:54:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

毕业设计(论文)

基于单片机的红外密码锁设计

系 别:

专 业: 姓 名:

班 级:

指导老师:

摘要

现今人类步入一个科学技术日新月异的时代,人们对各种日常生活中的锁具的安全性要求也越来越高。而红外遥控密码锁恰好能解决人们对这种安全性能的需求。因此红外遥控密码锁已成为财物安全保障必不可少的的装置。

本红外遥控密码锁设计采用单片机AT89C51,结合红外线发射器与红外线接收器,在考虑经济适用的情况下,整合单片机与红外线遥

控技术,将用于安全保障的锁具进一步智能化。

本设计除了拥有普通密码锁的功能之外,还新增了红外遥控功能、报警功能,这些都使其更加的智能化、人性化。

关键词:单片机、AT89C51、红外线、遥控、智能化

ABSTRACT

Nowadays human into a science and technology to change rapidly in the era, people on a variety of daily life in the lock of the safety requirements are also getting higher and higher .And infrared remote control cipher lock that can solve the safety requirements. The infrared remote control cipher lock has become the property security essential device.

The infrared remote control cipher lock design uses a single chip AT89C51, combined with the infrared emitter and the infrared receiver, in considering the economic applicable, the integration of SCM and infrared remote control technology, will be used for security lock further intelligence.

This design includes commonly used digital tube display circuit, which can display the input digital code, and can modify the password .all of these make it more intelligent, humane.

Keywords:microcomputer、AT89C51、infrared remote control、 single-chip、intelligent

目录

摘要???????????????????????????2 Abstract?????????????????????????3 第一章 绪论???????????????????????6 1.1 设计思路?????????????????????6 1.2 设计的意义????????????????????6 1.3 课题背景?????????????????????6

1.4 密码锁发展趋势和特点???????????????7 第二章 红外遥控系统???????????????????8

2.1 红外通信原理???????????????????8 2.2 红外线的基本知识?????????????????9 2.3 红外遥控系统结构?????????????????10

2.3.1 调制?????????????????????10 2.3.2 解码?????????????????????10 2.3.3 发射系统???????????????????11 2.3.4 红外接收头HS0038 ??????????????12 2.4 红外编码格式???????????????????13 2.5 密码锁的功能???????????????????14 第三章 红外密码锁硬件设计????????????????16

3.1 系统整体框图???????????????????16

3.1.1 最小系统???????????????????16 3.2 LCD1602介绍???????????????????19

3.2.1 LCD1602引脚名称及功能图???????????19 3.3 密码锁设计????????????????????20 3.4 4*4按键设计和仿真图???????????????21 第四章 红外密码锁的软件部分??????????????19

4.1 LCD1602软件设计?????????????????22 4.2 红外系统软件设计?????????????????22 4.3 红外遥控密码锁主程序设计?????????????23

第五章 系统的调试 ???????????????????22

5.1 调试仪器?????????????????????25 5.2 整体调试?????????????????????25 5.3 硬件调试?????????????????????25 5.4 软件调试?????????????????????25 第六章 结论??????????????????????27 致谢??????????????????????????28 参考文献????????????????????????29 附录??????????????????????????29

第一章 绪论

1.1设计思路

该设计考虑到实际需要,以单片机为主控器,设计了一套较简易实用系统,实现红外遥控密码锁系统的基本控制功能。该系统的硬件部分包括红外发射和接收、显示输出、按键等部分。红外发射器和接收装置对红外遥控的处理,显示输出部分采用LCD1602显示,系统软件部分用单片机C语言实现了本设计的全部控制功能。效果快速精

确,示清晰直观,比较理想的实现了设计要求.它解决了已往机械式的不安全和操作不方便等弊端,而红外遥控应用将更加广泛,实用性更强。 1.2设计的意义

目前大部分的锁采用的都是机械式的,其最大的缺点是利用简单工具就能很容易地把锁打开。针对这种情况,我们设计了一种红外遥控密码锁,而一般设备都采用专用的遥控编码及解码集成电路,其制作简单、容易,保密性好、安全可靠、成本低廉、连接方便,简单易用,适用范围广等优点。 1.3课题背景

进入二十一世纪以来各种电子信息技术进入高速发展阶段,包括信息系统技术微电子、计算机和现代通信技术、传感器技术,这也包括红外线技术,红外线是一种人的肉眼看不见的光线,最近二三十年来,初露头角的红外技术,在各个领域里获得了广泛的应用。开始应用到生产上,并形成了一门崭新的技术—红外技术。本设计针对传统机械锁的不足而设计的通过红外来控制的密码锁 1.4密码锁的发展趋势与特点

密码锁产生也是经历了一些阶段的,有传统的机械密码锁,电子密码锁,数字密码锁等。随着科学技术的发展,一些以芯片特别是单片机为处理核心的新型密码锁开始不断出现。电子密码锁是一种通过密码输入来控制电路或是芯片工作,从而控制机械开关的闭合,完成开锁、闭锁等任务。本论文就以AT89C51单片机设计了一个红外遥控

密码锁。

第二章 红外遥控系统

2.1 红外通讯原理

红外通信的基本原理是发送端将基带二进制信号调制为一系列的脉冲串信号(载波信号) ,通过红外发射管发射红外信号。常用的有通过脉冲宽度来实现信号调制的脉宽调制(PWM)和通过脉冲串之间的时间间隔来实现信号调制的脉时调制(PPM)两种方法。脉时调制(PPM)是红外数据协会(IrDA)和国际电子电工委员会(IEEE)都

推荐的调制方式,本设计采用PPM调制方法,即用两个脉冲串之间的时间间隔来表示二进制信息,数据比特的传送仿照不带奇偶校验的RS232 通信,首先产生一个同步头,然后接着 8 位数据比特。如图 1.1所示

如图1.1 PPM调制波形图

普通的红外遥控采用面向指令的帧结构,数据帧由同步码,地址码和指令码组成,指令码长度多为 8~16 个比特,传送多字节遥控协议时效率偏低,而增加指令码的长度不利于接收器同步,为此本设计选用一种面向字节的帧结构,采用类似于异步串行通信的帧结构,每帧由一个起始位(二进制数 0) 、8 个数据位和 2 个停止位(二进制数 1)构成,如图1.2 所示。每帧传送 1 个字节的数据,帧与帧间隔大于 2ms,帧结构不含地址信息,寻址问题由高层协议解决。

如图1.2 数据帧结构示意图

由于红外光存在反射,在全双工的方式下发送的信号也可能会被本身接收,因此红外通信应采用异步半双工方式,即通信的某一方发

送和接收是交替进行的。 2.2 红外线的基本知识

所谓红外线是指波长超过红色可见光的电磁辐射,利用红外辐射实现的无线数据传输,称为红外线技术。红外线波长一般是在750nm至1mm之间,它的频率高于微波而低于可见光,是一种人的眼睛看不到的光线。

红外通讯一般采用红外波段内的近红外线,波长在0.75um至25um之间。红外数据协会(IRDA)成立后,为了保证不同厂商的红外产品能够获得最佳的通讯效果,红外通讯协议将红外数据通讯所采用的光波波长的范围限定在850nm至900nm之内。

由于红外线的波长较短,对障碍物的衍射能力差,所以更适合应用在需要短距离无线通讯的场合,进行点对点的直线数据传输。 红外通信是利用红外技术实现两点间的近距离保密通信和信息转发。它一般由红外发射和接收系统两部分组成。发射系统对一个红外辐射源进行调制后发射红外信号,而接收系统用光学装置和红外探测器进行接收,就构成红外通信系统。

红外通信具有保密性强,息容量大,结构简单等特点,既可以是室内使用,也可以在野外使用,由于它具有良好的方向性,常被用于国防边界哨所与哨所在之间的保密通信, 但红外射束易受尘埃、雨水等物质的吸收,如何在野外环境下克服这些物质的吸收,增强红外射束信号的强度是重要的研究课题。 2.3红外遥控系统结构

红外遥控系统主要分为调制部分、发射部分、接收部分,如图1.3所示:

如图1.3 红外遥控系统

2.3.1 调制

红外信号的调制有脉冲宽度调制(PWM),脉冲位置调制(PPM)等方法,本设计采用脉宽调制。二进制的调制由单片机来完成,它把编码后的二进制信号调制成频率为38khz的间断脉冲串,此脉冲串即是用于红外发射二极管发送的信号。如图2-4,A是二进制信号的编码波形,B是频率为38khz(周期约为26us)的连续脉冲串,C是经调制后的间断脉冲串,即是用于发送的信号。图2-4中,待发的二进制数据为101。

2.3.2 解码

如图1.4 信号调制示意图

二进制信号的解调由一体化红外接收头来完成,它把接收到的信号经内部处理并解调复原,输出如图中的波形E。接收头的解调可理解为:在输入脉冲串时输出低电平,否则输出高电平。二进制的解码

由单片机来完成,它把红外接收头送来的二进制编码波形通过解码,还原成发送端发送的数据。如图1.5把波形E解码还原成数据信息101。

如图1.5 信号解调示意图

2.3.3 发射系统

目前有很多种芯片可以实现红外发射,可以根据选择发出不同种类的编码。由于发射系统一般用电池供电,这就要求芯片的功耗要很低,芯片大多都设计成可以处于休眠状态,当有按键按下时才工作,这样可以降低功耗,芯片所用的晶振应该有足够的耐物理撞击能力,不能选用普通的石英晶体,一般是选用陶瓷共鸣器,陶瓷共鸣器准确性没有石英晶体高,但通常一点误差可以忽略不计。

红外线通过红外发光二极管(LED)发射出去,红外发光二极管内部材料和普通发光二极管不同,在其两端施加一定电压时,它发出的是红外线而不是可见光。

如图1.6 简单驱动电路 如图1.7 发射极输出驱动电路

如图1.6和图1.7是LED的驱动电路,图3a是最简单电路, 选

用元件时要注意三极管的开关速度要快,还要考虑到LED的正向电流和反向漏电流,一般流过LED的最大正向电流为100mA,电流越大,其发射的波形强度越大。 图2.5电路有一点缺陷,当电池电压下降时,流过LED的电流会降低,发射波形强度降低,遥控距离就会变小。图2.6所示的射极输出电路可以解决这个问题,两个二极管把三级管基极电压钳位在1.2V左右,因此三级管发射极电压固定在0.6V左右,发射极电流IE基本不变,根据IE≈IC,所以流过LED的电流也基本不变,这样保证了当电池电压降低时还可以保证一定的遥控距离。

2.3.4 红外接收头HS0038

如图1.8 红外接收头HS0038

红外接收头的种类很多,引脚定义也不相同,一般都有三个引脚,包括供电脚,接地和信号输出脚。根据发射端调制载波的不同应选用相应解调频率的接收头,本设计选用如图1.8的红外接收头。

红外接收头内部放大器的增益很大,很容易引起干扰,因此在接收头的供电脚上须加上滤波电容,一般在22uf以有的厂家建议在供电脚和电源之间接入330欧电阻,进一步减少电源干扰。

2.4红外编码格式

遥控发射器专用芯片很多,红外遥控的编码目前广泛使用的是:NEC Protocol 的 PWM(脉冲宽度调制)和 Philips RC5 Protocol 的 PPM,本设计基于NEC协议。其编码特征如下:

1)8 位地址和 8 位指令长度;

2)地址和命令 2 次传输(确保可靠性)

3)PWM 脉冲位置调制,以发射红外载波的占空比代表“0”和“1”;

4)载波频率为 38Khz;

5)位时间为1.125ms 或 2.25ms;

一个脉冲对应 560us 的连续载波,一个逻辑 1 传输需要 2.25ms(560us脉冲+1680us低电平),占空比1/4:一个逻辑 0的传输需要 1.125ms(560us 脉冲+560us 低电平),占空比1/2。而遥控接收头在收到脉冲的时候为低电平,在没有脉冲的时候为高电平,这样,我们在接收头端收到的信号为:逻辑 1 应该是 560us 低+1680us 高,逻辑 0 应该是 560us 低+560us 高。如图1.9所示:

如图1.9 红外脉冲 NEC 遥控指令的数据格式为:

同步码头、地址码、地址反码、控制码、控制反码。同步码由一个 9ms 的低电平和一个 4.5ms 的高电平组成,地址码、地址反码、

控制码、控制反码均是8 位数据格式。按照低位在前,高位在后的顺序发送。采用反码是为了增加传输的可靠性,如图2.0所示:

如图2.0 遥控指令数据格式

一个命令只发送一次,即使遥控器上的按键一直按着。但是会每110ms发送一次代码,直到遥控器按键释放。如图 2.1

如图 2.1 重复按键数据格式

2.5 密码锁的功能

a:设定密码在该设计中设定了一组原始密码123456,用户可以通过主机矩形键盘的修改键来修改原始密码。

b: 密码输入有效显示为了确信是否有键按下以及防止密码外泄,在电路中设置了数码管显示,即在显示时并不是显示用户按下的数字符号,而是在输入一位时,数码管则显示一个字符“ *”,这样既巧妙地提醒了用户又保护了用户密码。

c:错误报警当用户输入的密码连续三次出现密码错误时,系统会长期报警不止,这时必须按复位方可停止。

d. 遥控开锁这是本论文设计中的最大特点之处,用户可以不

必在主机上输入。密码开锁。只要手执遥控器,键入正确密码,便会自动开锁如果密码错误,同样也会报警

第三章 硬件设计

3.1 系统整体框图

本文所设计的红外遥控密码锁系统由AT89C51单片机及其最小系统、红外接收头、红外发射器、蜂鸣器、电磁锁、LCD1602液晶显示等部分组成。如图2.2所示

如图2.2 系统整体框图

3.1.1 最小系统

本设计是采用的AT89C51的单片机,它的引脚如图2.3所示,引脚说明如下:

1、 信号引脚:P0.0:~P0.7、P1.0:~P1.7、 P2.0:~P2.7、

P3.0:~P3.7都是8位双向口线,都由锁存器、输入缓冲器、输出驱动器组成。

2、 ALE:地址锁存控制信号。在系统扩展时,ALE用于控制把

P0口输出的低8位地址锁存器锁存起来,以实现低位地址和数据的隔离。

3、 PSEN:外部程序存储器读选通信号。以实现外部ROM单元读

操作。

4、 EA:访问程序存储控制信号。 5、 RST:复位信号。

6、 XTAL1和XTAL2:外接晶体引线端。当使用芯片内部时钟时,

用于外接石英晶体和微调电容;当使用外部时钟时,用于接外部时钟脉冲信号。 7、 VSS:地线 8、 VCC:+5V电源。

如图2.3 AT89C51引脚图

本设计采用AT89C51系列单片机。AT89C51是一种带4K字节闪烁可编程可擦除只读存储器(FPEROM—Falsh Programmable and Erasable Read Only Memory)的低电压,高性能CMOS8位微处理器,俗称单片机。AT89C2051是一种带2K字节闪烁可编程可擦除只读存储器的单片机。单片机的可擦除只读存储器可以反复擦除100次。该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,AT89C2051是它的一种精简版本。AT89C单片机为很多嵌入式控制系

统提供了一种灵活性高且价廉的方案其中最小系统包括复位电路、晶振电路。

复位电路:此设计采用手动按键复位方式实现系统的复位操作.手动复位要求在电源接通的条件下,在单片机运行期间,用按钮开关操作使单片机复位.其结构如图 中R17和C6及按键.手动按键复位是通过按键将RST与VCC接通来实现.如图2.4所示

晶振电路:单片机内部具有一个高增益反相放大器,用于构成振荡器.通常在引脚XTALl和XTAL2跨接石英晶体和两个补偿电容构成自激振荡器,结构如图 中Y1,C5,C6.本设计选择12MHz频率的石英晶体,补偿电容采用30pF左右的瓷片电容。如图2.5所示

如图2.4 复位电路接线图

如图2.5 晶振电路接线图

3.2 LCD1602的介绍

LCD1602显示器具有体积小、功耗低、显示内容丰富、超薄轻巧等优点,因此,在袖珍式仪表和低功能应用系统中得到越来越广泛的应用。LCD1602液晶显示是2行*16个字符的字符型显示器,它由32个字符点阵块组成,每个字符点阵块由5*7或5*10个点阵组成,可以显示ASCII码表中的所有可视的字符,采用+5V电源供电,外围电路配置简单,价格便宜,具有很高的性价比。如图2.6 所示LCD1602及其接口设计图。

如图2.6 LCD1602引脚及其接口设计图。

3.2.1 LCD1602引脚名称及功能 1602采用标准的16脚接口,其中: 第1脚:VSS为电源地 第2脚:VCC接5V电源正极

第3脚:V0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高(对比度过高时会 产生“鬼影”,使用时可以通过一个10K的电位器调整对比度)。

第4脚:RS为寄存器选择,高电平1时选择数据寄存器、低电平0

时选择指令寄存器。

第5脚:RW为读写信号线,高电平(1)时进行读操作,低电平(0)时进行写操作。

第6脚:E(或EN)端为使能(enable)端,高电平(1)时读取信息,负跳变时执行指令。

第7~14脚:D0~D7为8位双向数据端。

第15~16脚:空脚或背灯电源。15脚背光正极,16脚背光负极。

3.3 密码锁设计

电磁锁是用继电器来驱动的,当单片机通过RELAY发信号给了继电器,继电器吸合(接常开触点),使解锁机构通电,打开门锁。如图2.7 密码锁驱动电路图。

如图2.7 密码锁驱动电路图。

3.4 4*4按键设计及仿真图

如图2.8 4*4按键设计及仿真图

第四章系统的软件设计

本系统控制软件采用AT89S52及KEIL调试工具。本系统程序代码使用C语言编写。本设计的软件部分采用模块化设计。LCD1602流程图、红外接收流程图、红外发射流程图等模块组成。

4.1 LCD1602软件设计 显示程序:

开始 写指令 评定LCD忙状态 写显示数据到LCD

Y

图2.9 显示程序

4.2 红外系统软件设计

红外遥控的工作原理,红外遥控的发射电路是采用红外发光二极管来发出经过调制的红外光波,红外接收电路将红外发射器发射的红外光转换为相应的电信号,再送后置放大器。

发射端一般由指令键、指令编码系统、调制电路、驱动电路、发射电路等几部分组成。当按下指令键时,指令编码电路产生所需的指令编码信号,指令编码信号对载体进行调制,再由驱动电路进行功率放大后由发射电路向外发射经调制定指令编码信号,如图3.1红外遥控的发射程序流程图。

接收端一般由接收电路、放大电路、调制电路、指令译码电路、驱动电路、执行电路(机构)等几部分组成。接收电路将发射器发出的已调制的编码指令信号接收下来,并进行放大后送解调电路,解调电路将已调制的指令编码信号解调出来,即还原为编码信号。指令译码器将编码指令信号进行译码,最后由驱动电路来驱动执行电路实现各种指令的操作控制(机构),如图3.2红外遥控的发射程序流程图。

开始 开始 串口初始化 串行口初始化

N

N N Y

Y

N N Y Y 执行相应程序

图3.1红外遥控的发射程序流程图 图3.2 红外遥控的发射程序流程图。

4.3 红外遥控密码锁主程序设计

根据控制要求以及各项程序流程,进行总体设计如下图3.3主程序流程图所示。 开始 有红外中断? 调用中断解码程序 红外解码

报警

N

Y Y 中断返回 图3.3红外遥控密码锁主程序设计

第五章 系统调试

5.1调试仪器

调试使用的设备如下所示:

序号 1 2 3 4 5 6 名称 计算机 直流稳压电源 万用表 串口调试通信线 Keil c51编译软件 仿真软件 数量 1 2 1 1 备注 有2个串口 5V

7 示波器 1 5.2整体调试

本设计的调试分为硬件调试和软件调试两部分组成。经分后,在制作硬件电路时候,调试也在进行这样有利于问题的分析和解决,不会造成问题的积累,从而节约了大量时间做之后的工作,软件调试是从单元调试开始。 5.5 硬件调试

红外钥匙调试:当按下按键时,系统上电,确保单片机能自锁电子开关,维持开关正常供电。在软件未编写的情况下,首先模拟单片机自锁的操作,发现电子开关能自锁,系统正常供电。软件编好在调试也可以正常工作。 5.6 软件调试

对于本设计来说软件调试还是挺麻烦的,整个程序用的是C语言。

用51单片机下载线将程序下载到单片机内,用串口USB线来检测发送和接收的数据来对照修改。首先要保证每个模块独立能够发送接收的数据符合要求,再来用线连接主机来测试单片机之间的串口通信协议是否正确。之后在加上红外发送和接收模块来统一测试。

红外遥控密码锁主程序设计

第六章 结论

本课题研究的是具有单片机功能的红外遥控密码锁,通过掌握其原理及控制过程,以及运用编程来解决红外发生的问题,最终目的在于独立查资料和思考来解决问题的能力。巩固自己的专业知识,例如:单片机的编程,单片机的结构,ptotel的使用,掌握一个电子专用软件设计的电路。加强动手能力,学会电路调试方法解决实际出现的问题。在这次设计中我知道由于自己知识领域有限,加之经验不足,本设计仍存在一些设计问题和缺陷,个人水平还有待提高,理论知识还有待加强。

致谢

四个月的毕业设计即将结束,回想整个做毕业设计的经历,使我认识到自己在专业知识上的欠缺,由于基础知识掌握得不够扎实,在实际运用中不够得心应手,但做毕业设计本就是一个不断发现问题、解决问题,只有不断的发现自己的不足才能够不断进步。此次毕业设计不仅让我对单片机有了更深一步的了解,同时也增强了自己的动手实践能力,为以后的工作打下了基础。

本论文是在我的导师戴俨炯老师的精心指导和悉心关怀下完成的,导师的严谨治学态度、无私的奉献精神使我深受启迪。从尊敬的导师身上,我不仅学到了扎实的专业知识,也学到了做人的道理。在

此我要向我的导师致以最衷心的感谢和深深的敬意。在这次设计过程中,自己设计的系统出现了很多错误,戴老师细心指导将自己设计的系统逐渐完善,在方案设计上戴老师也是及时纠正自己犯的低级错误,经过和戴老师交流发现了自己还有很多不足的地方,很多地方仅仅以自己课本上理论学的知识去解决,往往忽略了实际情况,而往往这些东西很容易被忽略,遇到问题不善于变通。戴老师不仅指点系统设计中出现的错误,更多的是教会我们解决问题的方法,教会了我们在拿到一个课题的时候应该如何处理。在这次毕业设计的过程中培养了独自研究问题能力。在多年的学习生活中,还得到了许多学院领导、系领导和老师的热情关心和帮助。最后,向所有关心和帮助过我的领导、老师、同学和朋友表示由衷的谢意!

参考文献

[1] 张俊谟编. 单片机原理中级教程[M]. 北京:北京航空航天大学出版社.

[2] 周立功编. Keil C51使用手册[M]. 北京:北京航空航天大学出版社.

[3] 苏长赞编. 红外线与超声波遥控[M]. 北京:人民邮电出版社. [4] 牛翌光.单片机原理及接口技术[M].北京:电子工业出版社 [5] 天狼星系列 单片机视频教程.

[6] 杨路明.C语言程序设计[M].北京:北京邮电大学出版社

附录

附录一:LCD显示、按键、延时程序设计:

#include #include #include \

#define uchar unsigned char #define uint unsigned int #define key P0

void delay(unsigned char t); void delay1(); void key_input(void); void newkeyinput(void);

unsigned char lcd_r_start(); void busy();

void wrc(unsigned char wcom); void wrd(unsigned char wdat); void wrn(unsigned char word[]); void lcdint(); sbit k=P2^0;

sbit RS=P3^0; //LCD控制位 sbit RW=P3^1; //LCD控制位 sbit E=P3^2; //LCD控制位

sbit Scl=P3^4; //串行时钟 sbit Sda=P3^5; //串行数据

unsigned char bdata usyflag; unsigned char n,m,f,dat,datn;

unsigned char word1[16]={\//第1行显示缓存

unsigned char word2[16]={\ //第2行显示缓存

code unsigned char word3[16]={\//用于固定显示的数据,固化到ROM中

code unsigned char word4[16]={\ //用于固定显示的数据,固化到ROM中

code unsigned char word5[16]={\ //用于固定显示的数据,固化到ROM中 unsigned char key1[]={1,2,3,4,5,6}; //用于老密码

unsigned char key2[]={8,8,8,8,8,8}; //用于按键输入存放密码

unsigned char key3[]={0,0,0,0,0,0}; //用于按键输入存放密码

void delay(unsigned char t) {

unsigned char j,i; for(i=0;i

for(j=0;j<50;j++); }

void delay1() {

_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); }

unsigned char scan_key(void ) {

unsigned char keyvalue; key=0xf0; if(key!=0xf0) {

delay(10);

if(key!=0xf0) {

keyvalue=key&0xf0; key=0x0f;

keyvalue=~(keyvalue|(key&0x0f)); key=0xf0;

}

switch(keyvalue) {

case 0x11: n=0; break; case 0x12: n=1; break; case 0x14: n=2; break; case 0x18: n=3; break; case 0x21: n=4; break; case 0x22: n=5; break; case 0x24: n=6; break; case 0x28: n=7; break; case 0x41: n=8; break; case 0x42: n=9; break; case 0x44: n=10; break; case 0x48: n=11; break; case 0x81: n=12; break; case 0x82: n=13; break; case 0x84: n=14; break; case 0x88: n=15; break; default: n=16;break; return n; } } }

void key_input(void) {

unsigned char j,s; scan_key( ); k=P1;

if((n<10)&&(k!=0xf0)) //1~9按键按下 {

wrc(0x80+j); //显示*

wrd('*'); s=1; n=16; }

k=P1;

if((s==1)&&(k==0xf0)) // 密码输入 {

key2[j]=n; j++; if(j>5) {

m=1; //6 j=0; } else {m=0;} s=0; }

/*if((n=10)&&(k!=0xf0)) // {

s=1; n=16; }

k=P1;

if((s==1)&&(k==0xf0)) {

j=j-1; }

s=0; */ }

void newkeyinput(void) {

unsigned char j,s,x; if(n==12) {

位密码输入标志 输入错误、10号键后退修改

wrc(0x80); //显示第1行的第1个字符 wrn(word1);

wrc(0xc0); //显示第3行的第1个字符 wrn(word3); scan_key( ); k=P1; x=1; }

if((x==1)&&(n<10)&&(k!=0xf0)) //1~9按键按下 {

wrc(0x80+j); //显示* wrd('*'); s=1; n=16; }

k=P1;

if((s==1)&&(k==0xf0)) {

key3[j]=n; j++; if(j>5) {

j=0;

m=1; //6位密码输入标志 x=0; } else {m=0;} s=0; } }

void kaisuo(void) {

uchar r; scan_key( ); key_input( );

if((m=1)&&(key2[0]==key1[0])&&(key2[1]==key1[1])&&(key2[2]==key1[2])&&(key2[3]==key1[3])&&(key2[4]==key1[4])&&(key2[5]==key1[5]))

r=1; else r=0;

if((r==1)&&(n==11)) { k=0; wrc(0x00); wrn(word4); n=16; }

if((r==0)&&(n=11)) { k=1;

wrc(0x00); wrn(word5); n=16; } }

void Start(void) {

Sda=1; Scl=1; _nop_ (); _nop_ (); _nop_ (); _nop_ (); Sda=0; _nop_ (); _nop_ (); _nop_ (); _nop_ (); }

void Stop(void) /*停止条件*/ {

Sda=0; Scl=1;

_nop_ (); _nop_ (); _nop_ (); _nop_ (); Sda=1; _nop_ (); _nop_ (); _nop_ (); _nop_ (); }

void Ack(void) /*应答位*/ {

Sda=0; _nop_ (); _nop_ (); _nop_ (); _nop_ (); Scl=1; _nop_ (); _nop_ (); _nop_ (); _nop_ (); Scl=0; }

void NoAck(void) /*反向应答位*/ {

Sda=1; _nop_ (); _nop_ (); _nop_ (); _nop_ (); Scl=1; _nop_ (); _nop_ (); _nop_ (); _nop_ (); Scl=0; }

void Send(uchar Data) /*发送数据子程序,Data为要求发送的数据*/

{

uchar BitCounter=8; /*位数控制*/ uchar temp; /*中间变量控制*/ do {

temp=Data; Scl=0; _nop_ (); _nop_ (); _nop_ (); _nop_ ();

if((temp&0x80)==0x80)/* 如果最高位是1*/ Sda=1; else

Sda=0; Scl=1;

temp=Data<<1; /*RLC*/ Data=temp; BitCounter--; }while(BitCounter); Scl=0; }

uchar Read(void) /*读一个字节的数据,并返回该字节值*/ {

uchar temp=0; uchar temp1=0;

uchar BitCounter=8; Sda=1; do{

Scl=0; _nop_ (); _nop_ (); _nop_ (); _nop_ (); Scl=1; _nop_ ();

_nop_ (); _nop_ (); _nop_ ();

if(Sda) /*如果Sda=1;*/

temp=temp|0x01; /*temp的最低位置1*/ else

temp=temp&0xfe; /*否则temp的最低位清0*/ if(BitCounter-1) { temp1=temp<<1; temp=temp1; }

BitCounter--; }while(BitCounter); return(temp); }

void WrToROM(uchar Data[],uchar Address,uchar Num) //写入一组数据到AT24C02中 {

uchar i=0; uchar *PData; PData=Data;

Start(); Send(0xa0);

//A0、A1、A2接地,固AT24C02的写地址为0XA0 Ack();

Send(Address); Ack();

for(i=0;i

Send(*(PData+i)); Ack(); }

Stop(); }

void RdFromROM(uchar Data[],uchar Address,uchar Num) {

uchar i=0;

uchar *PData; PData=Data;

for(i=0;i

Start(); Send(0xa0);

//A0、A1、A2接地,固AT24C02的写地址为0XA0 Ack();

Send(Address+i); Ack(); Start(); Send(0xa1);

//A0、A1、A2接地,固AT24C02读地址为0XA1 Ack();

*(PData+i)=Read(); Scl=0; NoAck(); Stop(); } }

unsigned char lcd_r_start() {

unsigned char s;

RW=1; //RW=1,RS=0,读LCD状态 delay1(); RS=0; delay1();

E=1; //E端时序 delay1();

s=P0; //从LCD的数据口读状态 delay1(); E=0;

delay1(); // RW=0; //delay1();

return(s); //返回读取的LCD状态字 }

void busy() //查询LCD是否忙碌子程序

{ unsigned char m; do {

m=lcd_r_start(); m=m&0x80; }while(m!=0); }

void wrc(unsigned char wcom) //写控制指令子程序 {

busy(); RW=0; delay1();

RS=0; // RW=1,RS=0,写LCD命令字 delay1();

E=1; //E端时序 delay1();

P0=wcom; //将com中的命令字写入LCD数据口 delay1(); E=0;

delay1(); RW=1;

delay(255); }

void wrd(unsigned char wdat) //写数据寄存器子程序 {

busy(); RW=0; delay1();

RS=1; // RW=1,RS=0,写LCD命令字 delay1();

E=1; // E端时序 delay1();

P0=wdat; // 将dat中的显示数据写入LCD数据口 delay1(); E=0;

delay1(); RW=1;

delay(255); }

void lcdint() {

wrc(0x38); wrc(0x01); wrc(0x06); wrc(0x0c); }

void wrn(unsigned char word[]) {

unsigned char i; for(i=0;i<16;i++) {

wrd(word[i]); } }

void main() {

lcdint(); //初始化

wrc(0x80); //显示第1行的第1个字符 wrn(word1);

wrc(0xc0); //显示第2行的第1个字符 wrn(word2);

while(1) {

key_input();

}

} }

附录二:红外遥控设计

#include //头文件, #include\ #include\”

#include

#define TURE 1 #define FALSE 0

sbit IR=P3^3; //红外接口标志 unsigned char irtime;//红外用全局变量 bit irpro_ok,irok; unsigned char IRcord[4];

//处理后的红外码,分别是 客户码,客户码,数据码,数据码反码 unsigned char irdata[33];

//33个高低电平的时间数据 /*函数声明 */ void ShowString (unsigned char line,char *ptr); /*定时器0中断服务函数 */

void tim0_isr (void) interrupt 1 using 1 //定时器0中断服务函数 {

irtime++;//用于计数2个下降沿之间的时间 }

/* 外部中断0函数 */

void ex0_isr (void) interrupt 2 using 1 //外部中断1服务函数 {

static unsigned char i; //接收红外信号处理 static bit startflag; //是否开始处理标志位 if(startflag) {

if(irtime<63&&irtime>=33)//引导码 TC9012的头,9ms+4.5ms i=0;

irdata[i]=irtime;//存储每个电平的持续时间,用于以后判断是0还是1 irtime=0; i++; if(i==33) { irok=1; i=0; } } else {

irtime=0;startflag=1; }

} /* 定时器0初始化 */ void TIM0init(void)//定时器0初始化 {

TMOD=0x02;

//定时器0工作方式2,TH0是重装值,TL0是初值 TH0=0x00; //重载值 TL0=0x00; //初始化值 ET0=1; //开中断 TR0=1;

} /*外部中断初始化 */ void EX0init(void) {

IT1 = 1;

//指定外部中断1下降沿触发,INT0 (P3.2) EX1 = 1; //使能外部中断 EA = 1; //开总中断

} /*红外键值处理 */ unsigned char KeyPro(void) //红外键值散转程序

{

switch(IRcord[3])

{

case 0x43:return 0;break; case 0x47:return 1;break; case 0x4B:return 2;break; case 0x4F:return 3;break; case 0x53:return 4;break; case 0x57:return 5;break; case 0x5B:return 6;break; case 0x5F:return 7;break; case 0x63:return 8;break;

case 0x67:return 9;break;

case 0x2B:return 10;break; // 按了F1键 default:break; }

irpro_ok=0; //处理完成后清楚标志位

} /* 红外解码函数处理*/ /unsigned char KeyScan(void)//红外码值处理函数 {

unsigned char i, j, k; unsigned char cord,value; k=1;

for(i=0;i<4;i++) //处理4个字节

{

for(j=1;j<=8;j++) //处理1个字节8位 {

cord=irdata[k]; if(cord>7) {

value=value|0x80; } else {

value=value; } if(j<8) {

value=value>>1; } k++; } IRcord[i]=value; value=0;

} irpro_ok=1;//处理完毕标志位置1 }

附录三:主程序

#include //头文件 #include #include\ #include\ #include\sbit RELAY=P1^7; sbit BEEP=P1^6;

Unsigned char code password[]={1,3,1,4,5,1,2,0}; //可以更改此密码 /* 主程序*/ main() {

unsigned char num,i=0,j;

unsigned char passwordtemp[16]; //最大输入16个 unsigned char inputtimes; //密码输入错误次数 unsigned char passwordlength,PLEN; //输入密码长度,实际密码长度 bit Flag;

PLEN=sizeof(password)/sizeof(password[0]); //用于计算出实际密码长度 EX0init();//初始化外部中断

TIM0init();//初始化定时器 LCD_Init();//初始化液晶屏

DelayMs(10); //延时用于稳定,可以去掉 LCD_Clear(); //清屏

LCD_Write_String(0,0,\LCD_Write_String(0,1,\ password!\//写入第二行信息,提示输入密码 while (1) //主循环 {

if(irok) //如果接收好了进行红外处理 {

KeyScan(); irok=0;

if(irpro_ok) // 红外处理完毕标志位置1后 {

num=KeyPro(); //取遥控键盘值 if(i==0)

//输入是第一个字符的时候需要把该行清空,方便观看密码 {

LCD_Write_String(0,1,\//清除该行 if(i<16)

{

passwordtemp[i]=num;

LCD_Write_Char(i,1,'*'); //输入的密码用\代替 }

i++; //输入数值累加 }

if(10==num)

//输入按键值10,按了F1键,表示输入结束,需要进行比对

{

passwordlength=i-1; //计算输入密码长度 i=0; //计数器复位 if(passwordlength==PLEN)

//长度相等则比较,否则直接输出错误 {

Flag=1;//先把比较位置1 for(j=0;j

//循环比较8个数值,如果有一个不等 则最终Flag值为0 Flag=Flag&&(passwordtemp[j]== password[j]); //比较输入值和已有密码 }

if(Flag)//如果比较全部相同,标志位置1

{

LCD_Write_String(0,1,\ LCD_Write_String(0,1,\//密码正确显示的信息 DelayMs(10); RELAY=!RELAY; inputtimes=0;

//输入正确则次数清零,重新计数 Flag=0; }

{

LCD_Write_String(0,1,\//清除该行

LCD_Write_String(0,1,\//密码错误,提示重新输 入 inputtimes++;

//连续输入错误,则次数累加 if(inputtimes==3) {

LCD_Write_String(0,1,\//清除该行

else

本文来源:https://www.bwwdw.com/article/9l2r.html

Top