求51单片机红外遥控器(电视遥控或者其他的红外遥控器)解码C程序!要数码管显示键码值的!

2025-01-08 23:30:13
推荐回答(3个)
回答1:

主函数
#include
#include
#define NOP() _nop_() /* 定义空指令 */

//译码器管脚定义
sbit LS138A=P2^2; //管脚定义
sbit LS138B=P2^3;
sbit LS138C=P2^4;

//此表为 LED 的字模, 共阴数码管 0-9 -
unsigned char code Disp_Tab[] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};

unsigned long LedOut[5],LedNumVal;
extern unsigned char IRCOM[7];

void delay(unsigned int i); //函数声名
void display(unsigned char Key_Val);
extern void IRInit(); //extern 是引用IR.C中的函数

main()
{
IRInit();
while(1)
{
//显示红外键码
display(IRCOM[2]);
}

键值读取函数:::::::

/********************************************************************************
* 描述: *
* 数码管显示 遥控键值读取器 *
* *
*****************************************************************************8**/
#include
sbit IRIN = P3^2; //红外接收器数据线

void IRdelay(char x); //x*0.14MS
void beep();
unsigned char IRCOM[7];
extern unsigned char Y0;
extern void display(unsigned char Key_Val);
/*******************************************************************/
void IRInit()
{
IE |= 0x81; //允许总中断中断,使能 INT0 外部中断
TCON |= 0x01; //触发方式为脉冲负边沿触发

IRIN=1; //I/O口初始化
}
/**********************************************************/
void IR_IN(void) interrupt 0
{
unsigned char j,k,N=0;
EX0 = 0;

IRdelay(5);
if (IRIN==1)
{ EX0 =1;
return;
}
//确认IR信号出现
while (!IRIN) //等IR变为高电平,跳过9ms的前导低电平信号。
{IRdelay(1);}
for (j=0;j<4;j++) //收集四组数据
{
for (k=0;k<8;k++) //每组数据有8位
{
while (IRIN) //等 IR 变为低电平,跳过4.5ms的前导高电平信号。
{IRdelay(1);}
while (!IRIN) //等 IR 变为高电平
{IRdelay(1);}
while (IRIN) //计算IR高电平时长
{
IRdelay(1);
N++;
if (N>=30)
{ EX0=1;
return;} //0.14ms计数过长自动离开。
} //高电平计数完毕
IRCOM[j]=IRCOM[j] >> 1; //数据最高位补“0”
if (N>=8) {IRCOM[j] = IRCOM[j] | 0x80;} //数据最高位补“1”
N=0;
}//end for k

}//end for j

if (IRCOM[2]!=~IRCOM[3])
{ EX0=1;
return;

}
EX0 = 1;
}

/**********************************************************/
void IRdelay(unsigned char x) //x*0.14MS
{
unsigned char i;
while(x--)
{
for (i = 0; i<13; i++) {}
}
}
仅供参考!!!

回答2:

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

程序名称: 将遥控接收头接收到的按键编 码通过数码管显示出来 说明:能解码的遥控编码必须是NEC 的6 221/6121/6222编码方式 同时也可以解9012 9018编码方式 注明: 单片机使用12M晶体

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

#include #include #include #define uint unsigned int #define uchar unsigned char #define _Nop() _nop_() #define TURE 1 #define FALSE 0

unsigned char irtime;//红外用全局变量

bit irpro_ok,irok; unsigned char IRcord[4]; unsigned char irdata[33]; void ShowString (unsigned char line,cha r *ptr);

//////////////////////////////////////////////

void Delay(unsigned char mS); void Ir_work(void); void Ircordpro(void);

void tim0_isr (void) interrupt 1 using 1//定时器0中断服务函数 { irtime ; }

void ex0_isr (void) interrupt 0 using 0//外部中断0服务函数 { static unsigned char i; static bit startflag;

if(startflag){ if(irtime<63&&irtime>=33)//引导码 TC90 12的头码 i=0; irdata[i]=irtime; irtime=0; i ; if(i==33){ irok=1; i=0; } } else{ irtime=0; startflag=1; } }

void TIM0init(void)//定时器0初始化 { TMOD=0x02;//定时器0工作方式2,TH0 是重装值,TL0是初值 TH0=0x00;//reload value TL0=0x00;//initial value ET0=1;//开中断 TR0=1; }

void EX0init(void) { IT0 = 1; // Configure interrupt 0 for fallin g edge on /INT0 (P3.2) EX0 = 1; // Enable EX0 Interrupt EA = 1; }

void Ircordpro(void)//红外码值处理函数 { unsigned char i, j, k=1; unsigned char cord,value;

for(i=0;i<4;i ){//处理4个字节 for(j=1;j<=8;j ){ //处理1个字节8位 cord=irdata[k]; value=value>>1; if(cord>7) value=value|0x80; //大于某值 为1 k ; } IRcord[i]=value; value=0; } irpro_ok=1;//处理完毕标志位置1 } void main(void) { EX0init(); // Enable Global Interrupt Flag TIM0init();

while(1){//主循环 if(irok){ Ircordpro(); irok=0; } if(irpro_ok){ /*遥控成功接收*/P0=0X00;/*IRcord[2];*/} } }

回答3:

这个属于一定的商业秘密了,