51F单片机实现红外遥控器HT6221发射的红外编码解码程序

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。


//-------------------------------------------------------------------------
//IR RX DECODE ROUTINE
//AUTHER : Xu Sen
//CREATE DATE : May 28. 2007
//Modified : May 30. 2007
//Version : V1.0
//THE RECEIVE CODE IS THE INVERSION OF THE TRANSMITTE CODE
//-------------------------------------------------------------------------
#include "c8051F310.h"
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long

//----------------------------------------------------------------------------
//DEFINE THE BIT "0 " AND BIT "1" FOR DECODE
#define ST_UP 0xBB8
#define ST_DW 0x792
#define RST_UP 0x792
#define RST_DW 0x540
#define BIT1_UP 0x540
#define BIT1_DW 0x300
#define BIT0_UP 0x300
#define BIT0_DW 0x8C

//---------------------------------------------------------------------------
//DEFINE THE USER COMPOSITE CODE AND KEY VALUE
#define USER_CODE 0xEB31
#define K1 0x0
#define K2 0x1
#define K3 0x2
#define K4 0x3



sbit LED = P3^4;
//--------------------------------------------------------------------------
//GOBAL VARIABLES
//--------------------------------------------------------------------------
bit flag = 0;
bit note = 0;
bit STB; //start bit
uint ADR; //adress code
//uint adr_temp;
uchar i = 0; //indicate the bit position
uchar DATA; //key value
//uchar data_temp;
//uchar indata_temp;
uchar INDATA; //inversion of key value
//uint timer0_temp;
uint code constant[16] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80,
0x100,0x200,0x400,0x800,0x1000,0x2000,
0x4000,0x8000 };


//--------------------------------------------------------------------------
//delay function
//---------------------------------------------------------------------------
void delay(uint j)
{
uint t;
for(t=0;t}
//------------------------------------------------------------------------------
uint temp(uchar a, uchar b)
{
uint t;
t = (uint)a;
t <= 8;
t = t | (uint)b;
return t;
}


//---------------------------------------------------------------------------
void key1_process(void)
{
LED = 0;
delay(10000);
}

//----------------------------------------------------------------------------
void key2_process(void)
{

delay(10000);
LED = 1;

}
//--------------------------------------------------------------------

---------
void key3_process(void)
{
LED = 0;
delay(10000);
}
//-------------------------------------------------------------------------------
void key4_process(void)
{

delay(10000);
LED = 1;


}


//-------------------------------------------------------------------------------
//CONFIG THE OSC TO 24.5MHZ
//-------------------------------------------------------------------------------
void osc_ini(void)
{
OSCICN = 0x83;
}

//--------------------------------------------------------------------------------
//TIMER0 INITIALISE FOR PULSE WIDTH MEASURE
//16BIT MODE, EXTERNAL INT0 ENABLE FOR CONTROL THE TIMER0
//-------------------------------------------------------------------------------
void timer0_ini(void)
{
TCON = 0x11;
TMOD = 0x41;
CKCON = 0x02;
}

//---------------------------------------------------------------------------------
//INTERRUPT INITIAL
//INT0 IS CFG AT P0.1, HIGH LEVEL ENABLE, EDGE TRIGERRED
//-----------------------------------------------------------------------------------
void int0_ini(void)
{
IT01CF = 0x09;
IE = 0x81;
flag = 1;

}
//------------------------------------------------------------------------------------
//PORT IO INITIAL
//CFG THE LED AND IR DATA IO AS PUSH-PULL MODE
//------------------------------------------------------------------------------------
void port_ini(void)
{
XBR1 = 0x40;
P0MDOUT = 0x04;
P3MDOUT = 0x10;
P0SKIP = 0x02; ;



}
//------------------------------------------------------------------------------------
//DISABLE WDT
//-----------------------------------------------------------------------------------
void disable_WDT(void)
{
PCA0MD &= ~0x40;
}



//------------------------------------------------------------------------------------
//the main routine
//------------------------------------------------------------------------------------

void main(void)
{
//--------SYSTEM INITIALISATION-----------------------------------------------------

osc_ini();
disable_WDT();
timer0_ini();
port_ini();
int0_ini();

//--------------------------------------------------------------------------------------

while(1)
{
if(ADR == USER_CODE)
{
if(K1==DATA & K1==~INDATA)
key1_process();
else if(K2=

=DATA & K2==~INDATA)
key2_process();
else if(K3==DATA & K3==~INDATA)
key3_process();
else if(K4==DATA & K4==~INDATA)
key4_process();
else;
}




}



}

//------------------------------------------------------------------------------------------
//INTERRUPT ROUTINE,CHECK THE TX DATA IS LOW OR HIGH
//JUDGE THE TX BIT IS "1" OR "0" AND GET THE USER CODE AND KEY VALUE
//USER VALUE IS SAVED IN ADR REG; KEY VALUE AND IT'S INVERSION IS SAVE
//IN DATA AND INDATA REGS
//------------------------------------------------------------------------------------------
void int0_isr(void) interrupt 0
{
if(flag)
{
flag = 0;
note = 1;
TH0 = 0;
TL0 = 0;
return;
}
if(note)
{
note = 0;
TH0 = 0; //A NEW DATA TRANSFER BEGIN SHOULD CLEAR THE TH0 AND THL0
TL0 = 0; //FIRST IN ORDER TO GET THE CORECT PULSE WDITH TIME
return;
}
if(~STB)
{

if(temp(TH0,TL0)ST_DW) //START TIMING 4.3mS{
STB = 1;
TL0 = 0;
TH0 = 0;
DATA = 0; //CLEAR THE DATA REGS FOR THE NEW RECEICED DATA BITS
INDATA = 0;
ADR = 0;
}

else
{
TH0 = 0;
TL0 = 0;
}

}
else
{

if(temp(TH0,TL0)BIT0_DW) //RECEIVE BIT "0"
{
i++;
TH0 = 0;
TL0 = 0;
if(i==32) //DATA TRANSFER IS FINISHED
{
i = 0; //CLEAR COUNTER i and START BIT
STB = 0; //FOR ANOTHER TRANSMISSION

}

}
else if(temp(TH0,TL0)BIT1_DW) //RECEIVE BIT "1"
{
i++;
TH0 = 0;
TL0 = 0;
if(i<17)
ADR = ADR | constant[i-1];
else if (i>16 & i<25)
DATA = DATA | (uchar)constant[i-17];
else if (i>24 & i<33)
{
INDATA = INDATA | (uchar)constant[i-25];
if(i==32) //TO

TAL 4 BYTE ARE RECEIVED
{
i = 0; //CLEAR COUNTER i and START BIT
STB = 0; //FOR ANOTHER TRANSMISSION

}
}
else;


}
else;

}

}




相关文档
最新文档