nec遥控协议
{
uchari=0;
uintnum=0;
for(i=1;i {
num=0;while((nec_dat==0)
nec_delay();
{
if((i>=1)
if((i>=8)
if((i>=16)
if((i>=24)
num=0;while((nec_dat==1)
}
else
{
if((i>=1)
if((i>=8)
(
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_pulsedat();
}
}
else
nec_id[0]=0x00;
编号:_______________
本资料为word版本,可以直接编辑和打印,感谢您的下载
甲 方:___________________
乙 方:___________________
日 期:___________________
nec
篇一:nec协议的红外遥控程序(任意io口)
/**************************************************
case94:break;
case8:break;
case28:break;
case90:break;
case66:break;
case82:break;
case74:break;
}
}
nec_actflag=0;
} }Baidu Nhomakorabea/
voidnec_pulsedat()//读第2到第32个脉冲,第一个
脉冲已判定
#definen5000//用于在while()中循环时超时跳出的数
的上限,可小刀
sbitnec_dat=p3A3;//任意io口,用到哪个自己改哪个
ucharnec_id[2]={0};//遥控器的编码号,第一个为原
码,第二个为反码
ucharnec_data[2]={0};//遥控器的命令号,第一个为
case71:break;
case68:break;
case64:break;
case67:break;
case7:break;
case21:break;
case9:break;
case22:break;
case25:break;
case13:break;
case12:break;
case24:break;
注意:由于未用中断,所以信号的接收是靠查询方式的, 可能会漏掉若干次红外信号。
***************************************************
**************************
#defineucharunsignedchar
#defineuintunsignedint
就错误了
(
nec_dat=1;
}
voidnec_delay()//延时0.8ms左右,要求要非常精确,
这是正确读数的关键
(
uchari;
for(i=0;i }
/*voidnec_act()//按键响应程序,根据自己需要写
(
nec_getdat() ; //先扫描一遍红外信号
if(nec_actflag==1)//如果是正确的红外信号才处理,
**************************
用于nec协议的遥控器与51单片机结合的驱动程序, 可用任意io口,不占用中断资源。用户码8位,分布于2-17个脉冲;按键码8位,分布于18-33个脉冲。
皆为前8原码,后8反码,并且接收数据时低位在前, 高位在后。
主控器为51单片机,晶振频率为11.0592mhz。
if((i>=16)
if((i>=24)
}
}
}
voidnec_getdat()//扫描式读遥控器的数据,可能有时
会扫描不到
(
uintnum=0;
if(nec_dat==1)(num=0;while((nec_dat==1)}
nec_delay();
if(nec_dat==0)
(
nec_delay();
原码,第二个为反码
ucharnec_status=0;//遥控器的按键状态信息。0:无按
键;1:一次按键;2:连续按键
ucharnec_actflag=0;//用于带到主函数里的按键响应
标志。0:不动作;1:动作
#ifndefnec_inF_s_h
#definenec_inF_s_h
voidnec_init();//初始化函数,注意一定要拉高,拉
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=0;while((nec_dat==1)
}
}
}
}
if(nec_status==1)
否则跳过
(
if(nec_data[0]==~nec_data[1])//验证所接收数据是
否正确
(
switch(nec_data[0])//自己写所需要的程序段
(
case69:/*点亮二极管,让蜂鸣器发声,什么都行,写
在这里*/break;case70:/*以下都一样,对应的遥控器按键
见图1-1*/break;
款遥控器的按键码可能不同,需要自己找到自己手头上遥控 器的按键码资料来对程序进行改动。本程序没有占用单片机 的中断资源,但是直接导致的问题就是单片机不一定能接收 到每次遥控器发来的信号,即其相应的灵敏度大打折扣了, 不过对于一般小程序来说妨碍不大,建议在较大的程序中或 者遥控部分非常重要的程序中使用带中断的红外驱动。记得 把nec_act();这个函数放在主函数中的大循环中,要不断查
低就错误了
voidnec_delay();//延时0.8ms左右,要求要非常精确,
这是正确读数的关键
voidnec_pulsedat();//读第2到第32个脉冲,第一个
脉冲已判定
voidnec_getdat();//扫描式读遥控器的数据,可能有
时会扫描不到
#endif
voidnec_init()//初始化函数,注意一定要拉高,拉低
nec_pulsedat();
}
nec_actflag=1;//一次按键的响应程序
}
if(nec_status==2)
{
//持续按键的响应程序
}
nec_status=0;//必须归零,非常重要
}
图1-1红外遥控器按键对应的接收码
1-2本程序使用的遥控器图
注意:本程序适用于nec协议的红外遥控器,但是每一