天天看点

stc8单片机控制美的空调stc8单片机通过红外模拟成空调遥控器

stc8单片机通过红外模拟成空调遥控器

文章分为红外遥控原理和单片机实现两个部分

1 红外遥控原理

通常红外遥控为了提高抗干扰性能和降低电源消耗,红外遥控器常用载波的方式传送二进制编码,常用的载波频率为38kHz,这是由发射端所使用的455kHz晶振来决定的。在发射端要对晶振进行整数分频,分频系数一般取12,所以455kHz÷12≈37.9kHz≈38kHz。也有一些遥控系统采用36kHz、40 kHz、56 kHz等,一般由发射端晶振的振荡频率来决定。所以,通常的红外遥控器是将遥控信号(二进制脉冲码)调制在38KHz的载波上,经缓冲放大后送至红外发光二极管,转化为红外信号发射出去的。

再看看这个图

stc8单片机控制美的空调stc8单片机通过红外模拟成空调遥控器

这个图的意思是说:发射端要发送38KHZ的信号,这个时间是0.56ms然后不发送这个38KHZ的载波信号,那么发射端要是想传送信号0或者1就是靠这个不发38Khz载波的间隔来决定的.间隔时间长的1.125ms就是表示的1,间隔0.56ms就是表示的0.

stc8单片机控制美的空调stc8单片机通过红外模拟成空调遥控器

接收端把碰到的载波信号认为是低电平,或者也可以说是接收到载波信号之后把接收端的输出引脚拉低了,没有接收到载波信号就会持续为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;
}
           

好了,空调遥控的核心的知识就是这些,我没有提到接收的部分,接收的部分其实就用外部中断来统计高电平的时间就可以了.这是全部的代码,点击这里,进行查看.

继续阅读