红外遥控密码锁讲解
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
目录
1 绪言1
1.1 课题背景、发展及意义 (1)
1.2 课程的具体要求及任务 (1)
1.2.1 设计任务 (1)
1.2.2 基本要求 (1)
1.2.3 发挥部分 (1)
2 红外遥控锁总体设计方案 (2)
2.1 任务分析与实现 (2)
2.2红外遥控锁硬件方案设计 (3)
2.3 红外遥控锁软件方案设计 (4)
3 红外遥控锁硬件电路设计方法及原理 (5)
3.1红外遥控系统 (5)
3.1.1 调制 (5)
3.1.2发射系统 (5)
3.1.3红外接收头原理图 (6)
3.2 单片机的原理及应用 (7)
3.2.1 单片机原理简介 (7)
3.2.2 单片机最小系统的介绍 (7)
3.2.3 单片机定时/计数功能的介绍 (8)
3.3 步进电机工作原理 (8)
3.3.1 步进电机原理 (8)
3.3.2 步进电机驱动电路 (8)
3.4 LED指示电路 (9)
3.5 蜂鸣器电路 (9)
3.6 系统原理图及印刷板图 (10)
3.6.1系统总原理图 (10)
3.6.2 印刷版图 (10)
4软件设计流程 (11)
4.1全部软件 ........................................................................ 错误!未定义书签。
5 系统的调试与分析 ................................................................. 错误!未定义书签。
5.1 硬件调试 ....................................................................... 错误!未定义书签。
5.2 软件调试 ....................................................................... 错误!未定义书签。
6 结论与展望 ............................................................................. 错误!未定义书签。
6.1 结论................................................................................ 错误!未定义书签。
6.2 展望................................................................................ 错误!未定义书签。
致谢.............................................................................................. 错误!未定义书签。
参考文献 ..................................................................................... 错误!未定义书签。
附录1........................................................................................... 错误!未定义书签。
附录2 (12)
1 绪言
1.1 课题背景、发展及意义
由于红外线遥控不具有像无线电遥控那样穿过障碍物去控制被控对象的能力,所以,在设计家用电器的红外线遥控器时,不必要像无线电遥控器那样,每套(发射器和接器)要有不同的遥控频率或编码(否则,就会隔墙控制或干扰邻居的家用电器),所以同类产品的红外线遥控器,可以有相同的遥控频率或编码,而不会出现遥控信号“串门”的情况。
这对于大批量生产以及在家用电器上普及红外线遥控提供了极大的方便。
由于红外线为不可见光,因此对环境影响很小,再由红外光波动波长远小于无线电波的波长,所以红外线遥控不会影响其他家用电器,也不会影响临近的无线电设备。
随着科技的进步,人们对物质生活的水平的要求也越来越高,以指代步,是人们对科技的要求。
红外技术的发展和红外线的诸多特性,决定了它在短距里遥控上的应用。
出于方便性和安全性和方便性的设计要求,我设计了红外遥控密码锁。
1.2 课程的具体要求及任务
1.2.1 设计任务
利用单片机、红外遥控器、红外接收头、LED、蜂鸣器等设计一个红外遥控密码锁。
1.2.2 基本要求
1.根据方案设计原理电路
2.供电电压5V稳压电源,遥控最大操作距离8m。
3.利用EDA仿真软件对设计电路进行仿真
1.2.3 发挥部分
连续输入密码输入N(N可以软件设定)次,实现可调报警功能。
2 红外遥控锁总体设计方案
2.1 任务分析与实现
本设计的任务是:以AT89C52单片机为处理核心,用红外接收管接收来自遥控器的红外波形,经过接收管解调后转化成的脉冲送入单片机进行处理。
红外波的解码是通过AT89C52单片机对红外接收头产生的信号的脉宽进行检测,从而判断接收到多少个0和1,最后合成为4个字节的8位代码。
通过软件编码,给该遥控器编写相应的初始化密码(启动系统是可以修改成任意的四位密码),然后通过解码来识别密码,以进行进一步的操作。
本系统总体思路如下:根据遥控器的按键编码值对遥控锁进行编程,从而设置开锁的初始化密码。
当系统启动时,系统进入设正常工作状态,此时,如果用户更改了初始密码,用户输入新的密码,步进电机正转90度开锁。
为了使用方便,专门设置了一个按键关锁(电机反转)。
采用初始密码的操作同上。
如果连续五次输入的密码均为错误,蜂鸣器会长鸣30秒报警(报警时间可以通过软件设定)。
要求达到的各项指标及实现方法如下:
1.利用红外接收头接收来自红外遥控器的编码波形,经红外接收头解调
放大后的脉冲送入单片机进行处理。
2.对脉冲信号的高低电平的时间长短进行存储和计数。
实现:通过软件编程,用单片机的定时和计数器对脉冲的高低电平进
行计时和计数。
3.对数据进行处理,根据红外的编码方式以脉宽为0.565ms、间隔0.56ms、
周期为 1.125ms 的组合表示二制的“0”;以脉宽为0.565ms、间隔
1.685ms、周期为
2.25ms 的组合表示二进制的“1”。
解码出的32位二
进制码前16为位用户识别码,能识别不同的电器设备,后16位为8 位
操作码(功能码)及其反码。
实现:利用软件编程,对数据进行处理得到相应按键对应的编码值。
最终实现目标:对遥控器的按键值进行识别、存储和计数,然后和设定的密码组进行比较以识别密码和控制步进电机开关锁。
总系统框图如图2.1.1所示。
图2. 1.1 红外电控锁系统框图
2.2红外遥控锁硬件方案设计
遥控锁,首先要解决是编码和解码的问题。
编码部分采用编码芯片为HT6221的遥控器面板,当发射器按键按下后,即有遥控码发出,所按的键不同遥控编码也不同。
这种遥控码具有以下特征:采用脉宽调制的串行码,以脉宽为0.565ms、间隔0.56ms、周期为 1.125ms 的组合表示二制的“0”;以脉宽为0.565ms、间隔1.685ms、周期为2.25ms 的组合表示二进制的“1”。
上述“0”和“1”组成的32 位二进制码经38kHz 的载频进行二次调制以提高发射效率,达到降低电源功耗的目的,然后再通过红外发射二极管产生红外线向空间发射。
HT6221 产生的遥控编码是连续的32 位二进制码组,其中前16 位为用户识别码,能区别不同的电器设备,防止不同机种遥控码互相干扰。
该芯片的用户识别码固定为十六进制01H;后16位为8 位操作码(功能码)及其反码。
UPD6121G 最多额128 种不同组合的编码。
在解码的时候,可以通过单片机对红外接收头产生的信号的脉宽进行检测,从而判断接收到多少个0和1,最后合成为4个字节的8位代码。
接收部分,采用红外接收头和单片机系统。
红外接收头把接收到的红外波形转化成红外脉冲,输入单片机,经过单片机接收和处理,读取按键值。
本设计用到的红外接收头来接收、放大和解调接收到的红外波,只要把该接收头的输出引脚连接单片机的外部中断口,就可以搭建简单的红外接收电路。
通过对红外接收头输出的正负脉冲进行计时和计数,通过计算就可以得到按键编码对应的二进制数组。
通过该数组获得按键值。
利用红外接收头来接收红外编码信号,电路简单,很容易操作实现,硬件开销小。
红外信号收发系统的典型电路如图1所示,红外接收电路通常被厂家集成在一个元件中,成为一体化红外接收头。
内部电路包括红外监测二极管,放大器,限副器,带通滤波器,积分电路,比较器等。
红外监测二极管监测到红外信号,然后把信号送到放大器和限幅器,限幅器把脉冲幅度控制在一定的水平,而不论红外发射器和接收器的距离远近。
交流信号进入带通滤波器,带通滤波器可以通过30khz到60khz的副载波,通过解调电路和积分电路进入比较器,比较器输出高低电平,还原出发射端的信号波形。
注意输出的高低电平和发射端是反相的,这样的目的是为了提高接收的灵敏度。
红外接收头的种类很多,引脚定义也不相同,一般都有三个引脚,包括供电脚,接地和信号输出脚。
根据发射端调制载波的不同应选用相应解调频率的接收头。
大体积红外接收头IRM38A引脚说明
红外接收头内部放大器的增益很大,很容易引起干扰,因此在接收头的供电脚上须加上滤波电容,一般在22uf以上。
有的厂家建议在供电脚和电源之间接入330欧电阻,进一步降低电源干扰。
红外发射器可从遥控器厂家定制,也可以自己用单片机的PWM产生,家庭遥控推荐使用红外发射管(L5IR4-45)的可产生37.91KHz的PWM, PWM占空比设置为1/3, 通过简单的定时中断开关PWM, 即可产生发射波形。
2.3 红外遥控锁软件方案设计
通过软件控制单片机的功能是单片机的主要特点和优点,程序的设计要考虑合理性和可读性,遵循模块化设计的原则,采用自顶向下的设计方法。
模块化设计使程序的可读性好、修改及完善方便。
软件设计包括主程序,密码校验子程序,步进电机正反准子程序,定时器0和外部中断1初始化子程序,延时子程序,红外解码子程序,蜂鸣器子程序等等。
密码校验子程序用来将解码得到的密码数组和设定的密码数组进行比较,从而判断密码正误。
步进电机正反转子程序用来控制步进电机正反转,从而实现开关锁。
定时器0和外部中断一用来对定时器0和外部中断1进行初始化。
红外解码程序用来将接收到的红外脉冲的时间数据转换成二进制表示的数据,然后进一步解码为按键编码值。
3 红外遥控锁硬件电路设计方法及原理
3.1红外遥控系统
红外遥控的概述:
红外线的光谱位于红色光之外,波长是0.76~1.5μm,比红光的波长还长。
红外遥控是利用红外线进行传递信息的一种控制方式,红外遥控具有抗干扰,电路简单,容易编码和解码,功耗小,成本低的优点。
红外遥控几乎适用所有家电的控制。
红外遥控系统的主要部分为调制、发射和接收,如图所示:
图1 红外遥控系统
3.1.1 调制
红外遥控是以调制的方式发射数据,就是把数据和一定频率的载波进行“与”操作,这样既可以提高发射效率又可以降低电源功耗。
调制载波频率一般在30khz到60khz之间,大多数使用的是38kHz,占空比1/3的方波,如图2所示,这是由发射端所使用的455kHz晶振决定的。
在发射端要对晶振进行整数分频,分频系数一般取12,所以455kHz÷12≈37.9
kH z≈38kHz。
3.1.2发射系统
目前有很多种芯片可以实现红外发射,可以根据选择发出不同种类的编码。
由于发射系统一般用电池供电,这就要求芯片的功耗要很低,芯片大多都设计成可以处于休眠状态,当有按键按下时才工作,这样可以降低功耗芯片所用的晶振应该有足够的耐物理撞击能力,不能选用普通的石英晶体,一般是选用陶瓷共鸣器,陶瓷共鸣器准确性没有石英晶体高,但通常一点误差可以忽略不计。
红外线通过红外发光二极管(LED)发射出去,红外发光二极管(红外发射管)内部构造与普通的发光二极管基本相同,材料和普通发光二极管不同,在红外发射管两端施加一定电压时,它发出的是红外线而不是可见光。
图3b 射击输出驱动电路
图3a 简单驱动电路
如图3a和图3b是LED的驱动电路,图3a是最简单电路,选用元件时要注意三极管的开关速度要快,还要考虑到LED的正向电流和反向漏电流,一般流过LED的最大正向电流为100mA,电流越大,其发射的波形强度越大。
图3a电路有一点缺陷,当电池电压下降时,流过LED的电流会降低,发射波形强度降低,遥控距离就会变小。
图3b所示的射极输出电路可以解决这个问题,两个二极管把三级管基极电压钳位在1.2V左右,因此三级管发射极电压固定在0.6V左右,发射极电流IE基本不变,根据IE≈IC,所以流过LED的电流也基本不变,这样保证了当电池电压降低时还可以保证一定的遥控距离。
3.1.3红外接收头原理图
红外接收头和复位电路电路原理图如图3.1.3所示。
图 3.1.3红外接收头和复位电路电路原理图
3.2 单片机的原理及应用
3.2.1 单片机原理简介
单片机是指集成在一个芯片上的微型计算机,也就是把组成微型计算机的各种功能部件,包括CPU、随机存储器RAM、只读存储器ROM、基本输入/输出接口电路。
定时器/计数器等部件都制作在一块芯片上,构成一个完整的微型计算机从而实现微型计算机的基本功能。
单片机内部结构示意图如图3.2.1所示。
图3.2.1单片机内部结构示意图
3.2.2 单片机最小系统的介绍
AT89C52提供以下标准功能:8K字节Flash闪速存储器,256字节内部RAM,32个I/O口线,3个16位定时/计数器,5个中断源,一个全双工串行通信口,片内具有振荡器及时钟电路。
单片机最小系统如图3.4所示。
图 3.2.2单片机最小系统
3.2.3 单片机定时/计数功能的介绍
AT89C52单片机定时/计数器的工作有两个特殊功能寄存器控制。
TMOD 用于设置其工作方式:TCON用于控制其启动和中断请求。
3.3 步进电机工作原理
3.3.1 步进电机原理
步进电机是一种感应电机,它的工作原理是利用电子电路,将直流电变成分时供电的,多相时序控制电流,用这种电流为步进电机供电,步进电机才能正常工作,驱动器就是为步进电机分时供电的,多相时序控制器虽然步进电机已被广泛地应用,但步进电机并不能象普通的直流电机,交流电机在常规下使用。
它必须由双环形脉冲信号、功率驱动电路等组成控制系统方可使用。
因此用好步进电机却非易事,它涉及到机械、电机、电子及计算机等许多专业知识。
步进电机作为执行元件,是机电一体化的关键产品之一, 广泛应用在各种自动化控制系统中。
随着微电子和计算机技术的发展,步进电机的需求量与日俱增,在各个国民经济领域都有应用。
3.3.2 步进电机驱动电路
步进电机驱动电路原理图如图3.2.2所示。
图3.3.2 步进电机驱动电路原理3.4 LED指示电路
LDE指示电路原理图如图3.4.1。
图3.4.LED指示电路原理图
3.5 蜂鸣器电路
蜂鸣器电路原理图如图3.5.1所示。
图3.5.1 蜂鸣器电路原理图
3.6 系统原理图及印刷板图
3.6.1系统总原理图
系统总原理图如图3.6.1所示。
图3.6.1 系统总原理图图
3.6.2 印刷版图
系统印刷板图如图3.6.2
图3.6.2 系统印刷板图
4软件设计流程
红外遥控锁元件清单
附录2
/******************************************************************** **
红外遥控锁全部程序
********************************************************************* **/
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
uchar code table[16] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x 71};
uchar code table1[]={0x80,0x40,0x20,0x10};
uchar code table2[]={0x10,0x20,0x40,0x80};
sbit P2_0=P2^0;
sbit P0_0=P0^0;
sbit P0_1=P0^1;
sbit P0_2=P0^2;
uchar htime;//红外时间变量
uchar startflag;//红外数据开始提取变量
uchar hdata[33];//红外数据的数组
uchar bytenumber;
uchar endflag;
uchar date[4];
uchar hp;
uchar disp[8];
void delay1(uint a) {while(a--);
}
void delay(uint del) {uint i,j;
for(i=0;i<del;i++)
for(j=0;j<110;j++); }
void time0_init() {TMOD=0x02;
TH0=0x00;
TL0=0x00;
EA=1;
ET0=1;
TR0=1;
}
void int1init()
{EA=1;
EX1=1;
IT1=1;
}
//红外数据提取函数void hpros()
{uchar k=1,i,j;
uchar value;
for(j=0;j<4;j++)
{
for(i=0;i<8;i++)
{ value=value>>1;
if(hdata[k]>6)
{value=value|0x80;
}
k++;
}
date[j]=value;
}
hp=1;
}
//红外数据处理函数void hchuli()
{disp[0]=date[0]/16; disp[1]=date[0]%16;
disp[2]=date[1]/16;
disp[3]=date[1]%16;
disp[4]=date[2]/16;
disp[5]=date[2]%16;
disp[6]=date[3]/16;
disp[7]=date[3]%16;
}
//蜂鸣器发声和Led亮
void BEEP()
{uchar m=20;
P0_0=0;
while(m--)
{P2_0=1;
delay(1);
P2_0=0;
delay(1);
}
P0_0=1;
}
void main()
{uint i=0,k,flag=0,b=0,d=0,FLAG=1,rflag=1,RFLAG=1,alarm=0,G=0,g=0,rag=0; uchar key[8]={4,5,4,6,4,7,4,4},key1[8],key2[8]={4,0,4,3,0,7,1,5};//电控锁密码数组为key,key2为正转和反转,key1为转载红外数据的数组
time0_init();
int1init();
while(1)
{ if(endflag)
{hpros();
endflag=0;
}
if(hp)
{hchuli();
hp=0;
flag=1;//按键按下蜂鸣器发声和led亮的标志
}
//电控锁复位标志
if((disp[4]==1)&&(disp[5]==6))
{uchar a;
for(a=0;a<8;a++)
{key1[a]=0;}
FLAG=1;
rflag=1;
alarm=0;
RFLAG=1;
i=0;
}
if(flag)
{BEEP();
key1[i]=disp[4];
key1[i+1]=disp[5];
i=i+2;
flag=0;
rag=1;
alarm++;
if(i==8)
{i=0;}
}
//修改密码
if((disp[4]==1)&&(disp[5]==9))
{ uchar a;
for(a=0;a<8;a++)
{key1[a]=0;}
RFLAG=0;
i=0;
}
//进入修改密码的具体的实现
if(RFLAG==0)
{
//确认要修改的密码的原密码
if((key[0]==key1[0])&&(key[1]==key1[1])&&(key[2]==key1[2])&&(key[3]==key 1[3])&&(key[4]==key1[4])&&(key[5]==key1[5])&&(key[6]==key1[6])&&(key[7] ==key1[7]))
{uint H;
G=1;
for(H=0;H<10;H++)
{ P0_1=0;
delay(20);
P0_1=1;
delay(20);
}
for(H=0;H<8;H++)
{key1[H]=0;}
i=0;
rag=0;
}
if((key2[0]==key1[0])&&(key2[1]==key1[1])&&(key2[2]==key1[2])&&(key2[3]= =key1[3])&&(key2[4]==key1[4])&&(key2[5]==key1[5])&&(key2[6]==key1[6])& &(key2[7]==key1[7]))
{uint h;
g=1;
for(h=0;h<10;h++)
{P0_2=0;
delay(30);
P0_2=1;
delay(30);
}
for(h=0;h<8;h++)
{key1[h]=0;}
i=0;
rag=0;
}
//修改密码,输入新密码
if(G)
{if(rag)
{ uint B;
key[b]=disp[4];
key[b+1]=disp[5];
b=b+2;
if(b==8)
{b=0;
G=0;
RFLAG=1;
alarm=0;
for(B=0;B<8;B++)
{key1[B]=0;
}
for(B=0;B<10;B++)
{P0_1=0;
delay(20);
P0_1=1;
delay(20);
}
i=0;
}
rag=0;
}
}
if(g)
{ if(rag)
{uint D;
key2[d]=disp[4];
key2[d+1]=disp[5];
d=d+2;
if(d==8)
{d=0;
g=0;
RFLAG=1;
alarm=0;
for(D=0;D<8;D++)
{key1[D]=0;
}
for(D=0;D<10;D++)
{P0_2=0;
delay(20);
P0_2=1;
delay(20);
}
i=0;
}
rag=0;
}
}
}
//红外控制电控锁旋转
if(RFLAG)
{
if((key[0]==key1[0])&&(key[1]==key1[1])&&(key[2]==key1[2])&&(key[3]==key 1[3])&&(key[4]==key1[4])&&(key[5]==key1[5])&&(key[6]==key1[6])&&(key[7] ==key1[7]))
{uint j=128;
if(FLAG)
{P0_1=0;
while(j--)
{for(k=0;k<4;k++)
{P2=table1[k];
delay1(800);
}
}
P0_1=1;
FLAG=0;
rflag=1;
alarm=0;
i=0;
}
}
if((key2[0]==key1[0])&&(key2[1]==key1[1])&&(key2[2]==key1[2])&&(key2 [3]==key1[3])&&(key2[4]==key1[4])&&(key2[5]==key1[5])&&(key2[6]==key1[6 ])&&(key2[7]==key1[7]))
{ uint j=128;
if(rflag)
{P0_2=0;
while(j--)
{for(k=0;k<4;k++)
{P2=table2[k];
delay1(800);
}
}
P0_2=1;
rflag=0;
FLAG=1;
alarm=0;
i=0;
}
}
if((disp[4]==0)&&(disp[5]==9))
{if(FLAG)
{uchar n;
for(n=0;n<10;n++)
{P0_1=0;
delay(20);
P0_1=1;
delay(20);
}
}
if(rflag)
{uchar m;
for(m=0;m<10;m++)
{P0_2=0;
delay(20);
P0_2=1;
delay(20);
}
}
disp[4]=0;
disp[5]=0;
i=0;
}
if(alarm>5)
{uint f=20;
while(f--)
{BEEP();}
i=0;
alarm=0;
}
}
}
}
void time0() interrupt 1
{htime++;
}
void int1() interrupt 2
{
if(startflag)
{
if(htime>35)
bytenumber=0;
hdata[bytenumber]=htime;
htime=0;
bytenumber++;
if(bytenumber==33)
{bytenumber=0;
endflag=1;
}
}
else
{
startflag=1;
htime=0;
}
}
20。