NEC协议的红外遥控器驱动程序
红外遥控协议标准(NEC RC5)及编程

红外遥控协议标准(NEC/RC5/RC5X)及编程目录1.NEC码遥控器技术标准2.RC5/RC5X码遥控器技术标准3.解码原理及算法(NEC)4.实例代码(NEC)1.NEC码遥控器技术标准特点:8位的系统码和8位的命令码长度为了增加可靠性,地址码(即用户码)和命令码都要发送两次脉冲宽度调制载波频率为38K每一位的时间长度为1.12ms或2.25ms其逻辑1与逻辑0的表示如图所示:逻辑1为2.25ms,脉冲时间560us;逻辑0为1.12ms,脉冲时间560us。
所以我们根据脉冲时间长短来解码。
推荐载波占空比为1/3至1/4。
NEC协议格式:首次发送的是9ms的高电平脉冲,其后是4.5ms的低电平,接下来就是8bit 的地址码(从低有效位开始发),而后是8bit的地址码的反码(主要是用于校验是否出错)。
然后是8bit 的命令码(也是从低有效位开始发),而后也是8bit的命令码的反码。
地址和命令发送两次。
第二次发送时,所有的位取反,用来验证第一次发送的消息。
如果开发者不用验证,则可以忽略验证的数据,或者将地址或命令扩展为16bit以上是一个正常的序列,但可能存在一种情况:你一直按着1个键,这样的话发送的是以110ms为周期的重复码,如下图:就是说,发了一次命令码之后,不会再发送命令码,而是每隔110ms时间,发送一段重复码。
重复码由9ms高电平和2.25ms的低电平以及560us的高电平组成。
需要注意的是:1838红外一体接收头为了提高接受灵敏度。
输入高电平,其输出的是相反的低电平。
2、编程注意事项2.1红外接收头引脚信号是相反的电平。
2. 2数据从LSB(低位)开始发送,所以选择右移方式接收数据。
四个字节的数据都是先发送D0,最后发送D7。
所以接收到1位数据后,给变量的最高位赋值,右移。
或者先右移,再给变量的最高位赋值。
2.3.可以用一个数组保存32个数据的持续时间,用于后面判断高低电平。
用定时器对两个数据(中断)之间的时间计时,并保存这个持续时间用于以后判断是位1还是位0。
红外遥控原理与nec协议介绍

红外遥控原理与nec协议介绍
红外遥控原理与NEC协议介绍
在现代家居中,我们经常使用的电器设备多数都配备了红外遥控功能,这是一种非常方便的控制方式,它使得我们可以在不接触设备的情况下,方便地控制它们的开关、调节等操作。
那么,红外遥控是如何实现的呢?NEC协议又是什么?
红外遥控原理
红外遥控所用的信号是红外线,光波的频率高于红外线的频率,因此红外线是我们肉眼无法看到的。
当我们按下遥控器上的按钮后,遥控器内部的红外LED会发出一个特定频率的光波,这个光波会通过空气传递到电器设备中的红外接收器(IR Receiver)。
红外接收器会将接
收到的光波转化为电信号,并将其传递给设备的中央处理器,中央处理器便会根据接收到的电信号执行相应的操作。
NEC协议介绍
NEC是红外遥控信号最为常用的协议之一,它是由日本NEC公司开发的。
NEC协议采用了脉冲编码调制技术(Pulse Coded Modulation, PCM),将发送的数据进行脉冲编码,以使接收端可以正确地解码。
NEC
协议的传输速率为38kHz,每个数据包由4个字节组成,其中第一个字节表示设备地址,第二个字节表示设备地址的反码,第三个字节表示数据码,第四个字节表示数据码的反码。
NEC协议可以支持多达256个设备地址,因此可以同时控制多个设备。
总结
红外遥控技术在现代家居中得到广泛应用,它是一种方便、快捷的控制方式,使得我们可以在不接触设备的情况下控制它们。
NEC协议是红外遥控信号最为常用的协议之一,它采用了脉冲编码调制技术,能够支持多达256个设备地址,因此能够满足多设备控制的需求。
红外遥控器程序及原理、程序

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 位。数据反码是数据 码反相后的编码,编码时可用于对数据的纠错。注意:第二段的用户码也可以在遥控应用电 路中被设置成第一段用户码的反码。
nec红外协议

nec红外协议NEC红外协议。
NEC红外协议是一种用于红外遥控器通信的协议标准,广泛应用于家电、电子设备等领域。
它采用了38kHz的载波频率,通过调制不同的脉宽来实现数据的传输,具有传输距离远、抗干扰能力强等优点。
本文将对NEC红外协议的原理、格式、编码方式等进行详细介绍,以便对该协议有更深入的了解。
NEC红外协议的原理是通过调制38kHz的载波信号来传输数据。
在NEC协议中,逻辑“0”和逻辑“1”分别用不同的脉宽来表示,通常逻辑“0”用560us的脉宽表示,而逻辑“1”用1690us的脉宽表示。
通过这种方式,接收端可以根据脉宽的不同来解析出发送端发送的数据,从而实现通信的目的。
NEC红外协议的格式通常包括引导脉冲、地址码、反码、命令码等部分。
其中,引导脉冲是一个9ms的高电平脉冲和4.5ms的低电平脉冲交替组成,用于唤醒接收器;地址码用来表示遥控器的地址信息;反码是地址码的反码,用于提高数据传输的可靠性;命令码用来表示具体的操作命令,比如开关机、音量调节等。
通过这样的格式组织,NEC红外协议可以实现对各种遥控器指令的准确传输。
NEC红外协议的编码方式是采用了32位的编码格式,其中包括8位的地址码、8位的地址反码、8位的命令码和8位的命令反码。
这种编码方式可以保证数据的准确性和可靠性,同时也便于接收端对数据进行解析和识别。
通过这种编码方式,NEC红外协议可以实现对各种遥控器指令的精准传输。
总的来说,NEC红外协议作为一种广泛应用的红外遥控器通信协议,具有传输距离远、抗干扰能力强、编码方式简单等优点。
通过对NEC红外协议的原理、格式、编码方式等方面的介绍,相信读者对该协议有了更深入的了解,可以更好地应用于实际的产品开发和设计中。
总结一下,NEC红外协议在红外遥控器通信领域有着重要的地位,其原理简单明了,格式清晰规范,编码方式可靠性高。
相信随着科技的不断发展,NEC红外协议将会有更广泛的应用和发展。
NEC协议的红外遥控器驱动程序

