stc8单片机通过红外模拟成空调遥控器
文章分为红外遥控原理和单片机实现两个部分
1 红外遥控原理
通常红外遥控为了提高抗干扰性能和降低电源消耗,红外遥控器常用载波的方式传送二进制编码,常用的载波频率为38kHz,这是由发射端所使用的455kHz晶振来决定的。在发射端要对晶振进行整数分频,分频系数一般取12,所以455kHz÷12≈37.9kHz≈38kHz。也有一些遥控系统采用36kHz、40 kHz、56 kHz等,一般由发射端晶振的振荡频率来决定。所以,通常的红外遥控器是将遥控信号(二进制脉冲码)调制在38KHz的载波上,经缓冲放大后送至红外发光二极管,转化为红外信号发射出去的。
再看看这个图
这个图的意思是说:发射端要发送38KHZ的信号,这个时间是0.56ms然后不发送这个38KHZ的载波信号,那么发射端要是想传送信号0或者1就是靠这个不发38Khz载波的间隔来决定的.间隔时间长的1.125ms就是表示的1,间隔0.56ms就是表示的0.
接收端把碰到的载波信号认为是低电平,或者也可以说是接收到载波信号之后把接收端的输出引脚拉低了,没有接收到载波信号就会持续为1.这样一来就完成了传送和接收的整个过程.
2 单片机实现
首先是先用定时器定时13us的时间
void hwsend_init() //13us 11.0592
{
AUXR |= 0x80; //定时器时钟1T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0x70; //设置定时初值
TH0 = 0xFF; //设置定时初值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0 = 1; //定时器0中断允许
EA = 1; //允许CPU中断
iraddr1=0;
iraddr2=0;
count = 0;
sflag = 0;
OP = 0;
Infr = 1;
}
然后就是发送空调码了,美的的空调码格式是先发送4.5ms的载波,然后发4.5ms(非载波),再加上6个字节的空调遥控码再加上4.5ms的开始载波信号,再发送5.2ms的连接码(非载波)然后把6个字节的空调遥控吗再次发送最后加上4.5ms的载波信号,以上是开启空调的格式,关闭的格式也是一样的.下面贴上代码
void SendIRdataOpen() //发送开启空调码
{
unsigned char irdata;
unsigned char dw,sw;
endcount=60; //发送4.5ms的起始码 692
sflag=1;
hwcount=0;
while(hwcount<endcount);
endcount=60; //发送4.5ms的结果码 346
sflag=0;
hwcount=0;
while(hwcount<endcount); //发送十六位地址的前八位
//开始发送那6个字节的数据
for(dw=0; dw<6; dw++)
{
irdata=irdataOpen[dw];
for(sw=0; sw<8; sw++)
{
endcount=44; //先发送0.56ms的38KHZ红外波(即编码中0.56ms的高电平)
sflag=1;
count=0;
while(count<endcount); //停止发送红外信号(即编码中的高电平)
if(irdata-(irdata/2)*2) //判断二进制数个位为1还是0
{
endcount=130; //1为宽的高电平 低电平时间为1.69ms
}
else
{
endcount=44; //0为窄的高电平 低电平时间为0.56ms
}
sflag=0;
count=0;
while(count<endcount);
irdata=irdata>>1;
} //发送十六位地址的后八位
}
//发送结束码
endcount=44; //先发送0.56ms的38KHZ红外波(即编码中0.56ms的高电平)
sflag=1;
count=0;
while(count<endcount); //停止发送红外信号(即编码中的高电平)
//发送连接码
endcount=80; //发送5.2ms的连接码
sflag=0;
hwcount=0;
while(hwcount<endcount);
//再发一遍
endcount=60; //发送4.5ms的起始码 692
sflag=1;
hwcount=0;
while(hwcount<endcount);
endcount=60; //发送4.5ms的结果码 346
sflag=0;
hwcount=0;
while(hwcount<endcount); //发送十六位地址的前八位
for(dw=0; dw<6; dw++)
{
irdata=irdataOpen[dw];
for(sw=0; sw<8; sw++)
{
endcount=44; //先发送0.56ms的38KHZ红外波(即编码中0.56ms的高电平)
sflag=1;
count=0;
while(count<endcount); //停止发送红外信号(即编码中的高电平)
if(irdata-(irdata/2)*2) //判断二进制数个位为1还是0
{
endcount=130; //1为宽的高电平 低电平时间为1.69ms
}
else
{
endcount=44; //0为窄的高电平 低电平时间为0.56ms
}
sflag=0;
count=0;
while(count<endcount);
irdata=irdata>>1;
} //发送十六位地址的后八位
}
//发送结束码
endcount=44; //先发送0.56ms的38KHZ红外波(即编码中0.56ms的高电平)
sflag=1;
count=0;
while(count<endcount);
sflag=0;
}
好了,空调遥控的核心的知识就是这些,我没有提到接收的部分,接收的部分其实就用外部中断来统计高电平的时间就可以了.这是全部的代码,点击这里,进行查看.