红外遥控电子密码锁的设计与实现.docx
《红外遥控电子密码锁的设计与实现.docx》由会员分享,可在线阅读,更多相关《红外遥控电子密码锁的设计与实现.docx(43页珍藏版)》请在冰豆网上搜索。
红外遥控电子密码锁的设计与实现
成都信息工程学院“天府软件园”杯嵌入式创新技术大赛
报告书
项目名称:
红外遥控电子密码锁的设计与实现
完成日期:
2011年5月
成员:
李刚张洋洋唐明友
摘要:
本设计是以STC89C52为主要芯片,以中断、计数等基本工作方式来控制、判断外部器件的工作、工作状态,结合采用数字信号编码的基本算法,用红外遥控器遥控发送密码、再用红外接收管接收密码,单片机根据红外接收管导通与否和持续时间结合二次调制方式的基本算法还原遥控器发送的密码,再与外部储存器AT24C02储存的密码对比,判断密码是否正确,辅助以LCD12864显示用户的操作结果,以蜂鸣器提醒,再通过矩阵键盘实现输入或修改密码等基本功能实现红外电子密码锁的设计。
该设计运用了c语言编写程序,简单、明了,很好的实现了红外通信的要求。
在以往设计的基础上,该设计添加了在线烧写程序,极大的方便了用户使用,特别是为工业生产带来了极大的便利。
红外电子密码锁具有成本较低、操作方便、体积小、无污染、反应速度快等优势,具有很好的市场价值。
关键词:
编码、解码、密码、红外
1总体设计思路
1.1题目要求
红外遥控电子密码锁由红外遥控发射板、红外接收终端、带控制的电子锁构成。
当红外接收终端收到遥控板送来的开锁密码信号,并与保存在终端中的密码对比。
当对比成功后终端向电子锁发出开锁命令,完成开锁功能。
此题目的重点、难点是实现红外信号的接收、密码储存和正确识别按键并显示操作结果。
由于红外遥控不影响周边环境、不干扰其他电器设备,其无法穿透墙壁,因此,不同房间的家用电器可使用通用的遥控器而不会产生相互干扰;电路调试简单,只要按给定电路连接无误,一般不需任何调试即可投入工作;编解码容易,可进行多路遥控。
而且红外电子密码所体积较小、操作方便等优势,具有很好的市场前景。
1.2本设计主要硬件功能部分
本系统主要由六大部分组成:
1)单片机最小系统模块;
2)LCD显示电路模块;
3)阵列键盘模块;
4)红外接收模块;
5)AT24C02模块;
6)蜂鸣器模块;
1.3本设计软件的总体构思
本设计是以STC89C52为核心控制器件。
本设计是通过STC89C52与AT24C02之间交换密码后,再与用户通过键盘或红外遥控器发送过来的密码作对比,再用LCD12864显示操作结果,用蜂鸣器提示电子锁是否打开,从而实现红外遥控电子密码锁的设计,如下图。
2
系统的硬件设计与实现
2.1AT24C02模块
2.1.1器件及原理介绍
AT24C02串行E2PROM具有I2C总线接口功能,功耗低,宽电源电压(根据不同型号2.5~6.0V),工作电流约为3mA,静态电流随电源电压不同为30μA~110μA。
图表2
I2C通信原理:
I2C总线进行数据传送时,时钟信号为高电平期间,数据线上的数据必须保持稳定,只有在时钟线上的信号为低电平期间,数据线上的高电平或低电平状态才允许变化,如图A。
SCL线为高电平期间,SDA线由高电平向低电平的变化表示起始信号;SCL线为高电平期间,SDA线由低电平向高电平的变化表示终止信号,如图4。
图表3
图表4
2.1.2电路实现
A0、A1、A2作为地址线,因在此只有一个器件,故全都接GND。
SDA作串行数据读写端接P1.2口,SCL作为时钟信号接P1.1口。
图表5AT24C02硬件结构
2.2红外通信模块
2.2.1遥控发射器及其编码
遥控发射器专用芯片很多,根据编码格式可以分成两大类,这里我们以运用比较广泛,解码比较容易的一类来加以说明,现以日本NEC的uPD6121G组成发射电路为例说明编码原理,我们使用的超薄型红外线遥控器使用的就是6121编码。
当发射器按键按下后,即有遥控码发出,所按的键不同遥控编码也不同。
这种遥控码具有以下特征:
采用脉宽调制的串行码,以脉宽为0.565ms、间隔0.56ms、周期为1.125ms的组合表示二进制的“0”;以脉宽为0.565ms、间隔1.685ms、周期为2.25ms的组合表示二进制的“1”,
其波形如图7所示。
图表7
上述“0”和“1”组成的32位二进制码经38kHz的载频进行二次调制以提高发射效率,达到降低电源功耗的目的。
然后再通过红外发射二极管产生红外线向空间发射。
UPD6121G产生的遥控编码是连续的32位二进制码组,其中前16位为用户识别码,能区别不同的电器设备,防止不同机种遥控码互相干扰,如我们可以同时使用电视机、机顶盒、功放等遥控器,但它们不会产生误触发。
该芯片的用户识别码固定为十六进制01H;后16位为8位操作码(功能码)及其反码。
UPD6121G最多额128种不同组合的编码。
遥控器在按键按下后,周期性地发出同一种32位二进制码,周期约为108ms。
一组码本身的持续时间随它包含的二进制“0”和“1”的个数不同而不同,大约在45~63ms之间,
图表8发射波形图
当一个键按下超过36ms,振荡器使芯片激活,将发射一组108ms的编码脉冲,这108ms发射代码由一个起始码(9ms),一个结果码(4.5ms),低8位地址码(9ms~18ms),高8位地址码(9ms~18ms),8位数据码(9ms~18ms)和这8位数据的反码(9ms~18ms)组成。
如果键按下超过108ms仍未松开,接下来发射的代码(连发代码)将仅由起始码(9ms)和结束码(2.5ms)组成。
代码格式(以接收代码为准,接收代码与发射代码反向)
1)位定义
图表9
2)单发代码格式
图表10
3)连发代码格式
图表11
2.2.2电路实现
一体化的红外接收装置将遥控信号的接收、放大、检波、整形集于一身,并且输出可以让单片机识别的TTL信号,这样大大简化了接收电路的复杂程度和电路的设计工作,方便使用。
在本系统中我们采用红外一体化接收头HS0038,外观图如图所示。
图表12
HS0038黑色环氧树脂封装,不受日光、荧光灯等光源干扰,内附磁屏蔽,功耗低,灵敏度高。
在用小功率发射管发射信号情况下,其接收距离可达35m。
它能与TTL、COMS电路兼容。
HS0038为直立侧面收光型。
它接收红外信号频率为38kHz,周期约26μs,同时能对信号进行放大、检波、整形,得到TTL电平的编码信号。
三个管脚分别是地、+5V电源、解调信号输出端。
利用外部中0断进行数据的接收。
图表13HS0038硬件结构
2.3矩阵键盘模块
将12个按键分为4排3列排列好,如图:
矩阵键盘硬件结构。
当有一个键按下时,通过某一边引脚赋低电平,扫描全部引脚看是否与最初的赋值一样,不一样则根据相应的算法(通过改变后的值与初始值相或,根据结果赋值)确定是哪个键按下。
图表14矩阵键盘硬件结构
2.4显示模块
2.4.1LCD12864介绍
LCD12864分为带字库和不带字库两种,带字库的在显示文本时更方便,不带字库的在显示图像时更有优势。
本系统采用带字库的LCD12864,采用标准的20脚接口,各引脚接口说明如表所示:
编号符号引脚说明编号符号引脚说明
1VSS电源地11D4数据
2VDD电源正极12D5数据
3V0对比度亮度调整13D6数据
4RS数据/命令选择14D7数据
5R/W读/写选择15PSB串行通信选择端
6E使能信号16NC空脚
7D0数据17RET复位
8D1数据18VOUTLCD驱动负电压
9D2数据19LED+背光电源正极
10D3数据20LED-背光电源地
2.4.2LCD12864电路图:
图表15LCD12864硬件结构
2.5蜂鸣器模块
蜂鸣器是一种一体化结构的电子讯响器,采用直流电压供电,广泛应用于计算机、打印机、复印机、报警器、电子玩具、汽车电子设备、电话机、定时器等电子产品中作发声器件。
蜂鸣器主要分为压电式蜂鸣器和电磁式蜂鸣器两种类型。
蜂鸣器在电路中用字母“H”或“HA”(旧标准用“FM”、“LB”、“JD”等)表示。
有源蜂鸣器直接接上额定电源(新的蜂鸣器在标签上都有注明)就可连续发声;而无源蜂鸣器则和电磁扬声器一样,需要接在音频输出电路中才能发声。
本系统采用无源蜂鸣器,控制更简单。
蜂鸣器硬件如下图:
图表16
2.6单片机最小系统模块
2.6.1单片机最小系统电路图:
图表17最小系统
3
软件设计
3.1程序流程图
3.1.1主程序流程图
图表18主程序流程图
3.1.2
键值判断流程图
图表19键值判断流程图
3.1.3
开锁流程图
图表20开锁程序流程图
3.1.4
密码修改流程图
图表21密码修改流程图
3.1.5
红外接收流程图
图表22红外接收流程图
3.1.6
按键扫瞄流程图
图表23按键扫描流程图
3.2程序设计(见附录二)
4
总结:
本设计不但很好的满足了题目的要求,即终端能够接收红外遥控发射板发射的红外信号(密码)并能与已存密码作对比,而且能够在液晶上显示操作结果,还增加了取消这一功能,从而完成了红外遥控电子密码锁的要求。
但一开始并不是这么顺利,最先将程序下载到机子里面,键盘不能工作,后经查发现键盘程序没有运行。
改过来后又发现多了一个键,没有用处,经讨论将多的键设为取消键。
原来设计的电源是直接用USB从电脑上引出来,后来在此解读题目时发现不能满足题目要求,所以添加了一个用7805稳压的小模块。
美中不足的是此设计红外遥控的距离并不太理想(一米多一点),而且取消功能并不是想象的能够取消前面自己不想要的内容,而是返回主菜单。
但这些不足并不能抵消此设计带来的好处。
5
参考文献:
侯璐《黑龙江大学学生学术科技创新项目申请书》
甄盈盈《红外遥控密码锁的设计与实现》
《撰写电子设计竞赛报告参考格式》
《第7章电子设计竞赛设计总结报告写作》
在此感谢以上作者、作品。
但由于部分原因没有完全列举出作者姓名或作品完整,望谅解。
6
附录一
6.1整体电路结构:
图表24总电路图
6.2PCB图:
图表25pcb电路图
7附录二
7.1AT24C02模块
#include"common.h"
sbitWP=P1^0;
sbitSCL=P1^1;
sbitSDA=P1^2;
voidDelay_US(void)
{
;;
}
voidDelay_10MS(void)
{
uchari=0;
ucharj=0;
for(i=50;i>0;i--)
{
for(j=200;j>0;j--);
}
}
voidAT24C08_unprotect()
{
WP=0;
}
voidAT24C02_Start(void)//开始总线
{
SDA=1;
SCL=1;
Delay_US();
SDA=0;
Delay_US();
}
voidAT24C02_Stop(void)//停止总线
{
SDA=0;
SCL=1;
Delay_US();
SDA=1;
Delay_US();
}
voidAT24C02_Ack(void)//ACK信号
{
uchari=0;//等待从机回应
SCL=1;
Delay_US();
while((SDA==1)&&(i<200))//等侍ACK信号
{
i++;
}
SCL=0;
Delay_US();
}
voidAT24C02_NOAck(void)//NOACK
{
SCL=1;//主机发送给从机
Delay_US();
SDA=1;
SCL=0;
Delay_US();
}
voidAT24C02_Write_Byte(ucharValue)//写8位数据到总线
{
uchari=0;
for(i=0;i<8;i++)
{
SCL=0;
SDA=Value&0x80;//10000000
Delay_US();
SCL=1;
Delay_US();
Value<<=1;
}
SCL=0;
Delay_US();
SDA=1;
}
ucharAT24C02_Read_Byte(void)//读8位数据
{
ucharValue=0;
uchari=0;
SCL=0;//低电平数据可以变化
Delay_US();
for(i=0;i<8;i++)
{
SCL=1;//高电平状态读数据
Delay_US();
if(SDA)
{
Value|=0x80>>i;//先读高位数据
}
SCL=0;
Delay_US();
}
returnValue;
}
voidAT24C02_Write(ucharAddress,ucharValue)
{
AT24C02_Start();//起始条件
AT24C02_Write_Byte(0xA0);//器件地址10100000//写
AT24C02_Ack();//等从机应答
AT24C02_Write_Byte(Address);//1024字节,其中一个字节操作25
AT24C02_Ack();
AT24C02_Write_Byte(Value);//0x15
AT24C02_Ack();//
AT24C02_Stop();
Delay_10MS();
}
ucharAT24C02_Read(ucharAddress)
{
ucharValue=0;
AT24C02_Start();//开始总线
AT24C02_Write_Byte(0xA0);//10100000
AT24C02_Ack();
AT24C02_Write_Byte(Address);//读数据的地址;//25
AT24C02_Ack();
AT24C02_Start();//再次开始
AT24C02_Write_Byte(0xA1);//10100001
AT24C02_Ack();
Value=AT24C02_Read_Byte();
AT24C02_NOAck();//主机发送给从机无应答
AT24C02_Stop();
returnValue;
}
7.2红外通信模块
sbitbeer=P0^4;
sbitRED_DATA=P3^2;//红外接口
//ucharRED_ADD=0;//红外遥控的地址
ucharRED_add=255;//红外遥控的地址缓存区
ucharRED_key=255;//红外摇控的键值,无键按下时为255
//红外初始化
voidInit_Red(void)
{
RED_DATA=1;//P3^2输出高电平
EX0=1;//开启红外中断P3^2
}
//检测脉冲宽度
ucharRed_check(void)
{
uchart=0;uchara=0;
while(RED_DATA)
{
t++;
for(a=0;a<4;a++);//
if(t==250)
returnt;//超时溢出
}
returnt;
}
voidexter0()interrupt0
{
ucharres=0;ucharaa=0;
bitOK=0;
bitRODATA=0;
while
(1)
{
if(RED_DATA)//有高脉冲出现
{
res=Red_check();//获得此次高脉冲宽度
if(res==250)
{
break;//非有用信号
}
if(res>=200&&res<250)
{
OK=1;//获得前导位(4.5ms)
}
elseif(res>=70&&res<100)//如果是宽脉冲,则RODATA=1
{
aa++;
RODATA=1;//1.69ms
}
elseif(res>=10&&res<50)//如果是窄脉冲,则RODATA=0
{
aa++;
RODATA=0;//500us
}
//前1-8位是遥控器地址码,9-16位是地址反码,17-24是键值码,25-32是是键值反码
//获取正码
if(OK&&(aa>=0)&&(aa<8))
{
RED_add<<=1;
RED_add=RED_add+(uchar)RODATA;
}
if(OK&&(aa>=17)&&(aa<25))
{
RED_key<<=1;
RED_key=RED_key+(uchar)RODATA;
}
if(aa==32&&RED_add==0)
{
KEY_main=Red_change(RED_key);break;
}
}
}
}
//把红外数据进行转换
ucharRed_change(ucharrednum)
{
switch(rednum)
{
case16:
return0;
case48:
return1;
case176:
return2;
case112:
return3;
case8:
return4;
case136:
return5;
case72:
return6;
case40:
return7;
case168:
return8;
case104:
return9;
case0:
return10;//电源开关
case32:
return11;//EQ
case144:
return12;//快退
case80:
return13;//快进
case160:
return14;//声音减
case96:
return15;//声音加
case128:
return16;//CH-
case64:
return17;//CH+
default:
return255;
}
}
7.3矩阵键盘模块
#include"common.h"
#defineKEYP2
voidKey(void)
{
uchari=0;
ucharj=0;
uchark=0;
KEY=0x0F;
i=KEY;
if(i!
=0x0F)
{
uintl=0;
Delay(1000);
KEY=0x0F;
i=KEY;
if(i!
=0x0F)
{
KEY=0x0F;
i=KEY;
KEY=0xF0;
j=KEY;
k=i|j;
KEY_change(k);
}
while(KEY!
=0xf0&&l<2000)
{
KEY=0xf0;
l++;
}
}
}
voidKEY_change(uchari)
{
switch(i)
{
case0xED:
{KEY_main=1;break;}
case0xDD:
{KEY_main=2;break;}
case0xBD:
{KEY_main=3;break;}
case0xEB:
{KEY_main=4;break;}
case0xDB:
{KEY_main=5;break;}
case0xBB:
{KEY_main=6;break;}
case0xE7:
{KEY_main=7;break;}
case0xD7:
{KEY_main=8;break;}
case0xB7:
{KEY_main=9;break;}
case0xEE:
{KEY_main=10;break;}
case0xDE:
{KEY_main=0;break;}
case0xBE:
{KEY_main=11;break;}
default:
break;
}
}
voidDelay(unsignedinti)
{
while(--i);
}
voidINIT_TIME_0()
{
TMOD=0X00;
TH0=0X0E;
TL0=0;
ET0=1;
TR0=1;
}
voidKEY_TIME_0()interrupt1using0
{
TH0=0X0E;
TL0=0;
Key();
}
7.4LCD12864显示
#include"common.h"
sbitCS=P0^3;
sbitSID=P0^2;
sbitCLK=P0^1;
sbitRESET=P0^0;
#definelcdcom_w0xf8
#definelcdcom_r0xfc
#definelcddata_w0xfa
#definelcddata_r0xfd
//汉字地址表
ucharcodeaddr_tab[]={//便于根据汉字坐标求出地址
0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,//第一行汉字位置
0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,//第二行汉字位置
0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f,//第三行汉字位置
0x98,0x99,0x9a,0x9b,0x9c,0x9d,0x9e,0x9f,//第四行汉字位置
};
//*****************************************************
//函数名:
voidDelay_LCD(void)
//功能:
5ms延时
//****************************************************/
voidDelayms(uintt)//约延时ms
{uinti;while(t--){f