是不是觉得红外遥控+51单片机是绝妙组合?但是在编程时才发现超级纠结?其实也没那么纠结,自己摸索摸索,总能找出办法来的。
本程序占用了51单片机的定时器0以及中断1两个资源,为的是使单片机能接收到每一个红外脉冲信号,一个都不能少。
如果舍不得用这两个资源,还有另一种查询的办法,就是不一定每个信号都能收到,可自己琢磨一下。
需要全套NEC协议红外遥控器资料的,到网上找,到处都有,而且很全。
另外,对着资料写程序如果实在写不出,可以找个示波器,把波形录下来好好研究研究。
毕竟有些时候资料会过时,只要里面有一点东西变化了,程序就完全不一样了。
这种弯路,尽量少走。
用于NEC按键码8#endif{TH0=0x19;TL0=0x19; //11.0592MHz晶振,计数230次,大概时间250usET0=1;TR0=0;//定时器0使能,先关着IT1=1;EX1=1; //外部中断1使能,用来接收红外信号EA=1; //开总中断}voidnec_act()//按键功能程序{if((nec_dat[0]==~nec_dat[1])&&(nec_flag==3)){switch(nec_dat[0]){case69:break;case70:break;case71:break;case68:break;case64:break;case67:break;case7:break;case21:break;case9:break;}}{{}}{uintintime=0;//intime:为了不打扰计时器工作,所以用intime把nec_time提出来intime=nec_time;nec_time=0;//nec_time置0,准备计数if(nec_num==0)TR0=1;//开定时器,开始计数if(nec_num==1){if((intime>50)&&(intime<60))nec_flag=1;}if(nec_num==2){if((intime>2)&&(intime<11))nec_flag=2;}if(nec_flag==2){if((nec_num>=2)&&(nec_num<=9)){if((intime>2)&&(intime<6))nec_cod[0]=nec_cod[0]&~(0x01<<(nec_num-2));elseif((intime>7)&&(intime<11))nec_cod[0]=nec_cod[0]|(0x01<<(nec_num-2));}if((nec_num>=10)&&(nec_num<=17)){if((intime>2)&&(intime<6))nec_cod[1]=nec_cod[1]&~(0x01<<(nec_num-10));elseif((intime>7)&&(intime<11))nec_cod[1]=nec_cod[1]|(0x01<<(nec_num-10));}if((nec_num>=18)&&(nec_num<=25)){if((intime>2)&&(intime<6))nec_dat[0]=nec_dat[0]&~(0x01<<(nec_num-18));}}。
红外遥控协议分析之:NEC协议

红外遥控编码传输协议生产厂家对红外遥控的编码做了严格的规范,目前国内外主流的红外遥控编码传输协议有十多种,女口 NEC 、Philips RC-5、Philips RC-6、Philips RC-MM 、Philips RECS80、 RCA 、 X-Sat 、ITT 、JVC 、Sharp 、Nokia NRC17 和 Sony SIRC 等。
国内最常用的规范有两种: NEC 和Sony SIRC 。
这两种规范的调制方式分别为: PPM(脉冲间隔调制)和PWM (脉冲宽度调制)。
谈到这两个概念,我需要具体讲解一下,因为我在 网上查阅相关资料时甚是郁闷,好多说法相互矛盾。
有说NEC 属于PWM 的因为它的脉宽 不同,PPM 的脉宽是固定的。
而细心地朋友如果探究到 NEC 的典型芯片的芯片手册时,会发现上面这种说法是错误的。
比如 UPD6121这款红外远程控制芯片的调制方式为PPM 。
后来终于在一家国外的网站上找到了能够自圆其说的解释。
个人认为比较正确,拿来和大家分享。
要想认清红外遥控编码传输协议的具体内容,我想还是先捡其重点来讲一下, 编码规范中最重要的当属调制这部分了。
而主流的调制方式有两种分别为 PPM 和PWM ,当然其他 还有好几种,这里先不讲解,免得糊涂了。
本文就先介绍下 PPM 和PWM 的区别。
PPM ( Pulse Position Modulation),其实更加准确的说法应该是PDM(Pulse DistaneeModulation)即脉冲间隔调制:------ :----- 225ms ------------- ------- 112ms ---- IE33上图为典型编码规范 NEC 协议的调制图,为PPM 调制。
可以看出不管是“0”还是“1 ”, 有高频调制波的地方(下文称其为脉冲)其宽度都是相同的位560us ,而脉冲间的间隔则是不同的:“1”时为(2.25ms-560us),“0”时为(1.12ms-560us)。
红外遥控的程序

