红外接收程序讲解
红外接收解码原理和源程序
上述“0”和“1”构成旳32位二进制码经38kHz旳载频进行二次调制以提升发射效率,到达降低电源功耗旳目旳。然后再经过红外发射二极管产生红外线向空间发射,如图。
UPD6121G产生旳遥控编码是连续旳32位二进制码组,其中前16位为顾客辨认码,能区别不同旳电器设备,预防不同机种遥控码相互干扰。芯片厂商把顾客辨认码固定为十六进制旳一组数;后16位为8位操作码(功能码)及其反码。UPD6121G最多额128种不同组合旳编码。遥控器在按键按下后,周期性地发出同一种32位二进制码,周期约为108ms。一组码本身旳连续时间随它包括旳二进制“0”和“1”旳个数不同而不同,大约在45~63ms之间,图4为发射波形图。当一种键按下超出36ms,振荡器使芯片激活,将发射一组108ms旳编码脉冲,这108ms发射代码由一种起始码(9ms),一种成果码(4.5ms),低8位地址码(9ms~18ms),高8位地址码(9ms~18ms),8位数据码(9ms~18ms)和这8位数据旳反码(9ms~18ms)构成。假如键按下超出108ms仍未松开,接下来发射旳代码(连发代码)将仅由起始码(9ms)和结束码(2.5ms)构成。
注:P3.2接旳是外部中断
红外接受头将38K载波信号过虑,得到与发射代码反向接受代码
发射端旳“0”和“1”
红外解码旳关键就是辨认 0和1
Hale Waihona Puke 1. 解码旳关键是怎样辨认“0”和“1”,从位旳定义我们能够发觉“0”、“1”均以0.56ms旳低电平开始,不同旳是高电平旳宽度不同,“0”为0.56ms,“1”为1.68ms,所以必须根据高电平旳宽度区别“0”和“1”。假如从0.56ms低电平过后,开始延时,0.56ms后来,若读到旳电平为低,阐明该位为“0”,反之则为“1”,为了可靠起见,延时必须比0.56ms长些,但又不能超出1.12ms,不然假如该位为“0”,读到旳已是下一位旳高电平,所以取(1.12ms+0.56ms)/2=0.84ms最为可靠,一般取0.84ms左右均可。
红外发射接收程序
红外发送调用SendIRdata();while(over==0);地址储存在addr(可根据需要改成发送16位地址,此程序发送的是八位地址,第二地址是第一个的反码)中,hwdata,c,d,over,dat是全局unsigned char ,在等待红外发送完成while(over==0)语句,等待时间为几十ms,可在前面或while中可执行其他程序。
(等待期间不需要执行其他程序也可把while语句放入SendIRdata()末尾)void SendIRdata(unsigned char x){TH1=0xdc;//发送9ms的起始码TL1=0xd8;TR2=1;TR1=1;hwdata=x;over=0;//红外发送结束标志,为1完成}/**************定时器1中断处理***************/void timeint(void) interrupt 3{switch(c){case 0: //起始码4.5msTH1=0xee;TL1=0x6c;TR2=0;c=1;dat=addr;//发送十六位地址的前八位break;case 1:TH1=0xfd; //560us高电平TL1=0xd0;TR2=1;c=2;break;case 2:if(dat&0x01){ TH1=0xf9;TL1=0x5c;}//1.7ms低电平else{ TH1=0xfd;TL1=0xd0;}//560us低电平TR2=0;dat>>=1;d++;c=1;if(d==8)dat=~addr;//发送十六位地址的后八位if(d==16)dat=hwdata;//发送八位数据if(d==24)dat=~hwdata;//发送八位数据的反码if(d==33){over=1;TR1=0;TR2=0;d=0;c=0;}break;}}外中断0 接收,储存在dat[3]全局变量中,hu,time1,time2,h,b,是unsigned char型全局变量,time是unsigned intvoid extern0() interrupt 0 //中断程序{if(hu==0){TL1=0;TH1=0;TR1=1;hu=1;}else{TR1=0;time1=TH1;time2=TL1;TL1=0;TH1=0;TR1=1;time=time1*256+time2;if(start==0){if((14000>time)&&(time>13000))start=1;}else{//if((time>2100)&&(2400>time))//{dat[h]>>=1; dat[h]=dat[h]|0x80;}//else//if((time>1000)&&(1250>time))//dat[h]>>=1;dat[h]>>=1;if((time>2100)&&(2400>time))dat[h]=dat[h]|0x80;b++;if(b>7){ b=0;h++;if(h>3){h=0;start=0;hu=0;if(dat[0]!=~dat[1]|| dat[2]!=~dat[3])dat[2]=0;}}}}}。
红外通讯(发送与接收)
程序1-发送 上传到mBot1/mCore1
程序2-接收 上传到mBot2/mCore2
• 脚本说明 • 本示例利用mCore的板载红外接收器和红外发射器实现。 • 准备两个mBot/mCore,将程序1上传到mBot1/mCore1, 将程序2上传到mBot2/mCore2。 • 程序1——发送消息,只要按下板载按钮, mBot1/mCore1发声并发送一条消息,消息由板载红外线 发射器发出,消息内容可以自由设置,本例将发送的消 息设为“S”。 • 程序2——接收消息,只要接收到消息“S”, mBot2/mCore2控制板发出红光,蜂鸣器发声(模仿“被 击中”的效果)。 • 若有其他mBot,只要发送/接收的消息相同,就可使用 本示例程序在多个mBot/mCore之间进行通讯与互动。 •
• 知识要点 • • 要点1 红外通讯中的字符
积木中定义的消息是作为信 号使用的,尽量填入占用空间小的英文字符或字 符串,避免程序较为复杂时出错。
• 要点2
积木的使用
•
积木用于红外通讯中判断信 号是否匹配,此处不能替换为运算 积木。
• 要3 实现程序2需要调出通讯积木
• 使用 积木,需要在 mBlock菜单栏里选择“扩展”“Communication”,才能在机器人模块区中, 调出“通讯”积木。
• 扩展任务
• 改变脚本实现:当控制板mCore1感受到较 强的光线时,发送另一条消息,控制板 mCore2接收到消息后表现出“满血复活” 的声光效果。
红外通讯(发送与接收)
• 当按下mBot1/mCore1的板载按 钮后,mBot1/mCore1发出通讯 信号并发声,mBot2/mCore2接 收到信号后发声发光。
• • • •
硬件要求: mBot/mCore控制板 实现方式: 将程序上传到Arduino
单片机红外接收解码程序说明
1单片机红外接收与解码原理1.1PT2262-I R编码原理PT2262-IR的编码格式如图1-1所示,其中,OSC为系统的时钟频率。
0,1,f和Sync 对应的分别是低电平,高电平,悬空和同步码的波形,图1-1 PT2262-IR编码格式由于使用的一体化红外接收头的接收频率为38KHz,所以系统的时钟频率应该设置为76KHz。
根据编码格式,通过计算可以得到各类编码中高低电平的宽度,也可以利用示波器测量各类编码中高低电平的宽度。
1.2 解码原理要进行软件解码最重要的是得到各个电平的宽度,因此我们在进行软件解码时要利用计时器去获得电平的宽度,然后对得到的数据进行处理,就可以得到每个相应的脉冲是宽脉冲还是窄脉冲。
通过对PT2262-IR的编码格式分析发现,根据每个周期中间时刻的电平状态就是判断相应周期中高电平是宽脉冲还是窄脉冲,为了减少数据的运算量,我们也可以在每个周期的中间时刻对输入端进行电平检测,得到相应时刻的电平状态,然后根据每个周期中间时刻的电平状态去判断该周期的脉冲是宽脉冲还是窄脉冲进而解码出发送的实际数据,每个周期中间时刻的电平状态和实际数据的对应关系如表1所示。
表1 编码与数据对应表利用判断周期中间时刻的电平状态进行软件解码时,我们可以通过计算得到周期的大概值,进而计算出半个周期的大概值,就可以在输入端有高电平跳变到低电平时给定时器一个初始值,然后启动定时器,使定时器可以在该周期的中间时刻产生中断,在中断处理程序中根据标记位判断是否需要读取信号输入端的电平状态,如果需要读取输入端的电平状态就开始读取输入端的电平状态,然后将其保存,同时计数值增加1,并清除标记位,对定时器设定初始值后重新启动定时器,以便判断该周期是否过长。
如果不需要读取电平状态说明此次定时是为了判断周期长度的,一旦进入该中断说明该周期过长,可能是同步位或者是误码,因此就需要将计数值清零,重新获取数据,一直到获取25个数据为止。
红外接收模块原理
红外接收模块原理
红外接收模块是一种用于接收红外信号的电子设备,常见于无线遥控器、红外传感器等产品中。
它通过接收和解码红外信号,将其转换为数字信号后再进行处理。
红外接收模块的原理可以分为三个主要步骤:信号接收、信号解码和信号处理。
首先是信号接收。
红外接收模块内部通常包含一个红外敏感的光电二极管。
当红外信号照射到光电二极管上时,光电二极管会产生微弱的电流。
这个电流的强弱与照射到光电二极管上的红外光强度成正比。
因此,光电二极管起到了将红外信号转换为电信号的作用。
接下来是信号解码。
红外信号通常是经过调制的,即通过在信号中加入特定的频率来表示不同的信号。
红外接收模块采用解调的方法,将接收到的红外信号进行解调,即还原出信号中的原始数据。
这个过程通常采用红外解码芯片来完成,该芯片内部有一组滤波器和放大器,用于滤除多余的噪声并放大信号。
最后是信号处理。
解码后的信号被传送至信号处理部分进行分析和判断。
根据具体使用的设备和应用场景,处理部分可能会进行不同的操作,例如判断按键是否按下、检测物体的距离或者执行特定的动作等等。
总结起来,红外接收模块的原理就是通过光电二极管接收红外信号并转换为电信号,经过解调和信号处理后,将信号转化为数字信号用于后续的处理。
这种原理使得红外接收模块在无线遥控、红外传感等领域中发挥重要的作用。
红外遥控器程序及原理、程序
Data=0;//收到数据 0 }
if(Ok==1) {
hw_jsm<<=1; hw_jsm+=Data;
if(Num>=32)
{ hw_jsbz=1; break }
EXTI_ClearITPendingBit(EXTI_Line15); }
printf_init(); //printf 初始化
while(1)
{
if(hw_jsbz==1) //如果红外接收到
{
hw_jsbz=0;
//清零
printf("红外接收码 %0.8X\r\n",hw_jsm); //打印
hw_jsm=0;
//接收码清零
}
}
}
1.1 红外遥控简介简介 红外遥控是一种无线、非接触控制技术,具有抗干扰能力强,信息传输可靠,功耗低, 成本低,易实现等显著优点,被诸多电子设备特别是家用电器广泛采用,并越来越多的应用 到计算机系统中。 由于红外线遥控不具有像无线电遥控那样穿过障碍物去控制被控对象的能力,所以,在 设计红外线遥控器时,不必要像无线电遥控器那样,每套(发射器和接收器)要有不同的遥控 频率或编码(否则,就会隔墙控制或干扰邻居的家用电器),所以同类产品的红外线遥控器, 可以有相同的遥控频率或编码,而不会出现遥控信号“串门”的情况。这对于大批量生产以 及在家用电器上普及红外线遥控提供了极大的方面。由于红外线为不可见光,因此对环境影 响很小,再由红外光波动波长远小于无线电波的波长,所以红外线遥控不会影响其他家用电 器,也不会影响临近的无线电设备。 红外遥控的编码目前广泛使用的是: NEC Protocol 的 PWM(脉冲宽度调制)和 Philips RC-5 Protocol 的 PPM(脉冲位置调制)。 普中科技 STM32 开发板配套的遥控器使用的是 NEC 协议,其特征如下: 1、 8 位地址和 8 位指令长度; 2、地址和命令 2 次传输(确保可靠性) 3、 PWM 脉冲位置调制,以发射红外载波的占空比代表“ 0”和“ 1”; 4、载波频率为 38Khz; 5、位时间为 1.125ms 或 2.25ms; NEC 码的位定义:一个脉冲对应 560us 的连续载波,一个逻辑 1 传输需要 2.25ms ( 560us 脉冲+1680us 低电平),一个逻辑 0 的传输需要 1.125ms( 560us 脉冲+560us 低 电平) 。而遥控接收头在收到脉冲的时候为低电平,在没有脉冲的时候为高电平,这样, 我们在接收头端收到的信号为:逻辑 1 应该是 560us 低+1680us 高,逻辑 0 应该是 560us 低+560us 高。 NEC 遥控指令的数据格式为:同步码头、地址码、地址反码、控制码、控制反码。同步 码由一个 9ms 的低电平和一个 4.5ms 的高电平组成,地址码、地址反码、控制码、控制 反 码均是 8 位数据格式。按照低位在前,高位在后的顺序发送。采用反码是为了增加传输的 可靠性(可 用于校验)。 2.数据码格式 数据格式包括了引导码、用户码、数据码和数据码反码,编码总占 32 位。数据反码是数据 码反相后的编码,编码时可用于对数据的纠错。注意:第二段的用户码也可以在遥控应用电 路中被设置成第一段用户码的反码。
红外接收头模块的使用
红外接收头模块的使用红外接收头模块是一种常见的电子元件,它具有接收和解码红外信号的功能。
在日常生活中,我们经常会见到红外接收头模块的应用,比如电视遥控器、空调遥控器、无线门铃等等。
它通过接收红外线的信号,并将其转化为电信号,从而实现遥控器与设备之间的通信。
以下将介绍红外接收头模块的使用方法以及其在各个领域中的应用。
我们来了解一下红外接收头模块的基本使用方法。
一般来说,红外接收头模块由三个引脚组成,分别是VCC、GND和OUT。
其中,VCC和GND分别连接电源的正负极,OUT则连接到控制电路。
在使用红外接收头模块之前,我们需要先了解一下它的工作原理。
红外接收头模块是通过接收红外线的信号来实现遥控功能的,所以在使用时需要将其朝向需要控制的设备。
当我们按下遥控器上的按钮时,红外接收头模块会接收到红外线的信号,并将其转化为电信号,然后通过OUT引脚输出给控制电路,从而实现设备的控制。
红外接收头模块在各个领域中都有着广泛的应用。
首先,它在家庭生活中的应用非常广泛。
比如,我们可以通过红外接收头模块与电视遥控器配对,实现对电视的开关、音量、频道等功能的控制。
此外,红外接收头模块还可以与空调遥控器配对,实现对空调的温度、风速、模式等参数的调节。
另外,红外接收头模块还可以用于无线门铃,当有人按下门铃按钮时,红外接收头模块会接收到信号,并触发门铃的响应。
除了家庭生活,红外接收头模块还在工业领域中有着广泛的应用。
比如,在自动化生产线上,红外接收头模块可以用于检测产品的位置和状态,从而实现对生产过程的控制和监测。
此外,红外接收头模块还可以用于安防监控系统,通过接收红外线的信号,实现对入侵者的检测和报警。
总的来说,红外接收头模块是一种非常常见且实用的电子元件。
它通过接收和解码红外信号,实现了设备之间的无线通信。
无论是在家庭生活中还是在工业领域中,红外接收头模块都发挥着重要的作用。
通过了解红外接收头模块的使用方法和应用领域,我们可以更好地理解它的工作原理,并能够更好地应用它来实现各种功能。
红外线遥控解码接收程序-C语言
红外线遥控解码接收程序-C语言.txt铁饭碗的真实含义不是在一个地方吃一辈子饭,而是一辈子到哪儿都有饭吃。
就算是一坨屎,也有遇见屎壳郎的那天。
所以你大可不必为今天的自己有太多担忧。
红外线遥控解码接收程序-C语言#include <regx51.h>#define uchar unsigned char#define uint unsigned int#define IR_RE P3_2bit k=0; //红外解码判断标志位,为0那么为有效信号,为1那么为无效uchar date[4]={0,0,0,0}; //date数组为存放地址原码,反码,数据原码,反码/*--------------------------延时1ms程子程序-----------------------*/delay1000(){uchar i,j;i=5;do{j=95;do{j--;}while(j);i--;}while(i);}/*---------------------------延时882us子程序-----------------------*/delay882(){uchar i,j;i=6;do{j=71;do{j--;}while(j);i--;}while(i);}/*--------------------------延时2400us程子程序-----------------------*/delay2400(){uchar i,j;i=5;do{j=237;do{j--;}while(j);i--;}while(i);}//**************************************************************//**************************************************************/*----------------------------------------------------------*//*-----------------------红外解码程序(核心)-----------------*//*----------------------------------------------------------*/void IR_decode(){uchar i,j;while(IR_RE==0);delay2400();{delay1000();delay1000();for(i=0;i<4;i++){for(j=0;j<8;j++){while(IR_RE==0); //等待地址码第1位高电平到来delay882(); //延时882us判断此时引脚电平///CY=IR_RE;if(IR_RE==0){date[i]>>=1;date[i]=date[i]|0x00;}else if(IR_RE==1){delay1000();date[i]>>=1;date[i]=date[i]|0x80;}} //1位数据接收完毕} //32位二进制码接收完毕}}//*****************************************************************//********************************************************************/*------------------------外部中断0程序-------------------------*//*------------------主要用于处理红外遥控键值--------------------*/void int0() interrupt 0{uchar i;k=0;EX0=0; //检测到有效信号关中断,防止干扰for(i=0;i<4;i++){delay1000();if(IR_RE==1){k=1;} //刚开场为9ms的引导码. }if(k==0){// EX0=0; //检测到有效信号关中断,防止干扰IR_decode(); //如果接收到的是有效信号,那么调用解码程序P0=date[1];delay2400();delay2400();delay2400();}EX0=1; //开外部中断,允许新的遥控按键}//*********************************************************************//********************************void main(){SP=0x60; //堆栈指针EX0=1; //允许外部中断0,用于检测红外遥控器按键EA=1; //总中断开while(1);}总结:关于本段程序的准确延时在<<C51中准确的延时与计算的实现>>里的评论有很好的诠释.//在STC12C5410上运用红外线解码程序.主要的问题在于延迟上。
电视机红外遥控和接收的制作(完整的电路、程序、照片)
程序:
#include<reg52.h> #include<intrins.h> #include<stdio.h>
#define uint unsigned int #define uchar unsigned char
sbit ir=P3^2 ; //红外端口 sbit P2_0=P2^0 ; //LED1 端口
} }
红外发射原理图:
晶振用的是 22.1184M
三级管驱动红外发射电路: 红外发射程序如下:(参考网上程序)
R16 另一边接 P1.0
#include <reg52.h> #define uint unsigned int #define uchar unsigned char bit irout;//红外管状态 sbit ir=P1^7;//红外发射管控制脚 uint count, set_count;//中断计数,设定中断次数 bit flag,keyflag;//红外发送标志,按键标志位 uchar irsys[4]={0x1a,0xa1,0xdc,0x03};//26 位系统码,最后一个字节只用 2 位 uchar ircode,irdata; /********************************************** 延时 1ms ***********************************************/
} } } }
/************************************* 主程序
*************************************/ void main() {
红外发射与接收程序
TR1=1;
while(Ir_Pin && (TH1&0x80)==0);
TR1=0;
return TH1*256+TL1;
}
//==============================================================
看个例子:
#include <reg51.h>
#define c(x) (x*120000/120000)
sbit Ir_Pin=P3^6;
sbit beep=P3^7;
//sbit RELAY=P2^0;
unsigned char code Led_Tab[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,
beep=1;
//RELAY=0;
//delay_50ms(50);
//RELAY=1;
}
while(1);
}
unsigned int Ir_Get_Low()
{
TL1=0;
TH1=0;
TR1=1;
while(!Ir_Pin && (TH1&0x80)==0);
TR1=0;
if(temp<c(200) || temp>c(2000)) goto restart;
Ir_Buf[i]>>=1;
if(temp>c(1120)) Ir_Buf[i]|=0x80;
}
Led_Buf[0]=Ir_Buf[2]&0xf;
红外发射器:可以用单片机产生38K的载波,也可以用555振荡产生,也可以用红外遥控器
红外发射接收程序
/*-----------------------------------------------名称:红外发射接收修改:无内容:*红外测试程序,用单片机通过发射管发射38K的调制频率码,由一体化接收并解码由发光管显示。
*正常情况下,由于反射和高灵敏度接收,LED4(P1.7)一直闪烁,可以用黑色纸片完全遮挡接收头使*之不能接收到发射管的信号,这是LED4熄灭。
说明功能性正常------------------------------------------------*/#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义sbit LED=P2^3; //红外发射sbit LED1=P0^1;bit Flag;void Init_Timer0(void){TMOD |= 0x01;TH0=0xf0; /* Init value */TL0=0x00;EA=1; /* interupt enable */ET0=1; /* enable timer0 interrupt */TR0=1;}/******************************************************************/ /* 定时器0初始化 *//******************************************************************/ void Timer0_isr(void) interrupt 1 using 1{TH0=0x0f; /* Init value */TL0=0x00;Flag=!Flag;}/******************************************************************/ /* 主函数 *//******************************************************************/ main(){unsigned int j;Init_Timer0(); //定时器初始化LED1=0;while(1){ //读取一体化接收头数值if(Flag){for(j=0;j<27;j++)//大约38KHz{LED=!LED; //发射管输出}}}}#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义sbit LED=P0^1;sbit IR=P2^3; //红外一体化接收sbit LED1=P0^2;sbit BUZZER=P2^5;void delayus(unsigned us){ unsigned int i,j;for(i=0;i<us;i++)for(j=0;j<101;j++);}main(){LED1=0;BUZZER=0;while(1){unsigned int a,b;b=0;for(a=0;a<22;a++){ if(IR==0)b=b+1;delayus(6);//对脉冲采样}if(b>5){LED=0;BUZZER=0;}else{LED=1;BUZZER=1;}//有障碍物灯灭、蜂鸣器响}}。
红外线接收主程序
红外线接收主程序:ORG 0000HAJMP RECEORG 0111HRECE: MOV R5, # 4 ; 接收4位红绿灯信号JB P2.0, $ ;MOV R7, # 15 ;RECE1: LCALL DELAY ; 调用一次子程序DELAY,产生一个26us的延时DJNZ R7, RECE1 ;等待15个脉冲的时间JB P2. 0, RECE1 ; 延时15个脉冲后Pl. 0=1,转RECE1重新检测JNB P2. 0, $; 延时15个脉冲后P2. 0还是0传输开始再等编码中的高电平(如图8中E点和F点) (直接位不为1则转移)GM: MOV R7, # 15 ; 编码中的高电平到来后,延时15个脉冲的时间GM1: LCALL DELAY ; 调用一次子程序DELAY,产生一个26us的延时DJNZ R7,GM1;延时15个脉冲JNB P2. 0, RE1: 延时15个脉冲后, P2. 0= 0转RE1, P2. 0= 1顺序执行CLR C; P2.0= 1时应解码为0(图8中B点),使标志C清0CLR A; 使A清0RLC A; 把标志C= 0移入寄存器A中,经4次移位到A的高位GM2: JB P2.0 , GM2 ;等待低电平LJMP XYW; 转接收下一位RE1: SETB C ; P2.0= 0时应解码为1(图A 中A点),使标志C置1 CLR A ;RLC A ;把标志C= 1移入寄存器A中JNB P2.0 , $;等待高电平XYW: DJNZ R5,GM; 4位未接收完,继续JNB Acc.1 , RED ; 红灯提示发声GREEN: MOV R0, #50H ;绿灯提示发声ACALL PLAY ; 调放音子程序MOV R0, #78H;ACALL PLAY;调放音子程序LJMP STOPRED: MOV R0, #00HACALL PLAY ; 调放音子程序MOV R0, #28H;ACALL PLAY;调放音子程序LJMP STOPDELAY: MOV R6, #12; 1usDJNZ R6, $ ;24usRET ; 1 usPLAY: MOV A, #00H;复位信号MOV P1, A; 使P1复位,P1才能作为输入口。
带连码红外接收程序
} start_T1;//在已经开始接收 32 码后,重新开启定时器 }ewvalue>120)//位周期大于某某数,表示位值为 1 {
point|=0x80000000; }//否则为 0
bit_amount++; if(bit_amount>=33)//32 位码接收完毕 {
REG.receive_start=0;//重置各标志位 bit_amount=0; REG.receive_32bits=0; if(p[0]==(uchar)(~p[1])&&p[2]==(uchar)(~p[3])) {
typedef struct FLG flag;
volatile flag REG;
void PORT_init(void) {
DDRB|=(1<<2); PORTA|=(1<<7);//上拉输入捕捉引脚,以提高稳定性 } //下面初始化中包含输出比较中断用于防止定时器计数过长而死机, //省去输出比较中断也无妨,可以测试一下 void Timer1_capture_init(void) { TCCR1B|=(1<<7); OCR1A=2000;
说起红外遥控,大家最熟悉的不过是 NEC 的红外协议了,现在重温一下这个协议。在红外遥控发射端, NEC 协议逻辑“1”是 560us 的 38K 载波(占空比 1/4 到 1/3,这个占空比值是基于发射端的电源节能考虑 的,好比一个周期不变的电源开关,闭合的时间越短就越省电,但刚好能满足接收端的识别要求)和 1690us 的低电平组成;逻辑“0”则是由 560us 的 38K 载波和 560us 低电平组成。所以两者的周期各为:2.25ms 和 1.12ms,具体如图 1 所示。
红外线的吸收实验
红外线的吸收实验红外线是我们日常生活中经常接触到的一种电磁辐射。
它在许多领域中有着广泛的应用,比如红外线摄像机、红外线传感器等。
为了更好地了解红外线的性质和特点,科学家们进行了许多相关的实验研究。
本文将介绍一种简单的红外线吸收实验。
实验步骤:1. 准备材料:- 红外线发射器- 红外线接收器- 红外线透明材料(如透明玻璃片、塑料薄膜等)- 物体样本(如纸张、布料、金属片等)- 长距离传输介质(如空气、真空等)2. 搭建实验装置:将红外线发射器和接收器分别连接到电源上,确保电源正常工作。
将它们放置在一个适当的位置,使得发射器能够向接收器发射红外线,而接收器能够接收到发射器发出的红外线。
3. 测量基准值:在没有物体样本的情况下,测量红外线接收器接收到的基准值。
记录下这个数值,作为后续实验比较的标准。
4. 测量吸收率:将不同的物体样本放置在发射器和接收器之间,让红外线通过物体样本。
观察接收器接收到的红外线数值的变化,并记录下来。
5. 分析结果:比较不同物体样本的红外线吸收值。
根据实验数据,可以得出各个样本对红外线的吸收能力大小。
同时,可以观察不同材料呈现出不同的吸收特性,如透明材料的吸收能力较低,而金属片则几乎完全吸收红外线。
实验注意事项:1. 安全使用电源,确保实验过程中的电压和电流在安全范围内。
2. 实验环境尽量保持安静和稳定,以避免外界因素的干扰。
3. 实验时注意手的干净,避免污染物附着在物体样本上,影响实验结果的准确性。
实验结论:通过以上实验,我们可以得出一些初步结论:- 不同材料对红外线的吸收能力存在差异,金属片对红外线吸收能力较强,透明材料对红外线吸收能力较低。
- 红外线的吸收能力与物体的颜色和纹理等特性有关。
例如,黑色物体对红外线的吸收能力较高,而白色物体的吸收能力较低。
实验的意义:通过这个实验,我们可以更好地了解红外线的特性和材料对红外线的吸收能力。
这对于红外线技术的应用和红外线传感器的优化设计具有重要意义。
红外接收程序,1602上显示用户码和数据码
*输入:行,列,需要输入1602的数据
*输出:无
***********************************************************************/
void L1602_char(uchar hang,uchar lie,char sign)
while(!hwx);//低电平开始,不处理只等待高电平接收
ly_ct=0;
while(hwx){//高电平开始,
delay100us();
if(ly_ct>25)
return;
return;
}
if(ly_ct<35)//NEC引导码引导码的后4。5MS,ly_ct约45
return;
/***********开始接收四个字节内容**************************************/
for(i=0;i<4;i++){
for(ia=0;ia<8;ia++){
case 0x82:num=6;break;
case 0xf8:num=7;break;
case 0x80:num=8;break;
case 0x90:num=9;break;
case 0x88:num=10;break;
case 0x83:num=11;break;
case 0xc6:num=12;break;
else IRCOM[5]=IRCOM[5]+0x30;
if(IRCOM[6]>9) { IRCOM[6]=IRCOM[6]+0x37;}
红外接收
红外数据传输一、红外通信原理红外遥控有发送和接收两个组成部分。
发送端采用单片机将待发送的二进制信号编码调制为一系列的脉冲串信号,通过红外发射管发射红外信号。
红外接收完成对红外信号的接收、放大、检波、整形,并解调出遥控编码脉冲。
为了减少干扰,采用的是价格便宜性能可靠的一体化红外接收头(HS0038,它接收红外信号频率为38kHz,周期约26μs) 接收红外信号,它同时对信号进行放大、检波、整形得到TTL 电平的编码信号,再送给单片机,经单片机解码并执行去控制相关对象。
如图1 所示:红外发送部分由51单片机、键盘、红外发光二极管和7段数码管组成。
键盘用于输入指令,51单片机检测键盘上按键的状态,并对红外信号进行调制,发光二极管产生红外线,数码管用来显示发送的键值。
图2红外发射电路红外接收部分由51单片机、一体化红外接收头HS0038和7段数码管组成。
51单片机检测HS0038,并对HS0038接收到的数据解码,通过数码管显示接收到的键值。
图3红外接收电路二、编码、解码(1) 二进制信号的调制二进制信号的调制由单片机来完成,它把编码后的二进制信号调制成频率为38kHz 的间断脉冲串,相当于用二进制信号的编码乘以频率为38kHz 的脉冲信号得到的间断脉冲串,即是调制后用于红外发射二极管发送的信号如图4 二进制码的调制所示(2) 红外接收需先进行解调,解调的过程是通过红外接收管进行接收的。
其基本工作过程为:当接收到调制信号时,输出高电平,否则输出为低电平,是调制的逆过程(图5 解调)。
HS0038是一体化集成的红外接收器件,直接就可以输出解调后的高低电平信号;红外接收器HS0038的应用电路(图6)。
(3)红外遥控发射芯片采用 PPM 编码方式,当发射器按键按下后,将发射一组 108ms 的编码脉冲。
遥控编码脉冲由前导码、16位地址码(8 位地址码、 8 位地址码的反码)和16位操作码(8 位操作码、 8 位操作码的反码)组成。
Arduino教程Lesson15:红外接收
Arduino教程Lesson15:红外接收这节我们会接触一个新的元件——红外接收管。
所谓红外接收管,也就是接收红外光的电子器件。
红外接收管,看着离我们很遥远的感觉!其实不然,它就在我们身边。
比如我们电视机,空调这些家电,其实它们都需要用到红外接收管。
我们都知道遥控器发射出来的都是红外光,电视机上势必要有红外接收管,才能接收到遥控器发过来的红外信号。
我们这次就用红外接收管做个遥控灯,通过遥控器的红色电源键来控制LED的开关。
所需材料•1×红外接收管•1× Mini遥控器STEP 1:硬件连接看着是不是很高兴,这应该是我们看到最容易的连线了,只需要连接三根线就可以了,注意一下正负就可以了(图中表明部分)。
红外接收管Vout输出接到数字引脚11。
STEP 2:输入代码这段代码,你可以不用自己手动输入,我们提供现成的IRremote 库,把整个库的压缩包解压到Arduino IDE安装位置Arduino 1.0.5/ libraries文件夹中,直接运行Example中的IRrecvDemo代码即可。
如果还是不是很明白如何加载库,可看一下如何加载库的帖子,对如何加库做了详细说明。
1.//这段代码来自IRremote库中examples中的 IRrecvDemo2.#include <IRremote.h> //调用IRremote.h库3.int RECV_PIN = 11; //定义RECV_PIN变量为114.IRrecv irrecv(RECV_PIN); //设置RECV_PIN(也就是11引脚)为红外接收端5.decode_results results; //定义results变量为红外结果存放位置6.7.void setup(){8.Serial.begin(9600); //串口波特率设为96009.irrecv.enableIRIn(); //启动红外解码10.}11.12.void loop() {13.//是否接收到解码数据,把接收到的数据存储在变量results 中14.if (irrecv.decode(&results)) {15.//接收到的数据以16进制的方式在串口输出16.Serial.println(results.value, HEX);17.irrecv.resume(); // 继续等待接收下一组信号18.}19.}20.复制代码下载完成后,打开Arduino IDE的串口监视器(Serial Monitor),设置波特率baud为9600,与代码中Serial.begin(9600)相匹配。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
红外接收程序讲解1、红外遥控系统通用红外遥控系统由发射和接收两大部分组成,应用编/解码专用集成电路芯片来进行控制操作,如图1所示。
发射部分包括键盘矩阵、编码调制、LED红外发送器;接收部分包括光、电转换放大器、解调、解码电路。
下面,我们将使用下面两种设备:另外,使用51单片机进行解码。
2、原理图从原理图看出,IR的data脚与51的PD2(P3.2)相连。
2、红外发射原理要对红外遥控器所发的信号进行解码,必须先理解这些信号。
a) 波形首先来看看,当我们按下遥控器时,红外发射器是发送了一个什么样的信号波形,如下图:由上图所示,当一个键按下超过22ms,振荡器使芯片激活,将发射一组108ms的编码脉冲(由位置1所示)。
如果键按下超过108ms仍未松开,接下来发射的代码(连发代码由位置3所示)将仅由起始码(9ms)和结束码(2.5ms)组成。
下面把位置1的波形放大:由位置1的波形得知,这108ms发射代码由一个起始码(9ms),一个结果码(4.5ms),低8位地址码(用户编码)(9ms~18ms),高8位地址码(用户编码)(9ms~18ms),8位数据码(键值数据码)(9ms~18ms)和这8位数据的反码(键值数据码反码)(9ms~18ms)组成。
b) 编码格式遥控器发射的信号由一串0和1的二进制代码组成.不同的芯片对0和1的编码有所不同。
通常有曼彻斯特编码和脉冲宽度编码。
XS-091遥控板的0和1采用PWM方法编码,即脉冲宽度调制。
下图为一个发射波形对应的编码方法:放大0和1的波形如下图:这种编码具有以下特征:以脉宽为0.565ms、间隔0.56ms、周期为1.125ms的组合表示二进制的“0”;以脉宽为0.565ms、间隔1.685ms、周期为2.25ms的组合表示二进制的“1”。
3、红外接收原理a) 波形红外接收头将38K载波信号过虑,接收到的波形刚好与发射波形相反:放大,位定义0和位定义1波形如下:4、解码原理及算法注:代码宽度算法:16位地址码的最短宽度:1.12×16=18ms 16位地址码的最长宽度:2.24ms×16=36ms可以得知8位数据代码及其8位反代码的宽度和不变:(1.12ms+2.24ms)×8=27ms 所有32位代码的宽度为(18ms+27ms)~(36ms+27ms)对于红外线遥控对于很多电子爱好者来讲,都感觉到非常神奇,看不到,摸不着,但能实现无线遥控,其实控制的关键就是我们要用单片机芯片来识别红外线遥控器发出红外光信号,即我们通常所说的解码。
单片机得知发过来的是什么信号,然后再做出相应的判断与控制,如我们按电视机遥控器的频道按钮,则单片机会控制更换电视频道,如按的是遥控器音量键,则单片机会控制增减音量。
解码的关键是如何识别“0”和“1” !!从位的定义我们可以发现“0”、“1”均以 0.56ms的低电平开始,不同的是高电平的宽度不同!,“0”为0.56ms,“1”为1.68ms,所以必须根据高电平的宽度区别“0”和“1”。
如果从0.56ms低电平过后,开始延时,0.56ms以后,若读到的电平为低,说明该位为“0”,反之则为“1”,为了可靠起见,延时必须比0.56ms长些,但又不能超过1.12ms,否则如果该位为“0”,读到的已是下一位的高电平,因此取(1.12ms+0.56ms)/2=0.84ms最为可靠,一般取0.84ms左右均可。
根据码的格式,应该等待9ms的起始码和4.5ms的结果码完成后才能读码。
5、实例代码:注意一下几点:1. 从上面“红外接收头与单片机连接原理图”来看,红外接收头的型号脚是与51的int0相连,所以需要使用INT0(外部中断0).2. 由于解码过程中涉及到延时,为精确起见,我们选择使用定期时1来计时。
实例代码:[C++]view plaincopy1.#include2.#include3.// 函数原型4.void SystemInit(void);5.void Delay_840us(void);6.void Delay_2400us(void);7.void LedDisp();8.unsigned char GetCode(void);//获得码9.void delay(unsigned char loop);10.// 位变量11.sbit IRIN = P3^2;12.sbit BEEP = P1^6;13.sbit swch = P1^7;14.// 变量15.unsigned char KeyValue; //机器码16.unsigned char MaValue; //键值码;17.unsigned char disbuf[4]; //数码管显示缓冲18.unsigned char scan[4]={0x04,0x08,0x10,0x20}; //p2位选择19.unsigned char code table[16] = //共陰碼20.{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7C,0x39,0x5E,0x79,0x71};21./**22. * 延时23. */24.void delay(unsigned char loop)25.{26. unsigned char i;27.for(i=0;i>8);28. TR1=1;29.while(!TF1);30. TF1=0;31. TR1=0;32.}33./**34. * 延时9ms35. */36.void Delay_9000us(void)37.{38. TL1 = 153.6;39. TH1 = 223.6;40. TR1 = 1;41.while(!TF1);42. TF1 = 0;43. TR1 = 0;44.}45./**46. * 延时4.5ms47. */48.void Delay_4500us(void)49.{50. TH1 = 239.8;51. TL1 = 204.8;52. TR1 = 1;53.while(!TF1);54. TF1 = 0;55. TR1 = 0;56.}57./**58. * 系统初始化59. */60.void SystemInit(void)61.{62. IRIN = 1;63. IT0 = 1; //INT0负跳变触发64. TMOD = 0x10; //定时器1工作在方式165. EA = 1;66. EX0 = 1;67.}68./**69. * 读码70. */71.unsigned char GetCode()72.{73. unsigned char n;74.static temp = 0;75.for( n = 0; n < 8; n++ )76. {77.while(!IRIN); // 等待高电平,开始解码78. Delay_840us(); // 延时0.84ms79.if(IRIN) // 若仍然为高电平,则为1,否则为080. {81. temp = (0x80|(temp>>1)); // 182.while(IRIN); //等待跳变成低电平83. }84.else {85. temp=(0x00|(temp>>1)); // 086. }87. }88.return temp;89.}90./**91. * 数码管显示92. */93.void LedDisp()94.{95. unsigned char i;96.for(i=0;i<4;i++)97. {98. P0=table[disbuf[i]];99. P2 = scan[i];100. delay(50);101. P0=0x00;102. }103.}104.void main(void)105.{106. SystemInit();107.while(1)108. {109. //以下是查表显示110. disbuf[0]=(((KeyValue&0xf0)>>4)&0x0f); 111. disbuf[1]=KeyValue&0x0f;112. disbuf[2]=(((MaValue&0xf0)>>4)&0x0f); 113. disbuf[3]=MaValue&0x0f;114. LedDisp();115. }116.}117.void interr_ir(void) interrupt 0118.{119. /**120. * 用户码和机器码121. */122. unsigned char addrl,addrh,num1,num2; 123. EA = 0; //先关闭外部中断0124. Delay_9000us(); // 检测9ms开始码125.if (IRIN) { // 检测是否为干扰信号126. EA = 1; // 重新开启外部中断0 127.return ; // 退出解码128. }129.while(!IRIN); // 等待跳为高电平130. Delay_4500us(); // 检测4.5ms结果码131.if (IRIN) { // 检测是否为干扰信号132. EA = 1; // 重新开启外部中断0 133.return ; // 退出解码134. }135. // 读码136. addrl=GetCode(); // 用户编码高位137. addrh=GetCode(); // 用户编码低位138. num1=GetCode(); // 机器码139. num2=GetCode(); // 机器码反码140. //校验是否为错码141.if(num1!=~num2)142. {143. KeyValue=14;144. EA=1;145.return;146. }147. KeyValue=num2;148. MaValue=addrh;149. EA=1;150.}代码分析(只分析关键部位):1. 系统初始化SystemInit()系统初始化时,我们设置IRIN为高电平,同时把IT0设置成1,即下降沿(负跳变)触发中断。
这是用于接收波形的引导码是从低电平开始的(如上面接收波形所示)。
这样,当按下按键时,红外接收到信号,IRIN则发生从预先设置的高电平跳为低电平,从而产生中断。
2. 解码--中断程序 interr_ir(void)首先,第一步把EX0关中断,这步至关重要,因为一个接收波形许多的下降沿,这样会产生干扰中断。