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

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

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

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

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

另外,对着资料写程序如果实在写不出,可以找个示波器,把波形录下来好好研究研 究。毕竟有些时候资料会过时,

只要里面有一点东西变化了, 程序就完全不一样了。这种弯 路,尽量少走。

本程序只是头文件,具体到应用上还要各位自己动脑筋了,希望对大家有所帮助。共 同学习,共同进步! 69 70 71 68 64 67 07 21 09 22 25 13 12 24 94 08 28 90 66 82 74 NEC 协议的红 外遥控器按 键对应数字 一览

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

INF_NEC.h

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

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

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

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

#in clude #defi ne uchar un sig ned char

#defi ne uint un sig ned int

uchar nec_cod[2]={0,1};〃遥控器的编号,编号 uchar nec_dat[2]={0,1};〃遥控器的数据,数据 #ifndef __INF_NEC_

#defi ne __INF_NEC extern void n ec_i nit(); extern void n ec_act();

#en dif

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

{

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

//11.0592MHz 晶振,计数 230次,大概时间 250us

//定时器0使能,先关着

〃外部中断1使能,用来接收红外信号

〃开总中断

void nec_act()//按键功能程序

{

if(( nec_dat[0]==~ nec_dat[1]) &&(n ec_flag==3))

{

switch( nec_dat[0])

{

case 69: break;

case 70: break;

case 71: break;

case 68:break;

case 64:break; uchar nec_flag=0;//nec_flag:遥控码的标志位。 uchar nec_num=0;//nec_num:红外码的序号

uint nec_time=0;//nec_time:定时器的计时次数 0:无信号;1、2:信号采集;

3、可用信号 n ec_time*250us

0为原码,编号1为反码

0为原码,数据1为反码

TH0=0x19;

TL0=0x19; ET0=1;TR0=0; IT 1=1;EX 1=1; EA=1;

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 timerO(void) in terrupt 1

{

n ec_time++;

if(nec_time>1000)〃长时间无红外遥控信号时关定时器

{

n ec_time=0;nec_num=0;n ec_flag=0;TR0=0;

}

}

void exin t1(void) in terrupt 2

{

uint in time=0;//i ntime:为了不打扰计时器工作,所以用 in time把nec_time提出来in time=n ec_time ;n ec_time=0 ;//n ec_time 置 0,准备计数

if(nec_num==0)TR0=1;〃开定时器,开始计数

if(n ec_ num==1){if((i ntime>50) &&(in time<60)) nec_flag=1;}

if(n ec_ num==2){if((i ntime>2)&&(i ntime<11)) nec_flag=2;}

if(n ec_flag==2)

{

if((nec_num >=2 )&&(nec_num <=9))

{

相关主题