课程设计(论文)基于单片机的遥控密码锁

上传人:仙*** 文档编号:32550779 上传时间:2021-10-15 格式:DOC 页数:43 大小:870.02KB
收藏 版权申诉 举报 下载
课程设计(论文)基于单片机的遥控密码锁_第1页
第1页 / 共43页
课程设计(论文)基于单片机的遥控密码锁_第2页
第2页 / 共43页
课程设计(论文)基于单片机的遥控密码锁_第3页
第3页 / 共43页
资源描述:

《课程设计(论文)基于单片机的遥控密码锁》由会员分享,可在线阅读,更多相关《课程设计(论文)基于单片机的遥控密码锁(43页珍藏版)》请在装配图网上搜索。

1、1遥控密遥控密码锁码锁 -基于基于 51 单单片机片机附带程序目录目录1目的和意义目的和意义 .22方案设计方案设计 .23 硬件原理分析及设计硬件原理分析及设计 .23.1 发射模块原理.23.1.1 红外发送系统原理.33.1.2 NEC编码格式介绍.33.2 接收解码模块.43.2.1 接收解码原理.43.2.2 接收解码模块的硬件电路.53.4 液晶显示模块.64 软件设计软件设计 .74.1 编程语言.74.2 主要程序说明及流程图.74.2.1 主程序.74.2.2 接收解码程序.84.2.3 按键数字分配.114.2.4 密码判断、报警及修改程序.124.2.5 按键发声程序.1

2、94.2.6 没操作响应.195 功能分析及总结功能分析及总结 .205.1 功能分析.205.2 C 语言编程的延时技巧.215.3 本设计优缺点.235.4 设计总结.23参参 考考 文文 献献 .1附录附录 C 实物图实物图.31摘要单片机遥控系统是将红外遥控技术和单片机应用技术相结合的一种方案。本系统为红外遥控电子密码锁的控制管理部分,只要再连接上不同用途的电磁锁即可成为一个完整的红外遥控电子密码锁系统应用到各种领域中。而且本系统还设计有学习 NEC 红外编码遥控器的功能,通过红外接收解码电路,把遥控器的键码还原并储存起来,再利用查找对比的方法便能够识别不同的遥控器,大大提高了系统的灵

3、活性和实用性。本系统以单片机作为核心元件将电子密码锁和无线遥控技术结合起来,使其具有修改密码、报警锁定等功能,不仅能进行远距离遥控解锁,还能实现近距离按键密码初始化及复位解除报警。同时采用 E2PROM 作为存储单元,方便用户存储、修改密码和遥控器键码;采用 LCD 显示令使用更加方便直观。红外线遥控电子密码锁能实现多种控制功能,改善了传统机械锁的各种缺点,有较好的市场发展前景和技术应用价值。而且本系统的红外接收解码部分延时计数准确,并且有错误校验,所以整个接收解码的准确性非常高。设计电路主要由红外线解码学习电路、密码修改和存储电路、声光提示报警电路、LCD 显示电路组成。系统能完成输入密码开

4、锁、出错报警、超次锁定、修改用户密码等基本的密码锁的功能,并且还能实现远距离遥控、按键密码初始化、掉电存储、声光提示、遥控器学习识别等附加功能。本设计详细介绍了单片机遥控系统的软硬件设计方法,并给出了具体的各单元电路设计、程序设计及主程序流程图。关键词:电子密码锁红外遥控单片机NEC 编码21目的和意义随着人们生活水平的提高,如何实现家庭防盗这一问题也变得尤其重要。目前国内,大部分人使用的还是传统的机械锁。传统的机械锁由于其构造的简单,被撬的事件屡见不鲜。即使是一把质量过关的机械锁,通过急开锁,甚至可以在不损坏锁的前提下将锁打开。而且,在日常的生活和工作中,若使用传统的机械式钥匙开锁,人们常需

5、携带多把钥匙,使用极不方便,且钥匙丢失后安全性即大打折扣。为此,本系统试着设计具有防盗报警功能的红外线遥控电子密码锁来代替传统的机械式密码锁,克服了机械式密码锁密码量少、安全性能差的缺点。而且还添加了红外遥控、遥控器学习识别和 LCD 显示等功能,可以实现远距离开关锁、修改密码等,系统灵活性强,操作简单直观、使用非常方便。2方案设计用以下方案设计本次系统:发射模块使用型号为 HZ-FT007 的 20 键车载 MP3 红外遥控器和创维 RC-585 型 DVD 遥控器,因为它们都是采用 NEC 编码格式的红外遥控芯片作为主要芯片;使用一体化红外接收头 SM0038 和单片机 STC89C51R

6、C 结合的方式完成接收解码模块,学习识别 NEC 编码格式的不同遥控器;使用 AT24C02 这一串行E2PROM 作为存储模块;使用 LCD1602A 实现系统的显示模块。系统的总框图如图 3 所示。这样的选择使系统在较低成本的情况下较好地实现系统的功能,而且系统有着较高的抗干扰性和稳定性。图 3 选用方案系统框图3 硬件原理分析及设计3.1 发射模块原理按键uPD6122GSM0038MCUAT24C02LCD1602电磁锁NEC 编码遥控器33.1.1 红外发送系统原理红外遥控信号是一连串的二进制脉冲码。为了使其在无线传输过程中免受其他红外信号的干扰,通常都是先将其调制在特定的载波频率上

7、,然后再经红外发光二极管发射出去,红外线接收装置则会滤除其它杂波只接收该特定频率的信号并将其还原成二进制脉冲码。在本红外遥控系统中,红外信号的载波频率为 38KHz。通常,红外遥控系统中所采用的编码方式有两种:通过脉冲宽度来实现信号调制的脉宽调制(PWM)和通过脉冲串之间的时间间隔来实现信号调制的脉时调制(PPM) 。本系统是采用 PPM 方法,即用两个脉冲之间的时间间隔来表示二进制信息。为了确保发送端和接收端之间数据传输的准确无误,红外线信号还要按照特定的传输协议来进行信号传输。常用的红外线信号传输协议有 NEC 协议、RC-5 协议、RC-6协议、Sharp 协议等。3.1.2 NEC 编

8、码格式介绍本系统使用的型号为 HZ-FT007 的 20 键车载 MP3 红外遥控器和创维 RC-585 型 DVD 遥控器请参看附录 C 中的实物图,它们主要芯片都是 NEC 编码格式的红外遥控芯片。NEC 编码广泛应用于电视机,DVD,PC 电脑,音响等,是比较常用的一种红外编码格式。下面以 NEC 编码标准的红外编码芯片 uPD6122G 作为例子介绍。NEC 遥控编码是连续的 32 位二进制码组,其中的前十六位是用户码,后 16 位为 8 位的数据码及其反码。在每次编码之前还会发送 9ms 高电平和 4.5ms 低电平组成的引导码(或称起始码) 。而且第二段的用户码也可以在遥控应用电路

9、中被设置为第一段用户码的反码。它的帧结构如图 4 所示。图 4 uPD6122G 编码格式NEC 编码标准是以用不同脉冲的时间间隔来区分0和1的,uPD6122G 以脉宽为 0.56ms、间隔 0.565ms、周期为 1.125ms 的组合表示二进制的0 ;以脉宽为40.56ms、间隔 1.69ms,周期为 2.25ms 的组合表示二进制的1 。其波形如图 5 所示。图 5 uPD6122G0和1波形图使用 455KHz 晶振时各代码所占的时间如图 6 所示:图 6 使用 455KHz 晶振时各代码所占的时间uPD6122G 按键输出有两种方式:一种是每次按键都输出完整的一帧数据;另一种是按下

10、按键不松开时,发送完整的一帧数据后再发送重复码,直到按键被松开。其波形如图 7 所示。图 7 重复码的波形图3.2 接收解码模块3.2.1 接收解码原理接收解码的关键是如何识别0和1 ,本系统使用的是一体化红外接收头进行红5外信号接收,在没有信号的时候其输出端是高电平,而有信号的时候是低电平,所以其输出信号电平正好和遥控发射端相反。从上面的讨论可以发现在遥控发射端0和1均以 0.56ms 的高电平开始,不同的是低电平的宽度, 0为 0.565ms, 1为1.69ms,所以必须根据低电平的宽度区别0和1 。本系统用中断的方式实现从接收头到 MCU 的信号传输。如图 9 所示,红外接收头的输出端连