/*红外线接收程序,本程序运行在NEC制下的遥控器下,市面上的遥控器大部份都是NEC 制的,运行程序,按遥控器在数码管上显示相应的地址码-控制码(以16进制显示)分四段,前两段是地址码,后两段为控制吗,根据NEC编码不同,有的是前8位为数据码,后8位为数据据码的反码,有的是16位编码,就没有反码了*/#include <reg51.h>#include <intrins.h>sbit spk=P3^4;sbit hwx=P3^3; //定义红外接收脚,code unsigned char table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40};//共阴数码管0-9 a-f - 表unsigned char I_tmpdate[4]={0,0,0,0};//显示管数据unsigned char flag,tmp;unsigned char I_lhj[66]; //定义66位数组变量来存储接收的时间参数void delay();//延时子函数void display(unsigned char *Ip,unsigned char Ic);//数字的显示函数;lp为指向数组的地址,lc 为显示的个数void main(void) //入口函数{EA=1; //首先开启总中断EX1=1; //开启外部中断1IT1=1; // 设置成下降沿触发方式while(1){ //循环显示,接收都由display(I_tmpdate,4);if (flag==0x2f){I_tmpdate[0]=10;I_tmpdate[1]=10;I_tmpdate[2]=10;I_tmpdate[3]=10;spk=0;}if (flag==0x07){I_tmpdate[0]=1;I_tmpdate[1]=1;I_tmpdate[2]=1;I_tmpdate[3]=1;}if (flag==0x0b){I_tmpdate[0]=2; I_tmpdate[1]=2; I_tmpdate[2]=2; I_tmpdate[3]=2;} if (flag==0x0f) {I_tmpdate[0]=3; I_tmpdate[1]=3; I_tmpdate[2]=3; I_tmpdate[3]=3;}if (flag==0x13) {I_tmpdate[0]=4; I_tmpdate[1]=4; I_tmpdate[2]=4; I_tmpdate[3]=4;}if (flag==0x17) {I_tmpdate[0]=5; I_tmpdate[1]=5; I_tmpdate[2]=5; I_tmpdate[3]=5;}if (flag==0x1b) {I_tmpdate[0]=6; I_tmpdate[1]=6; I_tmpdate[2]=6; I_tmpdate[3]=6;}if (flag==0x5b) {I_tmpdate[0]=0; I_tmpdate[1]=0; I_tmpdate[2]=0; I_tmpdate[3]=0;spk=1;}if (flag==0x1f){I_tmpdate[0]=7;I_tmpdate[1]=7;I_tmpdate[2]=7;I_tmpdate[3]=7;}if (flag==0x23){I_tmpdate[0]=8;I_tmpdate[1]=8;I_tmpdate[2]=8;I_tmpdate[3]=8;}if (flag==0x27){I_tmpdate[0]=9;I_tmpdate[1]=9;I_tmpdate[2]=9;I_tmpdate[3]=9;}}}void display(unsigned char *Ip,unsigned char Ic)//显示{unsigned char i; //定义变量P2=0; //端口2为输出P1=P1&0xF8; //将P1口的前3位输出0,对应138译门输入脚,全0为第一位数码管for(i=0;i<Ic;i++){ //循环显示P2=table[Ip[i]&0x7f]; //查表法得到要显示数字的数码段if(Ip[i]>0x7f)P2+=0x80;delay(); //延时P2=0; //清0端口,准备显示下位if(i==7) //检测显示完8位否,完成直接退出,不让P1口再加1,否则进位影响到第四位数据break;P1++; //下一位数码管}}void delay(void) //空5个指令{unsigned char i=13;while(i)i--;}void hongwai(void) interrupt 2 //外部中断1 ,INT1(P3^3)连接红外线接收IC数据脚{unsigned char i,j,tmp;unsigned int tmp2;EX1=0;// hwx=1;j=33; //传送一组数包括引导码1位,地址码8位加反码8位,指令码8位加反码8位,总共33位i=0; //从第一维数组开始tmp2=0;while(!hwx){ //NEC制红外波形引导码低电平开始tmp2++; //低电平延时记数if(tmp2==1000) //NEC制引导码判断,防止其它干扰波形进入break;}if(tmp2<1000){ //小于1000个记数的判断为干扰退出接收EX1=1;return;}//P2=0x76; //数码管输出显示H,作为红外接收的指示while(j){ //循环接收33位数据,为何我们用到66位数组,我们可以不接收高电平时间常数,只接低电平常数就//可以判断1或0了,在这里我们都接收//还有一点要知道,接收波形是反向,在没有接收时端口为高电平tmp=0;I_lhj[i]=1; //时间量从1开始while(!hwx){ //检测高低电平的变化I_lhj[i]++; //没变继续加1delay(); //加入延时,是因为我们采用8位二进来存储,如果不加延时,时间量将计满tmp++; //此变量为防止干扰带来的死循环if(tmp==250)break;}i++;tmp=0;I_lhj[i]=1; //时间量从1开始while(hwx){ //检测高低电平的变化I_lhj[i]++; //没变继续加1delay(); //同上tmp++;if(tmp==250)break;}i++;j--;}i=255; //加入循环延时,处理数据while(i){tmp=255;while(tmp){P2=0XF0;tmp--;}i--;}tmp=0;//这里显示了全部的四段码,包括地址位两段,控制位两段,每段用点分开for(i=3;i<19;i++,i++){ //处理地址位前8位,这是3是因为去掉前面的引导码。
(合同范本)NEC协议的红外遥控器驱动程序

