M50462遥控器解码源程序
- 格式:doc
- 大小:28.00 KB
- 文档页数:4
一文教会你红外线遥控器软件解码程序
红外线一开始发送一段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;//接受数据缓冲。
51单片机红外遥控解码程序类别:单片机/DSP 阅读:2975编者按:以下是网友编写的遥控解码程序!一种用延时等待的解码方法,比较容易理解,但缺点是占用CPU运行时间,第二种方法用定时器和外中断的解码方法,初学不易理解,但优点也很明显,第二种方法如果能解决连发解码就比较完美,更完善的红外遥控解码程序,请参考本站TOPA V-2008,TOP51-2005所配程序。
解码方法一;//单片机接收红外解读程序\\;硬件结构:8951,P0口数码管段码,P2.0-P2.3为位,P1为8个LED;P3.2为红外接收头,P2.7蜂鸣器,晶振12M;适用UPD6121 6122芯片接收;---------------------------------------------------------ORG 0000HAJMP MAIN ;转入主程序ORG 0003H ;外部中断P3.2脚INT0入口地址AJMP INT ;转入外部中断服务子程序(解码程序);以下为主程序进行CPU中断方式设置MAIN: SETB EA ;打开CPU总中断请求SETB IT0 ;设定INT0的触发方式为脉冲下降沿触发SETB EX0 ;打开INT0中断请求AJMP $;以下为进入P3.2脚外部中断子程序,也就是解码程序INT: CLR EA ;暂时关闭CPU的所有中断请求MOV R6,#10SB: ACALL YS1 ;调用882微秒延时子程序JB P3.2,EXIT ;延时882微秒后判断P3.2脚是否出现高; 电平如果有就退出解码程序DJNZ R6, SB ;重复10次,目的是检测在8820微秒内;如果出现高电平就退出解码程序;以上完成对遥控信号的9000微秒的初始低电平信号的识别。
JNB P3.2, $ ;等待高电平避开9毫秒低电平引导脉冲ACALL YS2 ;延时4.74毫秒避开4.5毫秒的结果码MOV R1,#1AH ;设定1AH为起始RAM区MOV R2,#4;PP: MOV R3,#8JJJJ: JNB P3.2,$ ;等待地址码第一位的高电平信号LCALL YS1 ;高电平开始后用882微秒的时间尺去判断信;号此时的高低电平状态MOV C,P3.2 ;将P3.2引脚此时的电平状态0或1存入C中JNC UUU ;如果为0就跳转到UUULCALL YS3;UUU: MOV A,@R1 ;将R1中地址的给ARRC A ;将C中的值0或1移入A中的最低位MOV @R1,A ;将A中的数暂时存放在R1中DJNZ R3,JJJJ ;接收地址码的高8位INC R1 ;对R1中的值加1,换下一个RAMDJNZ R2,PP ;接收完16位地址码和8位数据码和8位数据反; 码,存放在1AH/1BH/1CH/1DH的RAM中MOV A,1CH ;比较数据码和数据反码是否正确?CPL AXRL A,1DH ;将1CH的值取反后和1DH比较不同则无效丢弃,核对数据是否准确JNZ EXITMOV DPTR,#TAB ;表头地址送指针MOV A,1DHANL A,#0FH ;相与,得到低四位码MOVC A,@A+DPTRMOV 1EH,A ;查表得表码存入1EHMOV A,1DHSWAP AANL A,#0FHMOVC A,@A+DPTRMOV 1FH,A ;查表得高四位码存入1FMOV R7,#20HDISP:MOV P0,1FH ;送数码管显示CLR P2.1ACALL YS2SETB P2.1MOV P0,1EHCLR P2.2ACALL YS2SETB P2.2MOV P1,1DH ;将按键的键值通过P1口的8个LED显示出来!CLR P2.7 ;蜂鸣器鸣响-嘀嘀嘀-的声音,表示解码成功LCALL YS2SETB P2.7 ;蜂鸣器停止DJNZ R7,DISPEXIT: SETB EA ;允许中断RETI ;退出解码子程序YS1: MOV R4,#20 ;延时子程序1,精确延时882微秒D1: MOV R5,#20DJNZ R5,$DJNZ R4,D1RETYS2: MOV R4,#10 ;延时子程序2,精确延时4740微秒D2: MOV R5,#235DJNZ R5,$DJNZ R4,D2RETYS3: MOV R4,#2 ;延时程序3,精确延时1000微秒D3:MOV R5,#248DJNZ R5,$DJNZ R4,D3RETTAB: DB 0C0H,0DEH,0A2H,8AH,9CH,89H,81H,0DAH,80H,88H,90H,85H,0E1H,86H,0A1H,0B1H;数据表,0-9-A-FEND解码方法二你的解码程序和我现在用的解码程序大体是一样的,我自己实际做了一下,发现按下遥控器,接收到红外信号后,数码管闪的厉害。
电视遥控器的C51解码程序及其控制的电动遥控玩具车举例彩色电视红外线遥控器小巧方便,抗干扰能力强,遥控距离远,得到广泛应用。
其基本原理是通过键盘产生编码,对38K 载波调制,经放大,形成一串串脉冲由红外线发射管发射出去,现以M50462AP 集成电路的遥控器为例,介绍其编码及其用C 语言实现的解码程序。
彩电遥控器由键盘、M50462AP 和红外发射管等组成,电原理图如图1:图1脉冲宽度0.25MS ,编码为“1”时,脉冲间隔为1MS ,编码为“0”时,脉冲间隔为2MS ,如图3: 编码“0” 编码“1”图3指令前8位为引导码,后8位为功能码,M50462AP 中的引导码C0~C7由1110XX10组成,C4、C5由外引脚C4、C5控制,当C4、C5悬空或为“1”时,C4、C5为0,反之为1,如以熊猫牌遥控器为例,其引导码为“11100010”即十六进制“E2H ”,按键时间必须大于18MS 才能被确认,具有自动消抖功能,按键22MS 后开始发送指令,指令周期为44MS ,如此循环发送,直到按键被释放。
其编码及其对应的功能按键如表一:表一电视遥控器的解码由一片目前广泛使用、体积小而功能极强的AT89C2051单片机作解码芯片,该单片机内含128B RAM,2K Flash ROM,15根I/O口线,5个中断源,一个全双工串口,2个定时器/计数器,2个外部中断,时钟频率最高可达24M HZ,而外部引脚仅为20个。
遥控接收头直接接89C2051的INT0端,解码利用了定时器T0的门控位GA TE位功能捕捉脉冲间隔宽度,即定时器工作不仅要允许位TR0置位,还要INT0引脚为高电平才能开始定时,定时器T0工作在十六位定时器方式,解码如图4:图4至于定时数值的判定,初值为0,以逻辑“1”为例,晶振f=6M HZ,脉宽T=1.75MS,由计算知:count:=T/(1/f)=875=36BH 由于本文为实验,故仅判定TH0的值,而又因有误差,认为只要TH0大于等于3即为“1”,否则为“0”,详细见中断流程图。
标准文案天津滨海职业学院全日制高等职业教育毕业实践环节毕业设计(典型性项目)说明书红外遥控器设计(方案)作者:张耕榕院系:天津滨海职业学院机电工程系专业:电子信息工程技术年级:2012级学号:20120012136指导教师:×××时间:2015年4月摘要60年代初,一些发达国家开始研究民用产品的遥控技术,但由于受当时技术条件的限制,遥控技术发展很缓慢。
70年代末,随着大规模集成电路和计算机技术的发展,遥控技术才得到快速的进步。
在遥控方式上大体经历了从高成本的有线到成本低廉控制方便的无线控制。
无论采用何种方式,准确无误传输信号,最终达到满意的控制效果是非常重要的。
最初的无线遥控装置大多采用的是电磁波传输信号,由于电磁波容易产生干扰,也易受到外界干扰,因此逐渐采用超声波和红外线媒介来传输信号。
与红外线相比,超声传感器频带窄,所能携带的信息量少,易受干扰而引起误动作。
较为理想的是光控方式,逐渐采用红外线的遥控方式取代了超声波遥控方式,出现了红外线多功能遥控器,成为当今时代的主流。
由于红外线在频谱上居于可见光之外,所以抗干扰性强,且安全。
具有光波的直线传播特性,不易产生相互间的干扰,是很好的信息传输媒体。
信息可以直接对红外光进行调制传输,例如,信息直接调制红外光的强弱进行传输,也可以用红外线产生一定频率的载波,再用信息对载波进调制,接收端再去掉载波,取到信息。
从信息的可靠传输来说,后一种方法更好,这就是我们今天看到的大多数红外遥控器所采用的方法。
红外遥控技术在这十年来得到了迅猛发展,尤其在家电领域如彩电、DVD、空调、玩具等,也在其它电子领域得到广泛应用,随着人们生活水平的提高,对产品的追求是使用更方便、更具智能化,红外遥控技术正是一个重点的发展方向。
关键字:发光二极管 ATmega16目录一、现阶段红外遥控技术的研究现状和成果 (1)二、红外遥控器设计思想 (2)(一)系统设计概况 (2)(二)本系统设计思想 (4)三、红外遥控器硬件电路设计 (5)(一)红外遥控发射电路部分 (5)(二)接收电路部分 (7)(三)红外线信号编码格式 (11)四、遥控发射及接收控制电路的软件设计 (13)(一)遥控发射部分 (13)(二)遥控接收部分 (15)总结 (17)致谢 (18)参考文献 (19)一、现阶段红外遥控技术的研究现状和成果常用的红外遥控系统一般分发射和接收两个部分。
/*-----------------------------------------------名称:遥控器红外解码液晶显示公司:上海浩豚电子科技有限公司编写:师访日期:2009.5修改:无内容:------------------------------------------------*/#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义#include<stdio.h>#include<intrins.h>#define TURE 1#define FALSE 0sbit IR=P3^2; //红外接口标志sbit RS = P2^4;//Pin4sbit RW = P2^5;//Pin5sbit E = P2^6;//Pin6#define Data P0//数据端口unsigned int hour,minute,second,count;char code Tab[16]="0123456789ABCDEF";char data TimeNum[]=" ";char data Test1[]=" ";/******************************************************************//* 变量声明*//******************************************************************/unsigned char irtime;//红外用全局变量bit irpro_ok,irok;unsigned char IRcord[4]; //处理后的红外码,分别是客户码,客户码,数据码,数据码反码unsigned char irdata[33]; //33个高低电平的时间数据/******************************************************************//* 函数声明*/void Ir_work(void);void Ircordpro(void);void ShowString (unsigned char line,char *ptr);/******************************************************************//* 定时器0中断服务函数*//******************************************************************/void tim0_isr (void) interrupt 1 using 1//定时器0中断服务函数{irtime++; //用于计数2个下降沿之间的时间}/******************************************************************//* 外部中断0函数*//******************************************************************/ void ex0_isr (void) interrupt 0 using 0//外部中断0服务函数{static unsigned char i; //接收红外信号处理static bit startflag; //是否开始处理标志位if(startflag){if(irtime<63&&irtime>=33)//引导码TC9012的头码,9ms+4.5msi=0;irdata[i]=irtime;//存储每个电平的持续时间,用于以后判断是0还是1irtime=0;i++;if(i==33){irok=1;i=0;}}else{irtime=0;startflag=1;}}/******************************************************************//* 定时器0初始化*/void TIM0init(void)//定时器0初始化{TMOD=0x02;//定时器0工作方式2,TH0是重装值,TL0是初值TH0=0x00; //重载值TL0=0x00; //初始化值ET0=1; //开中断TR0=1;}/******************************************************************/ /* 外部中断初始化*/ /******************************************************************/ void EX0init(void){IT0 = 1; //指定外部中断0下降沿触发,INT0 (P3.2)EX0 = 1; //使能外部中断EA = 1; //开总中断}/******************************************************************/ /* 红外键值处理*/ /******************************************************************/void Ir_work(void) //红外键值散转程序{TimeNum[5] = Tab[IRcord[0]/16]; //处理客户码并显示TimeNum[6] = Tab[IRcord[0]%16];TimeNum[8] = Tab[IRcord[1]/16]; //处理客户码并显示TimeNum[9] = Tab[IRcord[1]%16];TimeNum[11] = Tab[IRcord[2]/16]; //处理数据码并显示TimeNum[12] = Tab[IRcord[2]%16];TimeNum[14] = Tab[IRcord[3]/16]; //处理数据反码并显示TimeNum[15] = Tab[IRcord[3]%16];ShowString(1,TimeNum);//显示处理过后的码值irpro_ok=0; //处理完成后清楚标志位}/******************************************************************/ /* 红外解码函数处理*/ /******************************************************************/ void Ircordpro(void)//红外码值处理函数{unsigned char i, j, k;unsigned char cord,value;k=1;for(i=0;i<4;i++) //处理4个字节{for(j=1;j<=8;j++) //处理1个字节8位{cord=irdata[k];if(cord>7)//大于某值为1,这个和晶振有绝对关系,这里使用12M计算,此值可以有一定误差{value=value|0x80;}else{value=value;}if(j<8){value=value>>1;}k++;}IRcord[i]=value;value=0;} irpro_ok=1;//处理完毕标志位置1}/******************************************************************//* 微秒延时函数*//******************************************************************/void DelayUs(unsigned char us)//delay us{unsigned char uscnt;uscnt=us>>1;/* Crystal frequency in 12MHz*/while(--uscnt);}/******************************************************************//* 毫秒函数声明*//******************************************************************/void DelayMs(unsigned char ms)//delay Ms{while(--ms){DelayUs(250);DelayUs(250);DelayUs(250);DelayUs(250);}}/******************************************************************/ /* 写入命令函数*/ /******************************************************************/ void WriteCommand(unsigned char c){DelayMs(5);//操作前短暂延时,保证信号稳定E=0;RS=0;RW=0;_nop_();E=1;Data=c;E=0;}/******************************************************************/ /* 写入数据函数*/ /******************************************************************/ void WriteData(unsigned char c){DelayMs(5); //操作前短暂延时,保证信号稳定E=0;RS=1;RW=0;_nop_();E=1;Data=c;E=0;RS=0;}/******************************************************************/ /* 写入字节函数*/ /******************************************************************/ void ShowChar(unsigned char pos,unsigned char c){unsigned char p;if (pos>=0x10)p=pos+0xb0; //是第二行则命令代码高4位为0xcelsep=pos+0x80; //是第二行则命令代码高4位为0x8WriteCommand (p);//写命令WriteData (c); //写数据}/******************************************************************/ /* 写入字符串函数*/ /******************************************************************/ void ShowString (unsigned char line,char *ptr){unsigned char l,i;l=line<<4;for (i=0;i<16;i++)ShowChar (l++,*(ptr+i));//循环显示16个字符}/******************************************************************/ /* 初始化函数*/ /******************************************************************/ void InitLcd(){DelayMs(15);WriteCommand(0x38); //display modeWriteCommand(0x38); //display modeWriteCommand(0x38); //display modeWriteCommand(0x06); //显示光标移动位置WriteCommand(0x0c); //显示开及光标设置WriteCommand(0x01); //显示清屏}/******************************************************************/ /* 主函数*/ /******************************************************************/void main(void){EX0init(); //初始化外部中断TIM0init();//初始化定时器InitLcd(); //初始化液晶DelayMs(15);sprintf(Test1," "); //显示第一行固定信息ShowString(0,Test1);sprintf(TimeNum,"Code ");//显示第二行固定信息ShowString(1,TimeNum);while(1)//主循环{if(irok) //如果接收好了进行红外处理{Ircordpro();irok=0;}if(irpro_ok) //如果处理好后进行工作处理,如按对应的按键后显示对应的数字等{Ir_work();}}}。
1第一章 电视遥控器的单片机译码模块电视遥控器在日常生活中应用非常普遍,可靠性高,价格低廉,用它作为使用单片机控制系统数据输入的工具,显然是较好的选择。
电视遥控器发送的是一连串脉冲,传输的媒介是红外光。
不同型号的遥控器发送的脉冲格式不尽相同,这些脉冲格式取决于遥控器的集成电路型号。
目前市场上能见到的遥控器用集成电路有几十种。
作者在一些项目中大多使用的集成电路是M50462AP 或替代型号的集成电路,下面就以集成电路是M50462AP 组成的遥控器为例介绍遥控器的工作原理。
其他型号的集成电路组成的遥控器的译码在第六章有介绍。
第一节 集成电路M50462AP 的工作原理引脚1_Vss 外接电源负端。
引脚2、3_OSC IN 、OSC OUT 外接振荡元件,可以接LC 或陶瓷振荡器。
产生480kHz 或455kHz 的基准频率,经内部的12分频后产生40kHz 或38kHz 的载波。
引脚4_ VNTR 发射指示输出端,在发射信号时此脚呈低电平,不发射时为高电平。
引脚5~12_A Φ ~H Φ 8个内部扫描信号输出端。
引脚13~20_1I ~8I 8个按键信号输入端。
引脚21、22_4C 、5C 用户码设定端。
用户码的另外6位C0、C1、C2、C3、C5、C6=111010是固定的。
4C 、5C 接高电平或开路时为“0”;4C 、5C 接地时为“1”。
引脚23_ 遥控信号输出端。
引脚24_V DD 外接电源正端 工作电源范围为2.2~5.5V ,静态工作电流90nA 。
集成电路M50462AP 的8个内部扫描信号输出端和8个按键信号输入端可以组成64键的扫描电路。
这些按键所对应的编码如表1_1所示。
例如,与扫描线A Φ和2I 连接的按2键的编码是0000 1000,前2位D7、D6常为00。
除了单按键外, 集成电路M50462AP 还有双键功能。
它的A Φ和1I 、A Φ和2I 、A Φ和3I 分别与E Φ~2I 、F Φ~2I 、G Φ~2I 、H Φ~2I 组成12个双键,这12个双键的编码如表1_2所示。
卫星电视接收器解密方法大全14小时前卫星电视接收器解密方法大全卫星电视接收器解密方法大全用遥控器进行自动搜索节目,系统设置的密码是F1 1 1 F2 0 2 其中F1,F2为遥控器上的按键。
菜单--系统设置--确定--F1 1 1 F2 0 2 输入这六位数密码确定--自动搜索等进度条100%就OK了。
如果不行的话再来一次就没问题了。
一、皇视1、皇视2080:在“转发器设定”时按5160、1698、156988。
2、皇视2080A型冲击波机<V:1.11);在开机状态下用遥控器按“菜单”键→电视屏显皇视主菜单→键入“530478”,电视机屏显“系统信息,数据存储中……”,待显示消失,在皇视主菜单中出现“自动搜索”,机内电视节目自动恢复为工厂设置。
此时选中“自动搜索”,设置相应参数,即可进行盲扫。
3、皇视HSR-2080A:调出主菜单→进入“转发器设置”一项,直接用遥控器按“1698”→画面出现“系统更新”字样,随后在主菜单“节目编辑”的下一栏出现“自动搜索”,进入该栏,按照相应的参数设置,再按“ 4、皇视HSR-2080C:将光标移至“转发器设定”,用遥控器数字键输入“1698”或“5168”即可。
5、皇视2080/C:菜单→皇视主菜单→转发器设定→5168或235523即可。
6、皇视2080系列设置方法:打开主菜单直接输入“5168”即可恢复。
7、皇视免费机的方法密码530478。
二、东仕8、东仕:<1)在恢复出厂时按“1270”。
<2)恢复出厂确定时按左键→“喜爱”键。
<3)各版本9画面的打开方法:5.13版:右键→确认键。
5.60版:改名键→左键→确认键。
5.89版:右键→左键→改名键→确认键。
9、东仕2000Q开启盲扫和9画面设置:按菜单→系统设置→恢复出厂设置→确认恢复<先不要按确认),按音量右键,然后按确认键恢复出厂状态,这时机器恢复到了出厂状态,9画面功能开启:进行第二次的按菜单→系统设置→恢复出厂设置→确认恢复<先不要按确认),按喜爱键,机器再一次恢复到出厂状态,9画面和盲扫都打开了。
//===================================================================== //// 红外遥控器解码程序演示//// 本程序主要将现在比较常用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 的前导低电平信号。
红外线遥控解码接收程序-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();if(IR_RE==1) //延时2.4ms后如果是高电平则是新码{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中精确的延时与计算的实现>>里的评论有很好的诠释.以上程序段可以应用在51/52单片机里.下面的程序可以应用在STC12C5410/STC12C2052型号的单片机里面.//在STC12C5410上运用红外线解码程序.主要的问题在于延迟上。
M50462遥控器解码源程序
来源:网上转载作者:不详
/************** YTREM.PLM ********************/
/* 遥控器按键代码表(熊猫M50462/CL54L2) */
/* 1---00h;2---10h;3---08h;4---18h;5---04h;6---14h;7---0ch;8---1ch; */
/* 9---80h;0---90h;1+---88h;2+---98h;pd+---50h;pd_---48h;ld+---0cch; */
/* ld_---0dch;yl+---44h;yl_---54h;sd+---0c4h;sd_---0d4h;BZ---0D0h; */
/* TV/AV---5CH;PX---D8H;-->.<-- ---0D0H;CLK---0E8H;*/
/* TIME---0F8H;ON.T---0E4H;SEL---0F4H;INC---0ECH; */
start:do;
$include(reg51.dcl)
declare (data1,data2,key,DAT) byte at (30h);
declare (ah,al,NUMBER,jihao,bjihao) byte;
declare Ale literally 'p17',da literally 'p15',clk literally 'p16';
DECLARE ACO(11) BYTE CONSTANT (0EDH,28H,0DCH,7CH,39H,75H,0F5H,2CH, 0FDH,7DH,02H);
DISPLAY: PROCEDURE(NUM);
DECLARE (K,NUM,N) BYTE;
N=NUM;
N=N MOD 10;
N=ACO(N);
DO K=0 TO 7;
N=SCR(N,1);
DA=CY;
CLK=0;
call time(1);
CLK=1;
END;
N=NUM;
N=N/10;
N=ACO(N);
DO K=0 TO 7;
N=SCR(N,1);
DA=CY;
CLK=0;
call time(1);
CLK=1;
END;
ALE=0;
call time(2);
ALE=1;
END DISPLAY;
YTNUMBER: procedure(kk);
declare (kk,relay) byte;
if kk=02 then
DO;
NUMBER=NUMBER+1;
IF NUMBER>4 THEN NUMBER=1;
END;
if kk=01 then
DO;
NUMBER=NUMBER-1;
IF NUMBER=0 THEN NUMBER=4;
END;
CALL DISPLAY(NUMBER);
KEY=0; data2=0;
END YTNUMBER;
recieve: procedure interrupt 4 using 1; declare (k,ask) byte;
disable;
if data2=0e2h and dat<>0 then
do;
ri=0;
jihao=sbuf;
if jihao=bjihao then
do;
data2=0;
p32=1;
do k=1 to 2;
if k=1 then sbuf=dat;
if k=2 then sbuf=number;
do while ti=0;
end;
ti=0;
call time(1);
end;
p32=0;
do while ri=0;
end;
ri=0;
ask=sbuf;
if ask=0ffh then
do;
;
end;
/* data1=0ffh;dat=0; */
end;
end;
enable;
end recieve;
rem:procedure interrupt 2;
declare k byte;
disable;
/* if data2=0e2h then goto int0end; */ k=16;
loop1:
call time(2);
do while p33=0;
end;
th0=0;
tl0=0;
tr0=1;
call time(2);
do while p33=1;
end;
tr0=0;
ah=th0;
al=tl0;
if ah>=4 then cy=1; /* 11.0592Mhz */
else cy=0;
data1=scl(data1,1);
k=k-1;
if k=8 then data2=data1;
if k<>0 then goto loop1;
if data2=0e2h then
do;
IF DATA1=54H THEN do;KEY=01;dat=0;end; /* YTNUMBER DEC KEY */ IF DATA1=44H THEN do;KEY=02;dat=0;end; /* YTNUMBER ADD KEY */ IF DATA1=00H THEN DAT=1;
IF DATA1=10H THEN DAT=2;
IF DATA1=08H THEN DAT=3;
IF DATA1=18H THEN DAT=4;
IF DATA1=04H THEN DAT=5;
IF DATA1=14H THEN DAT=6;
IF DATA1=0CH THEN DAT=7;
IF DATA1=1CH THEN DAT=8;
IF DATA1=80H THEN DAT=9;
IF DATA1=90H THEN DAT=10;
IF DATA1=88H THEN DAT=11;
IF DATA1=98H THEN DAT=12;
IF DATA1=50H THEN DAT=13;
IF DATA1=48H THEN DAT=14;
IF DATA1=40H THEN DAT=15;
IF DATA1=4CH THEN DAT=16;
IF DATA1=5CH THEN DAT=17;
IF DATA1=0D8H THEN DAT=18;
IF DATA1=0D0H THEN DAT=19;
IF DATA1=0E8H THEN DAT=20;
IF DATA1=0F8H THEN DAT=21;
IF DATA1=0E4H THEN DAT=22;
IF DATA1=0F4H THEN DAT=23;
IF DATA1=0ECH THEN DAT=24;
/* P34=0;CALL TIME(250);P34=1; */
end;
int0end:
ip=0;
DO K=0 TO 3; /* important value */
CALL TIME(250);
END;
enable;
end rem;
main$program:
data1=0;data2=0;dat=0;
p32=0; /* set recieve mode */
clk=1;Ale=1;
p33=1;NUMBER=1;KEY=0;
scon=50h;
pcon=00h;
tmod=21h;
tl1=0fdh; /* 9600 baud rate for 11.0592Mhz */ th1=0fdh;
th0=0;
tl0=0;
tr1=1;
es=1;
ex1=1;
bjihao=1;
enable;
call DISPLAY(NUMBER);
DO WHILE 1=1;
IF KEY=01 OR KEY=02 THEN
DO;
CALL YTNUMBER(KEY);
END;
end start;。