当前位置:文档之家› NEC协议的红外遥控器驱动程序

NEC协议的红外遥控器驱动程序

是不是觉得

红外遥控+51单片机是绝妙组合?但是在编程时才发现超级纠结?其实也没那么纠结,自己摸索摸索,总能找出办法来的。

本程序占用了51单片机的定时器0以及中断1两个资源,为的是使单片机能接收到每一个红外脉冲信号,一个都不能少。如果舍不得用这两个资源,还有另一种查询的办法,就是不一定每个信号都能收到,可自己琢磨一下。

需要全套NEC协议红外遥控器资料的,到网上找,到处都有,而且很全。

另外,对着资料写程序如果实在写不出,可以找个示波器,把波形录下来好好研究研究。毕竟有些时候资料会过时,只要里面有一点东西变化了,程序就完全不一样了。这种弯路,尽量少走。

本程序只是头文件,具体到应用上还要各位自己动脑筋了,希望对大家有所帮助。共同学习,共同进步!

/********************************************************** ********

INF_NEC.h

用于NEC协议的遥控器,主控器为51单片机。用户码8位,分布于2-17个脉冲;

按键码8位,分布于18-33个脉冲。皆为前8原码,后8反码。

注意:本驱动占用51单片机的外部中断1以及定时器0两个资源,编程时注意

不要再乱动这两个资源。

*********************************************************** ********/

#include

#define uchar unsigned char

#define uint unsigned int

uchar nec_flag=0;//nec_flag:遥控码的标志位。0:无信号;1、2:信号采集;3、可用信号

uchar nec_num=0;//nec_num:红外码的序号

uint nec_time=0;//nec_time:定时器的计时次数nec_time*250us uchar nec_cod[2]={0,1};//遥控器的编号,编号0为原码,编号1为反码

uchar nec_dat[2]={0,1};//遥控器的数据,数据0为原码,数据1为反码

#ifndef __INF_NEC__

#define __INF_NEC__

extern void nec_init();

extern void nec_act();

#endif

void nec_init() //外中断1及定时器0的初始化函数{

TMOD=(TMOD&0xf0)|0x02; //定时器0模式2,8位自动重装

TH0=0x19;

TL0=0x19; //11.0592MHz晶振,计数230次,大概时间250us

ET0=1;TR0=0; //定时器0使能,先关着

IT1=1;EX1=1; //外部中断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;

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<<(ne c_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<<(ne c_num-10));

}

if((nec_num>=18)&&(nec_num<=25))

{

if((intime>2)&&(intime<6))nec_dat[0]=nec_dat[0]&~(0x01<< (nec_num-18));

else

if((intime>7)&&(intime<11))nec_dat[0]=nec_dat[0]|(0x01<<(ne c_num-18));

}

if((nec_num>=26)&&(nec_num<=33))

{

if((intime>2)&&(intime<6))nec_dat[1]=nec_dat[1]&~(0x01<< (nec_num-26));

else

if((intime>7)&&(intime<11))nec_dat[1]=nec_dat[1]|(0x01<<(ne c_num-26));

}

}

nec_num++;if(nec_num>35){nec_num=35;nec_flag=3;}

}

(学习的目的是增长知识,提高能力,相信一分耕耘一分收获,努力就一定可以获得应有的回报)

相关主题