NEC协议的红外遥控器按键对应数字一览(合同范本)NEC协议的红外遥控器驱动程序是不是觉得红外遥控+51单片机是绝妙组合?但是在编程时才发现超级纠结?其实也没那么纠结,自己摸索摸索,总能找出办法来的。
本程序占用了51单片机的定时器0以及中断1两个资源,为的是使单片机能接收到每一个红外脉冲信号,一个都不能少。
如果舍不得用这两个资源,还有另一种查询的办法,就是不一定每个信号都能收到,可自己琢磨一下。
需要全套NEC协议红外遥控器资料的,到网上找,到处都有,而且很全。
另外,对着资料写程序如果实在写不出,可以找个示波器,把波形录下来好好研究研究。
毕竟有些时候资料会过时,只要里面有一点东西变化了,程序就完全不一样了。
这种弯路,尽量少走。
本程序只是头文件,具体到应用上还要各位自己动脑筋了,希望对大家有所帮助。
共同学习,共同进步!69**************************************************************** INF_NEC.h用于NEC 协议的遥控器,主控器为 51单片机。
用户码8位,分布于2-17个脉冲; 按键码8位,分布于18-33个脉冲。
皆为前8原码,后8反码。
注意:本驱动占用 51单片机的外部中断1以及定时器0两个资源,编程时注意 不要再乱动这两个资源。
***************************************************************** #include<reg52.h> #define uchar unsigned char#define uint unsigned int#ifndef __INF_NEC__#define __INF_NEC__ extern void nec_init();extern void nec_act();#endifvoid nec_init(){TMOD=(TMOD&0xf0)|0x02; // 定时器0模式2, 8位自动重装TH0=0x19;TL0=0x19;ET0=1;TR0=0;IT1=1;EX1=1;EA=1;} void nec_act()//按键功能程序 {if((nec_dat[0]==~nec_dat[1])&&(nec_flag==3)){switch(nec_dat[0]){case 69: break;case 70: break;case 71: break;case 68:break;case 64:break;case 67:break;case 7:break;case 21:break;/****/uchar nec_flag=0;//nec_flag:遥控码的标志位。
红外线遥控器(nec编码方式)介绍

學習型遙控器的分類
優點:可以使用任何遙控器的學習,無須更新代碼程式即可使用目前所有 乃至未來的所有紅外線遙控的學習。
缺點:對主控制晶片和記憶體的選擇都比固定式要高。整體成本上較貴於 固定碼式學習型遙控器
FAE Service Department designed
Data Memory
I/ O
8bit
16bit
Ext.
Int.
IR Carrier
LVR
PFD Stack
400kHz
~
15
2.0V
4MHz
~
1Kx14
32x8
--
--
--
--
v
v
--
1
3.6V
4MHz
16
Package 20SSOP
HT48RA0-1 HT48CA0-1
HT48RA1 HT48CA1
NEC碼分析
在東亞地區比較常用的紅外線傳輸協議是NEC協議,故我們主要介紹NEC 協議即6122協議。 1. 協議組成:
引導碼,16bit用戶碼(地址碼),8bit命令碼(數據碼)及其反碼。
• 引导码由一个9ms的载波波形和4.5ms的关断时间构成 ‚ 地址碼共16bit,低8位在前,高8位在后。 ƒ 8bit命令碼及其反碼
20x4
32x4
HT49RA1 HT49CA1
2.0V ~
3.6V
4MHz
4Kx15
160x8
8
,
8
33x3 4
,
8
1
1
v
2
4
v
v
红外遥控协议 NEC

∙方便理解所看到的波形是从红外接收管出来的信号,跟协议所说的信号高低(0或1)刚好相反。
∙NEC协议是众多红外遥控协议的其中一种,除NEC外,还有RC5、RC6等其它的。
市面上买到的非学习型万能电视遥控器大多集成一种或多种编码是NEC型的,我买的二个遥控器中就有三种以上编码是NEC的。
∙NEC编码的一帧(通常按一下遥控器按钮所发送的数据)由引导码、地址码及数据码组成,,如下图所示,把地址码及数据码取反的作用是加强数据的正确性。
∙
∙引导码及数据的定义如下图所示,当一直按住一个按钮的时候,会隔110ms左右发一次引导码(重复),并不带任何数据
∙
∙以下是用示波器采集到的一直按住某个按钮时的波形:
∙
∙按一下按钮的波形:。
红外遥控NEC解码程序

//=============================///********************************本解码程序完成于2017.07.29日,看起来不难,却花了我很多心思。
今我愿与网友分享此代码,希望能帮助跟我一样的初学者!!!此代码中定时器使用的是STC89C52的定时计数器2,位16位自动重装定时器。
此代码解码后解码数据显示在串口工具上。
********************************///=============================///********************************西安石油大学:王普********************************///=============================//#include <reg52.h>typedef unsigned char uchar;uchar count;uchar wedat[33];uchar dat[4];bit receive_flag , chuli_data_ok;sbit bus=P3^2;void init(){TMOD=0x22;//定时器1,0都是8位自动重装寄存器RCAP2H=0xfe;RCAP2L=0xff;TH2=(65535-256)/256;TL2=(65535-256)%256;EA=1;ET2=1;IT0=1; //红外外部中断EX0=1; //外部中断允许位TH1 = 0xfd; //此溢出率为波特率9600TL1 = 0xfd;TR1 = 1; //启动定时器1SM0 = 0;SM1 = 1; //设置串口工作方式1,10位异步收发器}void timer0() interrupt 5{TF2=0;count++;}void EX_INT0() interrupt 0//红外遥控信号进入中断服务程序{static uchar num;//静态变量,每次进入其值不变,num是每个脉宽的编号static uchar flag,flag1; //辅助标志位TR2=1;//当IT0下降沿发生,脉宽进入,打开定时器2if(flag == 1)//第一次flag=0,不执行下面程序,直接出中断程序,下次进入执行{if(( count < 60) && (count >= 40) )//检测起始码宽度,符合条件进入{num=0;//起始码编号为0,存入数组中flag1=1;//辅助标志位,用于进入下面程序}}if(flag1==1)//第二次进入中断后将33和脉宽依次存入数组中,编号为0~32 {wedat[num] = count; //读取T2定时器中断程序中的计数值count = 0;//都去完成后,清零num++;//编号++}flag=1;//第一次flag=0,第二次进入后为1,开始执行脉宽存储程序if(num > 32)//如果num大于32,也就是说33个脉宽都存入了,0~32,共33个。
NEC协议的红外遥控器驱动程序

