打印
[8/16-bit MCU]

红外编码与解码——GREE格力遥控 发送

[复制链接]
1429|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
cowboy2014|  楼主 | 2015-12-30 20:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
进行编码如下

代码如下:
void IRsend_sendGREE(long datavalue ,unsigned int greeCRC)
{
  long data = 0;
  long temp = 0;
  IRsend_enableIROut(38);
  IRsend_mark(GREE_HDR_MARK);
  IRsend_space(GREE_HDR_SPACE);
  data = (datavalue&0xffffff80)|0x0A;
  for (int i = 0; i < 32; i++){
      if (data & TOPBIT) {
      IRsend_mark(GREE_BIT_MARK);
      IRsend_space(GREE_ONE_SPACE);
    }
    else {
      IRsend_mark(GREE_BIT_MARK);
      IRsend_space(GREE_ZERO_SPACE);
    }


相关帖子

沙发
cowboy2014|  楼主 | 2015-12-30 20:31 | 只看该作者
data <<= 1;
  }
  data = 0x02;
  for (int i = 0; i < 3; i++){
      if (data & TOPBIT) {
      IRsend_mark(GREE_BIT_MARK);
      IRsend_space(GREE_ONE_SPACE);
    }
    else {
      IRsend_mark(GREE_BIT_MARK);
      IRsend_space(GREE_ZERO_SPACE);
    }
    data <<= 1;
  }

使用特权

评论回复
板凳
cowboy2014|  楼主 | 2015-12-30 20:32 | 只看该作者
IRsend_mark(GREE_COM_MARK);
  IRsend_space(GREE_COM_SPACE);  
  
  temp = datavalue&0x00000040;//7
  data = (temp>>6);
  data = data<<4;
  temp = datavalue&0x00000020;//6
  data = data|(temp>>5);
  data = data<<5;
  temp = datavalue&0x00000018;//5 4
  data = data|(temp>>3);
  data = ((data<<16)|0x1000)<<1;//3
  temp = datavalue&0x00000004;
  data = data|(temp>>2);
  data = (data<<5)|(greeCRC&0x000f);
  for (int i = 0; i < 32; i++){
      if (data & TOPBIT) {
      IRsend_mark(GREE_BIT_MARK);
      IRsend_space(GREE_ONE_SPACE);
    }

使用特权

评论回复
地板
cowboy2014|  楼主 | 2015-12-30 20:33 | 只看该作者
else {
      IRsend_mark(GREE_BIT_MARK);
      IRsend_space(GREE_ZERO_SPACE);
    }
    data <<= 1;
  }
  
  IRsend_mark(GREE_BIT_MARK);
  IRsend_space(0);
}

使用特权

评论回复
5
cowboy2014|  楼主 | 2015-12-30 20:33 | 只看该作者
IRsend_enableIROut 主要实现的功能是配置PWM波的载波频率,一般为38KHZ  1/3~1/4Duty (当然也有一些特别)
要发出红外波,就是以PWM驱动红外LED传播红外波
其代码如下:
void Sct_Pwm_Init(uint32_t PWM_RATE)
{
    /* Initialize the SCT as PWM and set frequency */
Chip_SCTPWM_Init(LPC_SCT);
Chip_SCTPWM_SetRate(LPC_SCT, PWM_RATE);
/* Setup Board specific output pin */
Chip_IOCON_PinMuxSet(LPC_IOCON, 0, 9, IOCON_FUNC2 | IOCON_MODE_INACT | IOCON_DIGITAL_EN | IOCON_INPFILT_OFF);
/* Use SCT0_OUT1 pin */
Chip_SCTPWM_SetOutPin(LPC_SCT, SCT_PWM_OUT, SCT_PWM_PIN_OUT);
/* Start with 0% duty cycle */
Chip_SCTPWM_SetDutyCycle(LPC_SCT, SCT_PWM_OUT, Chip_SCTPWM_GetTicksPerCycle(LPC_SCT) / 4);
//Chip_SCTPWM_Start(LPC_SCT);
}

使用特权

评论回复
6
cowboy2014|  楼主 | 2015-12-30 20:43 | 只看该作者
void IRsend_mark(int time) {
  // Sends an IR IRsend_mark for the specified number of microseconds.
  // The IRsend_mark output is modulated at the PWM frequency.
  TIMER_ENABLE_PWM(); // Enable pin 3 PWM output
  if (time > 0) delayMicros(time);
}


/* Leave pin off for time (given in microseconds) */
void IRsend_space(int time) {
  // Sends an IR IRsend_space for the specified number of microseconds.
  // A IRsend_space is no output, so the PWM output is disabled.
  TIMER_DISABLE_PWM(); // Disable pin 3 PWM output
  if (time > 0) delayMicros(time);
}

使用特权

评论回复
7
cowboy2014|  楼主 | 2015-12-30 20:44 | 只看该作者
解译出的代码
以开/关键为理
关IRsend_sendGREE(0x900400,0xa);
开IRsend_sendGREE(0X10900400,0xb);
仔细对比,校对得以上图。

最后上电测试 成功的开关空调。总结对于LPC54102的资源为 PWM 的输出,定时器(延时)。其实软件延时也可以。下图为非准确延时的图,都能实现开关机



不对资源不是很紧张或者是初调试者建议还是用定时器延时。用到的资源主要有
LPC_SCT 与LPC_TIMER2

使用特权

评论回复
8
danieldan007| | 2016-1-16 16:36 | 只看该作者
LZ我最近也在用单片机做空调红外遥控器,同样是格力空调,可是波形都很相似了也没能控制成功,LZ能不能给我看一下到底问题在哪里呀,万分感谢!
帖子地址:新人求助,关于自制红外遥控的问题
https://bbs.21ic.com/forum.php?mo ... amp;fromuid=1748360
(出处: 21ic电子技术论坛)

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

78

主题

821

帖子

5

粉丝