用AT89S52自制红外电视遥控器

2014-02-10 20:43:00来源: 互联网

红外遥控器发送数据时,是将二进制数据调制成一系列的脉冲信号红外发射管发射出去,红外载波为频率38KHz的方波,红外接收端在收到38KHz的载波信号时,会输出低电平,否则输出高电平,从而可以将“时断时续”的红外光信号解调成一定周期的连续方波信号,再经过1838一体化红外接收头解调便可以恢复出原数据信号。如图1所示

  

  图1

  红外接收头解调过程如图2所示

  

  图2

  解调后的“0”和“1”波形及单片机编码图3、图4所示

  

  图3

  

  图4

  
  图5

  了解了红外接收头解调及遥控编码下面就可以对照图5编写编码程序了,图5是遥控按键1的一段实际编码,由9ms低电平4.5ms高电平的启始码,26位系统码,及8位数据码、8位数据反码、23ms高电平及结束码组成。

  

  
  电路图

  

  实物图

********以下是遥控完整程序********

  /********

  **项目: 自制红外电视遥控器(EE01学习板演示程序)

  **作者:一线工人

  **网站:电子工程师之家 www.eehome.cn

  **转贴请保持代码的完整性

  ********/

  #include 《reg52.h》

  #define uint unsigned int

  #define uchar unsigned char

  bit irout;//红外管状态

  sbit ir=P1^7;//红外发射管控制脚

  uint count, set_count;//中断计数,设定中断次数

  bit flag,keyflag;//红外发送标志,按键标志位

  uchar irsys[4]={0x1a,0xa1,0xdc,0x03};//26位系统码,最后一个字节只用2位

  uchar ircode,irdata;

  /**********************************************

  延时1ms

  ***********************************************/

  void delay(uint z)//延时1ms,晶振22.1184M

  {

  uint x,y;

  for(x=z;x》0;x--)

  for(y=225;y》0;y--);

  }

  /**********************************************

  按键扫描

  **********************************************/

  void keyscan(void)

  {

  uchar keytemp;

  P3=0xff;

  keytemp=P3&0x0f;

  if(keytemp!=0x0f)

  {

  delay(20);

  keytemp=P3&0x0f;

  if(keytemp!=0x0f)

  keyflag=1;//有按键标志

  switch(keytemp)

  {

  case 0x0e:irdata=27;break;//按键1对应该遥控器P+的键值

  case 0x0d:irdata=26;break;//按键2对应该遥控器P-的键值

  case 0x0b:irdata=31;break;//按键3对应该遥控器VOL+的键值

  case 0x07:irdata=30;break;//按键4对应该遥控器VOL-的键值

  }

  }

  }

  /*******************************************

  发送8位红外数据

  *******************************************/

  void sendcode_8(void)

  {

  uchar i;

  for(i=0;i《8;i++)

  {

  set_count=28;//发送0.56ms 38k红外波(编码中的0.56ms低电平)

  flag=1;

  count=0;

  TR0=1;

  while(count《set_count);

  TR0=0;

  if(ircode&0x01)//判断红外编码最低位,1宽的高电平,0窄的高电平

  {

  set_count=120;

  }

  else

  {

  set_count=38;

  }

  flag=0;

  count=0;

  TR0=1;

  while(count《set_count);

  TR0=0;

  ircode=ircode》》1;

  }

  }

  /*******************************************

  发送2位红外数据

  *******************************************/

  void sendcode_2(void)//前26位系统码最后两位

  {

  uchar i;

  for(i=0;i《2;i++)

  {

  set_count=28;

  flag=1;

  count=0;

  TR0=1;

  while(count《set_count);

  TR0=0;

  if(ircode&0x01)

  {

  set_count=120;

  }

  else

  {

  set_count=38;

  }

  flag=0;

  count=0;

  TR0=1;

  while(count《set_count);

  TR0=0;

  ircode=ircode》》1;

  }

  }

  /*******************************************

  发送红外数据

  *******************************************/

  void sendcode(void)

  {

  set_count=575;//发送9ms 38K红外光

  flag=1;

  count=0;

  TR0=1;

  while(count《set_count);

  TR0=0;

  set_count=320;//间隔4.5ms

  flag=0;

  count=0;

  TR0=1;

  while(count《set_count);

  TR0=0;

  ircode=irsys[0];//发送26位系统码的前1-8位

  sendcode_8();

  ircode=irsys[1];//发送26位系统码的前9-16位

  sendcode_8();

  ircode=irsys[2];//发送26位系统码的前17-24位

  sendcode_8();

  ircode=irsys[3];//发送26位系统码的前24-26位

  sendcode_2();

  ircode=irdata;//发送8位数据码

  sendcode_8();

  ircode=~irdata; //发送8位数据反码

  sendcode_8();

  set_count=28;//发送0.56ms 38k红外波(编码中的0.56ms低电平)

  flag=1;

  count=0;

  TR0=1;

  while(count《set_count);

  TR0=0;

  ir=1;

  delay(23);//延时23ms(编码中的23ms高电平)

  set_count=575;//发送9ms 38k红外波

  flag=1;

  count=0;

  TR0=1;

  while(count《set_count);

  TR0=0;

  set_count=330;//间隔4.5ms

  flag=0;

  count=0;

  TR0=1;

  while(count《set_count);

  TR0=0;

  set_count=30;//发送0.56ms 38k红外波(编码中的0.56ms低电平)

  flag=1;

  count=0;

  TR0=1;

  while(count《set_count);

  TR0=0;

  ir=1;

  }

  /*******************************************

  定时器初始化

  *******************************************/

  void init_timer()

  {

  EA=1;

  TMOD=0X02;//8位自动重载模式

  ET0=1;

  TH0=0XE8;//定时13us,38K红外波,晶振22.1184

  TL0=0XE8;

  }

  /*******************************************

  主函数

  *******************************************/

  void main(void)

  {

  init_timer();

  count=0;

  flag=0;

  irout=1;

  while(1)

  {

  keyscan();

  if(keyflag)//若有新按键

  {

  delay(10);

  sendcode();//发送红外编码

  delay(500);

  keyflag=0;//按键标志清零

  }

  }

  }

  /*******************************************

  定时器中断

  *******************************************/

  void timer0(void) interrupt 1

  {

  count++;

  if(flag==1)

  {

  irout=~irout;

  }

  else

  {

  irout=1;

  }

  ir=irout;

  }

  ********************************************************************************************

关键字:AT89S52  红外  电视遥控器

编辑:神话 引用地址:http://www.eeworld.com.cn/mndz/2014/0210/article_24026.html
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。
论坛活动 E手掌握
微信扫一扫加关注
论坛活动 E手掌握
芯片资讯 锐利解读
微信扫一扫加关注
芯片资讯 锐利解读
推荐阅读
全部
AT89S52
红外
电视遥控器

小广播

独家专题更多

富士通铁电随机存储器FRAM主题展馆
富士通铁电随机存储器FRAM主题展馆
馆内包含了 纵览FRAM、独立FRAM存储器专区、FRAM内置LSI专区三大部分内容。 
走,跟Molex一起去看《中国电子消费品趋势》!
走,跟Molex一起去看《中国电子消费品趋势》!
 
带你走进LED王国——Microchip LED应用专题
带你走进LED王国——Microchip LED应用专题
 
电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2016 EEWORLD.com.cn, Inc. All rights reserved