--------------------发射程序---------------------------
#define uchar unsigned char
//just for convenience
#define uint unsigned int
#define ulong unsigned long
#include
//the standard head file
#include
static bit OP;
//the turn on or off of the IR led
int count; //delay count
int endcount; //terminate count
unsigned char flag;
//the flag of IR emission
sbit P1_3=P1^3; // IR
pin
extern char iraddr1;
//the first byte of the hex address
extern char iraddr2;
//the second byte of the hex address
extern char p_irdata;
//IR DATA
int test_mode;//0 mean constant period,1 mean
constant duty cycle
int logic_high;
int logic0_low;
int logic1_low;
int lead_high;
int lead_low;
void SendIRdata();
void IR_transfer(char iraddr1,char iraddr2,char
p_irdata);
//void delay_us(int i);
//void timer0_int_13us(void);
void IR_transfer(char iraddr1,char iraddr2,char
p_irdata)
{
count=0;
flag=0;
OP=0;
P1_3=0;
EA = 1; // permit cpu
interrupt
timer0_int_13us();
//TMOD = 0x11; //set timer0&1 to the HEX
mode of 1
//ET0 = 1; //permit
timer0 interrupt
//TH0 = 0xFF;
//TL0 = 0x7d; //set timer0 have a
interrup per 13us(38k/2)
//TR0 = 1;
//start count
test_mode=0;
//0 mean constant period,1 mean constant duty cycle
logic_high=43;
//43=0%;34=-20%,52=+20%;21=-50%,65=+50%
lead_high=903;
//625(-10%),556(-20%),486(-30%),417(-40%),347(-50%)
//695(0%)
//764(+10%),834(+20%),903(+30%),973(+40%),1000(+45%)
if(test_mode==0)
{
lead_low=350;//1045 is standard,
logic1_low=173-logic_high; //173 is standard,
logic0_low=87-logic_high; //87 is standard,
}
else
{
lead_low=lead_high/2+1; //+1 为了补偿中断子程序中取反操作与赋值操作的时间差
logic0_low=logic_high+1;
logic1_low=logic_high*3+1;
}
do{
//ET0=0;
//TR0=1;
//EA=1;
SendIRdata();
//TR0=0;
//ET0=0;
//EA=0;
delay_100ms(5);
}
while(1);
}
void SendIRdata()
{
int i;
char irdata;
//---------------send the
starting code of 9ms---------------------
endcount=lead_high; //690 is standard,
flag=1;
count=0;
//ET0=1;TR0=1;
do{}while(count
//---------------send the ending
code of 4.5ms--------------------
//ET0=0;TR0=0;
endcount=lead_low; //
flag=0;
count=0;
//ET0=1;TR0=1;
do{}while(count
//ET0=0;TR0=0;
//-----------------send the first 8 bit of the
address----------------
irdata=iraddr1;
for(i=0;i<8;i++)
{
//---------------first,send 0.56ms ir wave(38k),voltage
high-----------
//ET0=1;TR0=1;
endcount=logic_high;
flag=1;
count=0;
do{}while(count
//----------------stop
send ir wave,voltage low-----------------
if(irdata-(irdata/2)*2) //judge the last binary bit is 1 or 0
{
endcount=logic1_low;
//1 mean wide low level
}
else
{
endcount=logic0_low;
//0 mean narrow low level
}
flag=0;
count=0;
do{}while(count
irdata=irdata>>1;
}
//-------------send the last 8 bit of the HEX
address-----------------
irdata=iraddr2;
for(i=0;i<8;i++)
{
endcount=logic_high;
flag=1;
count=0;
do{}while(count
if(irdata-(irdata/2)*2)
{endcount=logic1_low;}
else
{endcount=logic0_low;}
flag=0;
count=0;
do{}while(count
irdata=irdata>>1;
}
//------------------send 8 bit data---------------------
irdata=p_irdata;
for(i=0;i<8;i++)
{
endcount=logic_high;
flag=1;
count=0;
do{}while(count
if(irdata-(irdata/2)*2)
{endcount=logic1_low;}
else
{endcount=logic0_low;}
flag=0;
count=0;
do{}while(count
irdata=irdata>>1;
}
//---------------------send the 8 bit complement
data----------------------
irdata=~p_irdata;
for(i=0;i<8;i++)
{
endcount=logic_high;
flag=1;
count=0;
do{}while(count
if(irdata-(irdata/2)*2)
{endcount=logic1_low;}
else
{endcount=logic0_low;}
flag=0;
count=0;
do{}while(count
irdata=irdata>>1;
}
endcount=logic_high;
flag=1;
count=0;
do{}while(count
flag=0;
P1_3=0;
//ET0 = 0;
}