NEC协议的红外遥控程序(任意IO口)

2018-11-30 20:02

/**************************************************************************** NEC_INF_S.h

用于NEC协议的遥控器与51单片机结合的驱动程序,可用任意IO口,不占用中断资源。 用户码8位,分布于2-17个脉冲;按键码8位,分布于18-33个脉冲。 皆为前8原码,后8反码,并且接收数据时低位在前,高位在后。 主控器为51单片机,晶振频率为11.0592MHz。

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

#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

if(nec_dat==1) { if((i>=1)&&(i<=7))nec_id[0]=nec_id[0]|(0x01<=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=1)&&(i<=7))nec_id[0]=nec_id[0]&(~(0x01<=8)&&(i<=15))nec_id[1]=nec_id[1]&(~(0x01<=16)&&(i<=23))nec_data[0]=nec_data[0]&(~(0x01<=24)&&(i<=31))nec_data[1]=nec_data[1]&(~(0x01<

void nec_getdat()//扫描式读遥控器的数据,可能有时会扫描不到 { uint num=0; if(nec_dat==1){num=0;while((nec_dat==1)&&(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;//必须归零,非常重要

}

图1-1 红外遥控器按键对应的接收码

1-2 本程序使用的遥控器 图

注意:本程序适用于NEC协议的红外遥控器,但是每一款遥控器的按键码可能不同,需要自己找到自己手头上遥控器的按键码资料来对程序进行改动。本程序没有占用单片机的中断资源,但是直接导致的问题就是单片机不一定能接收到每次遥控器发来的信号,即其相应的灵敏度大打折扣了,不过对于一般小程序来说妨碍不大,建议在较大的程序中或者遥控部分非常重要的程序中使用带中断的红外驱动。记得把nec_act();这个函数放在主函数中的大循环中,要不断查询才能接收到红外信号的。


NEC协议的红外遥控程序(任意IO口).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:国家开放大学2017开放英语1

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: