当前位置:文档之家› NEC协议的红外遥控程序(任意IO口)

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

/**************************************************************************** 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

nec_delay();

{

if((i>=1)&&(i<=7))nec_id[0]=nec_id[0]|(0x01<

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

}

else

{

if((i>=1)&&(i<=7))nec_id[0]=nec_id[0]&(~(0x01<

if((i>=8)&&(i<=15))nec_id[1]=nec_id[1]&(~(0x01<

if((i>=16)&&(i<=23))nec_data[0]=nec_data[0]&(~(0x01<

if((i>=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==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

num=0;while((nec_dat==1)&&(num

}

}

}

}

if(nec_status==1)

{

num=0;while((nec_dat==0)&&(num

相关主题