11、接到单片机的 INT0 脚。接收头输出端有低电平信号输出时引起单片机的中断。单片机响应中断并进行信号的接收解码。解码后的信号就变成相应的遥控器按键代码,从而可以成为密码锁的密码。图 9 中断接收示意图3.2.2 接收解码模块的硬件电路接收解码电路由一体化红外接收头 SM0038 和单片机 STC89C51RC 组成。 STC 系列单片机具有在系统中直接可编程特性,其好处是:省去购买通用编程器,单片机在用户系统上即可下载/烧录用户程序,而无须将单片机从已生产好的产品上拆下,再用通用编程器将程序代码烧录进单片机内部。有些程序尚未定型的产品可以一边生产,一边完善,加快了产品进入市场的速度,减小了新产

12、品由于软件缺陷带来的风险。由于可以在用户的目标系统上将程序直接下载进单片机看运行结果对错,故无须仿真器,因此选择使用这款单片机。一体化红外接收头 SM0038 是集信号放大、滤波、检波、整形于一体的红外接收器,电路内置 PIN 二极管和前置放大器,采用可以红外滤波的环氧树脂材料封装,可靠性高,不易受环境影响并可以防止非控制信号的输出脉冲出现。它的内部电路如图 10 所示。接收头SM0038MCUINT06图 10 SM0038 内部结构图SM0038 内置带通滤波器、积分器、和自动增益控制电路以抑制各种干扰和噪音。数据信号和干扰信号的主要区别在于载波频率、脉冲波长和工作周期上。所以数据信号应该

13、满足以下的要求。而本系统选用的 SM0038 在这三方面和 NEC 编码格式是相配的。 载波信号的频率尽量接近带通滤波器的中心频率(38KHz) 。 脉冲长度在 300us 以上。 数据的编码类型相兼容。3.4 液晶显示模块系统中采用 LCD1602 作为显示器件输出信息。与传统的 LED 数码管显示器件相比,液晶显示模块具有体积小、功耗低、显示内容丰富等优点,而且不需要外加驱动电路,现在液晶显示模块已经是单片机应用设计中最常用的显示器件了。LCD1602 可以显示 2行16 个字符,具有 8 位数据总线 D0-D7,和 RS、R/W、E 三个控制端口,工作电压为 5V,并且带有字符对比度调节

14、和背光设置。LCD1602 与单片机的连接电路图参考附录 A。其管脚功能简介如下:VL:LCD 对比度调节端,电压调节范围为 05V。接正电源时对比度最弱,接地电源时对比度最高,可以用一个 10K 的电位器来调整对比度;RS:数据或者指令选择端。处理器写入指令时,RS 为低电平,写入数据时,RS 为高电平;R/W:读写控制端。R/W 为高电平时,读取数据;R/W 为低电平时,写入数据;E:LCD 模块使能信号控制端。写数据时,需要下降沿触发模块;D0D7:8 位数据总线,三态双向;7BLA: LED 背光正极。需要背光时,BLA 串接一个限流电阻接 VCC;BLK: LED 背光负极。4 软件

15、设计4.1 编程语言目前,对单片机的编程主要采用汇编和 C 语言。汇编语言有执行效率高、速度快、与硬件结合紧密等特点。尤其在进行 I/O 端口管理时,使用汇编语言有快捷、直观的优点。但是使用汇编语言相对于使用高级语言编程难度要大一些,且程序可读性低,开放性差,从系统开发时间来看,效率不是很高。 C 语言是一种结构化语言,可产生紧凑代码。C 语言可以用许多机器级函数直接控制操作 8051 硬件。与汇编语言相比,C 语言有如下的优点: 不要求了解单片机的指令系统,仅要求对 8051 的存储结构有初步了解; 寄存器分配,不同存储器的寻址及数据类型等细节可由编译器管理; 程序有规范的结构,可分为不同的

16、函数,这种方式可使程序结构化; 具有将可变的选择与特殊操作组合在一起的能力,改善了程序的可读性; 关键字及运算符可用近似人的思维方式使用; 编程及程序调试时间显著缩短,从而提高效率; 提供的库包含许多标准子程序,具有较强的数据处理能力; 已编好的程序可容易地植入新程序,因为它具有方便的模块化编程技术。当然,采用混编模式,就能结合两者的优点。本着学习的目的,本系统均采用 C51语言编写。4.2 主要程序说明及流程图4.2.1 主程序本系统的软件程序主要包括主程序、接收解码程序、密码判断和报警程序、密码修改程序、遥控器学习识别程序几个大的模块程序。完整程序见附录 B。主程序首先是初始化程序,然后就

