(合同范本)NEC协议的红外遥控器驱动程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
NEC协议的红
外遥控器按
键对应数字
一览
(合同范本)NEC协议的红外遥控器驱动程序
是不是觉得红外遥控+51单片机是绝妙组合?但是在编程时才发现超级纠结?其实也没那么纠结,自己摸索摸索,总能找出办法来的。
本程序占用了51单片机的定时器0以及中断1两个资源,为的是使单片机能接收到每一个红外脉冲信号,一个都不能少。如果舍不得用这两个资源,还有另一种查询的办法,就是不一定每个信号都能收到,可自己琢磨一下。
需要全套NEC协议红外遥控器资料的,到网上找,到处都有,而且很全。
另外,对着资料写程序如果实在写不出,可以找个示波器,把波形录下来好好研究研
究。毕竟有些时候资料会过时,只要里面有一点东西变化了,程序就完全不一样了。这种弯路,尽量少走。
本程序只是头文件,具体到应用上还要各位自己动脑筋了,希望对大家有所帮助。共同学习,共同进步!
69
**************************************************************** INF_NEC.h
用于NEC 协议的遥控器,主控器为 51单片机。用户码8位,分布于2-17个脉冲; 按键码8位,分布于18-33个脉冲。皆为前8原码,后8反码。
注意:本驱动占用 51单片机的外部中断1以及定时器0两个资源,编程时注意 不要再乱动这两个资源。
***************************************************************** #include
#define uint unsigned int
#ifndef __INF_NEC__
#define __INF_NEC__ extern void nec_init();
extern void nec_act();
#endif
void nec_init()
{
TMOD=(TMOD&0xf0)|0x02; // 定时器0模式2, 8位自动重装
TH0=0x19;
TL0=0x19;
ET0=1;TR0=0;
IT1=1;EX1=1;
EA=1;
} void nec_act()//按键功能程
序 {
if((nec_dat[0]==~nec_dat[1])&&(nec_flag==3))
{
switch(nec_dat[0])
{
case 69: break;
case 70: break;
case 71: break;
case 68:break;
case 64:break;
case 67:break;
case 7:break;
case 21:break;
/**
**/
uchar nec_flag=0;//nec_flag:遥控码的标志位。
uchar nec_num=0;//nec_num:红夕卜码的序号
uint nec_time=0;//nec_time:定时器的计时次数
0:无信号; 1、 nectime*250us 2:信号采集;3、可用信号 uchar nec_cod[2]={0,1};//
uchar nec_dat[2]={0,1};//
遥控器的编号,编号 遥控器的数据,数据 0为原码,编号 0为原码,数据
1为反码 1为反码 〃外中断1及定时器0的初始化函数 //11.0592MHz 晶振,计数 230次,大概时间 250us 〃定时器0使能,先关着 〃外部中断1使能,用来接收红外信号 〃开总中断
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;
}
}
}
void timer0(void) interrupt 1
(
nec_time++;
if(nec_time>1000)//长时间无红外遥控信号时关定时器
(
nec_time=0;nec_num=0;nec_flag=0;TR0=0;
}
}
void exint1(void) interrupt 2
(
uint intime=0;//intime:为了不打扰计时器工作,所以用intime把nec_time提出来
intime=nec_time;nec_time=0;//nec_time 置0,准备计数
if(nec_num==0)TR0=1;//开定时器,开始计数
if(nec_num==1){if((intime>50)&&(intime<60))nec_flag=1;}
if(nec_num==2){if((intime>2)&&(intime<11))nec_flag=2;}
if(nec_flag==2)
{
if((nec_num>=2)&&(nec_num<=9))
(
if((intime>2)&&(intime<6))nec_cod[0]=nec_cod[0]&~(0x01<<(nec_num-2));
else if((intime>7)&&(intime<11))nec_cod[0]=nec_cod[0]|(0x01<<(nec_num-2));
}
if((nec_num>=10)&&(nec_num<=17))
(
if((intime>2)&&(intime<6))nec_cod[1]=nec_cod[1]&~(0x01<<(nec_num-10));
else if((intime>7)&&(intime<11))nec_cod[1]=nec_cod[1]|(0x01<<(nec_num-10));
}
if((nec_num>=18)&&(nec_num<=25))
(