|
#include <reg52.h>
#define u8 unsigned char
#define u16 unsigned int
static u16 count; //延時(shí)計(jì)數(shù)器
static u16 endcount; //終止延時(shí)計(jì)數(shù)
static u8 flag; //紅外發(fā)送標(biāo)志
sbit P1_0=P1^0;//紅外發(fā)射管的亮滅控制位
u8 iraddr; //地址碼
void SendIRdata(u8 p_irdata);//發(fā)送子函數(shù)
void delay();
void main(void)
{
count = 0;
flag = 0; //無載波
P1_0 = 1; //不亮
EA = 1; //允許CPU中斷
TMOD = 0x10; //設(shè)定時(shí)器0和1為16位模式1
ET1 = 1; //定時(shí)器0中斷允許
TH1 = 0xFF;
TL1 = 0xE6; //設(shè)定時(shí)值0為38K 也就是每隔26us中斷一次
TR1 = 1;//開始計(jì)數(shù)
iraddr=0;//自定義的一個(gè)地址
do{
delay();
SendIRdata(0x45);
}while(1);
}
void timeint(void) interrupt 3//定時(shí)器1中斷處理
{
TH1=0xFF;//載入初值
TL1=0xE6; //設(shè)定時(shí)值為38K 也就是每隔26us中斷一次
count++;
if (flag==1)//如果是待發(fā)送的有效數(shù)據(jù)flag=1,就在此產(chǎn)生載波(亮滅交變)
{
P1_0=!P1_0;
}
else
{
P1_0 = 0
}
}
void SendIRdata(u8 p_irdata)
{
u8 i;
u8 irdata=p_irdata;
//發(fā)送9ms的起始碼,并是載波模式有效
endcount=223;
flag=1;
count=0;
while(count<endcount);//等待中斷,控制亮滅交變的總時(shí)間為9ms
//發(fā)送4.5ms的結(jié)果碼,并是載波模式無效
endcount=117;
flag=0;
count=0;
do
{
}while(count<endcount);
//發(fā)送十六位地址的前八位
irdata=~iraddr;
for(i=0;i<8;i++)
{//一個(gè)周期里規(guī)定先以高電平開始,在以低電平結(jié)束。先發(fā)送0.56ms的38KHZ“1”的紅外波(即編碼中0.56ms的高電平)
endcount=10;
flag=1;
count=0;
do{}while(count<endcount);
//停止發(fā)送紅外信號(hào)(即編碼中的低電平)
if(irdata&0x01) //判斷二進(jìn)制數(shù)個(gè)位為1還是0
{
endcount=41;
} //1為寬的高電平1.68ms
else
{
endcount=15;
} //0為窄的高電平0.56ms
flag=0;
count=0;
while(count<endcount);
irdata=irdata>>1;//依次取位
}
//發(fā)送十六位地址的后八位
irdata=iraddr; //此處已經(jīng)是地址的反碼
for(i=0;i<8;i++)
{
endcount=10;
flag=1;
count=0;
while(count<endcount);
if(irdata&0x01)
{
endcount=41;
}
else
{
endcount=15;
}
flag=0;
count=0;
do{}while(count<endcount);
irdata=irdata>>1;
}
//發(fā)送八位數(shù)據(jù)
irdata=~p_irdata;
for(i=0;i<8;i++)
{
endcount=10;
flag=1;
count=0;
while(count<endcount);
if(irdata&0x01)
{
endcount=41;
}
else
{
endcount=15;
}
flag=0;
count=0;
do{}while(count<endcount);
irdata=irdata>>1;
}
//發(fā)送八位數(shù)據(jù)的反碼
irdata=p_irdata; //要將數(shù)據(jù)位取反
for(i=0;i<8;i++)
{
endcount=10;
flag=1;
count=0;
while(count<endcount);
if(irdata&0x01)
{
endcount=41;
}
else
{
endcount=15;
}
flag=0;
count=0;
while(count<endcount);
irdata=irdata>>1;
}
endcount=10;
flag=1;
count=0;
do{}while(count<endcount);
flag=0;
}
void delay()
{
u16 i;
u8 j;
for(i=0;i<400;i++)
for(j=0;j<100;j++);
}
不知道·哪里出問題了
|
|