17、等待红外接收头输出端的低电平,低电平出现说明遥控有键按下,外部中断设定为下降沿触发,故单片机进入中断服务程序进行信号的接收解码。系统进入密码输入界面,并且接收到八位的密码以后就开始运行密码核对程序,当密码输入正确后,就可以进行开锁、上锁或修改密码的操作。当密码输入错误的时候就会进入密码输入提醒程序提醒用户重新输入密码,密码输入累积到 3 次时系统会8报警并锁定。相应的主程序流程图如图 12 所示。图 12 主程序流程图4.2.2 接收解码程序红外接收解码的关键是如何识别0和1码,我的做法是根据0和1码的高电平宽度不一样的特点来进行识别。接收程序的流程图如图 13 所示。进入红外接收程序后先关闭

18、中断。接着的工作是避开 9ms 高电平、4.5ms 的低电平的引导码,并且判断是否干扰信号或者重复信号。正如前面所说,一体化红外接收头的输出端电平跟遥控发射端电平相反。如图 14 所示。所以只要遥控有键按下单片机就会马上产生中断接收数据。跟在引导码后面的是 32位用户码和数据码,也就是我们想要的数据,单片机把它接收并保存。当接收完 8 位的数据时要更换另外一个数据缓冲区,当 32 位的键码都接收完的时候就意味这一帧的数据已经接收完毕。然后根据接收到的数据码和数据反码是否对应位相反来确定接收的这初始化等待遥控识别按键时钟模式密码核对报警锁定开锁上锁密码修改N错误正确密码锁按键密码锁模式Y9一帧数

19、据是否正确,最后退出接收解码程序。图 13 红外接收程序流程图图 14 接收头前导码信号变相图红外中断程序关中断是否 9ms 低电平开始接收 32 位编码接收信号“1”保存,接收了 8 位?是否 4.5ms 低电平低电平大于 800us接收信号“0”保存,接收了 32 位?开中断返回干扰信号重复信号NNNNNYYYYY发射模块MCU9ms4.5ms接收头9ms4.5ms10而单片机的接收端的0 1波形图如图 15 所示。在保存0码和1码的时候还有一个保存时机的问题,如果从 0.56ms 低电平过后开始延时,0.56ms 以后若读到为低电平,说明该位为0 ,反之则为1 。为安全起见,延时必须比

20、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 0int width=0,i;EX0 = 0; /关中断/*常规状态下 INT0 为高电平,由高电平跳变为低电平时(即下降沿)产生中断*/ 引导信号:9ms 低电平 while(!IR) delay_100us()

21、; width+; /计算引导电平的宽度if (width 80) EX0 = 1; return; / 8ms=80*100us 如果不到 8ms 视为干扰信号 / 计算 4.5ms 高电平宽度 width = 0 x00; while(IR) delay_100us(); width+; if (width 30) EX0 = 1; return;/ 3ms=30*100us 如果不到 3ms 即视为 2.5ms 重复信号 / 至此,引导码已校验,以下接收地址码和数据码,一共 32 位 11 i=0; while(i+ 32) /接收 32 位编码 while(!IR); /等待高电平 w

22、idth = 0 x00; while(IR) /记录高电平宽度 delay_100us(); width+; ir_data 0 x08)ir_data |= 0 x01; /信号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;

23、 /接收成功标志位 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() switc

24、h(ir_data) case 0 x68: return(0); case 0 x30: return(1); case 0 x18: return(2); case 0 x7a: return(3); case 0 x10: return(4); case 0 x38: return(5); case 0 x5a: return(6); case 0 x42: return(7); case 0 x4a: return(8); case 0 x52: return(9); case 0 x98: return(10); case 0 xb0: return(11); case 0 xe0:

25、 return(12); case 0 xa8: return(13); case 0 x90: return(14); case 0 x22: return(15); case 0 x02: return(16); case 0 xc2: return(17); case 0 xa2: return(18); case 0 x62: return(19); case 0 xe2: return(20); default : return(99); 4.2.4 密码判断、报警及修改程序电子密码锁的软件编程主要分为两方面,分别是接收密码后判断及报警部分和密码修改控制部分。首先介绍密码判断及报警程

26、序。显示收到的键码并保存到接收缓存 receive_code8,直到 8 位键码接收完毕。然后和原密码缓存 origin_code8比较,判断密码是否正确。若密码正确则将标志位 code_right=1;若不正确则报警并使密码输入错误次数13wrong_num+,再判断错误次数是否已达 3 次,若是则程序进入死循环锁定。程序流程图如图 16 所示。图 16 密码判断及报警流程图接着介绍密码修改控制程序。当密码输入正确以后用户按下“密码修改键”就会进入密码修改操作,单片机也就会运行密码修改程序。程序流程图如图 17 所示。code_right=1修改密码?保存新密码新密码接收完毕?返回NNNNY

27、YYY新密码确认完毕?两次密码相同?显示错误输入密码接收了 8 位键码?code_right=1密码是否正确wrong_num+wrong_num=3?错误警告报警锁定NNNYYY14图 17 密码修改流程图进入密码修改程序首先等待新密码的第一次输入。第一次输入的新密码放在接收缓存 receive_code8中,当输入完第八个密码后系统会提示再次输入密码,第二次输入的新密码放在密码比较缓存 com_code8中。第二次输入密码完成后就检验两次输入的新密码是否相同,如果相同的话就更换密码,将新密码储存到 AT24C02 中。关键程序如下:void check_code(void) if(ir_f

28、lag=1) flag=0, key_data=key_match() , Beep(),ir_flag=0,j=0; /Beep 函数发出按键声音 if(show=1&flag=0) /接收 8 个密码 if(key_data0&key_data=10) /10 号键退格 DisplayListChar(rec_num-1,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_nu

29、m=8)/输入八个密码后密码检查&3 次错误后上锁 delay_LCM(500);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);e

30、lse 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_ri

31、ght=1;/密码正确标识位void change_code(void)16int i,j;if(ir_flag=1) key_data=key_match(),flag=0,Beep(),ir_flag=0; if( code_right=1 &key_data=11)/11 号按键为修改密码按键的键码delay_LCM(500);LCM_cls();DisplayListChar(0,0,Input new code);new_code1=1;/修 II 改密码标识位 1 if(new_code1=1&flag=0) if(key_data0&key_data=10) DisplayLis

32、tChar(rec_num-1,1, ); rec_num-; flag=1; if(code_right=1 & rec_num=8 & new_code1=1)/判断第一次新密码是否接收完 delay_LCM(500);LCM_cls();DisplayListChar(0,0,Input again!);rec_num=0;new_code2=1;/修改密码标识位 2new_code1=0; if(new_code2=1&flag=0) if(key_data0&key_data=10)17 DisplayListChar(rec_num-1,1, ); rec_num-; flag=1

33、; if(code_right=1 & rec_num=8 & new_code2=1)/判断第二次新密码是否接收完 rec_num=0;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;i8;i+) /密码一致,开始修改密码origin_cod

