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