单片机交流
直播中

石飞鹏

7年用户 995经验值
私信 关注
[问答]

stc8单片机是如何模拟成空调遥控器的

红外遥控的原理是什么?
stc8单片机是如何模拟成空调遥控器的?

回帖(1)

周梦斌

2021-9-28 14:14:52
  stc8单片机通过红外模拟成空调遥控器
  文章分为红外遥控原理和单片机实现两个部分
  1 红外遥控原理
  通常红外遥控为了提高抗干扰性能和降低电源消耗,红外遥控器常用载波的方式传送二进制编码,常用的载波频率为38kHz,这是由发射端所使用的455kHz晶振来决定的。在发射端要对晶振进行整数分频,分频系数一般取12,所以455kHz÷12≈37.9kHz≈38kHz。也有一些遥控系统采用36kHz、40 kHz、56 kHz等,一般由发射端晶振的振荡频率来决定。所以,通常的红外遥控器是将遥控信号(二进制脉冲码)调制在38KHz的载波上,经缓冲放大后送至红外发光二极管,转化为红外信号发射出去的。
  再看看这个图
  
  这个图的意思是说:发射端要发送38KHZ的信号,这个时间是0.56ms然后不发送这个38KHZ的载波信号,那么发射端要是想传送信号0或者1就是靠这个不发38Khz载波的间隔来决定的。间隔时间长的1.125ms就是表示的1,间隔0.56ms就是表示的0.
  
  接收端把碰到的载波信号认为是低电平,或者也可以说是接收到载波信号之后把接收端的输出引脚拉低了,没有接收到载波信号就会持续为1.这样一来就完成了传送和接收的整个过程。
  2 单片机实现
  首先是先用定时器定时13us的时间
  void hwsend_init() //13us 11.0592
  {
  AUXR |= 0x80; //定时器时钟1T模式
  TMOD &= 0xF0; //设置定时器模式
  TL0 = 0x70; //设置定时初值
  TH0 = 0xFF; //设置定时初值
  TF0 = 0; //清除TF0标志
  TR0 = 1; //定时器0开始计时
  ET0 = 1; //定时器0中断允许
  EA = 1; //允许CPU中断
  iraddr1=0;
  iraddr2=0;
  count = 0;
  sflag = 0;
  OP = 0;
  Infr = 1;
  }
  然后就是发送空调码了,美的的空调码格式是先发送4.5ms的载波,然后发4.5ms(非载波),再加上6个字节的空调遥控码再加上4.5ms的开始载波信号,再发送5.2ms的连接码(非载波)然后把6个字节的空调遥控吗再次发送最后加上4.5ms的载波信号,以上是开启空调的格式,关闭的格式也是一样的。下面贴上代码
  好void SendIRdataOpen() //发送开启空调码
  {
  unsigned char irdata;
  unsigned char dw,sw;
  endcount=60; //发送4.5ms的起始码 692
  sflag=1;
  hwcount=0;
  while(hwcount《endcount);
  endcount=60; //发送4.5ms的结果码 346
  sflag=0;
  hwcount=0;
  while(hwcount《endcount); //发送十六位地址的前八位
  //开始发送那6个字节的数据
  for(dw=0; dw《6; dw++)
  {
  irdata=irdataOpen[dw];
  for(sw=0; sw《8; sw++)
  {
  endcount=44; //先发送0.56ms的38KHZ红外波(即编码中0.56ms的高电平)
  sflag=1;
  count=0;
  while(count《endcount); //停止发送红外信号(即编码中的高电平)
  if(irdata-(irdata/2)*2) //判断二进制数个位为1还是0
  {
  endcount=130; //1为宽的高电平 低电平时间为1.69ms
  }
  else
  {
  endcount=44; //0为窄的高电平 低电平时间为0.56ms
  }
  sflag=0;
  count=0;
  while(count《endcount);
  irdata=irdata》》1;
  } //发送十六位地址的后八位
  }
  //发送结束码
  endcount=44; //先发送0.56ms的38KHZ红外波(即编码中0.56ms的高电平)
  sflag=1;
  count=0;
  while(count《endcount); //停止发送红外信号(即编码中的高电平)
  //发送连接码
  endcount=80; //发送5.2ms的连接码
  sflag=0;
  hwcount=0;
  while(hwcount《endcount);
  //再发一遍
  endcount=60; //发送4.5ms的起始码 692
  sflag=1;
  hwcount=0;
  while(hwcount《endcount);
  endcount=60; //发送4.5ms的结果码 346
  sflag=0;
  hwcount=0;
  while(hwcount《endcount); //发送十六位地址的前八位
  for(dw=0; dw《6; dw++)
  {
  irdata=irdataOpen[dw];
  for(sw=0; sw《8; sw++)
  {
  endcount=44; //先发送0.56ms的38KHZ红外波(即编码中0.56ms的高电平)
  sflag=1;
  count=0;
  while(count《endcount); //停止发送红外信号(即编码中的高电平)
  if(irdata-(irdata/2)*2) //判断二进制数个位为1还是0
  {
  endcount=130; //1为宽的高电平 低电平时间为1.69ms
  }
  else
  {
  endcount=44; //0为窄的高电平 低电平时间为0.56ms
  }
  sflag=0;
  count=0;
  while(count《endcount);
  irdata=irdata》》1;
  } //发送十六位地址的后八位
  }
  //发送结束码
  endcount=44; //先发送0.56ms的38KHZ红外波(即编码中0.56ms的高电平)
  sflag=1;
  count=0;
  while(count《endcount);
  sflag=0;
  }
  空调遥控的核心的知识就是这些,我没有提到接收的部分,接收的部分其实就用外部中断来统计高电平的时间就可以了。这是全部的代码,点击这里,进行查看.
举报

更多回帖

发帖
×
20
完善资料,
赚取积分