是不是觉得红外遥控 +51单片机是绝妙组合?但是在编程时才发现超级纠结?其实也 没那么纠结,自己摸索摸索,总能找出办法来的。
本程序占用了 51单片机的定时器 0以及中断1两个资源,为的是使单片机能接收到每 一个红外脉冲信号, 一个都不能少。
如果舍不得用这两个资源,还有另一种查询的办法,就 是不一定每个信号都能收到,可自己琢磨一下。
需要全套NEC 协议红外遥控器资料的,到网上找,到处都有,而且很全。
另外,对着资料写程序如果实在写不出,可以找个示波器,把波形录下来好好研究研 究。
毕竟有些时候资料会过时,只要里面有一点东西变化了, 程序就完全不一样了。
这种弯 路,尽量少走。
本程序只是头文件,具体到应用上还要各位自己动脑筋了,希望对大家有所帮助。
共 同学习,共同进步! 69 70 71 68 64 67 07 21 09 22 25 13 12 24 94 08 28 90 66 82 74 NEC 协议的红 外遥控器按 键对应数字 一览/******************************************************************INF_NEC.h用于NEC 协议的遥控器,主控器为 51单片机。
用户码8位,分布于2-17个脉冲;按键码8位,分布于18-33个脉冲。
皆为前8原码,后8反码。
注意:本驱动占用 51单片机的外部中断1以及定时器0两个资源,编程时注意 不要再乱动这两个资源。
*******************************************************************/#in clude<reg52.h> #defi ne uchar un sig ned char#defi ne uint un sig ned intuchar nec_cod[2]={0,1};〃遥控器的编号,编号 uchar nec_dat[2]={0,1};〃遥控器的数据,数据 #ifndef __INF_NEC_#defi ne __INF_NEC extern void n ec_i nit(); extern void n ec_act();#en difvoid nec_init() //外中断1及定时器0的初始化函数{TMOD=(TMOD&0xf0)|0x02; // 定时器0模式2,8位自动重装//11.0592MHz 晶振,计数 230次,大概时间 250us//定时器0使能,先关着〃外部中断1使能,用来接收红外信号〃开总中断void nec_act()//按键功能程序{if(( nec_dat[0]==~ nec_dat[1]) &&(n ec_flag==3)){switch( nec_dat[0]){case 69: break;case 70: break;case 71: break;case 68:break;case 64:break; uchar nec_flag=0;//nec_flag:遥控码的标志位。
红外线遥控器(nec编码方式)

抗干扰优化
通过调整编码方式或增加滤波器等手段,增强遥控器的抗干扰能 力。
测试结果与结论
测试结果显示,该红外线遥控器 在有效范围内能够正常工作,按 键响应准确,抗干扰能力较强。
通过调试优化,进一步提高了遥 控器的性能和稳定性。
结论:该红外线遥控器符合预期 要求,可以用于实际应用中。
在NEC编码中,脉冲的宽度和间隔时间 被分为两种不同的比例,即1:2和1:1, 通过这两种比例的不同组合,可以表示 出0和1两种不同的二进制位。
当发送数据时,首先发送起始位,然 后是数据位,最后是停止位。起始位 是一个较长的脉冲和一个较短的间隔 时间,数据位由一系列的脉冲和间隔 时间组成,停止位是一个较短的脉冲 和一个较长的间隔时间。
红外线遥控器(NEC编码方式)
目 录
• 红外线遥控器简介 • NEC编码方式简介 • 红外线遥控器(NEC编码方式)的电路设计 • 红外线遥控器(NEC编码方式)的软件设计 • 红外线遥控器(NEC编码方式)的测试与调试
01 红外线遥控器简介
红外线遥控器的原理
红外线遥控器利用红外线作为信号传输介质,通过调制信号来控制设备的开关或功 能。
THANKS FOR WATCHING
感谢您的观看
01
采用NEC编码算法,将按键信息转换为红外线信号。
解码算法
02
将接收到的红外线信号解码为按键信息。
测试与调试
03
对编码和解码算法进行测试和调试,确保其正确性和稳定性。
05 红外线遥控器(NEC编码 方式)的测试与调试
测试方法
1 2
发射距离测试
测试遥控器在不同距离下的信号发射效果,确保 遥控器在有效范围内能够正常工作。
nec,ir,协议

