51单片机stc89c52遥控控制宿舍格力空调

简介

stc89c52rc控制宿舍空调,牌子是格力Q力

 

红外协议

这个协议不同牌子空调各有差异,但大差不差,可以自行去了解。我首先是了解NEC协议(B站江科大红外部分),然后发现空调用的不是这个协议,都是做了改动变成了自己的协议,格力遥控也有各种型号如YAPOF、YBOF等,我使用的应该是比较简单通用的一个。

参考了网上的各种文章大致了解了这个协议。内容如下:(如有错误还请指正)

通过38kHz(可能不一定38,接近38都行,没确切说法)红外(波长是940mm来着)发送信号。

顺序结构:

        1.起始码(9000us方波+4500us空闲)//这里的方波就是38kHz,占空比我用的50%,可以使用,有人说30%占空比,可以花几块钱买个遥控器自己看看波形(我是买了红外发射接收、遥控器和逻辑分析仪),空闲就是没频率。

        2.35位byte数据        //4个字节,多出来的三位是固定的010;

                                        //发0: 600us方波+600us空闲        发1:600us方波+1600us空闲

                                        //这600us也不是绝对的,看到很多文章各种各样的时间都有,不必太纠结,我是选了个比较方便实现的。

        3.连接码(600us方波+20 000us空闲)

        4.32位byte数据        //4字节数据  (数据的发送在我看来是地位先发的)

        5.结束码(600us方波+空闲)        //可以发个0或者1。

大致是这样,可能有出入的地方但不影响。

数据含义:        (按发送顺序来看)

1717bcd4099d49e39157951e9066dd95.png

至于那几个固定段内容是否统一这个我不清楚,至少我这个能识别出来。

下面是我的初始数据:

unsigned char Data1[5] = {0x09,0x09,0x20,0x50,0x02};
unsigned char Data2[4] = {0x00,0x20,0x00,0xE0};
//模式制冷,空调开,风速自动,温度25°,灯光开。

 

目前只能简单的打开空调,算是迈出了第一步。


现在实现了阶段性的功能,项目告一段落,现在展示一下功能:

555d05d45758440eae526ef3d19fce0e.jpeg

 

a6b5dbdb912d4947a41d30a6d222df58.jpeg

 放个发射的波形给大家看看:

b28be96c138c4d89b60f1f58c9a22d6b.png

 黑色的是38kHz方波比较密看不清。

 

软件部分

stc89c52rc 使用了它的三个定时器,搞来搞去搞得还比较恼火,Timer0定时方波38kHz,Timer1给方波持续时间计时(9000us、600us),Timer2实现串口通信(9600、1停止位、无校验)然后给串口套了个蓝牙(白嫖来的不用白不用)。晶振11.0592MHz。

至于为啥要用这么多定时器,我也不想的,刚开始做的时候只用了一个定时器来实现波形,结果发现波形频率怎么也上不来,后来才知道是因为时钟频率还是不够,用C语言在中断函数里随便写几行时间就超限了,所以频率上不来;后来就改成用两个定时器了,一个翻转一个计时。

只展示一点点:

//main函数,可能还存在一定问题,只控制了这几个常用的功能
int main(void)
{
    Uart_Init();
    IR_Init();
    while(1)
    {
        if(ReceiveFlag)
        {
            ReceiveFlag = 0;
            Uart_SendByte(ReceiveByte);        //发送一个字节,高位表示选项匹配
                                               //低位是要修改的数据,实现的比较简陋
            if((ReceiveByte & 0xF0) == 0x20)   //开关
            {
                Data1[0] &= 0xF7;
                Data1[0] |= (ReceiveByte & 0x08);
            }
            else if((ReceiveByte & 0xF0) == 0x40)   //温度
            {
                Data1[1] &= 0xF0;
                Data1[1] |= (ReceiveByte & 0x0F);
            }
            else if((ReceiveByte & 0xF0) == 0x10)   //模式
            {
                Data1[0] &= 0xF8;
                Data1[0] |= (ReceiveByte & 0x07);
            }
            
            else if((ReceiveByte & 0xF0) == 0x30)   //风速
            {
                Data1[0] &= 0xCF;
                Data1[0] |= ((ReceiveByte & 0xF3)<<4);
            }
            Data2[3] &= 0x0F;
            Data2[3] |= ((Data1[0] + Data1[1] + 0x0C) <<4);
            IR_SendCommand();
        }
    }
}

本人只是个菜鸟,有什么问题都欢迎提出来 ,下面是工程链接可以参考参考没写啥注释







落不落几/IR Gitee

https://www.alipan.com/s/75pE61UzmLE aliyun

 

  • 21
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值