最简单详细的红外解码程序

合集下载

红外遥控解码流程图

红外遥控解码流程图

pic12f1822接收红外信号解码流程图单片机初始化
高电平 1.125 2.25低电平表示还在引导码高电平
高电平表示还在引导码9mS高电平结束,4.5mS低电平
高电平上,
高电平表示信号没来继续等待,高电位是红外接收头的电平
解码的关键是如何识别“0”和“1”,从位的定义我们可以
发现“0”、“1”均以0.56ms的低电平开始,不同的是高电
据高电平的宽度区别“0”和“1”。

如果从0.56ms低电平过
后,开始延时,0.56ms以后,若读到 的电平为低,说明该位为“0”,反之则为“1”,为了可靠起见,延时必须比
0.56ms长些,但又不能超过1.12ms,否则如果该位为“0”,
读到的已 是下一位的高电平,因此取(1.12ms+0.56ms)/2=0.84ms最为可靠,一般取0.88ms左右均可。

头的电平
mS。

(完整word版)红外编码解码程序(word文档良心出品)

(完整word版)红外编码解码程序(word文档良心出品)

红外编码解码程序,我写的是:发送模块通过按键,发送出相应键值的编码,接收模块接收到信号后解码该键值,并点亮相应的状态灯(新手,高手勿喷)//************************* 单片机红外发射******************************* #include<reg52.h> sbit ir=P 1人3;sbit k1= P2A5;sbit k2=P2M;sbit k3=P2A3;sbit k4=P2A2;sbit k5=Pil;unsigned int count, set_count; bit irflag,keyflag; unsigned char irsys[]={0x00,0xff}; unsigned char irdata,ircode;void delay(unsigned int a){unsigned char i;while(--a!=0) for(i=300;i>0;i--);}void keyscan(){/*if(k1==0){delay(10);if(k1==0){keyflag=1;while(!k1);irdata=0x01;}*/ if(k2==0) {delay(10); if(k2==0) {keyflag=1;while(!k2); irdata=0x02;}{delay(10); if(k3==0) {keyflag=1;while(!k3); irdata=0x03;} if(k4==0){delay(10); if(k4==0) {keyflag=1;while(!k4); irdata=0x04;} if(k5==0){delay(10); if(k5==0) {keyflag=1;while(!k5); irdata=0x05;void ir_sendbyte() // 红外发送一个字节数据{ unsigned char i; for(i=0;i<8;i++) //发送8 位数据{set_count=43; //发送编码中的0.56ms 高电平irflag=1;count=0;TR0=1; while(count<set_count);TR0=0;if(ircode&0x01) set_count=130; // 判断红外编码最低位,若为 1 则 1.69ms 的低电平else set_count=43; // 为0 则0.565ms 的低电平irflag=0;count=0;TR0=1; while(count<set_count);TR0=0; ircode=ircode>>1;}}void ir_send(){set_count=346; //发送编码中的引导码(4.5ms高电平+4.5ms低电平)irflag=1;count=0;TR0=1;while(count<set_count);set_cou nt=346; //发送编码中的 4.5ms低电平irflag=0;count=0;TR0=1;while(count<set_count);TR0=0; ircode=irsys[0];ir_sendbyte();ircode=irsys[1];ir_sendbyte();ircode=irdata; //发送8 位数据码ir_sendbyte();ircode=~irdata; // 发送8 位数据反码ir_sendbyte();set_count=43; //发送编码中的0.56ms高电平irflag=1;count=0;TR0=1;while(count<set_count);TR0=0;irflag=0;/*delay(23); //延时23ms (编码中的23ms低电平)set_count=346; //发送编码中的引导码(4.5ms高电平+4.5ms低电平) irflag=1;count=0;TR0=1; while(count<set_count);TR0=0; set_count=346; irflag=0;count=0;TR0=1;while(count<set_count);TR0=0;*/ set_count=43;irflag=1;count=0;TR0=1;while(count<set_count);TR0=0;irflag=0;delay(23);}void timer0_init(){EA=1;TMOD=0x02;//定时0 8 位自动重装模式ET0=1;TH0=0xe6; //定时13us,38K 红外矩形波,晶振24M TL0=0xe6; }void main(){timer0_init();count=0;ir=0;irflag=0;while(1){keyscan(); if(keyflag) {delay(10); ir_send(); delay(500); keyflag=0;delay(100);}}}void timer0() interrupt 1 {count++;if(irflag==1)ir=~ir; // 有发射标志,则发射38khz 的矩形波elseir=0;红外接收**************************** //*************************#include<reg52.h>#define uchar unsigned char #define uint unsigned intsbit led仁P2A1;sbit led2=卩2人2;sbit led3=卩2人3;uchar irtime;uchar startflag;uchar irdata[33];uchar bitnum;uchar irreceok;uchar ircode[4]; uchar irprosok;void display();void timer0init(){TMOD=0x02;TH0=0x00;TL0=0x00;ET0=1;EA=1;TR0=1;void int0init(){IT0=1;EX0=1; EA=1;}}void irpros(){uchar k,i,j;uchar value;k=1;for(j=0;j<4;j++){for(i=0;i<8;i++){ value=value>>1; if(irdata[k]>6){value=value | 0x80;}k++;if(k>33)k=1;}ircode[j]=value;}irprosok=1;}void main(){ timer0init(); int0init(); while(1) { if(irreceok) { irpros(); irreceok=0;} display();}void display()switch(ircode[2]){case 0x05:led1=1; led2=1; led3=1; break;case 0x02:led1=0;led2=1; led3=1; break;case 0x03:led2=0; led1=1; led3=1; break;case 0x04:led3=0;led1=1;led2=1; break;//case 0x01: 备用}void timer0 () interrupt 1 { irtime++;}void int0 () interrupt 0 {if(startflag){if(irtime>32) // 检测引导码{bitnum=0;}irdata[bitnum]=irtime;irtime=0;bitnum++;if(bitnum==33){bitnum=0;irreceok=1;startflag=0;}else{startflag=1; irtime=0;}}。

红外脉冲解码程序

红外脉冲解码程序

单片机红外脉冲解码电路采用共阴极四位数码管;8050开关三极管;STC89C52单片机;12M晶振。