竭诚为您提供优质文档/双击可除nec,ir,协议篇一:nec码红外遥控完整编码红外遥控编码程序如下:nec.sectiondataa_Rem_codedb;keydatacodea_customeR_1db;遥控器头码(客户码)低八位a_customeR_2db;遥控器头码(客户码)高八位#definecus_6221_100110100b;1234h#definecus_6221_200010010b;@------------------------------------------------nec_code.sectioncode;@*************subRoutine[xx]:sendRemotecode*** *********;;遥控码发送:send_Remote_code:clrwdt;清除进位标志,检测遥控发送的有效的按键szfg_sendactive;sz表示以0结尾的字符串jmpReady_send;跳转到Ready_send模块retReady_send:nec_code:mova,a_key_num;将数值发送到寄存器a中,直接寻址movm_tblp,atabRdla_Rem_code;查表专用指令moVa,cus_6221_1;读取遥控头码(客户码)低八位数值moVa_customeR_1,amoVa,cus_6221_2moVa_customeR_2,a以上为Ready_send运行模块,同时是为后面nec码发送的准备;首先将一个按键的数值已以直接寻址方式发送到寄存器a中,将寄存器a的是发送到m_tblp中,然后查表a_Rem_code,将cus_6221_1的值发送到寄存器中,在赋值给遥控器头码(客户码)低八位a_customeR_1,同理,将cus_6221_2赋值给遥控器头码(客户码)低八位a_customeR_2,随后即开始发送nec遥控码。
nec引导码发送并开始编译:;;---startingsendnecRemotecode---send_nec:;checknokeycodeffhsizaa_Rem_code;取出变量的大小jmpleadnec_code;跳转指令Ret;返回地址出栈,从而实现转移到返回地址处leadnec_code:;1instructioncycle=8.79usclrpn_iR;highlevel9ms(455khz:1023cycle)mova,002d;[( 3*168)+5]*2=1018mova_sR13,aleadind_code_00:mova,168dmovm_acc,aleadind_code_01:sdzm_acc;结果为零,则跳过下一条指令jmpleadind_code_01sdza_sR13jmpleadind_code_00nop2nop2nop;空操作指令,占用一个机器周期,用于延时或程序指令的对齐setpn_iR;置位标志,即将某一位置1 clrwdtmova,001d;lowlevel2.5ms(284cycle)mova_sR13,a;[(4*69)+5]*1=281lead_code_04:mova,70dmovm_acc,alead_code_05:nopsdzm_accjmplead_code_05sdza_sR13jmplead_code_04clrwdtszfg_Repeat;checkRepeatkey jmpRepeat_codemova,001d;lowlevel2.0ms(227cycle) mova_sR13,a;[(4*55)+5]*1=225lead_code_06:mova,53dmovm_acc,alead_code_07:nopsdzm_accjmplead_code_07sdza_sR13jmplead_code_06clrwdtnop2;------------------------ ;;客户码编译:cusnec_code:mova,002dmova_sR13,amoVa,oFFseta_customeR_1 moVm_mp0,acustom_pRo:mova,008dmova_sR11,a;8databitnopcustom_bit_blclrpn_iRmova,20dcustom_bit_bl_1:sdzm_accjmpcustom_bit_bl_1clrwdtnopcustom_bit_bh:setpn_iR;0.56ms->63cycle;[(3*20)+2]=62;00.56ms->63c ycle;11.68ms->191cyclenoprrm_indiRect1;mova,18dszm_indiRect1.7;mova,61dcustom_bit_bh_0:sdzm_accjmpcustom_bit_bh_0clrwdtsdza_sR11jmpcustom_bit_blincm_mp0sdza_sR13jmpcustom_pRo;;---------------------------;;数据码编译:data6nec_bit:mova,002dmova_sR13,adata_pRo: mova,008dmova_sR11,anopdata_bit_bl: clrpn_iRmova,20ddata_bit_bl_1: sdzm_acc jmpdata_bit_bl_1 clrwdtnopdata_bit_bh: setpn_iRnoprra_Rem_code; mova,18dsza_Rem_code.7 mova,61ddata_bit_bh_0:;8databit;0.53ms->60cycle;[(3*19)+2]= 59;00.53ms->60cycle;11.58ms->179cyclesdzm_accjmpdata_bit_bh_0clrwdtsdza_sR11jmpdata_bit_blcpla_Rem_codesdza_sR13jmpdata_pRo;0.53ms->60cycleclrpn_iR;[(3*19)+2]=59mova,20ddata_bit_bl_2:sdzm_accjmpdata_bit_bl_2clrwdtsetpn_iR;---Framedelaytimeprocess---mova,004d;Repetitiontime=108ms(12286cycle)mova_sR13,a;scankey=2471cycle;sendcode=7349cycleFdtp_loop_01:;12286-2471-7349=2466mova,152d;[(4*152)+5]*4=2452movm_acc,aFdtp_loop_02:nopsdzm_accjmpFdtp_loop_02clrwdtsdza_sR13jmpFdtp_loop_01mova,3dmovm_acc,aFdtp_loop_03:sdzm_accjmpFdtp_loop_03nop2ret;--------------------------------;;重复码编译:Repeat_code:;0.56ms->63cycleclrpn_iR;[(3*20)+2]=62mova,19dRep_bit_bl_3:sdzm_accjmpRep_bit_bl_3clrwdtsetpn_iR;---RepeatFramedelaytimeprocess--- mova,016dmova_sR13,aRep_delay_02:mova,130dmovm_acc,aRep_delay_03:nopsdzm_accjmpRep_delay_03clrwdtsdza_sR13jmpRep_delay_02mova,07d。
NEC协议的遥控器参考代码

NEC协议的遥控器参考代码下面是一个简单的NEC协议遥控器的参考代码。
```c#include <IRremote.h>//定义红外发射器的引脚#define IR_LED_PIN 3//定义红外接收器的引脚#define IR_RECEIVE_PIN 2IRsend irsend(IR_LED_PIN);IRrecv irrecv(IR_RECEIVE_PIN);decode_results results;void setu//初始化串口Serial.begin(9600);//初始化红外接收器irrecv.enableIRIn(;void loo//检查是否有红外信号收到if (irrecv.decode(&results))//打印红外编码Serial.print("Received NEC code: 0x"); Serial.println(results.value, HEX);//根据红外编码执行对应的操作switch (results.value)case 0xFFA25D: // 遥控器上的按键1//执行按键1的操作Serial.println("Button 1 pressed"); break;case 0xFF629D: // 遥控器上的按键2//执行按键2的操作Serial.println("Button 2 pressed"); break;case 0xFFE21D: // 遥控器上的按键3//执行按键3的操作Serial.println("Button 3 pressed"); break;//添加其他按键的处理逻辑default://未识别的红外编码Serial.println("Unknown button");break;}//继续等待下一个红外信号irrecv.resume(;}```这段代码使用了IRremote库来进行红外通信。
红外遥控协议分析之:NEC协议

