单片机红外遥控密码锁文档格式.docx
- 文档编号:22933703
- 上传时间:2023-02-06
- 格式:DOCX
- 页数:39
- 大小:355.69KB
单片机红外遥控密码锁文档格式.docx
《单片机红外遥控密码锁文档格式.docx》由会员分享,可在线阅读,更多相关《单片机红外遥控密码锁文档格式.docx(39页珍藏版)》请在冰豆网上搜索。
常用的红外线信号传输协议有NEC协议、RC-5协议、RC-6协议、Sharp协议等。
4.1.2NEC编码格式介绍
本系统使用的型号为HZ-FT007的20键车载MP3红外遥控器和创维RC-585型DVD遥控器请参看前面的实物图,它们主要芯片都是NEC编码格式的红外遥控芯片。
NEC编码广泛应用于电视机,DVD,PC电脑,音响等,是比较常用的一种红外编码格式。
下面以NEC编码标准的红外编码芯片uPD6122G作为例子介绍。
NEC遥控编码是连续的32位二进制码组,其中的前十六位是用户码,后16位为8位的数据码及其反码。
在每次编码之前还会发送9ms高电平和4.5ms低电平组成的引导码(或称起始码)。
而且第二段的用户码也可以在遥控应用电路中被设置为第一段用户码的反码。
它的帧结构如下图所示。
图3帧结构
NEC编码标准是以用不同脉冲的时间间隔来区分‘0’和‘1’的,uPD6122G以脉宽为0.56ms、间隔0.565ms、周期为1.125ms的组合表示二进制的‘0’;
以脉宽为0.56ms、间隔1.69ms,周期为2.25ms的组合表示二进制的‘1’。
其波形如下图所示。
图4脉冲波形图
使用455KHz晶振时各代码所占的时间如下图所示:
图5晶振时各代码所占时间
uPD6122G按键输出有两种方式:
一种是每次按键都输出完整的一帧数据;
另一种是按下按键不松开时,发送完整的一帧数据后再发送重复码,直到按键被松开。
图6按键输出波形
4.2接收模块原理
4.2.1接收解码原理
接收解码的关键是如何识别‘0’和‘1’,本系统使用的是一体化红外接收头进行红外信号接收,在没有信号的时候其输出端是高电平,而有信号的时候是低电平,所以其输出信号电平正好和遥控发射端相反。
从上面的讨论可以发现在遥控发射端‘0’和‘1’均以0.56ms的高电平开始,不同的是低电平的宽度,‘0’为0.565ms,‘1’为1.69ms,所以必须根据低电平的宽度区别‘0’和‘1’。
本系统用中断的方式实现从接收头到MCU的信号传输。
如图9所示,红外接收头的输出端连接到单片机的INT0脚。
接收头输出端有低电平信号输出时引起单片机的中断。
单片机响应中断并进行信号的接收解码。
解码后的信号就变成相应的遥控器按键代码,从而可以成为密码锁的密码。
图7中断接收示意图
4.2.2该模块的硬件电路
接收解码电路由一体化红外接收头SM0038和单片机STC89C52RC组成。
STC系列单片机具有在系统中直接可编程特性,其好处是:
省去购买通用编程器,单片机在用户系统上即可下载/烧录用户程序,而无须将单片机从已生产好的产品上拆下,再用通用编程器将程序代码烧录进单片机内部。
有些程序尚未定型的产品可以一边生产,一边完善,加快了产品进入市场的速度,减小了新产品由于软件缺陷带来的风险。
由于可以在用户的目标系统上将程序直接下载进单片机看运行结果对错,故无须仿真器,因此选择使用这款单片机。
一体化红外接收头SM0038是集信号放大、滤波、检波、整形于一体的红外接收器,电路内置PIN二极管和前置放大器,采用可以红外滤波的环氧树脂材料封装,可靠性高,不易受环境影响并可以防止非控制信号的输出脉冲出现。
它的内部电路如图10所示。
图8SM0038内部结构图
SM0038内置带通滤波器、积分器、和自动增益控制电路以抑制各种干扰和噪音。
数据信号和干扰信号的主要区别在于载波频率、脉冲波长和工作周期上。
所以数据信号应该满足载波信号的频率尽量接近带通滤波器的中心频率(38KHZ);
脉冲长度在300us以上;
数据的编码类型相兼容。
而本系统选用的SM0038在这三方面和NEC编码格式是相配的。
4.3存储模块原理
STC89C51、52内部都自带有2K字节的EEPROM,54、55和58都自带有16K字节的EEPROM,STC单片机是利用IAP技术实现的EEPROM,内部Flash擦写次数可达100,000次以上,先来介绍下ISP与IAP的区别和特点。
STC单片机内部有几个专门的特殊功能寄存器负责管理ISP/IAP功能的,见表1。
表1ISP/IAP相关寄存器列表
名称
地址
功能描述
D7
D6
D5
D4
D3
D2
D1
D0
复位值
ISP_DATA
E2h
Flash数据寄存器
11111111
ISP_ADDRH
E3h
Flash高字节地址寄存器
00000000
ISP_ADDRL
E4h
Flash低字节地址寄存器
ISP_CMD
E5h
Flash命令模式寄存器
--
MS2
MS1
MS0
xxxxx000
ISP_TRIG
E6h
Flash命令触发寄存器
xxxxxxxx
ISP_CONTR
E7h
ISP/IAP控制寄存器
ISPEN
SWBS
SWRST
WT2
WT1
WT0
000xx000
ISP_DATA:
ISP/IAP操作时的数据寄存器。
ISP/IAP从Flash读出的数据放在此处,向Flash写入的数据也需放在此处。
ISP_ADDRH:
ISP/IAP操作时的地址寄存器高八位。
ISP_ADDRL:
ISP/IAP操作时的地址寄存器低八位。
ISP_CMD:
ISP/IAP操作时的命令模式寄存器,须命令触发寄存器触发方可生效。
命令模式如表2所示。
表2ISP_CMD寄存器模式设置
模式选择
保留
命令选择
待机模式,无ISP操作
1
对用户的应用程序flash区及数据flash区字节读
对用户的应用程序flash区及数据flash区字节编程
对用户的应用程序flash区及数据flash区扇区擦除
程序在系统ISP程序区时可以对用户应用程序区/数据Flash区(EEPROM)进行字节读/字节编程/扇区擦除;
程序在用户应用程序区时,仅可以对数据Flash区(EEPROM)进行字节读/字节编程/扇区擦除。
STC89C51RC/RD+系列单片机出厂时已经固化有ISP引导码,并设置为上电复位进入ISP程序区,并且出厂时就已完全加密。
ISP_TRIG:
ISP/IAP操作时的命令触发寄存器。
在ISPEN(ISP_CONTR.7)=1时,对ISP_TRIG先写入46h,再写入B9h,ISP/IAP命令才会生效。
STC89C52RC,STC89LE52RC单片机内部可用DataFlash(EEPROM)的地址如表3所示,其它型号单片机请查阅相关资料。
表3STC89C52RC、STC89LE52RC单片机内部EEPROM地址表
第一扇区
第二扇区
第三扇区
第四扇区
起始地址
结束地址
2000H
21FFH
2200H
23FFH
2400H
25FFH
2600H
27FFH
第五扇区
第六扇区
第七扇区
第八扇区
2800H
29FFH
2A00H
2BFFH
2C00H
2DFFH
2E00H
2FFFH
每个扇区为512字节,建议大家在写程序时,将同一次修改的数据放在同一个扇区,方便修改,因为在执行擦除命令时,一次最少要擦除一个扇区的数据,每次在更新数据前都必须要擦除原数据方可重新写入新数据,不能直接在原来数据基础上更新内容。
4.4液晶显示模块原理
系统中采用LCD1602作为显示器件输出信息。
与传统的LED数码管显示器件相比,液晶显示模块具有体积小、功耗低、显示内容丰富等优点,而且不需要外加驱动电路,现在液晶显示模块已经是单片机应用设计中最常用的显示器件了。
LCD1602可以显示2行×
16个字符,具有8位数据总线D0-D7,和RS、R/W、E三个控制端口,工作电压为5V,并且带有字符对比度调节和背光设置。
LCD1602与单片机的连接电路图参考附录1。
其管脚功能简介如下:
VL:
LCD对比度调节端,电压调节范围为0-5V。
接正电源时对比度最弱,接地电源时对比度最高,可以用一个10K的电位器来调整对比度;
RS:
数据或者指令选择端。
处理器写入指令时,RS为低电平,写入数据时,RS为高电平;
R/W:
读写控制端。
R/W为高电平时,读取数据;
R/W为低电平时,写入数据;
E:
LCD模块使能信号控制端。
写数据时,需要下降沿触发模块;
D0-D7:
8位数据总线,三态双向;
BLA:
LED背光正极。
需要背光时,BLA串接一个限流电阻接VCC;
BLK:
LED背光负极。
5软件设计
5.1编程语言
目前,对单片机的编程主要采用汇编和C语言。
汇编语言有执行效率高、速度快、与硬件结合紧密等特点。
尤其在进行I/O端口管理时,使用汇编语言有快捷、直观的优点。
但是使用汇编语言相对于使用高级语言编程难度要大一些,且程序可读性低,开放性差,从系统开发时间来看,效率不是很高。
C语言是一种结构化语言,可产生紧凑代码。
C语言可以用许多机器级函数直接控制操作8051硬件。
与汇编语言相比,C语言有如下的优点:
●不要求了解单片机的指令系统,仅要求对8051的存储结构有初步了解;
●寄存器分配,不同存储器的寻址及数据类型等细节可由编译器管理;
●程序有规范的结构,可分为不同的函数,这种方式可使程序结构化;
●具有将可变的选择与特殊操作组合在一起的能力,改善了程序的可读性;
●关键字及运算符可用近似人的思维方式使用;
●编程及程序调试时间显著缩短,从而提高效率;
●提供的库包含许多标准子程序,具有较强的数据处理能力;
●已编好的程序可容易地植入新程序,因为它具有方便的模块化编程技术。
当然,采用混编模式,就能结合两者的优点。
本着学习的目的,本系统均采用C51语言编写。
5.2主要程序说明及流程图
本系统的软件程序主要包括主程序、接收解码程序、密码判断和报警程序、密码修改程序、遥控器学习识别程序几个大的模块程序。
5.2.1主程序
主程序首先是初始化程序,然后就等待红外接收头输出端的低电平,低电平出现说明遥控有键按下,外部中断设定为下降沿触发,故单片机进入中断服务程序进行信号的接收解码。
当接收到遥控器识别按键时,单片机查找AT24C02并判断此遥控器ID是否已存在。
当ID不存在时,系统进入遥控器学习模式,保存新ID及其键码;
当遥控器ID已存在时,系统进入密码输入界面,并且接收到八位的密码以后就开始运行密码核对程序,当密码输入正确后,就可以进行开锁、上锁或修改密码的操作。
当密码输入错误的时候就会进入密码输入提醒程序提醒用户重新输入密码,密码输入累积到3次时系统会报警并锁定。
图9主程序流程图
5.2.2接收解码程序
红外接收解码的关键是如何识别‘0’和‘1’码,我的做法是根据‘0’和‘1’码的高电平宽度不一样的特点来进行识别。
接收程序的流程图如图10所示。
进入红外接收程序后先关闭中断。
接着的工作是避开9ms高电平、4.5ms的低电平的引导码,并且判断是否干扰信号或者重复信号。
正如前面所说,一体化红外接收头的输出端电平跟遥控发射端电平相反。
如图14所示。
所以只要遥控有键按下单片机就会马上产生中断接收数据。
跟在引导码后面的是32位用户码和数据码,也就是我们想要的数据,单片机把它接收并保存。
当接收完8位的数据时要更换另外一个数据缓冲区,当32位的键码都接收完的时候就意味这一帧的数据已经接收完毕。
然后根据接收到的数据码和数据反码是否对应位相反来确定接收的这一帧数据是否正确,最后退出接收解码程序。
图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左右均可。
图11单片机接收端的‘0’‘1’波形图
接收解码中断程序:
voidIR_IN()interrupt0using0
{
unsignedcharj,k,N=0;
EX0=0;
delay(15);
if(IRIN==1)
{EX0=1;
return;
}//确认IR信号出现
while(!
IRIN)//等IR变为高电平,跳过9ms的前导低电平信号。
{delay
(1);
}
for(j=0;
j<
4;
j++)//收集四组数据
{
for(k=0;
k<
8;
k++)//每组数据有8位
{
while(IRIN)//等IR变为低电平,跳过4.5ms的前导高电平信号。
IRIN)//等IR变为高电平
while(IRIN)//计算IR高电平时长
delay
(1);
N++;
if(N>
=30)
{EX0=1;
}//0.14ms计数过长自动离开。
}//高电平计数完毕
IRCOM[j]=IRCOM[j]>
>
1;
//数据最高位补“0”
=8){IRCOM[j]=IRCOM[j]|0x80;
}//数据最高位补“1”
N=0;
}//endfork
}//endforj
if(IRCOM[2]!
=~IRCOM[3])
}
IRCOM[5]=IRCOM[2]&
0x0F;
//取键码的低四位
IRCOM[6]=IRCOM[2]>
4;
//右移4次,高四位变为低四位
if(IRCOM[5]>
9)
{IRCOM[5]=IRCOM[5]+0x37;
else
IRCOM[5]=IRCOM[5]+0x30;
if(IRCOM[6]>
{IRCOM[6]=IRCOM[6]+0x37;
IRCOM[6]=IRCOM[6]+0x30;
LED3=0;
beep();
LED3=1;
ir_data=IRCOM[2];
ir_flag=1;
//信号接收成功标志位
EX0=1;
}
5.2.3密码判断、报警及修改程序
电子密码锁的软件编程主要分为两方面,分别是接收密码后判断及报警部分和密码修改控制部分。
首先介绍密码判断及报警程序。
显示收到的键码并保存到接收缓存receive_code[8],直到8位键码接收完毕。
然后和原密码缓存origin_code[8]比较,判断密码是否正确。
若密码正确则将标志位code_right=1;
若不正确则报警并使密码输入错误次数wrong_num++,再判断错误次数是否已达3次,若是则程序进入死循环锁定。
程
序流程图所示。
图12密码判断、报警大致程序流程
接着介绍密码修改控制程序。
当密码输入正确以后用户按下“密码修改键”就会进入密码修改操作,单片机也就会运行密码修改程序。
图13密码修改流程图
进入密码修改程序首先等待新密码的第一次输入。
第一次输入的新密码放在接收缓存receive_code[8]中,当输入完第八个密码后系统会提示再次输入密码,第二次输入的新密码放在密码比较缓存com_code[8]中。
第二次输入密码完成后就检验两次输入的新密码是否相同,如果相同的话就更换密码,将新密码储存到芯片的eeprom中。
Eeprom存储子程序:
/*================打开ISP,IAP功能=================*/
voidISP_IAP_enable(void)
EA=0;
/*关中断*/
ISP_CONTR=ISP_CONTR&
0x18;
/*0001,1000*/
ISP_CONTR=ISP_CONTR|WaitTime;
/*写入硬件延时*/
ISP_CONTR=ISP_CONTR|0x80;
/*ISPEN=1*/
/*===============关闭ISP,IAP功能==================*/
voidISP_IAP_disable(void)
0x7f;
/*ISPEN=0*/
ISP_TRIG=0x00;
EA=1;
/*开中断*/
/*================公用的触发代码====================*/
voidISPgoon(void)
ISP_IAP_enable();
/*打开ISP,IAP功能*/
ISP_TRIG=0x46;
/*触发ISP_IAP命令字节1*/
ISP_TRIG=0xb9;
/*触发ISP_IAP命令字节2*/
_nop_();
/*====================字节读========================*/
unsignedcharbyte_read(unsignedintbyte_addr)
ISP_ADDRH=(unsignedchar)(byte_addr>
8);
/*地址赋值*/
ISP_ADDRL=(unsignedchar)(byte_addr&
0x00ff);
ISP_CMD=ISP_CMD&
0xf8;
/*清除低3位*/
ISP_CMD=ISP_CMD|RdCommand;
/*写入读命令*/
ISPgoon();
/*触发执行*/
ISP_IAP_disable();
/*关闭ISP,IAP功能*/
return(ISP_DATA);
/*返回读到的数据*/
/*==================扇区擦除========================*/
voidSectorErase(unsignedintsector_addr)
unsignedintiSectorAddr;
iSectorAddr=(sector_addr&
0xfe00);
/*取扇区地址*/
ISP_ADDRH=(unsignedchar)(iSectorAddr>
ISP_ADDRL=0x00;
/*清空低3位*/
ISP_CMD=ISP_CMD|EraseCommand;
/*擦除命令3*/
/*====================字节写========================*/
voidbyte_write(unsignedintbyte_addr,unsignedcharoriginal_data)
/*取地址*/
ISP_ADDRL=(unsignedchar)(byte_addr
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 红外 遥控 密码锁