C51程序/*红外脉冲破解程序。

脉冲波长用四位数码管以十六进制显示。

脉冲个数用四位数码管以十进制显示。

*/#include<reg52.h>sbit show=P2^4;sbit back=P2^5;sbitNshow=P2^6;unsignedint box[46];unsigned char code Num[]={0xEB,0x41,0xB3,0xBA,0x78,0xDA,0xDB,0xA8,0xFB,0xFA,0xF9,0x5B,0xC3,0x3B,0xD3,0xD1,0x04}; //数码管1-F 显示的花样程序(根据数码管的接线方法的不同,花样码也会不同)unsigned char Nu[4];unsigned char k=0; //脉冲计数判断unsigned char e=0; //脉冲总数存储unsigned char y=0; //数码管显示第几个脉冲unsignedintA,w;voidshow_led(void);voidwait_short(void);void four_led(unsigned char led) //四个数码管用十六进制显示脉冲长度。

{Nu[1]=box[led]%16;Nu[2]=(box[led]/16)%16;Nu[3]=(box[led]/256)%16;Nu[4]=box[led]/4096;}void main(){P2=0XF0;EA=1;EX0=1;IT0=1;ET0=1;TMOD=0x01;TR0=0;TH0=0;TL0=0;y=0;k=0;e=0;while(1)if(Nshow==0) //检查显示的脉冲数数码管用十进制显示{Nu[1]=y%10;Nu[2]=(y/10)%10;Nu[3]=(y/100)%10;Nu[4]=(y/1000)%10;A=3000;while(A--)show_led();four_led(y);}//================================================================================ if(back==0) //回看脉冲长度{A=10000;while(A--);if(y>=1){y=y-1;four_led(y);}else{y=0 ;four_led(y);}four_led(y); //巩固A=400;while(A--)show_led();four_led(y);}//========================================================================== if(show==0) //下一个脉冲长度{P2=0XF0;P1=0X00;A=10000;while(A--);if(y<e){y=y+1;four_led(y);}else{Nu[1]=16;Nu[2]=16;Nu[4]=16;A=400;while(A--)show_led();y=0;four_led(y);}four_led(y); //巩固A=400;while(A--)show_led();four_led(y);}//=============================================================================== show_led();}while(1);}void Int0_Routine() interrupt 0 using 0 //下降沿中断{TR0=0;box[k]=TH0*256+TL0;TH0=0;TL0=0;TR0=1;if(k==0)e=0;e=e+1;k=k+1;}void time_int() interrupt 1 using 0 //计数器中断{TR0=0;box[k]=TH0*256+TL0;TH0=0;TL0=0;k=0; //计数器溢出K归零准备下一个脉冲信号的接受y=0; // 计数器溢出脉冲结束数码管开始显示第0个脉冲four_led(y);}void show_led(void) //数码管显示数值{if(Nu[4]!=0){P1=Num[Nu[1]];wait_short();P2=0xF2;P1=Num[Nu[2]];wait_short();P2=0xF4;P1=Num[Nu[3]];wait_short();P2=0xF8;P1=Num[Nu[4]];wait_short();}else{if(Nu[3]!=0){P2=0xF1;P1=Num[Nu[1]];wait_short();P2=0xF2;P1=Num[Nu[2]];wait_short();P2=0xF4;P1=Num[Nu[3]];wait_short();}else{if(Nu[2]!=0){P2=0xF1;P1=Num[Nu[1]];wait_short();P2=0xF2;P1=Num[Nu[2]];wait_short();}else{P2=0xF1;P1=Num[Nu[1]];wait_short();}}}void wait_short(void) //消岐延时{w=40;while(w--);}解码结果。

一文教会你红外线遥控器软件解码程序

一文教会你红外线遥控器软件解码程序

一文教会你红外线遥控器软件解码程序
红外线一开始发送一段13.5ms的引导码,引导码由9ms的高电平和4.5ms的低电平组成,跟着引导码是系统码,系统反码,按键码,按键反码,如果按着键不放,则遥控器则发送一段重复码,重复码由9ms的高电平,2.25ms的低电平,跟着是一个短脉冲。

#includeat89x52.h
#defineNULL0x00//数据无效
#defineRESET0X01//程序复位
#defineREQUEST0X02//请求信号
#defineACK0x03//应答信号,在接收数据后发送ACK信号表示数据接收正确,
也位请求信号的应答信号
#defineNACK0x04//应答信号,表示接收数据错误
#defineBUSY0x05//忙信号,表示正在忙
#defineFREE0x06//空闲信号,表示处于空闲状态
#defineREAD_IR0x0b//读取红外
#defineSTORE_IR0x0c//保存数据
#defineREAD_KEY0x0d//读取键值
#defineRECEIVE0Xf400//接收缓冲开始地址
#defineSEND0xfa00//发送缓冲开始地址
#defineIR0x50//红外接收缓冲开始地址
#defineHEAD0xaa//数据帧头
#defineTAIL0x55//数据帧尾
#defineSDAP1_7
#defineSCLP1_6
unsigned char xdata *buf1;//接受数据缓冲。

红外解码程序详解

红外解码程序详解

红外遥控解码程序设计——————基于uPD6121红外编码制式红外传感系统是目前应用最为广泛的遥控系统,一个红外遥控系统可分为发射和接收两部分组成,发射端称之为红外遥控器,一般由矩阵键盘,红外编码调制芯片和红外发射管组成;接收端用一体化红外接收头即可,这个东东内置光电放大器和解调部分,信号接收之后一般很微弱须放大后才可解码,为有效发射出去得先托付在载波上所以需经历调制、解调的过程,其实对于发射部分主要工作在于编码,而对于编码方式只有几种主流方式,而目前国内大部分均为uPD6121编码方式(日本NEC公司搞出来的。

),所以我们只须弄清楚这种编码的时序,即可写出万能的红外解码程序,只要是基于这种编码方式的遥控器(家里的电视、空调、电扇遥控器)都可以用该程序来解码(这点也充分证明了C语言的高移植性啊。

)这种编码的格式其实很简单,开头是一个引导码,人家芯片在编码时将其设计成9ms的高电平和4.5ms的低电平,也就是说你必须跳过这段引导码之后才会接收到数据,第一个问题来了:为什么要加这段引导码?因为红外传感是非常容易受到干扰的,如果直接传送数据很可能并非发送端的信号,很可能来自其他辐射,后面设计程序时会遇到这个问题。

所以我们在写程序时在引导码时可以加入检测代码,如果是引导码则继续接收,否则跳出。

第二个问题就是:接收数据时我们用外部中断接收,这是考虑到CPU 的执行效率,如果你在主函数里接收数据,就好比CPU一直在问:你接收到数据没?你接收到没?..很明显不靠谱,和串口通信一样,接收数据用中断这是经验,有利于单片机的执行效率。

第三个要注意的就是红外接收端和编码发送的数据是反向的!这点很重要,我看很多资料没有写明这点,让很多童鞋疑惑不解,也就是说引导码编码时确实是9ms高电平和4.5ms 的低电平,但是到了接收端是9ms的低电平和4.5ms的高电平,所以我们在解码时就得注意引导码高电平出现的顺序。

对于编码格式,引导码后接了4个字节的数据,前两个字节为用户码和用户反码,简单点说就是器件地址;后两字节为操作码和操作反码,就是我们真正需要的数据。

万能遥控器红外解码C程序

万能遥控器红外解码C程序

for(i=2;i>0;i--)
for(j=230;j>0;j--) ;
}
/***************************延时4.5ms子程序**********************/
void Delay4_5ms(void)
{uchar i,j;
for(i=10;i>0;i--)
for(j=225;j>0;j--) ;
if(IRsignal==1) //如果IRsignal是"1",则向右移入一位"1"
{Delay1ms();
CodeTemp=CodeTemp|0x80;
if(j<8) CodeTemp=CodeTemp>>1;
}
else
if(j<8)CodeTemp=CodeTemp>>1;//如果IRsignal是"0",则向右移一位,自动补"0"
{while(IRsignal==0);
Delay4_5ms();
//跳过持续4.5ms的高电平
for(i=0;i<4;i++)
//分别读取4个字节
{for(j=1;j<=8;j++)
//每个字节8个bit的判断
{ while(IRsignal==0);
//等待上升沿
Delay0_9ms();
//从上升沿那一时刻开始延时0.9ms,再判断IRsignal
/* 前16位为8位用户码及其反码,后16位为8位的操作码及其反码
*/
/* 以脉宽为0.565ms、间隔0.56ms、周期为1.125ms的组合表示"0"; */

红外解码方案

红外解码方案

红外解码方案1. 红外发射的原理遥控器部分的工作原理较为简单,主要就是编码IC 通过三极管进行放大调变,然后将此电信号(脉冲波)经有红外发射管(940nm 波长)转变为光信号发射出去。

现在国产遥控器的电路主要有:455kHz 晶振,编码IC ,放大三极管,发射管等主要几个电子原件组成;通常使用38kHz 载波,这样可以提高红外线的抗干扰能力,避免大气中的红外线干扰。

调制载波频率一般在30kHz 到60kHz 之间,大多数使用的是38kHz ,占空比1/3的方波,这是由发射端所使用的455kHz 晶振所决定的。

在发射端要对晶振进行整数分频,分频系数一般取12,所以455kH z÷12≈37.9kH z≈38kHz 。

2.红外接收的原理红外接收头内部结构主要由光电二极管+红外接收IC 组成,工作原理为:光电二极管(俗称接收管)其接收到红外发射管发射出的光信号后转换为电信号(为微安级的电流),此电信号输入到接收IC 内部经过放大--增益--滤波--解调变--整形还原,还原遥控器给出的原始编码,通过接收头信号输出脚输入到后面的代码3. 几种编码格式3.1 NEC 制NEC 制的数据格式分为引导码、16位用户码(地址码)、8位数据码、8位数据反码构成。

用户码或数据码中的每一个位可以是位‘1’,也可以是位‘0’。

区分‘0’和‘1’是利用脉冲的时间间隔来区分,这种编码方式称为脉冲位置调制方式(PPM)(注意NEC每一位的长度不一样,1.125ms或者2.25ms)。

按键保持按下状态时每发送完整的一帧数据后,再发送重复码,再到按键被松开。

此芯片用两种不同的重复码,当用户码的C0位为1时用一种,C0位为0时使用另一种。

3.2RC5制RC5编码相对NEC编码简单一些。

RC5编码有2位起始位(为‘1’)、1位控制、5位系统码(地址码)、6位指令码,一共14位数据。

在这个协议里所有位是平等的长度都等于1.778ms,位时间的一半填满脉冲是36KHz的载波,另外一半被闲置。

红外遥控解码程序

红外遥控解码程序

红外遥控解码程序红外接收头的型号有很多HS0038 VS838等功能⼤致相同,只是引脚封装不同。

红外接收有⼏种统⼀的编码⽅式,采样哪种编码⽅式取决于遥控器使⽤的芯⽚,接收头收到的都是⼀样的。

电视遥控器使⽤的是专⽤集成发射芯⽚来实现遥控码的发射,如东芝TC9012,飞利浦AA3010T等,通常彩电遥控信号的发射,就是将某个按键所对应的控制指令和系统码(由0和1组成的序列),调制在38KHz的载波上,然后经放⼤、驱动红外发射管将信号发射出去。

不同公司的遥控芯⽚,采样的遥控码格式也不⼀样,较普遍的有两种,⼀种NEC标准,⼀种是PHILIPS标准。

NEC标准:遥控载波的频率为38KHz(占空⽐1:3)当某个键按下时,系统⾸先发射⼀个完整的全码,如果按键超过108ms仍未松开,接下来发射的代码(连发代码)将由起始码(9ms)和结束码(2.5ms)组成。

⼀个完整的全码 = 引导码 +⽤户码 +⽤户码 + 数据码 + 数据码 + 数据反码。

其中,引导码⾼电平9ms,低电平4.5ms;系统码8位,数据码8位,共32位;其中前16位为⽤户识别码,能区别不同的红外遥控设备,以防⽌不同的机种遥控码互相⼲扰。

后16位为8位的操作码和8位的操作反码,⽤于核对数据是否接收准确。

收端根据数据码做出应该执⾏上⾯动作的判断。

连发代码是在持续按键时发送的码。

它告知接收端。

某键是在被连续的按着。

NEC标准下的发射码表⽰发射数据0时⽤”0.56ms⾼电平 + 0.565ms低电平 = 1.125ms”表⽰;数据1⽤”⾼电平0.56ms + 1.69ms = 2.25ms”表⽰。

遥控器发射信号:需要注意的是:当⼀体化接收头收到38kHz红外信号时,输出端输出低电平,否则为⾼电平。

所以⼀体化接收头输出的波形和发射波形是反向的PHILIPS标准:载波频率38KHz:没有筒,点按键时,控制码1和0之间切换,若持续按键,则控制码不变。

⼀个全码 = 起始码’11’ +控制码 + ⽤户码 + ⽤户码数据0⽤“低电平1.778ms + ⾼电平1.778ms”表⽰;数据1⽤“⾼电平1.778ms + 低电平1.778ms”表⽰。

红外解码程序

红外解码程序

红外解码程序本篇介绍红外解码的原理和程序的写法。

下面来看一下,红外线是如何编码的。

下面来具体说一下,解码的原理,每按一下遥控器的一个按键,遥控器就会发出32个“0”“1”代码(当然是通过高低电平的占空比来判断是0还是1的),具体是0,1是如何编码的上面图片中有介绍,和一个引导码,引导码的作用是告诉处理器,接下来将要开始发送代码,我们在编写程序时,当检测到引导码时,就应该准备接受数据了。

32位代码中的前16位是用户识别码,不同的遥控器不相同,防止互相干扰的,后16是8为数据码,和8位数据反码。

接下来开始介绍如何解码程序的编写。

程序中用到了两个中断,一个是定时器中断,一个是外部中断。

定时器中断用来准确计时,判断接受的代码是0还是1,外部中断用来准确确定定电平到来的时刻,然后开始计时。

/*********************************************************函数功能:红外解码,用八位数码管显示红外线的按键码,便于红外控制测试环境:hot 51学习板编译环境:keil4整理人:张家越QQ:435835181整理时间:2011-04-03************************************************************/#include<reg51.h>#define uchar unsigned char#define uint unsigned intuchar code seg_du[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0 x6f,0x77,0x7c,0x39,0x5E,0x79,0x71 };//0-f的段选码unsigned char code seg_we[]={0,1,2,3,4,5,6,7};uchar irtime,startflag,bitnum,irreceok;uchar irdata[33];uchar irprosok;uchar display[8];uchar ircode[8] ;sbit led1=P0^1;sbit led2=P0^2;/******************************************************************** ****函数功能:延时函数,在数码管显示时使用,不需要很精确********************************************************************* ****/void delay_50us(uint t){uchar j;for(;t>0;t--)for(j=19;j>0;j--);}/******************************************************************** ******函数的功能:定时器0的初始化********************************************************************* *****/void timer0init(){TMOD=0x02; //设置定时器工作在方式2TH0=0x00; //TL0=0x00; //设置定时器的初值ET0=1; //开定时器中断TR0=1; // 打开定时器EA=1; //开总中断}/******************************************************************** ****外部中断1的初始化********************************************************************* **/void int1init(){IT1=1; //设置触发方式为上升沿EX1=1; //开外部中断1EA=1; //开总中断}/******************************************************************** **定时器0的功能函数,每中断一次irtime++,用于计时********************************************************************* **/void timer0() interrupt 1{irtime++; //定时器中断一次irtime++,用于计时}/******************************************************************** ***外部中断0的处理函数,每当有低电平数据过来时,中断一次,(使用次中断的前提是,信号线必需接在外部中断0上面,也就是P3^2口),函数功能是,把信号从高低电平变成时间的代码放入irdata【】中********************************************************************* ***/void int1() interrupt 2{if(startflag){if(irtime>32) //一组代码检测完毕{bitnum=0;}irdata[bitnum]=irtime; //把检测到的时间送到数组irdata【】中去irtime=0;bitnum++;if(bitnum==33) //如果检测到bitnum=33,说明32位用户码已经检测完毕{bitnum=0; //将bitnum清零以便重新计数irreceok=1; //接收完毕标志位置一}}else //(此函数先进入else语句,跳过引导码的检测){startflag=1; //将开始标志位置一irtime=0; //设置时间初值为零irreceok=1; //接收完毕标志位置一}}/******************************************************************** *****函数功能:把irdata【】中的时间代码转换成二进制代码存放在ircode【】中********************************************************************* *****/void irpros(){uchar k=1,value,j,i;for(j=0;j<4;j++){for(i=0;i<8;i++){value=value>>1; //右移7次(第一次是00,相当于没有移位)if(irdata[k]>6) //循环8次{value=value|0x80;}k++;}ircode[j]=value;}irprosok=1;}/******************************************************************** ********函数的功能是:将ircode【】中的二进制代码转换成为16进制代码便于在数码管上显示******************************************************************* ********/void irwork(){display[0]=ircode[0]/16;display[1]=ircode[0]%16;display[2]=ircode[1]/16;display[3]=ircode[1]%16;display[4]=ircode[2]/16;display[5]=ircode[2]%16;display[6]=ircode[3]/16;display[7]=ircode[3]%16;}/******************************************************************** ****函数功能:用数码管显示解码结果********************************************************************* ***/void display1(){uchar i;for(i=0;i<8;i++){P2=seg_we[i];P0=seg_du[display[i]];delay_50us(40);}}void main(){timer0init(); //定时器初始化int1init(); //外部中断初始化while(1){if(irreceok) //判断数据接收完毕(数组中存储的是高低电平的时间){irpros(); //执行处理函数,将高低电平时间转化成16进制的0,1代码,存放在数组中irreceok=0; //标志清零}if(irprosok) //处理函数执行完毕,{irwork(); //将存储的16进制代码分离,便于数码管显示irprosok=0; //标志清零}display1();}}//在最后我再分析一下程序的编写思路,便于大家理解,一旦有按键按下,接受管接收到引导码,进入外部中断,并将高低电平的时间放入irdata【】数组中,接受完毕标志位置一,判断接受标志位,为1,进行处理函数,将高低电平转换成16进制数,处理标志位置一,判断处理标志位,为1,执行分离函数,将16进制数分离,便于数码管显示,分离完毕后显示。

所有红外遥控器的解码方法

所有红外遥控器的解码方法

所有红外遥控器的解码方法已经完成了DS1302,18B20,RS232通讯,24C02存储,红外遥控等.现只将红外遥控的解码方法贴出,希望能与大家交流,起到抛砖引玉的作用.我的开发环境是IAR FOR AVR 5.11, CPU为M8,晶振 11.0592.红外遥控解码原理是通过AVR的输入捕获功能,捕获信号后进行宽度判断,并通过串口在电脑中显示出来.下面是捕获的程序,数据未经处理,只是捕获后进行编码的解码.通过这个捕获程序,原则上能解所有线外遥控编码,我已经解了格力和中星九B的遥控编码,代码未优化,只是测试.#include <iom8.h>#include "MyDelay.h" //在此未提供我的延时程序,如果有需要的我再贴出#include "MyUSART.h"//在此未提供我的串口配置程序,如果有需要的我再贴出#ifndef uchar#define uchar unsigned char#endif#ifndef uint#define uint unsigned int#endifvoid ini(void){//配置输入捕获TCCR1A = 0x00;//普通端口模式,OC1A/B未连接TCCR1B = 0x81;//位7与位6是输入捕获允许和触发方式,BIT2-0,分频选择TCNT1H = 0x00;//计数器起始值高8位TCNT1L = 0x00;//计数器起始值低8位ICR1 = 0x0000;//输入捕获发生时,将该值写入TCNTTIMSK |= 0x20;//输入捕捉中断使能 BIT5 =1TIFR &= 0xdf;//输入捕捉标志,外部引脚 ICP1 出现捕捉事件时 ICF1置位}#pragma vector = TIMER1_CAPT_vect //定时器0溢出中断入口__interrupt void TimeINT0(void){uint r;uchar h,l;r = ICR1;//接收时序if(TCCR1B &= 0x40) //更改触发方式TCCR1B = 0x81; //下降沿触发elseTCCR1B = 0xc1;//上升沿触发TCNT1H = 0x00;//计数器起始值高8位TCNT1L = 0x00;//计数器起始值低8位TIFR |= 0x20;//输入捕捉标志,外部引脚 ICP1 出现捕捉事件时 ICF1置位h = (uchar)(r>>8);l = (uchar)r;USART_Send(h); //串口显示高八位USART_Send(l);//串口显示低八位}void main(void){ini();}以下是由串口调试助手显示的数据.说明:1.时间未用,我的程序也通过串口显示了,2.前两个字节无意义,是因为捕获到低电平后,16位计数器一直在计数,所以,前面的计数值无用.3.编码原理不管是曼彻斯特_码/日立的通用红外编码/PT2272码等,差不多都由(异步) 码头+引导+编码+停止位组成,大同小异,所以根据这个原理,解出了上述数据的码头,引导和键编码.再根据解出的码画出频率图.4.计算时要将显示的数据转换成10进制再计算.5.未知部分估计是停止位,不过只要能检测到码头,引导和编码就可以了.6.解码后,可以将该数据进行处理, 这时,这个遥控器就可以赋与功能,和开发板互动了.呵呵,7.为什么选中九B,因为中9B的遥控器不用花钱,中9老是升级,好多客户都不用了,所以又省了10元钱,一块敷铜板的钱,哈哈哈.8.题外话,中9想升级的可以和我交流,我已经升了很多了.9.好,希望该方法可以帮助需要的朋友.。

51单片机红外遥控解码,很详细(汇编语言,C语言等)

51单片机红外遥控解码,很详细(汇编语言,C语言等)
//k[i]=TH0;
//i++;
if(TH0<3)
b=1;
else b=0;
TH0=0;
TL0=0;
}
uchar hw_key()
{
uchar j,m;
//i=0;
hw_start(); //等待低电平到来
hw_pulse();
for(j=0;j<24;j++) //测试用户码脉冲宽度
{
hw_pulse();
}
for(j=0;j<8;j++) //测试键码脉冲宽度
{
hw_pulse();
if(b==1)
m=(m<<1)|1;
else
m<<=1;
}
return m; //键码
}
while(in==0); //高电平到了,
TR0=0; //关闭定+;
TH0=0;
TL0=0;
TR0=1; //高电平到了,启动定时器1,测试高电平宽度
while(in==1); //低电平到了,
TR0=0; //关闭定时器1,高电平宽度测试完
请注意甄别内容中的联系方式诱导购买等信息谨防诈骗
51单片机红外遥控解码,很详细(汇编语言,C语言等)
单片机源程序如下:
#include
#define hw_hs0038_ENTITY
#include "hw_hs0038.h"
sbit in=P3^2;
//uchar i=0;
//uchar k[2];
bit bdata b=0;
/*
void timer0(void) interrupt 1 using 1

51单片机红外接收解码程序(详细解析)

51单片机红外接收解码程序(详细解析)

51单片机红外接收解码程序接收以S52单片机作为接收系统。

以S52的P3.3口作为接收端口,该端口是外部中断1。

这个接受程序是以XC866作为红外发送控制系统,接收程序如下:#include<reg52.h>//头文件#include<intrins.h>#define uchar unsigned char//宏定义#define uint unsigned intsbit HWRx=P3^3;//位声明code uchar Table[]=//共阴数码管0-9 a-f - 表{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40};uchar Table_Data[8]={0,0,0,0,0,0,0,0};//用于显示的数组uchar Table_Rx[67];//用于存储判断接收是1或0的参数void Delay();//延时子函数void Display(uchar *lp,uchar lc)//显示{uchar i;//定义变量P2=0;//端口2为输出,关闭P1=P1&0xF8;//将P1口的前3位输出0,对应138译门输入脚,全0为第一位数码管for(i=0;i<lc;i++)//循环显示,采用动态扫描{P2=Table[lp[i]]; //查表法得到要显示数字的数码段if(lp[i]>0x7f)P2+=0x80;Delay();//延时P2=0;//清0端口,准备显示下位if(i==7)//检测显示完8位否,完成直接退出,不让P1口再加1,否则进位影响到第四位数据break;P1++;//点亮下一位数码管}}void main()//主函数{EA=1;//首先开启总中断EX1=1;//开启外部中断1IT1=1;//设置成下降沿触发方式while(1)//一直显示,其它由中断处理{Display(Table_Data,8);}}void Delay()//延时时间大约为31us,晶振12M{uchar i=13;while(i)i--;}void Delay_ms(uint z) //延时时间约为1ms*X晶振为12M{uint x=0,y=0;for(x=z;x>0;x--)for(y=54;y>0;y--);}void hongwai()interrupt 2//外部中断1 ,INT1(P3^3)连接红外线接收IC数据脚{uchar i,j,tmp;EX1=0;//关闭中断j=33;//传送一组数包括引导码1位,4个八位数据,总共33位i=0;//从第一维数组开始Delay_ms(10);if(HWRx){//然后再检测红线接收脚是有数据招收,有继续,没有则退出EX1=1;return;}while(j--){//循环接收33位数据,为何我们用到66位数组,我们可以不接收高电平时间常数,只接低电平常数就//可以判断1或0了,在这里我们都接收,还有一点要知道,接收波形是反向,在没有接收时端口为高电平tmp=0;Table_Rx[i]=1;//时间量从1开始while(!HWRx) //检测高低电平的变化,这里检测的是高电平{Table_Rx[i]++;//没变继续加1Delay();//家一个延时防止,计数值一下子就加满了tmp++;//加1if(tmp==250)break;}i++;tmp=0;Table_Rx[i]=1;//时间量从1开始while(HWRx)//检测高低电平的变化,这里检测的是低电平{Table_Rx[i]++; //没变继续加1Delay();//同上tmp++;//加1,用于判断是1还是0的,低电平来了if(tmp==250)break;}i++;}P1=0xf8;i=200;//加入循环延时,抗干扰while(i)//在有接收数据的时候显示一个H{tmp=255;while(tmp){tmp--;P2=0x76;}i--;}tmp=0;for(i=3;i<19;i++,i++)//处理发送的数据{tmp>>=1;//右移一位,接收低位在前if(Table_Rx[i]>30)//检测低电平时间超过30就确认为1 tmp+=0x80;}Table_Data[0]=tmp/16;//分开2位以16进制显示,用显示发送的数据Table_Data[1]=tmp%16;tmp=0;for(i=19;i<35;i++,i++)//同上{tmp>>=1;if(Table_Rx[i]>30)tmp+=0x80;}Table_Data[2]=tmp/16;Table_Data[3]=tmp%16;tmp=0;for(i=35;i<51;i++,i++){tmp>>=1;if(Table_Rx[i]>30)tmp+=0x80;}Table_Data[4]=tmp/16;Table_Data[5]=tmp%16;tmp=0;for(i=51;i<67;i++,i++){tmp>>=1;if(Table_Rx[i]>30)tmp+=0x80;}Table_Data[6]=tmp/16;Table_Data[7]=tmp%16;EX1=1;//刚进中断时关闭了分控,现在要打开}。

红外遥控器解码程序

红外遥控器解码程序

//===================================================================== //// 红外遥控器解码程序演示//// 本程序主要将现在比较常用TX1300遥控器进行解码,将解码后的数据通过P2端////口的数码管显示出来,为了更好的看到运行过程,特加了三个指示灯用来指示当////前运行状态.P10主要用来闪亮,表示程序正在运行,P11则用来表示接收到数据, ////P12表示触发内部的定时器操作.P13的闪亮表示正确接收完一个数据. //// 程序运行效果: 打开本机电源开关,可以看到P10不停的闪动,按下遥控器的数////字键,数码管则显示相应的数字键(1-9).可以看到P11,P12在显示后呈亮状态.则////可以接收下一个数据,在上面过程中可以看到P13闪亮了一下.表明上次正确接收////到数据. ////---------------------------------------------------------------------//// 开发日期: 2009/01/30 研发单位:上海腾芯实业有限公司//#include <reg52.h> //包含51单片机相关的头文件#define uint unsigned int //重定义无符号整数类型#define uchar unsigned char //重定义无符号字符类型uchar code LedShowData[]={0x03,0x9F,0x25,0x0D,0x99, //定义数码管显示数据0x49,0x41,0x1F,0x01,0x19};//0,1,2,3,4,5,6,7,8,9uchar code RecvData[]={0x07,0x0A,0x1B,0x1F,0x0C,0x0D,0x0E,0x00,0x0F,0x19};uchar IRCOM[7];static unsigned int LedFlash; //定义闪动频率计数变量unsigned char RunFlag=0; //定义运行标志位bit EnableLight=0; //定义指示灯使能位/***********完成基本数据变量定义**************/sbit S1State=P1^0; //定义S1状态标志位sbit S2State=P1^1; //定义S2状态标志位sbit B1State=P1^2; //定义B1状态标志位sbit IRState=P1^3; //定义IR状态标志位sbit RunStopState=P1^4; //定义运行停止标志位sbit FontIRState=P1^5; //定义FontIR状态标志位sbit LeftIRState=P1^6; //定义LeftIR状态标志位sbit RightIRState=P1^7; //定义RightIRState状态标志位/*************完成状态指示灯定义*************/sbit S1=P3^2; //定义S1按键端口sbit S2=P3^4; //定义S2按键端口/*************完成按键端口的定义*************/sbit LeftLed=P2^0; //定义前方左侧指示灯端口sbit RightLed=P0^7; //定义前方右侧指示灯端口/*************完成前方指示灯端口定义*********/sbit LeftIR=P3^5; //定义前方左侧红外探头sbit RightIR=P3^6; //定义前主右侧红外探头sbit FontIR=P3^7; //定义正前方红外探头/*************完成红外探头端口定义***********/sbit M1A=P0^0; //定义电机1正向端口sbit M1B=P0^1; //定义电机1反向端口sbit M2A=P0^2; //定义电机2正向端口sbit M2B=P0^3; //定义电机2反向端口/*************完成电机端口定义***************/sbit B1=P0^4; //定义话筒传感器端口sbit RL1=P0^5; //定义光敏电阻端口sbit SB1=P0^6; //定义蜂鸣端口/*********完成话筒,光敏电阻,蜂鸣器.端口定义**/sbit IRIN=P3^3; //定义红外接收端口/*********完成红外接收端口的定义*************/#define ShowPort P2 //定义数码管显示端口extern void ControlCar(uchar CarType); //声明小车控制子程序void delayms(unsigned char x) //0.14mS延时程序{unsigned char i; //定义临时变量while(x--) //延时时间循环{for (i = 0; i<13; i++) {} //14mS延时}}void Delay() //定义延时子程序{ uint DelayTime=30000; //定义延时时间变量while(DelayTime--); //开始进行延时循环return; //子程序返回}void IR_IN() interrupt 2 using 0 //定义INT2外部中断函数{unsigned char j,k,N=0; //定义临时接收变量EX1 = 0; //关闭外部中断,防止再有信号到达delayms(15); //延时时间,进行红外消抖if (IRIN==1) //判断红外信号是否消失{EX1 =1; //外部中断开return; //返回}while (!IRIN) //等IR变为高电平,跳过9ms 的前导低电平信号。

单片机红外接受解码程序成功版

单片机红外接受解码程序成功版

单片机红外接受解码程序成功版1、效果图2、发射码格式3、38KH载波发射(完整的发射图)4、 0 与 1的区别5、载波6、小结7、代码发射码格式38KH载波发射(完整的发射)0与1的区别载波小结1、发射端发射出来的是高电平。

但是接收到的是低电平。

(接收到的数据与发射的相反)2、我这里用的外部下降沿触发的中断3、使用12M的晶振完4、整源码下载地址:代码#include <reg51.h>sbit IR=P3^2; //红外接口标志sbit dm = P2^2; //段码sbit wm = P2^3; //位码unsigned char hc[8]; //数码管显示缓存unsigned char DM[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0 x7c,0x39,0x5e,0x79,0x71};// 显示段码值0~Funsigned char WM[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //位码。

显示的位置unsigned char sj[33]; //接收脉冲时间数组char w=0; //数码管显示缓存指针(0~7)unsigned char i; //脉冲个数记录unsigned char mcsj; //脉冲时间(大于0.56ms小于1.125ms为0,大于1.125ms小于2.25ms)bit MC=0; //接收红外脉冲开始标志(0:脉冲已经结束,1:脉冲刚开始)bit JS=0; //脉冲接收结束标志位(1标志接收结束)bit JM=0; //解码完成标志位(1:解码完成)void Delay(unsigned char f);void dsq_0() interrupt 1 using 1 //定时器T0中断服务函数{mcsj++; //256}void wbzd_0() interrupt 0 //外部中断服务函数{if(MC){if(mcsj>32) //判断是不是引导码。

红外线遥控解码接收程序-C语言

红外线遥控解码接收程序-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上运用红外线解码程序.主要的问题在于延迟上。

最简51单片机红外遥控解码程序(转载

最简51单片机红外遥控解码程序(转载

最简51单片机红外遥控解码程序(转载)2009-09-07 23:03/* 51单片机红外遥控解码程序 *//* 适用uPD6121系列 *//* 周正华 2008.4.11编 *//* /52_diy */#include <reg52.h>#define DIGPORT P2#define WORDPORT P0unsigned char code LED_num[]={0x3f,0x18,0x76,0x7c,0x59,0x6d,0x6f,0x38,0x7f,0x7d};#define Imax 14000 //此处为晶振为11.0592时的取值,#define Imin 8000 //如用其它频率的晶振时,#define Inum 1450 //要改变相应的取值。

unsigned char Im[]={0x00,0x00,0x00,0x00};unsigned long m,Tc;unsigned char i,IrOK;void DelayMy(unsigned int t){while(--t);}void Display_LED(unsigned long num){unsigned int ii;unsigned int jj=0;unsigned long aa,bb;unsigned int xx[8]={0,0,0,0,0,0,0,0};do{bb=num/10;aa=num-bb*10;xx[jj]=aa;num=bb;jj++;}while(num>0);DIGPORT=0x80;for(ii=0;ii<8;ii++){WORDPORT=LED_num[xx[ii]];DelayMy(60);DIGPORT=DIGPORT>>1;};WORDPORT=0;}//外部中断解码程序void intersvr1(void) interrupt 2 using 1{Tc=TH0*256+TL0; //提取中断时间间隔时长TH0=0; TL0=0; //定时中断重新置零if((Tc>Imin)&&(Tc<Imax)) m=0; //找到启始码if(Tc>Inum) Im[m/8]=Im[m/8]>>1|0x80; else Im[m/8]=Im[m/8]>>1; //取码if(m==32) if((Im[2]|0x01)==~Im[3]) IrOK=1; else IrOK=0; //取码完成后判断读码是否正确m++; //准备读下一码}/*演示主程序*/void main(void){m=0;EA=1;IT1=1;EX1=1;TMOD=0x11;TH0=0;TL0=0;TR0=1;ET0=1;for(;;){DelayMy(100);if(IrOK==1) for(i=0;i<400;i++) Display_LED(Im[2]);IrOK=0;}}。

(完整)简单的红外解码程序

(完整)简单的红外解码程序

简单的红外解码程序(不用中断)#ifndef __IR_H__#define __IR_H__#include <reg52.h>#include ”delay。

h"#define uchar unsigned char//8位#define uint unsigned int//16位sbit IR_IN=P3^2;//信号接收IR_JS();//无线接收程序#endif#include "IR.h”uchar data dat_IR[3]; //写缓存//==========红外接收程序=================IR_JS()//{uchar r1,r2,dat,dat1,dat2;if(IR_IN!=0){return 0;}//无信号退出delay_ms(1);if(IR_IN!=0){return 0;}//干扰退出r2=0;while(IR_IN ==0)//等高电平{delay_ms(1);r2++;}if(r2〈5){return 0;}//检测是否有同步头//delay_ms(4);//跳过同步码的高电平do{delay_100us(1);r2++;if(r2〉20){return 0;}}//防卡死while(IR_IN ==1);//开始解码for(r1=0;r1〈8;r1++)//接收8位数(系统码1){r2=0;while(IR_IN ==0);delay_100us(6);dat=dat<〈1;if(IR_IN ==1)dat=dat+1; //读数据位,接收的数据位放入retc中do{delay_100us(1);r2++;if(r2>20){return 0;}}//防卡死while(IR_IN ==1);}for(r1=0;r1〈8;r1++)//接收8位数(系统码2){r2=0;while(IR_IN ==0);delay_100us(6);//dat1=dat1<<1;if(IR_IN ==1)dat1=dat1+1; //读数据位,接收的数据位放入retc中 do{delay_100us(1);r2++;if(r2>20){return 0;}}//防卡死while(IR_IN ==1);}for(r1=0;r1〈8;r1++)//接收8位数(键值){r2=0;while(IR_IN ==0);delay_100us(6);//dat2=dat2<<1;if(IR_IN ==1)dat2=dat2+1; //读数据位,接收的数据位放入retc中 do{delay_100us(1);r2++;if(r2〉20){;return 0;}}//防卡死while(IR_IN ==1);}for(r1=0;r1<8;r1++)//接收8位数(键值反码){r2=0;while(IR_IN ==0);delay_100us(6);//dat=dat<〈1;if(IR_IN ==1)dat=dat+1; //读数据位,接收的数据位放入retc中 do{delay_100us(1);r2++;if(r2〉20){return 0;}}//防卡死while(IR_IN ==1);}//接收完32位数据if(dat2!= ~dat){return 0;}//检测键值和键值反码,出错退出//解码完成,保存数据dat_IR[0]=dat;dat_IR[1]=dat1;dat_IR[2]=dat2;//P2显示数据P2=dat2;delay_ms(1000);//显示一秒P2=0xFF;return 1; //解码成功}。

红外解码程序(用1602显示码值)

红外解码程序(用1602显示码值)

红外解码程序(用1602显示码值)#include #define uchar unsigned char#define uint unsigned intsbit beep=P1;bit startflag; //定义一个扫描开始标志位bit irreceok;//红外接收OK 标志位bit irprosok;//红外接收处理OK 标志位uchar irdata[33];//定义一个存放编码的数组。

引导码1 位,客户码8 位,客户反码8 位,数据码8 位,数据反码8 位,共33 位uchar bitnum;//接收到的第几位数据的标志位uchar irtime;//定义红外扫描时间uchar ircode[4];//为四个码值定义一个数组存放,把四位码分开uchar disp[8];//四组数据,每组拆成高四位和低四位,共八个元素/**************1602 部分******************/sbit lcden=P1 ;sbitlcdrs=P1;sbitlcdrw=P1;/*cha r code Tab[]={0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F};*/char code Tab[]=“0123456789abcdef”;void delay(uint z) //延时子程序{ uint x,y; for(x=z;x>0;x--) for(y=220;y>0;y--);}void write_com(uchar com)//定义一个带参数的写命令子程序{lcdrs=0; //1602的rs 为0 时,接收命令,为1 时接收数据P0=com;//把void write_com(uchar com)中的COM 中的数据给P0 口delay(2);lcden=1;delay(2);lcden=0;delay(2);}void init_1602()//定义一个初始化子程序{lcden=0;lcdrw=0;write_com(0x38);//调用write_com 子程序并把0x38 赋给P0 口,显示模式打开write_com(0x0f);//调用write_com 子程序并把开显示,显示光标,光标闪烁指令码赋给P0 口write_com(0x06);//调用write_com 子程序并把地址指针加1,整屏不移动指令码赋给P0 口//write_com(0x80+0x10);//数据指针初始化,让指针指向可显示的最右端write_com(0x80);//数据指针初始化,让指针指向最左端,显示从第一行开始write_com(0x01);//调用write_com 子程序并把”清零指”令码赋给P0 口} void write_dat(uchar dat)//定义一个带参数的写数据子程序{lcdrs=1; //1602 的rs。

红外解码原来如此简单

红外解码原来如此简单

红外解码原来如此简单硬件连接红外解码只需连下图中TSOP382的 3 根线(2 根电源 + 1 根数据)即可。

NEC 协议解码本文所述的红外编解码采用 NEC 协议。

通信的数据帧里使用高电平时间来区分 0 和 1。

对于按一下然后按住不动的情况,NEC 协议下是这么处理的:上图中Sugar 写的“固定重复指令”也叫作“重复引导码”。

对于红外通信协议,搜关键词“IR 引导码”会比较容易搜出结果。

NEC 的编码规则非常简单,如下图:Sugar 实际用逻辑分析仪抓取的波形如下,可以与上面的规则相互印证:Arduino 红外解码把上图中的代码复制到下面:•••••••••••••••••••••••••#include <IRremote.h>const int irReceiverPin = 2;IRrecv irrecv(irReceiverPin);decode_results results;decode_results res_last;void setup() { Serial.begin(9600); irrecv.enableIRIn();}void loop() { if(irrecv.decode(&results)){ if(res_last.value != results.value){ res_last.value = results.value; Serial.print('irCode: '); Serial.print(results.value, HEX); Serial.print(', bits: '); Serial.println(results.bits); } irrecv.resume(); }}STM32 红外解码一、外部中断方式参考《江涛带你玩STM32-CubeMX红外NEC解码实战(上)—外部中断方式》外部中断方式的优点在于:用哪个引脚都可以。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

#include<reg52.h> //包含头文件名
sbit IRIN=P3^2; //定义红外接收头的外部接口,即外部中断0
sbit BEEP=P1^5; //定义蜂鸣器接口,我的在P1^5
unsigned char IRCOM[7]; //定义数组,用来存储红外接收到的数据
void delay(unsigned char x)
{ //延时子程序unsigned char i; //延时约x*0.14ms
while(x--) //不同遥控器应设置不同的参数
{for(i=0;i<13;i++){}} //参数的选择咱们先不管,先看这个
}
void beep()
{
unsigned char i; //蜂鸣器发声子程序
for(i=0;i<100;i++)
{
delay(4); //这个得看你的蜂鸣器内部是否有振荡源
BEEP=~BEEP;
} //如果没有振荡源就应该输入脉冲信号
BEEP=1;
}
void IR_IN() interrupt 0 using 0 //外部中断0程序
{
unsigned char j,k,n=0; //先定义变量,记住n=0
EX0=0; //禁止中断,以免再次进入中断
delay(15); //延时0.14ms*15=2.1ms
if(IRIN==1) //如果在这期间有高电平说明
{ //信号不是来自遥控的,返回主程序
EX0=1;
return;
}
while(!IRIN){delay(1);} //死循环,等待9ms前导低电平信号的结束for(j=0;j<4;j++) //一共有4组数据
{
for(k=0;k<8;k++) //每组数据有8位
{
while(IRIN){delay(1);} //死循环,等待4.5ms前导高电平的结束
while(!IRIN){delay(1);} //等待0.56ms低电平的结束,准备采集数据,
while(IRIN) //开始采集数据
{
delay(1); //延时0.14ms,每过0.14ms时n就加1
n++; //用n记录一共有多少个0.14ms
if(n>=30) //如果超过0.14ms*30=4.2ms
{ //说明是乱码,放弃不要
EX0=1;
return;}
}
IRCOM[j]=IRCOM[j]>>1; //右移1位,xxxx xxxx变成0xxx xxx
//我们先认为这一位数据是0,现在已经送入一位数据了
/*你肯定知道_cror_(x,1)和x>>1的区别吧*/
if(n>=8){IRCOM[j]=IRCOM[j]|0x80;}//但是如果不是0呢,
//0xxx xxxx和0x80相或后变成了1xxx xxxx
//这样这一们数据就被记录为1了
/*想一下这里为什么是8呢,0.14ms*8=1.12ms,知道了吧*/
/*这样反复执行8次,8位数据就存在IRCOM[j]中了*/
/*外层再循环4次,4*8=32位数据码全都在IRCOM[0],IRCOM[1],IRCOM[2],IRCO M[3]中了*/
n=0; //n计数后一定要记得清0,否则下一次就不能准确计数了
}
}
if(IRCOM[2]!=~IRCOM[3]) //这里我们判断数据码和数据反码是不是相反{ //因为相反才是正确的,否则就放弃
EX0=1;
return;}
beep();
EX0=1; //记得开中断,你可以去掉这句话试一试
}
void main()
{
IE=0x81;
TCON=0X01;
BEEP=1;
IRIN=1;
while(1);
}
怎么样,你看懂了吗?
作者:任杰。

相关文档
最新文档