/*功能说明:红外发射,用于遥控复制或自制发射器*/
//这里采用1T周期的stc15w102单片机,烧录时晶振选33,要在精准选外部晶振的芯片
#include
#include
#include
#define uint unsigned int
#define uchar unsigned char
sbit s1=P3^5; //红外LED
void Delay13us()//@33MHz //产生载波38KHZ
{
unsigned char a;
for(a=104;a>0;a--);
}
void Delay3000ms()//@33MHz 单片机小精灵生成,STC软件生成较长延时时测试不准
{
unsigned char a,b,c,d;
for(d=186;d>0;d--)
for(c=14;c>0;c--)
for(b=86;b>0;b--)
for(a=109;a>0;a--);
}
void L(){ //红外0 以低电平0.565ms,高电平0.565ms表示0
uchar j;
for (j=0;j<43;j++) {s1=~s1;Delay13us();} //低电平0.565ms载波,模拟38KHZ
for (j=0;j<43;j++) {s1=1;s1=1;Delay13us();} //高电平0.565ms无载波
}
void H(){ //红外1;以低电平0.565ms,高电平1685表示1
uchar j;
for (j=0;j<43;j++) {s1=~s1;Delay13us();} //低电平0.565ms载波,模拟38KHZ
for (j=0;j<129;j++) {s1=1;Delay13us();} //高电平1685ms无载波
}
void bit_8(uchar num){ //发送一个8位数据
uchar j;
for (j=0;j<8;j++){ if((num&0x01)==0x00)L(); //低位先发
else H();
num=num>>1;
}
}
void main(void)
{
uint j;
while(1){
Delay3000ms();
//以下开始发送
for (j=0;j<692;j++) {s1=~s1;Delay13us();}//载波发送9ms的起始码
for (j=0;j<346;j++) {s1=1;Delay13us();}//无载波发送4.5ms的结果码
bit_8(0x00);
bit_8(0xff);//前16位用户识别码
bit_8(0x15); //数据
bit_8(~0x15); //数据反码
for (j=0;j<44;j++) {s1=~s1;Delay13us();}//最后载波发送总的结束位
for (j=0;j<3076;j++) {s1=1;Delay13us();}//延时40ms,9ms+4.5ms+32位数据+结束位总共68ms,在延时会到108ms
//以下发送连发码,按键超过108ms时发送,不加也可
for (j=0;j<692;j++) {s1=~s1;Delay13us();}//载波发送9ms的起始码
for (j=0;j<173;j++) {s1=1;Delay13us();}//2.25ms
for (j=0;j<44;j++) {s1=~s1;Delay13us();}//结束位
for (j=0;j<7400;j++) {s1=1;Delay13us();}//在延时96.2ms到108ms,在发送连发码
for (j=0;j<692;j++) {s1=~s1;Delay13us();}//载波发送9ms的起始码
for (j=0;j<173;j++) {s1=1;Delay13us();}//2.25ms
for (j=0;j<44;j++) {s1=~s1;Delay13us();}//结束位
for (j=0;j<7400;j++) {s1=1;Delay13us();}//在延时96.2ms到108ms,在发送连发码
}
}