红外遥控编码传输协议生产厂家对红外遥控的编码做了严格的规范,目前国内外主流的红外遥控编码传输协议有十多种,如NEC、Philips RC-5、Philips RC-6、Philips RC-MM、Philips RECS80、 RCA、X-Sat、ITT、JVC、Sharp、Nokia NRC17和Sony SIRC等。
国内最常用的规范有两种:NEC和Sony SIRC。
这两种规范的调制方式分别为:PPM(脉冲间隔调制)和PWM(脉冲宽度调制)。
谈到这两个概念,我需要具体讲解一下,因为我在网上查阅相关资料时甚是郁闷,好多说法相互矛盾。
有说NEC属于PWM的因为它的脉宽不同,PPM的脉宽是固定的。
而细心地朋友如果探究到NEC的典型芯片的芯片手册时,会发现上面这种说法是错误的。
比如UPD6121这款红外远程控制芯片的调制方式为PPM。
后来终于在一家国外的网站上找到了能够自圆其说的解释。
个人认为比较正确,拿来和大家分享。
要想认清红外遥控编码传输协议的具体内容,我想还是先捡其重点来讲一下,编码规范中最重要的当属调制这部分了。
而主流的调制方式有两种分别为PPM和PWM,当然其他还有好几种,这里先不讲解,免得糊涂了。
本文就先介绍下PPM和PWM的区别。
PPM(Pulse Position Modulation),其实更加准确的说法应该是PDM(Pulse Distance Modulation)即脉冲间隔调制:上图为典型编码规范NEC协议的调制图,为PPM调制。
可以看出不管是“0”还是“1”,有高频调制波的地方(下文称其为脉冲)其宽度都是相同的位560us,而脉冲间的间隔则是不同的:“1”时为(2.25ms-560us),“0”时为(1.12ms-560us)。
由此得来PPM的称号。
再来看下PWM的调制波形吧:显然可以看出,“1”的脉冲宽度为1.2ms,“0”的为600us。
而脉冲间隔不管是“0”还是“1”,均为600us。
NEC协议的红外遥控器驱动程序

