简介
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。
大致是这样,可能有出入的地方但不影响。
数据含义: (按发送顺序来看)
至于那几个固定段内容是否统一这个我不清楚,至少我这个能识别出来。
下面是我的初始数据:
unsigned char Data1[5] = {0x09,0x09,0x20,0x50,0x02};
unsigned char Data2[4] = {0x00,0x20,0x00,0xE0};
//模式制冷,空调开,风速自动,温度25°,灯光开。
目前只能简单的打开空调,算是迈出了第一步。
现在实现了阶段性的功能,项目告一段落,现在展示一下功能:
放个发射的波形给大家看看:
黑色的是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