1.想法

我的整体想法是通过红外接收头对遥控器发射的信号波形进行记录,然后使用的时候只要根据记录的数据发射就可以了。

现在手头上的模块包括以下三个部分组成。

QQ图片20180701082957.jpg

所以,可以通过单片机对接收到的信号进行记录,因为没有示波器,所以整个过程中对信号的分析只能通过串口上传给电脑人工分析了。

2.困境

在作出想法过后便遇到了困境,那就是单片机资源不足的问题。目前板上的单片机为stc11f02e,具有256字节的内部ram,2K的Flash,没有外部扩展ram,两个定时器,外接的晶振为22.1184MHz。重点是256字节的ram可能不够用,因为程序运行需要一定的ram,那么剩下的只有200字节左右,如果一次红外信号需要记录的数据大于200字节,那么接下来的编程将愈发困难。

通过翻阅资料可以得知,红外信号的编码采用PWM(脉冲宽度调制)后一般通过38KHz的载波在空中传播。其中红外接收头一般情况下为高电平,只有接收到红外信号时为低电平,如下图。

20150525181754064.gif

而红外信号中的1个位是通过“一低一高”两个电平来表示,并且根据其中低电平与高电平持续的时间长短来区分是0还是1。例如低电平200us高电平200us为“0”,低电平200us高电平400us为“1”,具体的时间规定需要根据解析出的信号来分析。

(1)那么一次红外信号的数据信息单片机可以存储下吗?

我们知道,单片机可以对外部信号的输入产生中断,然后在中断处理程序中做一些操作。而外部信号产生的中断方式一般为两种:下降沿触发低电平触发。所以结合上面红外信号编码的基本知识可以得知,红外信号的每一个“0与1”都会有一个低电平,也即出现一个下降沿,所以我们可以对这个下降沿或者低电平进行计数,就可以得出一次红外发射包含多少位的数据了。

接下来的需要解决的问题是将红外接收管的信号引脚接入单片机的外部中断引脚。幸运的是,这两个引脚在电路板上已经连接起来了,不需要我们通过跳线,根据stc11f系列的芯片手册,P3.3为外部中断1的信号源。

QQ图片20180701082957.jpg

所以,如何对红外接收的信号进行计数就很简单了,在程序中开启外部中断1,然后设置触发方式为下降沿触发(防止低电平检测时间不够),然后在中断服务程序中计数就可以了。经过计数,一次红外信号接收到的数据长度为106位,所以单片机的ram大小是满足要求的。

(2)红外信号的0和1真的是像资料中所说的那样编码的吗?

目前我们对资料中的编码方式持怀疑态度。第一,我们需要验证红外信号中的编码有几种;第二,这几种编码的是如何实现的。

为了验证红外信号中编码有几种,我们首先对红外信号每个位的时间长度进行统计。这里想到的办法是开启另外一个定时器,每次进入下降沿中断时,开始对该位进行统计,在进入下一次下降沿中断时停止统计。代码如下,其中flag用来标记当前统计的是第几位信号,并将定时器溢出的次数放入数组time_counter中。这里需要注意的是定时器溢出周期的把握,如果定时器溢出周期太大,那么得到的溢出次数将会很小,不具有分辨力;如果溢出周期太小,那么计数的值将会溢出,数据将会不正确。经过反复试验,定时器溢出周期为100us时比较合适。


flag = 0;

void tm0_isr() interrupt 1 using 1
{
    TL0 = T1MS;                     
    TH0 = T1MS >> 8;                

    if(flag < 160)
    {
        time_counter[flag] += 1;
    }
}

void INT1_1838_Isr() interrupt 2
{
    flag ++ ;
    TR0 = 1;
}

通过以上程序,串口得到的数据如下。

QQ图片20180701082957.jpg

通过数据分析可以得出,除去第一位与最后一位,中间的数据只有两种,第一种是0x16大小的,第二种是0x0B大小的。我们可以对多次不同的键值进行测试,可以发现第一位始终不变,大小为0x86左右,中间的数据只由0x160x0B组成,最后一位数据始终在变化,为什么最后一位数据会不断变化呢?

因为我们是对下降沿进行统计的。最后一位数据只有一个下降沿,所以它没有统计结束的标识。所以最后一位数据只是一个低电平,但这个低电平持续多长时间,我们不得而知。

现在我们知道每一位的时间长度,那么每一个位的时间中有多长时间的低电平,多长时间的高电平呢?

我们还可以通过程序进行分析。其实我们只需要对程序进行很小的改动,在定时器每次溢出中断时,对信号接收引脚进行检测,将引脚的低电平和高电平次数分别进行统计即可,这样我们就可以知道在一个位的数据中,低电平和高电平定时器各溢出了几次,进而转换为时间。

再次对实验数据分析,结果如下。

数据位结果分析
第1位先低电平89次,后高电平45次
0x16长度位先低电平6次,后高电平16次
0x0B长度为先低电平6次,后高电平5次
最后1位低电平6次,没有高电平

测试使用的空调是AUX的,结合之前查阅的格力空调的资料(见末尾参阅资料),可以整理出AUX空调的红外编码调制的方式。

  • 起始位:低电平9000us+高电平4500us
  • 1:低电平600us+高电平1600us
  • 0:低电平600us+高电平600us
  • 结束位(可能是数据位):低电平600us

至此,AUX空调红外编码的基本规则已经清楚,接下来只需要将每个键值的编码记录下,然后通过单片机调制发射出去即可。

3.参阅资料

格力空调遥控器红外编码透析(长码)
红外遥控器工作原理