34、ei=com_codei;DisplayListChar(0,0,New codes saved!);/修改密码成功delay_LCM(5000);wrong_num=0;code_right=0;ir_flag = 0;k=1; /跳到时钟return;4.2.3 时钟模式一开始进入运行的是时钟模式。while(1) /时钟部分程序 F1:DisplayListChar(0,0, );DisplayListChar(0,1, );DisplayListChar(6,0,(0_0);18DisplayListChar(3,1, : : );write_sfm(3,shi);write_sfm(

35、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

36、; 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) 19 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

37、+;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; 4.2.5 按键发声程序 如果有按键的话,就执行以下发声程序 Beep() ,靠定时器产生不同频率的声音。void Beep(void) int CurrentFre,Temp_T;if(key_data=18) beep_flag=1; SPEAKER = 1;TR0 =

38、 0;EA = 1;if(key_data!=99&beep_flag=1) CurrentFre = FreTabkey_data; /查出对应音符的频率 Temp_T = 65536-(50000/CurrentFre)*10/(12000000/SYSTEM_OSC); /计算计数器初值Sound_Temp_TH0 = Temp_T/256; Sound_Temp_TL0 = Temp_T%256; TH0 = Sound_Temp_TH0; TL0 = Sound_Temp_TL0 + 12; /加 12 是对中断延时的补偿 TR0=1;/开计时中断if(key_data=18) de

39、lay_LCM(500);/开机键响 0.5 秒,其它 0.2 秒else delay_LCM(200);TR0=0;/关计时器SPEAKER = 1;void BeepTimer0(void) interrupt 1 SPEAKER = !SPEAKER; TH0 = Sound_Temp_TH0; TL0 = Sound_Temp_TL0;4.2.6 没操作响应20如果没有操作的话就开定时器 0,开始计时,5s 过后就返回时钟模式。在这段时间之内只要有按键操作,就会关定时器 0。void No_action(void) interrupt 3 if(T100) T+;TH1=0X3C;TL

40、1=0XB0; else rec_num=0,k=1,T=0,TR1=0; 5 功能分析及总结5.1 功能分析本系统顺利完成了输入正确密码开锁、出错报警、超次锁定、修改用户密码等基本的密码锁功能,并且还能实现远距离遥控、掉电存储、声光提示、遥控器学习识别等功能。完成后的实物图如图 19 所示。打开系统电源后程序初始化,LCD 提示输入遥控器识别按键,同时等待红外接收头输出端的低电平,低电平出现说明遥控有键按下,外部中断设定为下降沿触发,故单片机进入中断服务程序进行信号的接收解码。接收解码程序有很好的抗干扰性,脉冲宽度的延时计数准确,能够识别重复信号,屏蔽多余按键避免误操作,并且 32 位编码接

41、收完毕后还要进行错误校验,所以整个接收解码的准确性非常高。21图 19 不带 LCD 的硬件实物图当接收到识别按键后,单片机便可解码出相应的键码和该遥控器的用户码,组成该遥控器的 ID。此 ID 是单片机识别不同遥控器的根据,单片机从 AT24C02 中查找相应的 ID,如果此 ID 不存在,就会提示输入该遥控器其余键码的信息并保存到 AT24C02相应的地址。如果 ID 存在,系统即进入电子密码锁模式。系统进入密码输入界面,每输入一位密码 LCD 就显示“*”号,而且程序设有回格功能,删除上一位输入的密码,直到接收完八位的密码后就开始运行密码核对程序。若密码输入正确,就可以选择进行开锁、上锁

42、或修改密码的操作,并伴有 LED 灯显示。当密码输入错误的时候就会进入密码输入提醒程序提醒错误次数,密码输入错误次数累积到 3 次时系统就会通过蜂鸣器报警,而且程序进入死循环,系统被锁定。系统被锁定后无法通过遥控器解锁,只能够按电子锁上面的复位键使整个程序复位。如果选择了密码修改操作,LCD 提示输入第一次新密码,接收完 8 位新密码后,保存并 LCD 提示输入第二次新密码。两次新密码接收完毕后,进入密码比较程序,判断两次输入的密码是否相同。若相同则把新密码保存到 origin_code 中,由于没有外部存储器,密码在下一次开机的时候还是原始密码。若不相同则 LCD 显示错误,程序返回。密码初

43、始化及遥控器 ID清零按键LCD 对比度调节电阻AT24C02一体化红外接收头 SM0038STC89C51RC复位键LED 灯指示225.2 C 语言编程的延时技巧编写单片机程序的时候,经常会遇到需要短时间延时的情况,如本系统红外接收解码的时候就需要用到精确的 100us 的短时间延时来确保接收解码的准确性,有时甚至还需要更高的精度。C 语言不像汇编一样可以计算指令运行所要的时间,所以 C 语言的定时是 C 语言编写单片机程序最大的一个缺陷。当然可以在 C 里嵌入汇编来解决这个问题,但在这里我没有使用这个方法。还有可以考虑用定时器,但进出中断程序以及重新装载计数初值也是要耗费一些时间的,也很

44、难精确定时到微秒级,而且在极端的情况下,计时器甚至已经全部有其它的用途。所以在这里使用了循环计时的方式计时,用断点的方式来调试。Keil uVision2 编译器有程序调试的功能,通过调试本系统成功地只用 C51语言产生精确的定时。编写 100us 的延时程序,程序如下:void delay_100us(void) unsigned char i=48; while(-i);首先在 Keil uVision2 上编译上面的程序,并打开其汇编代码。如图 20 所示然后进入 Keil uVision2 的调试状态。在延时子程序的开始和结束处设下两个断点,见图中的两个红点。红点之间的程序就是所调试的

45、延时程序,接着把项目所用的晶振设为 12M,这与硬件电路相对应。按运行后程序运行到断点 1 时所用的时间为 0.000616 秒;图 20 第一个断点调试图第 1 个断点到第 1 个断点用时23再次按运行又可以从图 21 中看到运行到断点 2 所用的时间是 0.000717 秒。两时间相减是 0.000101 秒,就是说延时程序的运行时间是 101us,与理想值只差 1us,延时十分精确。图 21 第二个断点调试图5.3 本设计优缺点红外技术是一门相当成熟的技术,而单片机技术也有着相当长的一段发展时间,本系统把两门技术结合起来,发挥各自的优点,使红外技术应用在单片机控制的电子密码锁上,也就是利

46、用红外遥控实现密码锁的开锁、上锁和修改密码的操作。这样的结合使密码锁的使用更加方便,安全性能得到进一步的提高。本系统的遥控器使用的是家电遥控中使用得最多的专用芯片,所以抗干扰能力比较强,而且十分准确可靠,误码率很低。本系统还具有学习识别 NEC 编码遥控器的功能,可以实现多对一操作,不同的遥控器采用相同的密码,不用担心遥控器遗失的问题,而且用户可以经常更改密码,防止密码被盗。当输入密码多次错误时,报警系统自动启动。接收部分用单片机作为主芯片,可以根据不同要求来修改设定不同的密码位数或改变、增添一些新功能。这是使用专用的密码锁芯片和以前的机械密码锁都不能做到的。而且本系统既可以室内使用,也可以在

47、野外使用。但是红外射束易受尘埃、雨水等物质的吸收,易受气候的影响。在恶劣的环境使用出现故障的机率会大大的提高。而且本系统的最大一个技术缺陷是密码在发送过程中无到第 2 个断点用时第 2 个断点24法避免通过监测反射的红外线和滤除环境噪声的窃听,这也是红外通讯的最大的缺点。还有就是由于红外遥控编码的调制方式有很多种,编码格式也各不相同。所以要对各种形式的遥控器进行学习就存在着一定的难度,最常用的学习红外编码的方法也就是记录下编码的所有高低电平时间,这种方式能实现对大部分的遥控器进行学习,不过这样需要大量的存储空间,尤其是空调的遥控器,空调遥控器的编码包含很多的信息,编码特别长。因此本系统只针对最

48、常用的 NEC 编码格式的遥控器进行学习与识别,舍弃其它编码。这样的优点是专用性强,解码的准确率高;缺点是并不是所有编码格式的遥控器都能学习,有一定的局限性。5.4 设计总结本次的课程设计过程中,Proteus 仿真软件中都是没有此类硬件的,只能放弃仿真。由于电烙铁不好用,所一制作了很久。用 keil 写程序的时候,由于我们受 FPGA 和组态软件的影响,总是认为程序是并行执行的,所以遇到了一些困难。调试过程中,学习了外部中断还有定时中断,感觉很有用。我们小组参考了一个音乐播放器的程序而想出了按键发音的主意。没操作返回也是用定时器写的。液晶显示方面,参考了一些程序,对写命令还有写数据有了一定的

49、认识。总体感觉就是要认真思考,用不同的方法去思考一些遇到的问题,或者去验证我们的想法。1参 考 文 献李朝青. 2005. 单片机原理及接口技术(第 3 册)M. 北京: 北京航空航天大学出版社. 17-140来清民. 2008. 传感器与单片机接口及实例M. 北京: 北京航空航天大学出版社. 213-226张义和,陈敌北,周金圣. 2006. 例说 Protel2004M. 北京: 人民邮电出版社. 142-204康华光. 2000. 电子技术基础数字部分(第四版)M. 北京: 高等教育出版社.213-228谭浩强. 2005. C 语言程序设计(第三版)M. 北京: 清华教育出版社. 20

50、4-278Q18550P1.0/T21P1.1/T2EX2P1.23P1.34P1.45P1.56P1.67P1.78RST9P3.0/RxD10P3.1/TxD11P3.2/INT012P3.3/INT113P3.4/T014P3.5/T115P3.6/WR16P3.7/RD17XTAL218XTAL119VSS20P2.0/A821P2.1/A922P2.2/A1023P2.3/A1124P2.4/A1225P2.5/A1326P2.6/A1427P2.7/A1528PSEN29ALE30EA/VPP31P0.7/AD732P0.6/AD633P0.5/AD534P0.4/AD435P0.

51、3/AD336P0.2/AD237P0.1/AD138P0.0/AD039VCC40U189S5112Y1XTAL104C112345678910111213141516LCD1LCD1602VCC123456789RP1R_10K30PC230PC3VCC10uFE1VCC1KR31KR91KR10D2LEDD3LEDVCCLED1LED21KR5VCC100R6SPEAKERLED2LED1LED3D0D1D2D3D4D5D6D7ERWRSD0D1D2D3D4D5D6D7ERWRSE01E12E23GND4SDA5SCL6WC7VCC8U324C02VCC10KR710KR8WCSCLSD

52、AWCSCLSDAVCCVCC1KR4D1LED4213S11KR2R110kIN13OUT2GNDU2780512J1POWERINVCC104C4SW-Power1SW-SPSTVss1Vdd2OUT31VCC4213S2D4LED1KR11LED3SPEAKERSPEAKER1Speaker附录 A 电路连接图附录 C 实物图图 1HZ-FT007 的 20 键车载 MP3 红外遥控器图 2 不带 LCD 硬件实物图图 3 带 LCD 硬件实物图程序附录:主程序:#includesbit IR = P32; / 红外中断输入端口(INT0sbit SPEAKER=P30;sbit LED

53、1=P13;sbit LED2=P14;sbit LED3=P15;#define SYSTEM_OSC 12000000/定义晶振频率 12000000HZ#define uchar unsigned char#define uint unsigned intuchar 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_c

54、ode8;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,uc

55、har 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);v

