首页资源分类嵌入式处理器其它 > 红外遥控密码锁(内含延时计算方法)

红外遥控密码锁(内含延时计算方法)

已有 445117个资源

下载专区

上传者其他资源

    文档信息举报收藏

    标    签:延时计算

    分    享:

    文档简介

    红外遥控密码锁(内含延时计算方法)

    文档预览

     基于51单片机的红外密码锁 (设计及测试报告) 目录: VCC (v) 14 VOL 15 第一章 绪论 1.1 课题背景及目的 在日常的生活和工作中, 住宅与部门的安全防范、单位的文件档案、财务报表以及一些个人资料的保存多以加锁的办法来解决。若使用传统的机械式钥匙开锁,人们常需携带多把钥匙, 使用极不方便, 且钥匙丢失后安全性即大打折扣。随着科学技术的不断发展,人们对日常生活中的安全保险器件的要求越来越高。为满足人们对锁的使用要求,增加其安全性,用密码代替钥匙的密码锁应运而生。密码锁具有安全性高、成本低、功耗低、易操作等优点。 在安全技术防范领域,具有防盗报警功能的电子密码锁逐渐代替传统的机械式密码锁,克服了机械式密码锁密码量少、安全性能差的缺点,使密码锁无论在技术上还是在性能上都大大提高一步。随着大规模集成电路技术的发展,特别是单片机的问世,出现了带微处理器的智能密码锁,它除具有电子密码锁的功能外,还引入了智能化管理、专家分析系统等功能,从而使密码锁具有很高的安全性、可靠性,应用日益广泛。 随着人们对安全的重视和科技的发展,许多电子智能锁(指纹识别、IC卡辨认)已在国内外相继面世。但是这些产品的特点是针对特定的指纹和有效卡,只能适用于保密要求的箱、柜、门等。而且指纹识识别器若在公共场所使用存在容易机械损坏,IC卡还存在容易丢失、损坏等特点。加上其成本较高,一定程度上限制了这类产品的普及和推广。鉴于目前的技术水平与市场的接收程度,电子密码锁是这类电子防盗产品的主流。 但是接触式密码锁系统都相应的存在着不同的缺点。例如:接触式密码锁系统成本较低,体积小,卡片本身无须电源,但使用不太方便,而且有接触磨损。相比之下,红外遥控密码锁系统的成本与接触式密码锁系统相当,而且可以进行近距离遥控,使用十分方便。而且它已经与 PC 机的数据库相结合,可以组成一套酒店房间的门禁管理系统。 由于红外遥控具有许多优点, 例如红外线发射装置采用红外发光二极管遥控发射器易于小型化且价格低廉; 采用数字信号编码和二次调制方式,不仅可以实现多路信息的控制,增加遥控功能,提高信号传输的抗干扰性,减少误动作,而且功率消耗低;红外线不会向室外泄露,不会产生信号串扰;反应速度快、传输效率高、工作稳定可靠等。工业设备中,在高压、辐射、有毒气体、粉尘等环境下,采用红外线遥控不仅完全可靠而且能有效地隔离电气干扰。所以红外线遥控是目前使用最广泛的一种通信和遥控手段。 在本设计中,红外遥控密码锁和 PC 机、数据库相结合,能够实现适时的、强大的管理,使得整个红外遥控系统得到更好的完善。 1.2 国内外研究现状 目前大部分的锁采用的都是机械式的,其最大的缺点是利用简单工具就能很容易地把锁打开。针对这种情况,我们设计了一种红外遥控密码锁,而一般设备都采用专用的遥控编码及解码集成电路,其制作简单、容易,但由于特定功能的限制,只适用于专用的电器产品,其应用范围受到限制。而设计的红外遥控密码锁系统能提高门禁系统的可靠性和安全性,适应市场需要。该系统具有普通电子密码锁功能的同时,还增加了遥控功能。该系统具有较强的实际应用价值,所涉及的技术包括:红外载波数据传输技术、单片机控制技术、红外遥控系统编码及译码技术、电路设计与演示板制作技术等。 1.3 课题研究方法 主要的设计实施过程:首先,选用ATMEL公司的单片机AT89C51,以及选购其他电子元器件。第二步,使用PROTEL99完成原理图,并设计PCB图完成人工布线(后因PCB板损坏决定采用万能板焊接的方法)。第三步,使用Keil uVision3软件编写单片机的C语言程序、仿真、软件调试。第四部,使用PROTEUS软件进行模拟软、硬件调试。最后,联合软、硬件调试电路板,完成本次设计。 。 第二章 红外遥控系统介绍 2.1 红外通讯原理 红外遥控是单工的红外通信方式,本设计的红外遥控采用以通信方式为基础的红外遥控,而且本设计也使用了红外通信技术,故着重分析红外通信的基本原理。 红外通信是利用红外技术实现两点间的近距离保密通信和信息转发。它一般由红外发射和接收系统两部分组成。发射系统对一个红外辐射源进行调制后发射红外信号,而接收系统用光学装置和红外探测器进行接收,就构成红外通信系统。 红外线是波长在 750nm至1mm之间的电磁波,它的频率高于微波而低于可见光,是一种人的眼睛看不到的光线。红外通信一般采用红外波段内的近红外线,波长在 0.75um至 25um之间。红外数据协会(IrDA)成立后,为了保证不同厂商的红外产品能够获得最佳的通信效果,红外通信协议将红外数据通信所采用的光波波长的范围限定在 850 至 900nm之内。 红外通信的基本原理是发送端将基带二进制信号调制为一系列的脉冲串信号(载波信号) ,通过红外发射管发射红外信号。常用的有通过脉冲宽度来实现信号调制的脉宽调制(PWM)和通过脉冲串之间的时间间隔来实现信号调制的脉时调制(PPM)两种方法。脉时调制(PPM)是红外数据协会(IrDA)和国际电子电工委员会(IEEE)都推荐的调制方式,本设计采用PPM调制方法,即用两个脉冲串之间的时间间隔来表示二进制信息,数据比特的传送仿照不带奇偶校验的RS232 通信,首先产生一个同步头,然后接着 8 位数据比特。如图 2.1所示。 图 2.1 PPM 调制波形图 普通的红外遥控采用面向指令的帧结构,数据帧由同步码,地址码和指令码组成,指令码长度多为 8~16 个比特,传送多字节遥控协议时效率偏低,而增加指令码的长度不利于接收器同步,为此本设计选用一种面向字节的帧结构,采用类似于异步串行通信的帧结构,每帧由一个起始位(二进制数 0) 、8 个数据位和 2 个停止位(二进制数 1)构成,如图 2.2 所示。每帧传送 1 个字节的数据,帧与帧间隔大于 2ms,帧结构不含地址信息,寻址问题由高层协议解决[8]。 图 2.2 数据帧结构示意图 由于红外光存在反射,在全双工的方式下发送的信号也可能会被本身接收,因此,红外通信应采用异步半双工方式,即通信的某一方发送和接收是交替进行的。 2.2红外遥控系统结构 红外遥控系统主要分为调制、发射和接收三部分,如图2.3 所示: 图2.3 2.2.1调制 红外遥控发射数据时采用调制的方式,即把数据和一定频率的载波进行“与”操作,这样可以提高发射效率和降低电源 功耗。 调制载波频率一般在30khz到60khz之间,大多数使用的是38kHz,占空比1/3的方波,如图2.4所示,这是由发射端所使用的 455kHz晶振决定的。在发射端要对晶振进行整数分频,分频系数一般取12,所以455kHz÷12≈37.9 kHz≈38kHz。 图2.4 载波波形  2.2.2发射系统 目前有很多种芯片可以实现红外发射,可以根据选择发出不同种类的编码。由于发射系统一般用电池供电,这就要求芯片 的功耗要很低,芯片大多都设计成可以处于休眠状态,当有按键按下时才工作,这样可以降低功耗芯片所用的晶振应该有 足够的耐物理撞击能力,不能选用普通的石英晶体,一般是选用陶瓷共鸣器,陶瓷共鸣器准确性没有石英晶体高,但通常 一点误差可以忽略不计。 红外线通过红外发光二极管(LED)发射出去,红外发光二极管内部材料和普通发光二极管不同,在其两端施加一定电压时, 它发出的是红外线而不是可见光。 图2.5A 简单驱动电路    图2.5B 射击输出驱动电路 如图2.5A和图2.5B是LED的驱动电路,图3a是最简单电路, 选用元件时要注意三极管的开关速度要快,还要考虑到LED的正向 电流和反向漏电流,一般流过LED的最大正向电流为100mA,电流越大,其发射的波形强度越大。 图2.5A电路有一点缺陷,当电池电压下降时,流过LED的电流会降低,发射波形强度降低,遥控距离就会变小。图2.5B所示的 射极输出电路可以解决这个问题,两个二极管把三级管基极电压钳位在1.2V左右,因此三级管发射极电压固定在0.6V左右, 发射极电流IE基本不变,根据IE≈IC,所以流过LED的电流也基本不变,这样保证了当电池电压降低时还可以保证一定的遥 控距离。 2.2.3一体化红外接收头 红外接收电路通常被厂家集成在一个元件中,成为一体化红外接收头。 内部电路包括红外监测二极管,放大器,限副器,带通滤波器,积分电路,比较器等。红外监测二极管监测到红外信号, 然后把信号送到放大器和限幅器,限幅器把脉冲幅度控制在一定的水平,而不论红外发射器和接收器的距离远近。交流 信号进入带通滤波器,带通滤波器可以通过30khz到60khz的负载波,通过解调电路和积分电路进入比较器,比较器输出 高低电平,还原出发射端的信号波形。注意输出的高低电平和发射端是反相的,这样的目的是为了提高接收的灵敏度。 一体化红外接收头,如图2.6所示:   图2.6 红外接收头     红外接收头的种类很多,引脚定义也不相同,一般都有三个引脚,包括供电脚,接地和信号输出脚。根据发射端调制 载波的不同应选用相应解调频率的接收头。 本设计选择HX1383,因为其性价比较高,且易于购得,如图2.7: 图2.7      红外接收头内部放大器的增益很大,很容易引起干扰,因此在接收头的供电脚上须加上滤波电容,一般在22uf以上。 有的厂家建议在供电脚和电源之间接入330欧电阻,进一步降低电源干扰。 2.3红外编码格式 遥控发射器专用芯片很多,红外遥控的编码目前广泛使用的是:NEC Protocol 的 PWM(脉冲宽度调制)和 Philips RC-5 Protocol 的 PPM,本设计基于NEC协议。其编码特征如下: 1、8 位地址和 8 位指令长度; 2、地址和命令 2 次传输(确保可靠性) 3、PWM 脉冲位置调制,以发射红外载波的占空比代表“0”和“1”; 4、载波频率为 38Khz; 5、位时间为1.125ms 或 2.25ms; NEC 码的位定义: 一个脉冲对应 560us 的连续载波,一个逻辑 1 传输需要 2.25ms(560us脉冲+1680us低电平),占空比1/4;一个逻辑 0的传输需要 1.125ms(560us 脉冲+560us 低电平),占空比1/2。而遥控接收头在收到脉冲的时候为低电平,在没有脉冲的时候为高电平,这样,我们在接收头端收到的信号为:逻辑 1 应该是 560us 低+1680us 高,逻辑 0 应该是 560us 低+560us 高。 如图2.8 图2.8 NEC 遥控指令的数据格式为: 同步码头、地址码、地址反码、控制码、控制反码。同步码由一个 9ms 的低电平和一个 4.5ms 的高电平组成,地址码、地址反码、控制码、控制反码均是8 位数据格式。按照低位在前,高位在后的顺序发送。采用反码是为了增加传输的可靠性(可用于校验)。如图2.9 图2.9 重复码: 一个命令只发送一次,即使遥控器上的按键一直按着。但是会每110mS发送一次代码,直到遥控器按键释放。如图 2.10 图2.10 重复码比较简单:一个9mS的AGC脉冲、2.25mS间隔、560uS脉冲。如图2.11 图2.11 本设计采用网上购买的LC7641芯片为内核的小型遥控器作为发送端,其编码基于NEC协议。接收端为HX1383,数据流入51单片机解码。 第3章 硬件电路设计 3.1整系统框图 接收部分系统主要由AT89C51(51系列)、lcd、继电器、LED、4×4矩阵键盘、复位电路等组成。由红外接收头HX1383接收信号,数据流入51单片机解码。 发送部分本设计采用网上购买的LC7641芯片为内核的小型遥控器作为发送端,其编码基于NEC协议。 3.2红外发送/接收 3.2.1红外遥控器 发送部分本设计采用网上购买的LC7641芯片为内核的小型遥控器作为发送端,其编码基于NEC协议。 图3-1 1.外型尺寸: 1.1键数: 1-18键 1.2主尺寸:86mm〈长〉*38mm〈宽〉*6mm〈厚〉 2.材质: 2.1 面贴:0.125mmPET光面面料 2.2 外壳:ABS料黑色 2.3 电池:CR2025/3V 2.4 按键弹力:180-230克力 3.控制角度: 3.1 有效发射角度:30度 4.控制距离: 4.1 有效距离≥8m 5.按键寿命测试: 5.1 3万次以上 遥控器技术参数及标准 项目 单位 测试条件 最小值 标准值 最大值 静态电流 UA 无键按下 5 10 动态电流 MA 键按下时 6 12 发射距离 M 沿光轴方向 8 30度自选范围 6 工作电压 V 2.2 3 3.5 振荡频率 KHZ 可定制 455 栽波频率 KHZ 可定制 38KHZ 红外波长 Nm 940 功能键数 18 适用环境温度℃ -10℃ 25℃ 40℃ 相对温度 Rh% 40 90 3.2.2红外接收头 图3-2 规格:HX1838(铁壳) ●宽电压适应、低功耗、高灵敏度、优良的抗干扰特性; ●应用广泛:家用电器、空调、玩具等红外遥控接收; 极限参数: 电源电压 VCC (v) 6.0 工作温度 TOPR (℃) -25 — +85 功 耗 PD(mw) 35 储存温度 TSTG (℃) -40 —+125 光电参数: (T=25℃ VCC=5V f0=38KHZ) 参 数 符号 测试条件 Min Type Max 单 位 工作电压 Vcc 2.7 5.5 V 接收距离 L L5IR5 IF =300mA (测试信号) 10 17 M 载波频率 f0 38k HZ 接收角度 θ1/2 距离衰减1/2 +/-45 Deg BMP 宽度 fBW -3Db Bandwidth 2 3.3 5 kHz 静态电流 ICC 无信号输入时 ---- 0.8 1.5 mA 低电平输出 VOL Vin=0V Vcc=5V 0.2 0.4 V 高电平输出 VOH Vcc=5V 4.5 Vcc V 输出脉冲 宽 度 TPWL Vin=500μVp-p ※ 500 600 700 μS TPWH Vin=50mVp-p ※ 500 600 700 μS ※:光轴上测试,以宽度为600/900μS为发射脉冲,在5CM之接收范围内,取50次接收脉冲之平均值(参见测试波形)。 测试波形: 图3-3 电原理框图: 图3-5 3.3单片机AT89C51简介 AT89C51是美国ATMEL公司生产的低电压,高性能CMOS8位单片机,片内含4K bytes的可反复擦写的只读程序存储器(EPROM)和128bytes的随机存取数据序存器(RAM),器件采用ATMEL公司的高密度/非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位中央处理器(CPU)和FLASH存储单元,AT89C51单片机为许多嵌入式控制系统提供了一种灵活行高且价廉的方案。 3.3.1主要特性 · 8031 CPU与MCS-51 兼容 · 4K字节可编程FLASH存储器(寿命:1000写/ 擦循环) · 全静态工作:0Hz-24KHz · 三级程序存储器保密锁定 · 128*8位内部RAM · 32条可编程I/O线 · 两个16位定时器/计数器 · 6个中断源 图3—6 · 可编程串行通道 · 低功耗的闲置和掉电模式 · 片内振荡器和时钟电路 3.3.2 管脚说明 VCC:供电电压。     GND:接地。     P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。当P1口的管脚第一次写1时,被定义为高阻输入。P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。在FIASH编程时,P0 口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。     P1口:P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。在FLASH编程和校验时,P1口作为第八位地址接收。     P2口:P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。并因此作为输入时,P2口的管脚被外部拉低,将输出电流。这是由于内部上拉的缘故。P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。P2口在FLASH编程和校验时接收高八位地址信号和控制信号。     P3口:P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。 P3口也可作为AT89C51的一些特殊功能口,如下表所示: 管脚 备选功能: 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口同时为闪烁编程和编程校验接收一些控制信号。 RST:复位输入。当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。 ALE/PROG:当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。在FLASH编程期间,此引脚用于输入编程脉冲。在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。因此它可用作对外部输出的脉冲或用于定时目的。然而要注意的是:每当用作外部数据存储器时,将跳过一个ALE脉冲。如想禁止ALE的输出可在SFR8EH地址上置0。此时, ALE只有在执行MOVX,MOVC指令是ALE才起作用。另外,该引脚被略微拉高。如果微处理器在外部执行状态ALE禁止,置位无效。  /PSEN:外部程序存储器的选通信号。在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。     /EA/VPP:当/EA保持低电平时,则在此期间外部程序存储器(0000H-FFFFH),不管是否有内部程序存储器。注意加密方式1时,/EA将内部锁定为RESET;当/EA端保持高电平时,此间内部程序存储器。在FLASH编程期间,此引脚也用于施加12V编程电源(VPP)。     XTAL1:反向振荡放大器的输入及内部时钟工作电路的输入。     XTAL2:来自反向振荡器的输出。 3.3.3 震荡特性 XTAL1和XTAL2分别为反向放大器的输入和输出。该反向放大器可以配置为片内振荡器。石晶振荡和陶瓷振荡均可采用。如采用外部时钟源驱动器件,XTAL2应不接。有余输入至内部时钟信号要通过一个二分频触发器,因此对外部时钟信号的脉宽无任何要求,但必须保证脉冲的高低电平要求的宽度。 3.3.4 芯片擦除 整个PEROM阵列和三个锁定位的电擦除可通过正确的控制信号组合,并保持ALE管脚处于低电平10ms 来完成。在芯片擦操作中,代码阵列全被写“1”且在任何非空存储字节被重复编程以前,该操作必须被执行。 此外,AT89C51设有稳态逻辑,可以在低到零频率的条件下静态逻辑,支持两种软件可选的掉电模式。在闲置模式下,CPU停止工作。但RAM,定时器,计数器,串口和中断系统仍在工作。在掉电模式下,保存RAM的内容并且冻结振荡器,禁止所用其他芯片功能,直到下一个硬件复位为止。 3.4 4×4矩阵键盘 如图所示,本系统采用4×4矩阵键盘,16个按键分为输入数字键: 0、 1、2、3、4、5、6、7、8、9;功能键lock、modify、cel、Enter。矩阵键盘。 图3—7 3.5复位电路 图3—8 时钟电路工作后,在REST管脚上加两个机器周期的高电平,芯片内部开始进行初始复位(如图3—8)。 3.6 振荡电路 图3—9 本设计晶振选择频率为12MHZ,电容选择30pF如图(3-9)。经计算得单片机工作胡机器周期为: 12×(1÷12M)=1us。 3.7 1602液晶显示 图3-10 LCD1602 可显示两行英文字符,并且内带 ASCII 字符库。LCD1602 模块内部可以完成显示扫描,单片机只要向 LCD1602 发送命令和显示内容的 ASCII 码。 表3-1 引脚功能说明 引脚 符号 功能说明 1 VSS 一般接地 2 VDD 接电源(+5V) 3 V0 液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高(对比度过高时会产生“鬼影”,可以通过一个10K的电位器调整对比度)。 4 RS RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。 5 R/W R/W为读写信号线,高电平(1)时进行读操作,低电平(0)时进行写操作。 6 E E(或EN)端为使能(enable)端,下降沿使能。 7 DB0 底4位三态、 双向数据总线 0位(最低位) 8 DB1 底4位三态、 双向数据总线 1位 9 DB2 底4位三态、 双向数据总线 2位 10 DB3 底4位三态、 双向数据总线 3位 11 DB4 高4位三态、 双向数据总线 4位 12 DB5 高4位三态、 双向数据总线 5位 13 DB6 高4位三态、 双向数据总线 6位 14 DB7 高4位三态、 双向数据总线 7位(最高位)(也是busy flag) 15 BLA 背光电源正极 16 BLK 背光 电源负极    图3.11 LCD1602引脚图 表3-2寄存器选择控制表 RS R/W 操作说明 0 0 写入指令寄存器(清除屏等) 0 1 读busy flag(DB7),以及读取位址计数器(DB0~DB6)值 1 0 写入数据寄存器(显示各字型等) 1 1 从数据寄存器读取数据   1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,这些字符有:阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是01000001B(41H),显示时模块把地址41H中的点阵字符图形显示出来,我们就能看到字母“A”。   因为1602识别的是ASCII码,试验可以用ASCII码直接赋值,在单片机编程中还可以用字符型常量或变量赋值,如'A’。   图3.9是1602的16进制ASCII码值: 读的时候,先读上面那列,再读左边那行,如:感叹号!的ASCII为0x21,字母B的ASCII为0x42(前面加0x表示十六进制)。 图3.12 1602的16进制ASCII码值 表3-3 显示地址 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 00H 01H 02H 03H 04H 05H 06H 07H 08H 09H 0AH 0BH 0CH 0DH 0EH 0FH 40H 41H 42H 43H 44H 45H 46H 47H 48H 49H 4AH 4BH 4CH 4DH 4EH 4FH 指令集 1602通过D0~D7的8位数据端传输数据和指令。 显示模式设置: (初始化)   0011 0000 [0x38] 设置16×2显示,5×7点阵,8位数据接口;   显示开关及光标设置: (初始化)   0000 1DCB D显示(1有效)、C光标显示(1有效)、B光标闪烁(1有效)   0000 01NS N=1(读或写一个字符后地址指针加1 &光标加1),   N=0(读或写一个字符后地址指针减1 &光标减1),   S=1 且 N=1 (当写一个字符后,整屏显示左移)   s=0 当写一个字符后,整屏显示不移动   数据指针设置:   数据首地址为80H,所以数据地址为80H+地址码(0-27H,40-67H)   其他设置:   01H(显示清屏,数据指针=0,所有显示=0);02H(显示回车,数据指针=0)。   通常推荐的初始化过程:   延时15ms   写指令38H   延时5ms   写指令38H   延时5ms   写指令38H   延时5ms   (以上都不检测忙信号)   (以下都要检测忙信号)   写指令38H   写指令08H 关闭显示   写指令01H 显示清屏   写指令06H 光标移动设置   写指令0cH 显示开及光标设置 3.8 发光二极管LED 图3-13 由于LED使用的是高亮的led所以加了一个三极管驱动如图3-13。 3.9 继电器 图3-14 在继电器的使用中要注意的就是电流的驱动还有由于继电器内部是电感所以应加一个二极管泄流如图3-14。 3.10 24C02 图3-15 由于只有一个24C02所以只需把A0,A1,A2接地,按照I2C协议,SCL,SDA需接10K上拉电阻 AT24C02 AT24C02是美国ATMEL公司的低功耗CMOS串行EEPROM,它是内含256×8位存储空间,具有工作电压宽(2.5~5.5V)、擦写次数多(大于10000次)、写入速度快(小于10ms)等特点。 1、特性 与400KHz I2C 总线兼容 2.5 到5.5 伏工作电压范围 低功耗CMOS 技术 写保护功能当WP 为高电平时进入写保护状态 页写缓冲器 自定时擦写周期 1,000 编程/擦除周期 可保存数据100 年 8 脚DIP SOIC 或TSSOP 封装 温度范围商业级工业级和汽车级 2、概述 AT24C02 是一个2K 位串行CMOS E2PROM ,部含有256 个8 位字节,ATALYST 公司的先进CMOS 技术实质上减少了器件的功耗,CAT24WC01 有一个8 字节页写缓冲器CAT24WC02/04/08/16 有一个16 字节页写缓冲器,器件通过I2C 总线接口进行操作,一个专门的写保护功能。 3、管脚配置 图3-16 AT24C02管脚配置 4、管脚描述 5、极限参数 工作温度:工业级:-55°C-- +125°C 商业级:0°C-- +75°C 储存温度:-65°C-- +150°C 各管脚承受电压:-2.0V-- +2.0V Vcc管脚承受电压::-2.0V-- +7.0V 封装功率损耗:(Ta=25°C):1.0W 焊接温度(10秒):300°C 输出短路电流:100mA 6、可靠性参数 7、功能描述 AT24C01/02/04/08/16 支持I2C 总线数据传送协议,I2C 总线协议规定,任何将数据传送到总线的器件作为发送器。任何从总线接收数据的器件为接收器。数据传送是由产生串行时钟和所有起始停止信号的主器件控制的。主器件和从器件都可以作为发送器或接收器,但由主器件控制传送数据发送或接收的模式,通过器件地址输入端A0 A1 和A2 可以实现将最多8 个24WC01 和24WC02 器件4 个242C04 器件,2 个24WC08 器件和1 个24WC16 器件连接到总线上。 8、管脚描述 SCL:串行时钟 CAT24WC01/02/04/08/16 串行时钟输入管脚用于产生器件所有数据发送或接收的时钟,是一个输入管脚。 SDA:串行数据/地址 CAT24WC01/02/04/08/16 双向串行数据/地址管脚用于器件所有数据的发送或接收,SDA 是一个开漏输出管脚。 A0 A1 A2:器件地址输入端 这些输入脚用于多个器件级联时设置器件地址,当这些脚悬空时默认值为0 24WC01 除外。当使用24WC01 或24WC02 时最大可级联8 个器件,如果只有一个24WC02 被总线寻址,这三个地址输入脚A0 A1 A2 可悬空或连接到Vss, 如果只有一个24WC01 被总线寻址,这三个地址输入脚A0 A1 A2 必须连接到Vss。当使用24WC04 时,最多可连接4 个器件该器件,仅使用A1 A2 地址管脚,A0 管脚未用可以连接到Vss 或悬空,如果只有一个24WC04 被总线寻址,A1 和A2 地址管脚可悬空或连接到Vss。 WP:写保护 如果WP 管脚连接到Vcc, 所有的内容都被写保护只能读,当WP 管脚连接到Vss 或悬空,允许器件进行正常的读/写操作。 9、I2C 总线协议 I2C 总线协议定义如下 只有在总线空闲时才允许启动数据传送。 在数据传送过程中,当时钟线为高电平时,数据线必须保持稳定状态不允许有跳变,时钟线为高电平时,数据线的任何电平变化将被看作总线的起始或停止信号。 起始信号:时钟线保持高电平期间数据线电平从高到低的跳变作为I2C 总线的起始信号。 停止信号:时钟线保持高电平期间数据线电平从低到高的跳变作为I2C 总线的停止信号。 图3-17 总线时序 图3-18 写周期时序 图3-19 起始/停止时序 10、器件寻址 主器件通过发送一个起始信号启动发送过程,然后发送它所要寻址的从器件的地址,8 位从器件地址的高4 位固定为1010,接下来的3 位A2 A1 A0 为器件的地址位用来定义哪个器件以及器件的哪个部分被主器件访问。上述8个CAT24WC01/02,4 个CAT24WC04,2个CAT24WC08,1个CAT24WC16可单独被系统寻址。从器件8位地址的最低位作为读写控制位,1表示对从器件进行读操作,0 表示对从器件进行写操作,在主器件发送起始信号和从器件地址字节后,CAT24WC01/02/04/08/16 监视总线并当其地址与发送的从地址相符时,响应一个应答信号通过SDA ,CAT24WC01/02/04/08/16 再根据读写控制位R/W 的状态进行读或写操作,应答信号I2C 总线数据传送时每成功地传送一个字节数据后,接收器都必须产生一个应答信号应答的器件,在第9 个时钟周期时将SDA 线拉低,表示其已收到一个8 位数据。CAT24WC01/02/04/08/16 在接收到起始信号和从器件地址之后响应一个应答信号,如果器件已选择了写操作,则在每接收一个8 位字节之后响应一个应答信号。当CAT24WC01/02/04/08/16 工作于读模式时,在发送一个8 位数据后释放SDA 线并监视一个应答信号,一旦接收到应答信号CAT24WC01/02/04/08/16 ,继续发送数据,如主器件没有发送应答信号,器件停止传送数据且等待一个停止信号。 图3-20 应答时序 图3-21从器件地址位 A0 A1 和A2 对应器件的管脚1 、2 和3 a8 a9 和a10 对应存储阵列地址字地址 11、写操作 字节写:在字节写模式下,主器件发送起始命令和从器件地址信息R/W 位置零给从器件,在从器件产生应答信号后,主器件发送CAT24WC01/02/04/08/16 的字节地址,主器件在收到从器件的另一个应答信号后再发送数据到被寻址的存储单,AT24WC01/02/04 /08/16再次应答并在主器件产生停止信号后开始内部数据的擦写,在内部擦写过程中CA T24WC0 1/02/04/08/16 不再应答主器件的任何请求。 图3-22 字节写时序 12、读操作 对CAT24WC01/02/04/08/16 读操作的初始化方式和写操作时一样仅把R/W 位置为1 有三种不同的读操作方式立即地址读、选择读和连续读。 立即地址读: CAT24WC01/02/04/08/16 的地址计数器内容为最后操作字节的地址加1,也就是说如果上次读/写的操作地址为N,则立即读的地址从地址N+1开始。如果N=E,这里对24WC01 E=127、对24WC02 E=255、对24WC04 E=511、对24WC08 E=1023、对24WC16 E=2047 则计数器将翻转到0且继续输出数据。CAT24WC01/02/04/08/16 接收到从器件地址信号后R/W 位置1 ,它首先发送一个应答,信号然后发送一个8 位字节,数据主器件不需发送一个应答信号但要产生一个停止信号。 图3-23立即地址读时序 3.11元器件列表 元器件 规格/型号 数量 Lcd 1602 1 继电器 Hrs4h-s-dc12 1 三极管 SR9013 2 红外接收头 1838 1 电阻 27k 8 电阻 10k 3 电阻 1k 1 电解电容 0.47uF/50V 1 瓷片电容 30pF 2 单片机 AT89C51 1 Eeprom 24c02 1 Usb接口 母口 1 按键 X 16 Led X 4 第4章 系统的软件设计 设计综述: 此设计能实现通过红外发送进行密码的解锁,同时在开锁终端设备上也能进行解锁的操作,并修改密码和储存密码。所以,软件设计也根据需求相应分成几个模块。下面一一列举 程序流程图: 。 5.1 红外发射编码部分 红外发射部分使用现成的红外遥控板发射,编码已知,故省略。 5.2 红外接收解码部分 1. 单片机解码过程 ① 单片机外中断0以中断方式检测红外信号的第一个下降沿。 ② 单片机检测到引导码后,延时屏蔽引导码(9ms低电平和4.5ms低电平) ③ 引导码屏蔽后,等待16位系统识别码的第一位数据,当其上升沿到来时,延时882us(为了保证数据的准确性,每位数据的时间间隔介于565~1125us之间,这里选择882us)后读取电平状态:若为低电平,等待下一位数据的上升沿;若为高电平,则延时1ms后等待下一位数据的上升沿。依次循环,直到16位系统识别码读完为止。 ④ 16位系统识别码检测结束后,等待8位原码和8位反码的第一位数据,当上升沿到来时,延时882us后读取电平的状态:若为低电平,保存位数据“0”,然后等待下一位数据的上升沿;若为高电平,保存位数据“1”,且延时1ms后等待下一位数据的上升沿。依次循环,直到8位原码和8位反码数据读完,将8位原码数据取反后与原码数据比较:若相等,则保存原码数据,完成解码;若不相等,则退出解码。 2. 红外解码程序代码 //红外接收程序头文件 #ifndef _remote_H #define _remote_H //----------------------------------------------------------------- // 数据类型宏定义 //----------------------------------------------------------------- #define uchar unsigned char #define uint unsigned int //----------------------------------------------------------------- // I/O口定义 //----------------------------------------------------------------- sbit HONGWAI = P3^2; // 红外接收数据线 //----------------------------------------------------------------- // 外部变量声明 //----------------------------------------------------------------- extern uchar ch; // 红外原码数据存放单元 extern bit intx0f; // 初始为0;为1表示响应外0中断 extern bit irvalidf; // 红外解码解码有效标志位,为1表示有效 //----------------------------------------------------------------- // 外部函数声明 //----------------------------------------------------------------- extern void Delay_1ms (unsigned char t) ;// 时基为1ms的延时 extern void Delay_882us(void); // 时基为882us的延时 extern void Decoder (void); // 遥控解码 extern void INTX0_ISR (void); // 外0中断服务程序,接收到红外信号(下降沿)响应中断 #endif //红外接收子程序 //说明:单片机使用晶振为12MHz #include #include #include "remote.h" //----------------------------------------------------------------- // 全局变量:内RAM存储单元定义 //----------------------------------------------------------------- uchar ch; // 红外原码数据存放单元 //----------------------------------------------------------------- // 全局变量:内RAM位定义 //----------------------------------------------------------------- bit intx0f; // 初始为0;为1表示响应外0中断 bit irvalidf; // 红外解码解码有效标志位,为1表示有效 //----------------------------------------------------------------- // 功能程序区 //----------------------------------------------------------------- //----------------------------------------------------------------- // void Delay_1ms (unsigned char t) //----------------------------------------------------------------- // 函数功能: 时基为1ms的延时 // 例子提示: 调用Delay_1ms(20),得到20ms延时 // 入口参数: 无符号8bit整数 // 返回参数: 无 // 全局变量: 无 // 调用模块: 无 // 注意事项: 基于使用外12MHz晶振的标准8051(如AT89S51)单片机 /* 令x=165,y=2,n=1,则延时时间 ={[3y+(n+2)xy+3]*t+5}T=(999t+5)T 单位: 1SYSCLK SYSCLK=12MHz 误差 Delay_1ms(1): 延时 1 004 1.004ms 4us Delay_1ms(2): 延时 2 003 2.003ms 3us Delay_1ms(3): 延时 3 002 3.002ms 2us Delay_1ms(5): 延时 5 000 5.000ms 0us Delay_1ms(10): 延时 9 995 9.995ms 5us Delay_1ms(20): 延时 19 985 19.985ms 15us Delay_1ms(40): 延时 39 965 39.965ms 35us Delay_1ms(60): 延时 59 945 59.945ms 55us Delay_1ms(100):延时 99 905 99.905ms 95us Delay_1ms(200):延时 199 805 199.805ms 195us Delay_1ms(255):延时 254 750 254.750ms 250us */ //----------------------------------------------------------------- void Delay_1ms (unsigned char t) { unsigned char i,j; do { j = 2; do { i = 165; do { _nop_(); } while (--i); } while (--j); } while (--t); } //----------------------------------------------------------------- // void Delay_882us (void) //----------------------------------------------------------------- // // 函数功能: 时基为882us的延时 // 入口参数: 无 // 返回参数: 无 // 全局变量: 无 // 调用模块: 无 // 注意事项: 延时时间为881us,误差为1us //----------------------------------------------------------------- void Delay_882us (void) { uchar i,j; for (i=20; i>0; i--) { for(j=20; j>0; j--) { ; } } for (i=5; i>0; i--) { _nop_(); } } //----------------------------------------------------------------- // void Decoder (void) //----------------------------------------------------------------- // // 函数功能: 遥控解码 // 入口参数: 无 // 返回参数: 无 // 全局变量: irvalidf:红外解码有效标志位,为1表示有效 // ch:红外原码数据存放单元 // 调用模块: Delay_882us();Delay_1ms(unsigned char) // 注意事项: //----------------------------------------------------------------- void Decoder (void) { uchar i,j; uchar tmp[2]; // tmp[0]:暂存原码数据;tmp[1]:暂存反码数据 irvalidf = 1; // 先设红外解码有效 for (i=0; i<10; i++) // 循环10次,检测在8.820ms内信号的电平状态 { Delay_882us(); // 延时882us if (HONGWAI) // 若信号为高电平,则为干扰信号 { irvalidf = 0; // 红外解码解码无效 break; } } if (irvalidf) { while (!HONGWAI); // 等待引导码中的9ms低电平结束 Delay_1ms(5); // 延时5ms,屏蔽引导码中的4.5ms高电平 for (j=0; j<16; j++) // 检测26位系统识别码 { while (!HONGWAI); // 等待系统识别码第一位数据的上升沿 Delay_882us(); // 高电平开始后,用882us的时间尺检测信号的电平状态 if (HONGWAI) // 若该信号为高电平,则延时1ms等待高电平结束 { Delay_1ms(1); // 延时1ms } } for (i=0; i<2; i++) // 接收原码和反码数据并暂存 { for (j=0; j<8; j++) // 循环8次,接收8位数据(原码或反码) { while (!HONGWAI); // 等待系统识别码第一位数据的上升沿 Delay_882us(); // 高电平开始后,用882us的时间尺读取信号的电平状态 tmp[i] >>= 1; // 先接收低位数据 if (HONGWAI) // 若该信号为高电平,则延时1ms等待高电平结束 { Delay_1ms(1); // 延时1ms tmp[i] = tmp[i] | 0x80; // 暂存信号此时的电平状态 } } } if (~tmp[0] == tmp[1]) // 将原码取反后与反码进行比较,若两者的值相同则完成解码 { ch = tmp[0]; // 保存原码数据 } else { irvalidf = 0; // 若原码和反码不等,则本次接收的数据无效 } } } //----------------------------------------------------------------- // 中断服务子程序 //----------------------------------------------------------------- //----------------------------------------------------------------- // void INTX0_ISR (void) //----------------------------------------------------------------- // // 函数功能: 外0中断服务程序,接收到红外信号(下降沿)响应中断 // 入口参数: 无 // 出口参数: 无 // 全局变量: intx0f:初始为0;为1表示响应了外0中断 // 调用模块: 无 // 注意事项: //----------------------------------------------------------------- void INTX0_ISR (void) interrupt 0 { _nop_(); // 目的:跳过尖峰干扰脉冲 intx0f = 1; } //----------------------------------------------------------------- // End Of File //----------------------------------------------------------------- 5.3 单片机接收终端部分 1. 密码的输入与确认 初始状态红灯亮,表示闭锁。设定初始密码为{1,2,3,4},通过按输入键开始输入密码,依次输入4个数字,最后与24C02当中储存的密码相比较,密码相等则开锁,绿灯亮。否则开锁失败闭锁,红灯亮。 2. 密码的修改 通过按下密码修改键,重现设定密码。重新设定密码首先要输入原密码,正确则进行新密码的设定,不相等则退出修改。重新修改密码时需输入两次密码,第一次为新设定的密码,第二次为新密码的确认修改密码成功时LCD提示修改成功并有led闪烁。稍后返回欢迎界面。 3. 矩阵键盘的扫描 键盘设计为4*4矩阵键盘。16个按键用到的实际为14个按键,其中包括10个数字键,一个输入键,一个确认键,一个取消键,一个修改密码键。矩阵键盘的扫描方式采用线反转法。 4. IIC 程序开始就从24c02 读出密码储存,为以后输入密码比较。当修改密码成功时将新的密码写入24c02中,掉电不丢失。 5. 1602液晶显示 本设计采取1602液晶显示界面进行人机交互, 液晶初始状态为欢迎登录界面 每次操作都有相应的提示语言显示,密码输入输入正确与错误都有相应的提示。 6. 终端程序部分 1 1602显示 //1602 头文件 #ifndef _LCD1602_H #define _LCD1602_H #include #define uchar unsigned char #define uint unsigned int sbit rs=P2^3; sbit rw=P2^4; sbit en=P2^5; sbit lcd=P2^7; //背光灯端口 //table中存放相应必要提示语 uchar code table[] ="Welcome!"; uchar code table1[]="Successful!"; uchar code table2[]="Wrong!"; uchar code table3[]="Modify Success!"; uchar code table4[]="Enter password:"; uchar code table5[]="Modify Password:"; uchar code table6[]="New password:"; uchar code table7[]="New pwd again:"; uchar code table8[]="Modify Fail!"; uchar code table9[]="Exit later!"; void delay(uint n) { uint x,y; for (x=n;x>0;x--) for (y=110;y>0;y--); } //1602 写命令子函数 void lcd_wcom(uchar com) { rs = 0; rw = 0; P0 = com; delay(5); en = 1; en = 0; } // 1602 写数据子函数 void lcd_wdat(uchar dat) { rs = 1; rw = 0; P0 = dat; delay(5); en = 1; en = 0; } // 1602 初始化 void lcd_init() { lcd_wcom(0x38); lcd_wcom(0x0c); lcd_wcom(0x06); lcd_wcom(0x01); } #endif 2 矩阵键盘扫描 /*判断按键按下及按键值确定*/ uint keyin() { uchar t, keydown; uint x=16; P1 = 0xF0; if (P1!=0xF0) { //按键操作 delay_ms(10); P1 = 0xF0; if (P1!=0xF0) { t = P1; } P1 = 0x0F; keydown = P1 | t; switch(keydown) //判断按键值 { case 0xED: x=14; break; // 密码输入 case 0xE7: x=0; break; // 0 case 0xDE: x=12; break; // 取消 case 0xDD: x=3; break; // 3 case 0xDB: x=2; break; // 2 case 0xD7: x=1; break; // 1 case 0xBE: x=11; break; // 确认 case 0xBD: x=6; break; // 6 case 0xBB: x=5; break; // 5 case 0xB7: x=4; break; // 4 case 0x7E: x=10; break; // 设定修改密码 case 0x7D: x=9; break; // 9 case 0x7B: x=8; break; // 8 case 0x77: x=7; break; // 7 default: break; } while (P1!=0x0f); //松键检测 } return x; } 3 IIC #ifndef _24Cxx_H #define _24Cxx_H #include #include #include #include "delay.h" #define uint unsigned int #define uchar unsigned char sbit scl = P3^6; //时钟线 sbit sda = P3^7; //数据线 // 24c02 初始化 void init() { scl = 1; delay_us(2); sda = 1; delay_us(2); } //24c02 启动 void start() { sda = 1; delay_us(2); scl = 1; delay_us(2); sda = 0; delay_us(2); scl = 0; delay_us(2); } //24c02 结束 void stop() { sda = 0; delay_us(2); scl = 1; delay_us(2); sda = 1; delay_us(2); } //24c02 写一字节数据 void writex(uchar temp) { uchar i; for (i=0;i<8;i++) { sda = (bit)(temp&0x80); delay_us(2); scl = 1; delay_us(2); scl = 0; delay_us(2); temp <<= 1; } } //从24c02 读一字节数据 uchar readx() { uchar i,j,k; scl = 0; delay_us(2); sda = 1; for (i=0;i<8;i++) { delay_us(2); scl = 1; delay_us(2); if (sda==1) j = 1; else j = 0; k = (k<<1)|j; scl = 0; } delay_us(2); return k; } //软件模拟时钟信号 void clock() { uchar i; scl = 1; delay_us(2); while ((sda==1)&&(i<255)) i++; scl = 0; delay_us(2); } //24c02 从相应地址读数据 uchar aread(uchar address) { uchar i; start(); writex(0xa0); clock(); writex(address); clock(); start(); writex(0xa1); clock(); i = readx(); stop(); delay_us(5); return (i); } //24c02 向相应地址写入数据 void awrite(uchar address,uchar info) { EA = 0; start(); writex(0xa0); clock(); writex(address); clock(); writex(info); clock(); stop(); EA = 1; delay_us(5); } #endif 4 密码输入确认及修改 /*密码输入及设定密码*/ void mimakey() { uchar key; //key为暂存键值 uchar j; static uchar i=0; static uchar fin; static uchar in = 0; static uchar ms = 1; static uchar mk = 1; static uchar mj = 0; static uchar mb = 1; static uchar modif = 0; static uchar keyok; //开锁闭锁判断标志 key = keyin(); //按键操作 if (key == 14) //输入键开启才能输入密码 { in = 1; fin = 1; intx0f = 0; } if (key==10 && ms) //修改密码 { lcd_wcom(0x01); lcd_wcom(0x80); for (j=0;j<16;j++) { lcd_wdat(table5[j]); } modif = 1; mk = 1; in = 1; fin = 1; } if (key==12 && keyok) //开锁情况下按取消建闭锁 { led = 0; intx0f = 0; lcd_wcom(0x01); lcd_wcom(0xc0); for (j=0;j<11;j++) { lcd_wdat(table9[j]); } delay_ms(1000); lcd_wcom(0x01); lcd_wcom(0x80); for (j=0;j<8;j++) { lcd_wdat(table[j]); } i = 0; ms = 1; mj = 0; } if (in == 1) //密码输入 { if (modif && mk) //修改输入 { if (key>=0 && key <=9 && fin == 1) { temp[i] = key; lcd_wcom(0xc0+i); lcd_wdat('*'); i++; if (i==4) fin = 0; } else if (key == 12) { intx0f = 0; lcd_wcom(0x01); lcd_wcom(0xc0); for (j=0;j<11;j++) { lcd_wdat(table9[j]); } delay_ms(1000); lcd_wcom(0x01); lcd_wcom(0x80); for (j=0;j<8;j++) { lcd_wdat(table[j]); } in = 0; i = 0; } else if (i==4 && key==11) { keyok = 1; for (j=0;j<4;j++) { if (temp[j] != mima[j]) { keyok = 0; break; } } if (keyok) { led = 1; lcd_wcom(0x01); lcd_wcom(0x80); for (j=0;j<13;j++) lcd_wdat(table6[j]); in = 0; i = 0; mb = 0; mk = 0; } else { led = 0; lcd_wcom(0x01); lcd_wcom(0x80); for (j=0;j<6;j++) lcd_wdat(table2[j]); lcd_wcom(0xc0); for (j=0;j<11;j++) { lcd_wdat(table9[j]); } delay_ms(800); lcd_wcom(0x01); lcd_wcom(0x80); for (j=0;j<8;j++) { lcd_wdat(table[j]); } modif = 0; i = 0; } } } else if (mb==0) //输入密码与原密码匹配,则设定新的密码 { if (key>=0 && key <=9 && fin == 1) { temp2[i] = key; lcd_wcom(0xc0+i); lcd_wdat('*'); i++; if (i==4) fin = 0; } else if (key == 12) { intx0f = 0; lcd_wcom(0x01); lcd_wcom(0xc0); for (j=0;j<11;j++) { lcd_wdat(table9[j]); } delay_ms(1000); lcd_wcom(0x01); lcd_wcom(0x80); for (j=0;j<8;j++) { lcd_wdat(table[j]); } in = 0; modif = 0; mb = 1; i = 0; } else if (i==4 && key==11) { lcd_wcom(0x01); lcd_wcom(0x80); for (j=0;j<14;j++) { lcd_wdat(table7[j]); } in = 0; mj = 1; i = 0; mb = 1; } } else if (mj) //再次输入新的密码 { if (key>=0 && key <=9 && fin == 1) { temp1[i] = key; lcd_wcom(0xc0+i); lcd_wdat('*'); i++; if (i==4) fin = 0; } else if (key == 12) { intx0f = 0; lcd_wcom(0x01); lcd_wcom(0xc0); for (j=0;j<11;j++) { lcd_wdat(table9[j]); } delay_ms(1000); lcd_wcom(0x01); lcd_wcom(0x80); for (j=0;j<8;j++) { lcd_wdat(table[j]); } in = 0; mj = 0; i = 0; } else if (i==4 && key==11) { keyok = 1; for (j=0;j<4;j++) { if (temp2[j] != temp1[j]) { keyok = 0; break; } } if (keyok) { lcd_wcom(0x01); lcd_wcom(0x80); for (j=0;j<15;j++) { lcd_wdat(table3[j]); } lcd_wcom(0xc0); for (j=0;j<11;j++) { lcd_wdat(table9[j]); } for(j=0;j<10;j++) { led = 1; delay_ms(10); led = 0; delay_ms(10); } lcd_wcom(0x01); lcd_wcom(0x80); for (j=0;j<8;j++) { lcd_wdat(table[j]); } in = 0; i = 0; for (j=0;j<4;j++) { mima[j] = temp1[j]; } for(j=3;j>=0;j++) { awrite(j,mima[j]); //在24c08 的地址中写入数据 delay_us(5); } } else { led = 0; lcd_wcom(0x01); lcd_wcom(0x80); for (j=0;j<12;j++) { lcd_wdat(table8[j]); } lcd_wcom(0xc0); for (j=0;j<11;j++) { lcd_wdat(table9[j]); } delay_ms(1000); lcd_wcom(0x01); lcd_wcom(0x80); for (j=0;j<8;j++) { lcd_wdat(table[j]); } mj = 0; i = 0; } } } else //不修改密码时普通开锁输入 { //i=0; if (key>=0 && key <=9 && fin == 1) { lcd_wcom(0x80); for (j=0;j<15;j++) { lcd_wdat(table4[j]); } temp[i] = key; lcd_wcom(0xc0+i); lcd_wdat('*'); i++; if (intx0f||i==4) { i=0; fin = 0; } } else if (key == 12) { intx0f = 0; in = 0; lcd_wcom(0x01); lcd_wcom(0xc0); for (j=0;j<11;j++) { lcd_wdat(table9[j]); } delay_ms(1000); lcd_wcom(0x01); lcd_wcom(0x80); for (j=0;j<8;j++) { lcd_wdat(table[j]); } i = 0; } //else if (i==4 && key==11) else if (key==11) { keyok = 1; for (j=0;j<4;j++) { if (temp[j] != mima[j]) { keyok = 0; break; } } if (keyok) { led = 1; lcd_wcom(0x01); lcd_wcom(0x80); for(j=0;j<11;j++) lcd_wdat(table1[j]); lcd_wcom(0xc0); for (j=0;j<11;j++) { lcd_wdat(table9[j]); } delay_ms(1000); lcd_wcom(0x01); lcd_wcom(0x80); for (j=0;j<8;j++) { lcd_wdat(table[j]); } in = 0; i = 0; } else { led = 0; lcd_wcom(0x01); lcd_wcom(0x80); for(j=0;j<6;j++) lcd_wdat(table2[j]); lcd_wcom(0xc0); for (j=0;j<11;j++) { lcd_wdat(table9[j]); } delay_ms(1000); lcd_wcom(0x01); lcd_wcom(0x80); for (j=0;j<8;j++) { lcd_wdat(table[j]); } ms =1; i = 0; } } } } } 以上即为本次软件设计的详细过程。 第五章 设计调试与方案选择 5.1编码的方案选择 本设计发送端的编码过程是一个难点,可以通过软件编码与硬件编码实现。 方案一:硬件编码 编码成功率高,读取显示简单,这是它的优点。可是该芯片价格昂贵,硬件电路较为复杂,不易调试是它的一大缺点。 方案二:软件编码 编码方式更为灵活,不需拘泥与各种标准的形式。缺点是编程过程复杂,没有标准化,可读行不高,稳定性差。 方案三:遥控器 成本低,稳定性高,可以直接作为已编码的发送端使用,直接省去了发送段的制作、编程以及调试过程,加快了项目进度,节约了资源。但解码时必须参考特定 遥控器的编码格式,如NEC标准,飞利浦标准,在解码前也必须先了解遥控器各个键位的编码值(可以通过某些示波器的储存模式查看)。 综上所述,考虑到可以节约更多成本和时间,本设计采用遥控器作为发送端。 5.2解码的方案选择 本设计的重点在于遥控解码,遥控解码的方式有硬件解码与软件解码。 方案一:硬件解码。 硬件解码:在接受遥控的一边可以连接一个专用解码芯片,只要按键盘上的键值,它就能直接把这个键值解码出来并存储,当你调用这个键值的时候只要从里面 去读取就行了,所以它的解码率高,读取显示简单,这是它的优点。可是该芯片价格昂贵,而且只能解码对应的遥控器,兼容性差,成本昂贵,不适合用作市场 量产。 方案二:软件解码。 软件解码:根据遥控器选择的芯片不同,其遥控码格式也有不同。现在市场上主要有日本的NEC标准和飞利浦标准,通过软件的方式解码时解码的正确率就是一个很重要的指标了。在单片机编程的时候是选择用执行效率高的汇编语言还是选用可读性编写容易的C语言呢?不可否认汇编的执行效率是C语言的几倍甚至几十倍,而且误码率低,可是如果选择汇编的话编写难度可想而知,可是如果用C语言编写的话误码率及实时性又会变得比较差。综合以上考虑,采用C语言软件解码方式。 5.3红外接收部分调试 通过示波器观察,得知遥控器键值码表如下 键位 传输编码 键值 1 00110000 0C 2 00011000 18 3 01111010 5E 4 00010000 08 5 00111000 1C 6 01011010 5A 7 01000010 42 8 01001010 52 9 01010010 4A 0 01100001 16 输入 10010001 19 确认 11010001 0D 注:NEC标准规定传输低位先传高位后传,故上表编码的值不等于键值 从示波器中看到的编码波形如图5-1 图5-1 5.4总结 经过查资料、设计方案、实验、系统设计、模块设计、实物连接与调试等几个阶段,所设计的红外遥控密码锁系统已实现所要求的基本功能----通过按键发出命令,红外遥控锁接收到指令后,对命令进行分析,给出相应的操作。 在此次竞赛过程中,巩固了在大学内学过的知识,尤其是单片机和模拟电子方面的知识;同时通过这次竞赛提高了单片机编程的能力,也获得的软件调试经验;同时也加强了我的实际编程能力,让自己更加的知道了自己知识领域里的不足和缺陷。由于时间太仓促,经验不足,理论方面也相应的存在不足,再加上条件有限,本设计中仍存在着一些设计方面的问题和缺陷,个人技能也有待提高,理论知识还要巩固加强。 参考文献 [1 ] 胡汉才.单片机原理及其借口技术[M].清华大学出版社,1996 [2] 薛小玲 刘志群 贾俊荣 .单片机借口模块应用与开发实例详解. 北京航空航天大学出版社 2010 [3] 郑锋 王巧芝等.51单片机应用系统典型模块开发大全.中国铁道出版社 2010 [4] 陈玻若 . 红外系统. 普通高等教育兵工类规划教材 1995 [5] www.elecfans.com [6] www.eehome.cn

    Top_arrow
    回到顶部
    EEWORLD下载中心所有资源均来自网友分享,如有侵权,请发送举报邮件到客服邮箱bbs_service@eeworld.com.cn 或通过站内短信息或QQ:273568022联系管理员 高进,我们会尽快处理。