NEC协议的遥控器参考代码

合集下载

红外遥控协议标准(NEC RC5)及编程

红外遥控协议标准(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 .SECTION 'DATA'a_REM_CODE DB ? ;KEY DATA CODEa_CUSTOMER_1 DB ? ;遥控器头码(客户码)低八位a_CUSTOMER_2 DB ? ;遥控器头码(客户码)高八位#define CUS_6221_1 00110100b ;1234H#define CUS_6221_2 00010010b ;@------------------------------------------------NEC_CODE .SECTION 'CODE';@************* SUBROUTINE[xx]: Send Remote Code ************;;遥控码发送:SEND_REMOTE_CODE:clr WDT ;清除进位标志,检测遥控发送的有效的按键SZ fg_SendActive ;SZ表示以0结尾的字符串JMP READY_SEND ;跳转到READY_SEND模块retREADY_SEND:NEC_CODE:mov A,a_KEY_NUM ;将数值发送到寄存器A中,直接寻址mov M_TBLP,ATABRDL a_REM_CODE ;查表专用指令;读取遥控头码(客户码)低八位数值 MOV A,CUS_6221_1MOV a_CUSTOMER_1,AMOV A,CUS_6221_2MOV a_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遥控码。

RC-5码和NEC码技术标准

RC-5码和NEC码技术标准

RC-5码和NEC码技术标准本技术标准包含RC-5码和NEC码两部分RC-5码遥控器技术标准特点:5位地址码和6位命令码(RC5X为7位)Bi-phase coding(即Manchester coding)双相编码载波频率为36KHz每发一位数据的时间是1.778ms(即36KHz频率下64个周期)载波调制:图1 逻辑0和1的波形RC-5码协议使用36KHz频率的双相编码红外载波。

每一位的时间都是等长的为1.778ms,并且每一位中有一半的时间为36KHz载波的高电平,另一半为低电平,如图1所示逻辑“1”和“0”的波形。

当为逻辑“0”时,其前一半时间为高电平;而为逻辑“1”时,后一半时间为高电平。

注:如果前后两位的值相同,在发第二个值时需要转换电平;如果前后两位值不同,在发第二个值时不需要转换电平。

这样叫作双向编码。

协议:下图是一个RC-5码的逻辑队列。

图2 RC-5码的逻辑队列前两位为开始位,并且必须设为逻辑1。

注意当红外接收器接收到开始位时,1bit时间的一半已经过去了。

对于扩展的RC-5码,开始位S2用来作为命令码的第六位,即共有7位的命令码。

第三位是翻转位,当一个键值发出然后再按下时该位会取反,这样接收器就会知道该键是一直按下,还是被重新按下了。

接下来的5位是IR设备地址码,地址码按从MSB到LSB发送;跟着地址码的是6位命令码,命令码也是从MSB开始发送。

这样一个消息由14bit组成,一个消息的周期加起来是25ms。

但有时一个消息的周期会短一点,因为S1前一半是空转,而且命令码的最后一位的后一半也可能是空转的。

图3 连续按键波形如果常按某一键,消息则会每隔114ms发送一次,并且在这些消息中bit3翻转位会一直维持同一值,如图3。

图4 完整的波形每一帧数据之前都有16bit等待时间和2bit扫描时间,如图4所示。

采用的RC5码遥控器的波形图如下:(MENU按键)键值命令:以下是根据RC-5码键值命令标准确定的海信电视机RC-5码遥控器键值规范。

NEC遥控编码解析

NEC遥控编码解析

一NEC编码介绍(来自网络)NEC编码的一帧(通常按一下遥控器按钮所发送的数据)由引导码、地址码及数据码组成,,如下图所示,把地址码及数据码取反的作用是加强数据的正确性。

引导码及数据的定义如下图所示,当一直按住一个按钮的时候,会隔110ms 左右发一次引导码(重复),并不带任何数据以下是用示波器采集到的一直按住某个按钮时的波形:按一下按钮的波形:二解析程序预置条件:每125us产生一次中断用于计数算法介绍:统计两个下降沿之间的计数个数。

如果是在103左右,则认为收到了引导码。

如果是18左右,则认为接收到逻辑1;如果在9左右,则认为接收到逻辑0。

在125us的定时器中断服务程序中,调用如下程序进行编码解析。

uchar port_recv_cnt = 120;uchar port_recv_bit_cnt = 0;uchar port_recv_low_cnt = 0;bit port_recv_low_flg = 0;bit port_recv_high_flg = 0;bit port_recv_start_flg = 0;unsigned long idata port_recv_data = 0;/* NTC remote receive programme */void Port_Recv_Proc(){uchar oposite_data1;uchar oposite_data2;if(0 == PORT_RECV_LINE){if(!port_recv_low_flg){// 第一次接收低电平,开始计数器计数port_recv_cnt = 0;port_recv_low_flg = 1;port_recv_high_flg = 0;return;}else if(!port_recv_high_flg){// 低电平计时port_recv_cnt++;return;}else{// 低->高->低,认为一次计数完成,清除标志,下次重新计时port_recv_low_flg = 0;if(port_recv_cnt >= 120) //异常{port_recv_high_flg = 0;port_recv_start_flg = 0;return;}else if(port_recv_cnt >= 100) // 引导码{port_recv_start_flg = 1;port_recv_bit_cnt = 0;return;}else if(port_recv_cnt >= 40) //异常{port_recv_bit_cnt = 0;port_recv_start_flg = 0;return;}else if(port_recv_cnt >= 15) // 逻辑1{port_recv_data = port_recv_data << 1;port_recv_data = port_recv_data | 0x01;port_recv_bit_cnt++;}else //逻辑0{port_recv_data = port_recv_data << 1;port_recv_bit_cnt ++;}// 一共有32bitif(port_recv_bit_cnt < 32){return;}else{port_recv_bit_cnt = 0;if(!port_recv_start_flg) // 一定要有引导码{return;}port_recv_start_flg = 0;oposite_data1 = ((port_recv_data & 0xff00)/0xff) ; //数据位校验oposite_data2 = (port_recv_data & 0xff);if(0xff != (oposite_data2 +oposite_data1) )return;remote_key_cnt = oposite_data2;}}}else{if(!port_recv_low_flg)return;port_recv_cnt++; // 高电平计数port_recv_high_flg = 1;return;}}。

nec遥控协议

nec遥控协议
款遥控器的按键码可能不同,需要自己找到自己手头上遥控 器的按键码资料来对程序进行改动。本程序没有占用单片机 的中断资源,但是直接导致的问题就是单片机不一定能接收 到每次遥控器发来的信号,即其相应的灵敏度大打折扣了, 不过对于一般小程序来说妨碍不大,建议在较大的程序中或 者遥控部分非常重要的程序中使用带中断的红外驱动。记得 把nec_act();这个函数放在主函数中的大循环中,要不断查
原码,第二个为反码
ucharnec_status=0;//遥控器的按键状态信息。0:无按
键;1:一次按键;2:连续按键
ucharnec_actflag=0;//用于带到主函数里的按键响应
标志。0:不动作;1:动作
#ifndefnec_inF_s_h
#definenec_inF_s_h
voidnec_init();//初始化函数,注意一定要拉高,拉
就错误了
(
nec_dat=1;
}
voidnec_delay()//延时0.8ms左右,要求要非常精确,
这是正确读数的关键
(
uchari;
for(i=0;i }
/*voidnec_act()//按键响应程序,根据自己需要写
(
nec_getdat() ; //先扫描一遍红外信号
if(nec_actflag==1)//如果是正确的红外信号才处理,
(
num=0;while((nec_dat==0)
if(nec_dat==1)
(
nec_delay();nec_delay();nec_delay();
if(nec_dat==1)nec_status=2;
else
(
nec_id[0]=0x01;

NEC协议的红外遥控器驱动程序

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编码方式)
如果发现按键响应异常,需要对按键映射进行修正,确保按键功 能正常。
抗干扰优化
通过调整编码方式或增加滤波器等手段,增强遥控器的抗干扰能 力。
测试结果与结论
测试结果显示,该红外线遥控器 在有效范围内能够正常工作,按 键响应准确,抗干扰能力较强。
通过调试优化,进一步提高了遥 控器的性能和稳定性。
结论:该红外线遥控器符合预期 要求,可以用于实际应用中。
在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控制代码(客户)

NEC控制代码(客户)

Response: At the time of a failureA1H 98H 01H xxH 02H DATA01 DATA02 CKS(*1) (*2) (*4) (*3)-----------------------------------------------------------------------------------------------------------------------------------------附:NEC /NP4100+ 4100W+控制代码下表显示了PC 功能及其相关代码数据。

功能代码数据电源打开:02H 00H 00H 00H 00H 02H电源关闭:02H 01H 00H 00H 00H 03H输入选择COMPUTER 1:02H 03H 00H 00H 02H 01H 01H 09H输入选择COMPUTER 2:02H 03H 00H 00H 02H 01H 02H 0AH输入选择COMPUTER 3(DVI或HDMI):02H 03H 00H 00H 02H 01H 1AH 22H输入选择COMPONENT:02H 03H 00H 00H 02H 01H 10H 18H输入选择VIDEO:02H 03H 00H 00H 02H 01H 06H 0EH输入选择S-VIDEO:02H 03H 00H 00H 02H 01H 0BH 13H影像静音打开02H 10H 00H 00H 00H 12H影像静音关闭02H 11H 00H 00H 00H 13H声音静音打开02H 12H 00H 00H 00H 14H声音静音关闭02H 13H 00H 00H 00H 15H屏幕静音打开02H 14H 00H 00H 00H 16H屏幕静音关闭02H 15H 00H 00H 00H 17H高宽比自动:03H 10H 00H 00H 05H 18H 00H 00H 05H 00H 35H4:3 :03H 10H 00H 00H 05H 18H 00H 00H 00H 00H 30H16:9 :03H 10H 00H 00H 05H 18H 00H 00H 02H 00H 32H15:9 03H 10H 00H 00H 05H 18H 00H 00H 0DH 00H 3DH16:10 03H 10H 00H 00H 05H 18H 00H 00H 0CH 00H 3CH横向放大(仅适用于NP4100+) 03H 10H 00H 00H 05H 18H 00H 00H 03H 00H 33H字符框(仅适用于NP4100W+) 03H 10H 00H 00H 05H 18H 00H 00H 01H 00H 31H自然03H 10H 00H 00H 05H 18H 00H 00H 0EH 00H 3EHAUTO ADJUST 02H 0FH 00H 00H 02H 05H 00H 18H附:NEC RS-232串口和8针园口控制口接线示意图(NEC机型有2种波特率:19200、38400,对应说明书)增加11年机型控制命令(示例:NP-M350X+,NEC机器各控制命令一样,只是增加了LAN 和HDMI输入选择等控制命令)----------------LAN、USB。

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

NEC协议的遥控器参考代码
/****************************************************************************
NEC_INF_S.h
用于NEC协议的遥控器与51单片机结合的驱动程序,可用任意IO口,不占用中断资源。

用户码8位,分布于2-17个脉冲;按键码8位,分布于18-33个脉冲。

皆为前8原码,后8反码,并且接收数据时低位在前,高位在后。

主控器为51单片机,晶振频率为11.0592MHz。

注意:由于未用中断,所以信号的接收是靠查询方式的,可能会漏掉若干次红外信号。

*****************************************************************************/
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
#define N 5000//用于在while()中循环时超时跳出的数的上限,可小刀
sbit nec_dat=P3^3;//任意IO口,用到哪个自己改哪个
uchar nec_id[2]={0};//遥控器的编码号,第一个为原码,第二个为反码
uchar nec_data[2]={0};//遥控器的命令号,第一个为原码,第二个为反码
uchar nec_status=0;//遥控器的按键状态信息。

0:无按键;1:一次按键;2:连续按键uchar nec_actflag=0;//用于带到主函数里的按键响应标志。

0:不动作;1:动作
#ifndef NEC_INF_S_h
#define NEC_INF_S_h
void nec_init();//初始化函数,注意一定要拉高,拉低就错误了
void nec_delay();//延时0.8ms左右,要求要非常精确,这是正确读数的关键void nec_pulsedat();//读第2到第32个脉冲,第一个脉冲已判定
void nec_getdat();//扫描式读遥控器的数据,可能有时会扫描不到
#endif
void nec_init()//初始化函数,注意一定要拉高,拉低就错误了
{
nec_dat=1;
}
void nec_delay()//延时0.8ms左右,要求要非常精确,这是正确读数的关键{
uchar i;
for(i=0;i<245;i++);
}
/*void nec_act()//按键响应程序,根据自己需要写
{
nec_getdat();//先扫描一遍红外信号
if(nec_actflag==1)//如果是正确的红外信号才处理,否则跳过
{
if(nec_data[0]==~nec_data[1])//验证所接收数据是否正确
{
switch(nec_data[0])//自己写所需要的程序段
{
case 69:/*点亮二极管,让蜂鸣器发声,什么都行,写在这里*/ break;
case 70: /*以下都一样,对应的遥控器按键见图1-1*/ 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;
}
}
nec_actflag=0;
}
}*/
void nec_pulsedat()//读第2到第32个脉冲,第一个脉冲已判定{
uchar i=0;
uint num=0;
for(i=1;i<32;i++)
{
num=0;while((nec_dat==0)&&(num<N))num++;
nec_delay();
if(nec_dat==1)
{
if((i>=1)&&(i<=7))nec_id[0]=nec_id[0]|(0x01<<i);
if((i>=8)&&(i<=15))nec_id[1]=nec_id[1]|(0x01<<(i-8));
if((i>=16)&&(i<=23))nec_data[0]=nec_data[0]|(0x01<<(i-16));
if((i>=24)&&(i<=31))nec_data[1]=nec_data[1]|(0x01<<(i-24));
num=0;while((nec_dat==1)&&(num<N))num++;
}
else
{
if((i>=1)&&(i<=7))nec_id[0]=nec_id[0]&(~(0x01<<i));
if((i>=8)&&(i<=15))nec_id[1]=nec_id[1]&(~(0x01<<i-8));
if((i>=16)&&(i<=23))nec_data[0]=nec_data[0]&(~(0x01<<i-16));
if((i>=24)&&(i<=31))nec_data[1]=nec_data[1]&(~(0x01<<i-24));
}
}
}
void nec_getdat()//扫描式读遥控器的数据,可能有时会扫描不到
{
uint num=0;
if(nec_dat==1){num=0;while((nec_dat==1)&&(num<N))num++;} nec_delay();
if(nec_dat==0)
{
nec_delay();
if(nec_dat==0)
{
nec_delay();
if(nec_dat==0)
{
nec_delay();
if(nec_dat==0)
{
nec_status=1;
num=0;while((nec_dat==0)&&(num<N))num++;
num=0;while((nec_dat==1)&&(num<N))num++;
}
}
}
}
if(nec_status==1)
{
num=0;while((nec_dat==0)&&(num<N))num++;
nec_delay();
if(nec_dat==1)
{
nec_delay();nec_delay();nec_delay();
if(nec_dat==1)nec_status=2;
else
{
nec_id[0]=0x01;
nec_pulsedat();
}
}
else
{
nec_id[0]=0x00;
nec_pulsedat();
}
nec_actflag=1;//一次按键的响应程序
}
if(nec_status==2)
{
//持续按键的响应程序
}
nec_status=0;//必须归零,非常重要}。

相关文档
最新文档