课程设计(论文)-基于单片机的遥控密码锁.doc_第1页
课程设计(论文)-基于单片机的遥控密码锁.doc_第2页
课程设计(论文)-基于单片机的遥控密码锁.doc_第3页
课程设计(论文)-基于单片机的遥控密码锁.doc_第4页
课程设计(论文)-基于单片机的遥控密码锁.doc_第5页
已阅读5页,还剩38页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1 遥控密遥控密码锁码锁 -基于基于 51 单单片机片机 附带程序 目录目录 1 目的和意义目的和意义 2 2 方案设计方案设计 2 3 硬件原理分析及设计硬件原理分析及设计 2 3.1 发射模块原理.2 3.1.1 红外发送系统原理.3 3.1.2 nec编码格式介绍.3 3.2 接收解码模块.4 3.2.1 接收解码原理.4 3.2.2 接收解码模块的硬件电路.5 3.4 液晶显示模块.6 4 软件设计软件设计 7 4.1 编程语言.7 4.2 主要程序说明及流程图.7 4.2.1 主程序.7 4.2.2 接收解码程序.8 4.2.3 按键数字分配.11 4.2.4 密码判断、报警及修改程序.12 4.2.5 按键发声程序.19 4.2.6 没操作响应.19 5 功能分析及总结功能分析及总结 20 5.1 功能分析.20 5.2 c 语言编程的延时技巧.21 5.3 本设计优缺点.23 5.4 设计总结.23 参参 考考 文文 献献 1 附录附录 c 实物图实物图.3 1 摘 要 单片机遥控系统是将红外遥控技术和单片机应用技术相结合的一种方案。本系统为 红外遥控电子密码锁的控制管理部分,只要再连接上不同用途的电磁锁即可成为一个完 整的红外遥控电子密码锁系统应用到各种领域中。而且本系统还设计有学习 nec 红外编 码遥控器的功能,通过红外接收解码电路,把遥控器的键码还原并储存起来,再利用查 找对比的方法便能够识别不同的遥控器,大大提高了系统的灵活性和实用性。 本系统以单片机作为核心元件将电子密码锁和无线遥控技术结合起来,使其具有修 改密码、报警锁定等功能,不仅能进行远距离遥控解锁,还能实现近距离按键密码初始 化及复位解除报警。同时采用 e2prom 作为存储单元,方便用户存储、修改密码和遥控 器键码;采用 lcd 显示令使用更加方便直观。红外线遥控电子密码锁能实现多种控制功 能,改善了传统机械锁的各种缺点,有较好的市场发展前景和技术应用价值。而且本系 统的红外接收解码部分延时计数准确,并且有错误校验,所以整个接收解码的准确性非 常高。 设计电路主要由红外线解码学习电路、密码修改和存储电路、声光提示报警电路、 lcd 显示电路组成。系统能完成输入密码开锁、出错报警、超次锁定、修改用户密码等 基本的密码锁的功能,并且还能实现远距离遥控、按键密码初始化、掉电存储、声光提 示、遥控器学习识别等附加功能。本设计详细介绍了单片机遥控系统的软硬件设计方法, 并给出了具体的各单元电路设计、程序设计及主程序流程图。 关键词:电子密码锁 红外遥控 单片机 nec 编码 2 1 目的和意义 随着人们生活水平的提高,如何实现家庭防盗这一问题也变得尤其重要。目前国内, 大部分人使用的还是传统的机械锁。传统的机械锁由于其构造的简单,被撬的事件屡见 不鲜。即使是一把质量过关的机械锁,通过急开锁,甚至可以在不损坏锁的前提下将锁 打开。而且,在日常的生活和工作中,若使用传统的机械式钥匙开锁,人们常需携带多 把钥匙,使用极不方便,且钥匙丢失后安全性即大打折扣。为此,本系统试着设计具有 防盗报警功能的红外线遥控电子密码锁来代替传统的机械式密码锁,克服了机械式密码 锁密码量少、安全性能差的缺点。而且还添加了红外遥控、遥控器学习识别和 lcd 显 示等功能,可以实现远距离开关锁、修改密码等,系统灵活性强,操作简单直观、使用 非常方便。 2 方案设计 用以下方案设计本次系统:发射模块使用型号为 hz-ft007 的 20 键车载 mp3 红外 遥控器和创维 rc-585 型 dvd 遥控器,因为它们都是采用 nec 编码格式的红外遥控芯 片作为主要芯片;使用一体化红外接收头 sm0038 和单片机 stc89c51rc 结合的方式 完成接收解码模块,学习识别 nec 编码格式的不同遥控器;使用 at24c02 这一串行 e2prom 作为存储模块;使用 lcd1602a 实现系统的显示模块。系统的总框图如图 3 所 示。这样的选择使系统在较低成本的情况下较好地实现系统的功能,而且系统有着较高 的抗干扰性和稳定性。 图 3 选用方案系统框图 3 硬件原理分析及设计 3.1 发射模块原理 按键 upd6122g sm0038 mcu at24c02 lcd1602 电磁锁 nec 编码遥控器 3 3.1.1 红外发送系统原理 红外遥控信号是一连串的二进制脉冲码。为了使其在无线传输过程中免受其他红外 信号的干扰,通常都是先将其调制在特定的载波频率上,然后再经红外发光二极管发射 出去,红外线接收装置则会滤除其它杂波只接收该特定频率的信号并将其还原成二进制 脉冲码。在本红外遥控系统中,红外信号的载波频率为 38khz。 通常,红外遥控系统中所采用的编码方式有两种:通过脉冲宽度来实现信号调制的 脉宽调制(pwm)和通过脉冲串之间的时间间隔来实现信号调制的脉时调制(ppm) 。本 系统是采用 ppm 方法,即用两个脉冲之间的时间间隔来表示二进制信息。 为了确保发送端和接收端之间数据传输的准确无误,红外线信号还要按照特定的传 输协议来进行信号传输。常用的红外线信号传输协议有 nec 协议、rc-5 协议、rc-6 协议、sharp 协议等。 3.1.2 nec 编码格式介绍 本系统使用的型号为 hz-ft007 的 20 键车载 mp3 红外遥控器和创维 rc-585 型 dvd 遥 控器请参看附录 c 中的实物图,它们主要芯片都是 nec 编码格式的红外遥控芯片。 nec 编码广泛应用于电视机,dvd,pc 电脑,音响等,是比较常用的一种红外编码格式。 下面以 nec 编码标准的红外编码芯片 upd6122g 作为例子介绍。nec 遥控编码是连续 的 32 位二进制码组,其中的前十六位是用户码,后 16 位为 8 位的数据码及其反码。在 每次编码之前还会发送 9ms 高电平和 4.5ms 低电平组成的引导码(或称起始码) 。而且 第二段的用户码也可以在遥控应用电路中被设置为第一段用户码的反码。它的帧结构如 图 4 所示。 图 4 upd6122g 编码格式 nec 编码标准是以用不同脉冲的时间间隔来区分0和1的,upd6122g 以脉 宽为 0.56ms、间隔 0.565ms、周期为 1.125ms 的组合表示二进制的0 ;以脉宽为 4 0.56ms、间隔 1.69ms,周期为 2.25ms 的组合表示二进制的1 。其波形如图 5 所示。 图 5 upd6122g0和1波形图 使用 455khz 晶振时各代码所占的时间如图 6 所示: 图 6 使用 455khz 晶振时各代码所占的时间 upd6122g 按键输出有两种方式:一种是每次按键都输出完整的一帧数据;另一种 是按下按键不松开时,发送完整的一帧数据后再发送重复码,直到按键被松开。其波形 如图 7 所示。 图 7 重复码的波形图 3.2 接收解码模块 3.2.1 接收解码原理 接收解码的关键是如何识别0和1 ,本系统使用的是一体化红外接收头进行红 5 外信号接收,在没有信号的时候其输出端是高电平,而有信号的时候是低电平,所以其 输出信号电平正好和遥控发射端相反。从上面的讨论可以发现在遥控发射端0和 1均以 0.56ms 的高电平开始,不同的是低电平的宽度, 0为 0.565ms, 1为 1.69ms,所以必须根据低电平的宽度区别0和1 。本系统用中断的方式实现从接 收头到 mcu 的信号传输。如图 9 所示,红外接收头的输出端连接到单片机的 int0 脚。 接收头输出端有低电平信号输出时引起单片机的中断。单片机响应中断并进行信号的接 收解码。解码后的信号就变成相应的遥控器按键代码,从而可以成为密码锁的密码。 图 9 中断接收示意图 3.2.2 接收解码模块的硬件电路 接收解码电路由一体化红外接收头 sm0038 和单片机 stc89c51rc 组成。 stc 系列单片机具有在系统中直接可编程特性,其好处是:省去购买通用编程器, 单片机在用户系统上即可下载/烧录用户程序,而无须将单片机从已生产好的产品上拆 下,再用通用编程器将程序代码烧录进单片机内部。有些程序尚未定型的产品可以一边 生产,一边完善,加快了产品进入市场的速度,减小了新产品由于软件缺陷带来的风险。 由于可以在用户的目标系统上将程序直接下载进单片机看运行结果对错,故无须仿真器, 因此选择使用这款单片机。 一体化红外接收头 sm0038 是集信号放大、滤波、检波、整形于一体的红外接收器, 电路内置 pin 二极管和前置放大器,采用可以红外滤波的环氧树脂材料封装,可靠性高, 不易受环境影响并可以防止非控制信号的输出脉冲出现。它的内部电路如图 10 所示。 接收头 sm0038 mcu int0 6 图 10 sm0038 内部结构图 sm0038 内置带通滤波器、积分器、和自动增益控制电路以抑制各种干扰和噪音。 数据信号和干扰信号的主要区别在于载波频率、脉冲波长和工作周期上。所以数据信号 应该满足以下的要求。而本系统选用的 sm0038 在这三方面和 nec 编码格式是相配的。 载波信号的频率尽量接近带通滤波器的中心频率(38khz) 。 脉冲长度在 300us 以上。 数据的编码类型相兼容。 3.4 液晶显示模块 系统中采用 lcd1602 作为显示器件输出信息。与传统的 led 数码管显示器件相比, 液晶显示模块具有体积小、功耗低、显示内容丰富等优点,而且不需要外加驱动电路, 现在液晶显示模块已经是单片机应用设计中最常用的显示器件了。lcd1602 可以显示 2 行16 个字符,具有 8 位数据总线 d0-d7,和 rs、r/w、e 三个控制端口,工作电压 为 5v,并且带有字符对比度调节和背光设置。lcd1602 与单片机的连接电路图参考附 录 a。 其管脚功能简介如下: vl:lcd 对比度调节端,电压调节范围为 05v。接正电源时对比度最弱,接地 电源时对比度最高,可以用一个 10k 的电位器来调整对比度; rs:数据或者指令选择端。处理器写入指令时,rs 为低电平,写入数据时,rs 为 高电平; r/w:读写控制端。r/w 为高电平时,读取数据;r/w 为低电平时,写入数据; e:lcd 模块使能信号控制端。写数据时,需要下降沿触发模块; d0d7:8 位数据总线,三态双向; 7 bla: led 背光正极。需要背光时,bla 串接一个限流电阻接 vcc; blk: led 背光负极。 4 软件设计 4.1 编程语言 目前,对单片机的编程主要采用汇编和 c 语言。汇编语言有执行效率高、速度快、 与硬件结合紧密等特点。尤其在进行 i/o 端口管理时,使用汇编语言有快捷、直观的优 点。但是使用汇编语言相对于使用高级语言编程难度要大一些,且程序可读性低,开放 性差,从系统开发时间来看,效率不是很高。 c 语言是一种结构化语言,可产生紧凑代码。c 语言可以用许多机器级函数直接控 制操作 8051 硬件。与汇编语言相比,c 语言有如下的优点: 不要求了解单片机的指令系统,仅要求对 8051 的存储结构有初步了解; 寄存器分配,不同存储器的寻址及数据类型等细节可由编译器管理; 程序有规范的结构,可分为不同的函数,这种方式可使程序结构化; 具有将可变的选择与特殊操作组合在一起的能力,改善了程序的可读性; 关键字及运算符可用近似人的思维方式使用; 编程及程序调试时间显著缩短,从而提高效率; 提供的库包含许多标准子程序,具有较强的数据处理能力; 已编好的程序可容易地植入新程序,因为它具有方便的模块化编程技术。 当然,采用混编模式,就能结合两者的优点。本着学习的目的,本系统均采用 c51 语言编写。 4.2 主要程序说明及流程图 4.2.1 主程序 本系统的软件程序主要包括主程序、接收解码程序、密码判断和报警程序、密码修 改程序、遥控器学习识别程序几个大的模块程序。完整程序见附录 b。 主程序首先是初始化程序,然后就等待红外接收头输出端的低电平,低电平出现说 明遥控有键按下,外部中断设定为下降沿触发,故单片机进入中断服务程序进行信号的 接收解码。系统进入密码输入界面,并且接收到八位的密码以后就开始运行密码核对程 序,当密码输入正确后,就可以进行开锁、上锁或修改密码的操作。当密码输入错误的 时候就会进入密码输入提醒程序提醒用户重新输入密码,密码输入累积到 3 次时系统会 8 报警并锁定。相应的主程序流程图如图 12 所示。 图 12 主程序流程图 4.2.2 接收解码程序 红外接收解码的关键是如何识别0和1码,我的做法是根据0和1码 的高电平宽度不一样的特点来进行识别。接收程序的流程图如图 13 所示。 进入红外接收程序后先关闭中断。接着的工作是避开 9ms 高电平、4.5ms 的低电平 的引导码,并且判断是否干扰信号或者重复信号。正如前面所说,一体化红外接收头的 输出端电平跟遥控发射端电平相反。如图 14 所示。 所以只要遥控有键按下单片机就会马上产生中断接收数据。跟在引导码后面的是 32 位用户码和数据码,也就是我们想要的数据,单片机把它接收并保存。当接收完 8 位的 数据时要更换另外一个数据缓冲区,当 32 位的键码都接收完的时候就意味这一帧的数 据已经接收完毕。然后根据接收到的数据码和数据反码是否对应位相反来确定接收的这 初始化 等待遥控识别按键 时钟模式 密码核对 报警锁定 开锁上锁密码修改 n 错误 正确 密码锁按键 密码锁模式 y 9 一帧数据是否正确,最后退出接收解码程序。 图 13 红外接收程序流程图 图 14 接收头前导码信号变相图 红外中断程序 关中断 是否 9ms 低电平 开始接收 32 位编 码 接收信号 “1” 保存,接收了 8 位? 是否 4.5ms 低电平 低电平大于 800us 接收信号 “0” 保存,接收了 32 位? 开中断 返回 干扰信号重复信号 n n n n n y y y y y 发射模块mcu 9ms 4.5ms 接收头 9ms 4.5ms 10 而单片机的接收端的0 1波形图如图 15 所示。在保存0码和1码的时 候还有一个保存时机的问题,如果从 0.56ms 低电平过后开始延时,0.56ms 以后若读到 为低电平,说明该位为0 ,反之则为1 。为安全起见,延时必须比 0.56ms 长一些, 但又不能超过 1.12ms,否则如果该位为0读到的已是下一位的高电平,因此取( 1.12ms + 0.56ms )/2=0.84ms 较为可靠,一般取 0.84ms 左右均可。 图 15 单片机接收端的0 1波形图 接收解码关键程序: sbit ir = p32; / 红外中断输入端口(int0) void ir_svr(void) interrupt 0 using 0 int width=0,i; ex0 = 0; /关中断 /*常规状态下 int0 为高电平,由高电平跳变为低电平时(即下降沿)产生中断*/ / 引导信号:9ms 低电平 while(!ir) delay_100us(); width+; /计算引导电平的宽度 if (width 0x08)ir_data |= 0x01; /信号“1“和“0“判断 if (i=8) /保存接收到的数据 datair0 = ir_data; if (i=16) datair1 = ir_data; if (i=24) datair2 = ir_data; if (i=32) datair3 = ir_data; if (datair2 != datair3) /纠错校验 ex0 = 1; return; ir_data = datair2; ir_flag = 1; /接收成功标志位 tr1=0; /有按键关定时器 1 t=0; ex0 = 1; 4.2.3 按键数字分配 由于遥控器的编码是为了不容易出错而编的,导致数据比较乱,为了编程方便,我们特意修改 了数据。09 号为密码数据,10 号为退格键,11 号为密码修改键,18 号为开锁键,14 号为调整时 间键,8 号调时,9 号调分。 /* 按 键 数 据 编 码 */ 12 /* 18,19,20 */ /* 15,16,17 */ /* 12,13,14 */ /* 0, 10,11 */ /* 1, 2, 3 */ /* 4, 5, 6 */ /* 7, 8, 9 */ /* 遥控器 */ uchar key_match() switch(ir_data) case 0x68: return(0); case 0x30: return(1); case 0x18: return(2); case 0x7a: return(3); case 0x10: return(4); case 0x38: return(5); case 0x5a: return(6); case 0x42: return(7); case 0x4a: return(8); case 0x52: return(9); case 0x98: return(10); case 0xb0: return(11); case 0xe0: return(12); case 0xa8: return(13); case 0x90: return(14); case 0x22: return(15); case 0x02: return(16); case 0xc2: return(17); case 0xa2: return(18); case 0x62: return(19); case 0xe2: return(20); default : return(99); 4.2.4 密码判断、报警及修改程序 电子密码锁的软件编程主要分为两方面,分别是接收密码后判断及报警部分和密码 修改控制部分。 首先介绍密码判断及报警程序。显示收到的键码并保存到接收缓存 receive_code8, 直到 8 位键码接收完毕。然后和原密码缓存 origin_code8比较,判断密码是否正确。若 密码正确则将标志位 code_right=1;若不正确则报警并使密码输入错误次数 13 wrong_num+,再判断错误次数是否已达 3 次,若是则程序进入死循环锁定。程序流程 图如图 16 所示。 图 16 密码判断及报警流程图 接着介绍密码修改控制程序。当密码输入正确以后用户按下“密码修改键”就会进 入密码修改操作,单片机也就会运行密码修改程序。程序流程图如图 17 所示。 code_right=1 修改密码? 保存新密码 新密码接收完毕? 返回 n n n n y y y y 新密码确认完毕? 两次密码相同? 显示错误 输入密码 接收了 8 位键码? code_right=1 密码是否正确 wrong_num+ wrong_num=3? 错误警告 报警锁定 n n n y y y 14 图 17 密码修改流程图 进入密码修改程序首先等待新密码的第一次输入。第一次输入的新密码放在接收缓 存 receive_code8中,当输入完第八个密码后系统会提示再次输入密码,第二次输入的 新密码放在密码比较缓存 com_code8中。第二次输入密码完成后就检验两次输入的新 密码是否相同,如果相同的话就更换密码,将新密码储存到 at24c02 中。 关键程序如下: void check_code(void) if(ir_flag=1) flag=0, key_data=key_match() , beep(),ir_flag=0,j=0; /beep 函数发 出按键声音 if(show=1 flag=1; rec_num-; if(key_data=18) /跳到时钟模式 key_data=99; delay_lcm(10); lcm_cls(); show=0 ; beep_flag=0;rec_num=0; k=1; 15 if(rec_num=8)/输入八个密码后密码检查 for(j=7;j0;j-) if(origin_codej!=receive_codej)/与原密码比较 wrong_num+; if(wrong_num=1) delay_lcm(1000);lcm_cls();delay_lcm(1000); displaylistchar(0,0,“input it again!“); else if(wrong_num=2) delay_lcm(1000);lcm_cls();delay_lcm(1000); displaylistchar(0,0,“the last time“); else if(wrong_num=3) lcm_cls(); displaylistchar(0,0,“wrong!“); displaylistchar(0,1,“lock“); led1=1;led2=1;led3=0; speaker=0; /3 次错误报警 delay_lcm(10000); while(1); /3 次错误进入死循环锁定 code_right=0; rec_num=0; return; lcm_cls(); displaylistchar(0,0,“ (_)“);/密码正确,开锁成功 displaylistchar(0,1,“what you want?“); rec_num=0; show=0; code_right=1;/密码正确标识位 void change_code(void) 16 int i,j; if(ir_flag=1) key_data=key_match(),flag=0,beep(),ir_flag=0; if( code_right=1 lcm_cls(); displaylistchar(0,0,“input new code“); new_code1=1;/修 ii 改密码标识位 1 if(new_code1=1 rec_num-; flag=1; if(code_right=1 lcm_cls(); displaylistchar(0,0,“input again!“); rec_num=0; new_code2=1;/修改密码标识位 2 new_code1=0; if(new_code2=1 rec_num-; flag=1; if(code_right=1 new_code2=0; j=8; while(j-) /判断两次输入是否一致 if(com_codej!=com1_codej) delay_lcm(10); lcm_cls(); displaylistchar(0,0,“not match!“); displaylistchar(0,1,“press change key“); delay_lcm(200); return; lcm_cls(); for(i=0;i sbit ir = p32; / 红外中断输入端口(int0 sbit speaker=p30; sbit led1=p13; sbit led2=p14; sbit led3=p15; #define system_osc 12000000/定义晶振频率 12000000hz #define uchar unsigned char #define uint unsigned int uchar datair4,ir_data,new_code1=0,new_code2=0; uchar key_data=100; int rec_num=0,show=0,wrong_num=0,flag=0; uchar origin_code=1,2,3,4,5,6,7,8,receive_code8,com_code8,com1_code8; int t,ir_flag=0,code_right=0,j=0,n=0,beep_flag=0,shi,fen,miao,k=0; int code fretab21 = 300,400,600,800,800,1200,1400,300,400,600,800,800,1200,1400,300,400,600,800,800,1200,1400 ; /原始 频率表 uchar sound_temp_th0,sound_temp_tl0;/音符定时器初值暂存 extern void delay_100us(void); extern void write_sfm(uchar add,uchar date); extern void initlcm( void); /lcd 初始化子程序 extern void displaylistchar(uchar x,uchar y, unsigned char *ddata); extern void displayonechar(uchar x,uchar y, unsigned char ddata); extern void delay_lcm(uint k); /显示指定坐标的一串字符子函数 extern void lcm_cls(void); void delay_lcm(uint k); void delay_100us(void); void check_code(void); void change_code(void); void beep(void); /* 按 键 数 据 编 码 */ /* 18,19,20 */ /* 15,16,17 */ /* 12,13,14 */ /* 0, 10,11 */ /* 1, 2, 3 */ /* 4, 5, 6 */ /* 7, 8, 9 */ /* 遥控器 */ uchar key_match() switch(ir_data) case 0x68: return(0); case 0x30: return(1); case 0x18: return(2); case 0x7a: return(3); case 0x10: return(4); case 0x38: return(5); case 0x5a: return(6); case 0x42: return(7); case 0x4a: return(8); case 0x52: return(9); case 0x98: return(10); case 0xb0: return(11); case 0xe0: return(12); case 0xa8: return(13); case 0x90: return(14); case 0x22: return(15); case 0x02: return(16); case 0xc2: return(17); case 0xa2: return(18); case 0x62: return(19); case 0xe2: return(20); default : return(99); main(void) th1=0x3c;tl1=0xb0; initlcm(); tmod |= 0x11;/定时器 0 和定时器 1 工作方式都是 1 et0 = 1; et1=1; it0=1; ex0=1; ea=1; tr0=0; displaylistchar(3,0,“welcome!“); displaylistchar(3,1,“00:00:00“); shi=0; fen=0; miao=0; delay_lcm(5000); while(1) /时钟部分程序 f1: displaylistchar(0,0,“ “); displaylistchar(0,1,“ “); displaylistchar(6,0,“(0_0)“); displaylistchar(3,1,“ : : “); write_sfm(3,shi); write_sfm(6,fen); write_sfm(9,miao); while(1) delay_lcm(2000); displaylistchar(6,0,“(_)“); if(ir_flag=1) key_data=key_match(),ir_flag=0; if(key_data=14)key_data=99;goto f2; if(key_data=18) /转入密码模式 beep_flag=1; beep(); key_data=99; lcm_cls(); delay_lcm(10); displaylistchar(0,0,“input the code! “); show=1; beep_flag=1; goto a1; miao+; if(miao=60) miao=0; fen+; if(fen=60) fen=0; shi+; if(shi=24) shi=0; write_sfm(3,shi); write_sfm(6,fen); write_sfm(9,miao); f2: while(1) if(ir_flag=1) key_data= key_match(); switch(key_data) case 8: if(shi=23)shi=0; else shi+;ir_flag=0;write_sfm(3,shi);break; case 9: if(fen=59)fen=0; else fen+;ir_flag=0;write_sfm(6,fen);break; default: displaylistchar(6,0,“(-_-)“);ir_flag=0;delay_lcm(3000);displaylistchar(6,0,“(0)“);break; if(key_data=14)key_data=99;goto f1; a1: while(1) tr1=1; if(code_right=0) check_code(); /密码程序部分 else change_code(); if(k=1) delay_lcm(2000); code_right=0; k=0; goto f1; /*按键接收、显示和检验报警*/ void check_code(void) if(ir_flag=1) flag=0, key_data=key_match() , beep(),ir_flag=0,j=0; /beep 函数发出按键声音 if(show=1 flag=1; rec_num-; if(key_data=18) /跳到时钟模式 key_data=99; delay_lcm(10); lcm_cls(); show=0 ; beep_flag=0;rec_num=0; k=1; if(rec_num=8)/输入八个密码后密码检查 for(j=7;j0;j-) if(origin_codej!=receive_codej)/与原密码比较 wrong_num+; if(wrong_num=1) delay_lcm(1000);lcm_cls();delay_lcm(1000); displaylistchar(0,0,“input it again!“); else if(wrong_num=2) delay_lcm(1000);lcm_cls();delay_lcm(1000); displaylistchar(0,0,“the last time“); else if(wrong_num=3) lcm_cls();displaylistchar(0,0,“wrong!“); displaylistchar(0,1,“lock“); led1=1;led2=1;led3=0; speaker=0; /3 次错误报警 delay_lcm(10000); while(1); /3 次错误进入死循环锁定 code_right=0; rec_num=0; return; lcm_cls(); displaylistchar(0,0,“ (_)“);/密码正确,开锁成功 displaylistchar(0,1,“what you want?“); rec_num=0; show=0; code_right=1;/密码正确标识位 /*修改密码程序*/ void change_code(void) int i,j; if(ir_flag=1) key_data=key_match(),flag=0,beep(),ir_flag=0; if( code_right=1 lcm_cls(); displaylistchar(0,0,“input new code“); new_code1=1;/修 ii 改密码标识位 1 if(new_code1=1 rec_num-; flag=1; if(code_right=1 lcm_cls(); displaylistchar(0,0,“input again!“); rec_num=0; new_code2=1;/修改密码标识位 2 new_code1=0; if(new_code2=1 rec_num-; flag=1; if(code_right=1 new_code2=0; j=8; while(j-) /判断两次输入是否一致 if(com_codej!=com1_codej) delay_lcm(10); lcm_cls(); displaylistchar(0,0,“not match!“); displaylistchar(0,1,“press change key“); delay_lcm(200); return; /密码一致,开始修改密码 lcm_cl

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论