56、oid 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 0 x68: return(0); case 0 x30: return(1); case 0 x18: return(2); case 0 x7a: return(3); c

57、ase 0 x10: return(4); case 0 x38: return(5); case 0 x5a: return(6); case 0 x42: return(7); case 0 x4a: return(8); case 0 x52: return(9); case 0 x98: return(10); case 0 xb0: return(11); case 0 xe0: return(12); case 0 xa8: return(13); case 0 x90: return(14); case 0 x22: return(15); case 0 x02: return(

58、16); case 0 xc2: return(17); case 0 xa2: return(18); case 0 x62: return(19); case 0 xe2: return(20); default : return(99); main(void) TH1=0X3C;TL1=0XB0; initLCM(); TMOD |= 0 x11;/定时器 0 和定时器 1 工作方式都是 1 ET0 = 1; ET1=1; IT0=1; EX0=1; EA=1; TR0=0;DisplayListChar(3,0,WELCOME!);DisplayListChar(3,1,00:00:0

59、0);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_f

60、lag=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);writ

61、e_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,(

62、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(s

63、how=1&flag=0) /接收 8 个密码 if(key_data0&key_data=10) /10 号键退格 DisplayListChar(rec_num-1,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)/输入八个密码后密码检查&3 次错误后上锁 delay_LCM(500);for(j=7;j0;j-)if(origin_codej!=receive_co

64、dej)/与原密码比较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

65、);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_ma

66、tch(),flag=0,Beep(),ir_flag=0; if( code_right=1 &key_data=11)/11 号按键为修改密码按键的键码delay_LCM(500);LCM_cls();DisplayListChar(0,0,Input new code);new_code1=1;/修 II 改密码标识位 1 if(new_code1=1&flag=0) if(key_data0&key_data=10) DisplayListChar(rec_num-1,1, ); rec_num-; flag=1; if(code_right=1 & rec_num=8 & new_code1=1)/判断第一次新密码是否接收完 delay_LCM(500);LCM_cls();DisplayListChar(0,0,Input again!);rec_num=0;new_code2=1;/修改密码标识位 2new_code1=0; if(new_code2=1&flag=0) if(key_data0&key_data=10) DisplayListChar(rec_num-1

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

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!