N E C协议的红外遥控器驱动程序Hessen was revised in January 2021是不是觉得红外遥控+51单片机是绝妙组合但是在编程时才发现超级纠结其实也没那么纠结,自己摸索摸索,总能找出办法来的。
本程序占用了51单片机的定时器0以及中断1两个资源,为的是使单片机能接收到每一个红外脉冲信号,一个都不能少。
如果舍不得用这两个资源,还有另一种查询的办法,就是不一定每个信号都能收到,可自己琢磨一下。
需要全套NEC协议红外遥控器资料的,到网上找,到处都有,而且很全。
另外,对着资料写程序如果实在写不出,可以找个示波器,把波形录下来好好研究研究。
毕竟有些时候资料会过时,只要里面有一点东西变化了,程序就完全不一样了。
这种弯路,尽量少走。
本程序只是头文件,具体到应用上还要各位自己动脑筋了,希望对大家有所帮助。
共同学习,共同进步!/******************************************************************用于NEC协议的遥控器,主控器为51单片机。
用户码8位,分布于2-17个脉冲;按键码8位,分布于18-33个脉冲。
皆为前8原码,后8反码。
注意:本驱动占用51单片机的外部中断1以及定时器0两个资源,编程时注意不要再乱动这两个资源。
*******************************************************************/ #include<>#define uchar unsigned char#define uint unsigned intuchar nec_flag=0;//nec_flag:遥控码的标志位。
0:无信号;1、2:信号采集;3、可用信号uchar nec_num=0;//nec_num:红外码的序号uint nec_time=0;//nec_time:定时器的计时次数nec_time*250usuchar nec_cod[2]={0,1};//遥控器的编号,编号0为原码,编号1为反码uchar nec_dat[2]={0,1};//遥控器的数据,数据0为原码,数据1为反码#ifndef __INF_NEC__#define __INF_NEC__extern void nec_init();extern void nec_act();#endifvoid nec_init() //外中断1及定时器0的初始化函数{TMOD=(TMOD&0xf0)|0x02; //定时器0模式2,8位自动重装TH0=0x19;TL0=0x19; //晶振,计数230次,大概时间250usET0=1;TR0=0; //定时器0使能,先关着IT1=1;EX1=1; //外部中断1使能,用来接收红外信号EA=1; //开总中断}void nec_act()//按键功能程序{if((nec_dat[0]==~nec_dat[1])&&(nec_flag==3)){switch(nec_dat[0]){case 69: break;case 70: break;case 71: break;case 68:break;case 64:break;case 67:break;case 7:break;case 21:break;case 9:break;case 22:break;case 25:break;case 13:break;case 12:break;case 24:break;case 94:break;case 8:break;case 28:break;case 90:break;case 66:break;case 82:break;case 74:break;}}}void timer0(void) interrupt 1{nec_time++;if(nec_time>1000)//长时间无红外遥控信号时关定时器{nec_time=0;nec_num=0;nec_flag=0;TR0=0;}}void exint1(void) interrupt 2{uint intime=0;//intime:为了不打扰计时器工作,所以用intime把nec_time提出来intime=nec_time;nec_time=0;//nec_time置0,准备计数if(nec_num==0)TR0=1;//开定时器,开始计数if(nec_num==1){if((intime>50)&&(intime<60))nec_flag=1;}if(nec_num==2){if((intime>2)&&(intime<11))nec_flag=2;}if(nec_flag==2){if((nec_num>=2)&&(nec_num<=9)){if((intime>2)&&(intime<6))nec_cod[0]=nec_cod[0]&~(0x01<<(nec_nu m-2));elseif((intime>7)&&(intime<11))nec_cod[0]=nec_cod[0]|(0x01<<(nec_num-2));}if((nec_num>=10)&&(nec_num<=17)){if((intime>2)&&(intime<6))nec_cod[1]=nec_cod[1]&~(0x01<<(nec_nu m-10));elseif((intime>7)&&(intime<11))nec_cod[1]=nec_cod[1]|(0x01<<(nec_num-10));}if((nec_num>=18)&&(nec_num<=25)){if((intime>2)&&(intime<6))nec_dat[0]=nec_dat[0]&~(0x01<<(nec_nu m-18));elseif((intime>7)&&(intime<11))nec_dat[0]=nec_dat[0]|(0x01<<(nec_num-18));}if((nec_num>=26)&&(nec_num<=33)){if((intime>2)&&(intime<6))nec_dat[1]=nec_dat[1]&~(0x01<<(nec_nu m-26));elseif((intime>7)&&(intime<11))nec_dat[1]=nec_dat[1]|(0x01<<(nec_num-26));}}nec_num++;if(nec_num>35){nec_num=35;nec_flag=3;}}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
是不是觉得红外遥控+51单片机是绝妙组合?但是在编程时才发现超级纠结?其实也没那么纠结,自己摸索摸索,总能找出办法来的。
本程序占用了51单片机的定时器0以及中断1两个资源,为的是使单片机能接收到每一个红外脉冲信号,一个都不能少。
如果舍不得用这两个资源,还有另一种查询的办法,就是不一定每个信号都能收到,可自己琢磨一下。
需要全套NEC协议红外遥控器资料的,到网上找,到处都有,而且很全。
另外,对着资料写程序如果实在写不出,可以找个示波器,把波形录下来好好研究研究。
毕竟有些时候资料会过时,只要里面有一点东西变化了,程序就完全不一样了。
这种弯路,尽量少走。
本程序只是头文件,具体到应用上还要各位自己动脑筋了,希望对大家有所帮助。
共同学习,共同进步!
/******************************************************************
INF_NEC.h
用于NEC协议的遥控器,主控器为51单片机。
用户码8位,分布于2-17个脉冲;
按键码8位,分布于18-33个脉冲。
皆为前8原码,后8反码。
注意:本驱动占用51单片机的外部中断1以及定时器0两个资源,编程时注意
不要再乱动这两个资源。
*******************************************************************/
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar nec_flag=0;//nec_flag:遥控码的标志位。
0:无信号;1、2:信号采集;3、可用信号uchar nec_num=0;//nec_num:红外码的序号
uint nec_time=0;//nec_time:定时器的计时次数nec_time*250us
uchar nec_cod[2]={0,1};//遥控器的编号,编号0为原码,编号1为反码
uchar nec_dat[2]={0,1};//遥控器的数据,数据0为原码,数据1为反码
#ifndef __INF_NEC__
#define __INF_NEC__
extern void nec_init();
extern void nec_act();
#endif
void nec_init() //外中断1及定时器0的初始化函数
{
TMOD=(TMOD&0xf0)|0x02; //定时器0模式2,8位自动重装
TH0=0x19;
TL0=0x19; //11.0592MHz晶振,计数230次,大概时间250us
ET0=1;TR0=0; //定时器0使能,先关着
IT1=1;EX1=1; //外部中断1使能,用来接收红外信号
EA=1; //开总中断
}
void nec_act()//按键功能程序
{
if((nec_dat[0]==~nec_dat[1])&&(nec_flag==3))
{
switch(nec_dat[0])
{
case 69: break;
case 70: break;
case 71: break;
case 68:break;
case 64:break;
case 67:break;
case 7:break;
case 21:break;
case 9:break;
case 22:break;
case 25:break;
case 13:break;
case 12:break;
case 24:break;
case 94:break;
case 8:break;
case 28:break;
case 90:break;
case 66:break;
case 82:break;
case 74:break;
}
}
}
void timer0(void) interrupt 1
{
nec_time++;
if(nec_time>1000)//长时间无红外遥控信号时关定时器
{
nec_time=0;nec_num=0;nec_flag=0;TR0=0;
}
}
void exint1(void) interrupt 2
{
uint intime=0;//intime:为了不打扰计时器工作,所以用intime把nec_time提出来intime=nec_time;nec_time=0;//nec_time置0,准备计数
if(nec_num==0)TR0=1;//开定时器,开始计数
if(nec_num==1){if((intime>50)&&(intime<60))nec_flag=1;}
if(nec_num==2){if((intime>2)&&(intime<11))nec_flag=2;}
if(nec_flag==2)
{
if((nec_num>=2)&&(nec_num<=9))
{
if((intime>2)&&(intime<6))nec_cod[0]=nec_cod[0]&~(0x01<<(nec_num-2));
else if((intime>7)&&(intime<11))nec_cod[0]=nec_cod[0]|(0x01<<(nec_num-2));
}
if((nec_num>=10)&&(nec_num<=17))
{
if((intime>2)&&(intime<6))nec_cod[1]=nec_cod[1]&~(0x01<<(nec_num-10));
else if((intime>7)&&(intime<11))nec_cod[1]=nec_cod[1]|(0x01<<(nec_num-10));
}
if((nec_num>=18)&&(nec_num<=25))
{
if((intime>2)&&(intime<6))nec_dat[0]=nec_dat[0]&~(0x01<<(nec_num-18));
else if((intime>7)&&(intime<11))nec_dat[0]=nec_dat[0]|(0x01<<(nec_num-18));
}
if((nec_num>=26)&&(nec_num<=33))
{
if((intime>2)&&(intime<6))nec_dat[1]=nec_dat[1]&~(0x01<<(nec_num-26));
else if((intime>7)&&(intime<11))nec_dat[1]=nec_dat[1]|(0x01<<(nec_num-26));
}
}
nec_num++;if(nec_num>35){nec_num=35;nec_flag=3;}
}
如有侵权请联系告知删除,感谢你们的配合!
如有侵权请联系告知删除,感谢你们的配合!。