网上搜了“一年”竟然没有基于51单片机的美的R05D协议的红外发射控制,STM32倒是一大堆,但是不想换芯片。唯一找到一个代码51单片机红外发射功能(以遥控空调为例)-优快云博客,但是延时有问题每个_nop_()的延时竟然不一样,我专门买了逻辑分析仪来对照,引导码、数据1、数据0、分隔符每个和美的的协议都有几ms的误差,害得我一个一个去调,搞了一下午加一晚上终于搞好了成功控制了空调,我把代码分享出来。
这是main.c我测试用的,主程序自己改改就好,什么情况关、什么情况开,这里给出来尽量简单,方便大家调试
#include <stdio.h>
#include <intrins.h>
#include <reg52.h>
#include <public.h>
#include <control.h>
int a=2;
void main()
{
while(a>=1)
{
guan();
a--;
}
while(1);
}
这是public.h(和开头提到的博客中有变化的也就是这里,调整了for循环的次数,因为这里每个for循环用逻辑分析仪看出来,每个和美的的协议都有时间上的误差)
#include <stdio.h>
typedef unsigned char u8;
typedef unsigned short u16;
typedef unsigned long u32;
sbit ired = P3^2;
void H()//12/110.592=1.085us
{
u8 a;//17+9=26us 38kHZ 17/26=65%占空比的高电平
for(a=0;a<=14;a++)//0.54ms 540/26.04=20.7
{
ired=0;
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();//8.68us
ired=1;
_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();//1.085*16=17.36us
}
ired=1;//发高为低
for(a=0;a<=41;a++)//1.62ms空载 1620/26us=62.3
{
_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();//*24=26.04us
}
}
void L()
{
u8 a;