侵权投诉
当前位置:

OFweek电子工程网

正文

最简单的51单片机红外遥控解码程序

导读: 用单片机进行红外遥控解码,对大多数初学者来说是很麻烦的一个问题。下面介绍本人自编的红外遥控解码的C51程序,自认为是可能是史上最简的。此程序是针对uPD6121系列的遥控器的取码程序,解码值在Im[2]中,当IrOK=1时解码有效。

  用单片机进行红外遥控解码,对大多数初学者来说是很麻烦的一个问题。下面介绍本人自编的红外遥控解码的C51程序,自认为是可能是史上最简的。此程序是针对uPD6121系列的遥控器的取码程序,解码值在Im[2]中,当IrOK=1时解码有效。

  /* 51单片机红外遥控解码程序 */

  /* 适用uPD6121系列 */

  #include

  #define DIGPORT P2

  #define WORDPORT P0

  unsigned char code LED_num[]={0x3f,0x18,0x76,0x7c,0x59,0x6d,0x6f,0x38,0x7f,0x7d};

  #define Imax 14000 //此处为晶振为11.0592时的取值,

  #define Imin 8000 //如用其它频率的晶振时,

  #define Inum 1450 //要改变相应的取值。

  unsigned char Im[]={0x00,0x00,0x00,0x00};

  unsigned long m,Tc;

  unsigned char i,IrOK;

  void DelayMy(unsigned int t){

  while(--t);

  }

  void Display_LED(unsigned long num)

  {

  unsigned int ii;

  unsigned int jj=0;

  unsigned long aa,bb;

  unsigned int xx[8]={0,0,0,0,0,0,0,0};

  do {

  bb=num/10;

  aa=num-bb*10;

  xx[jj]=aa;

  num=bb;jj++;

  }

  while(num》0);

  DIGPORT=0x80;

  for(ii=0;ii《8;ii++) {

  WORDPORT=LED_num[xx[ii]];

  DelayMy(60);

  DIGPORT=DIGPORT》》1;

  };

  WORDPORT=0;

  }

  //外部中断解码程序

  void intersvr1(void) interrupt 2 using 1

  {

  Tc=TH0*256+TL0; //提取中断时间间隔时长

  TH0=0; TL0=0; //定时中断重新置零

  if((Tc》Imin)&&(Tc

  if(Tc》Inum) Im[m/8]=Im[m/8]》》1|0x80; else Im[m/8]=Im[m/8]》》1; //取码

  if(m==32) if((Im[2]|0x01)==~Im[3]) IrOK=1; else IrOK=0; //取码完成后判断读码是否正确

  m++; //准备读下一码

  }

  /*演示主程序*/

  void main(void)

  {

  m=0;

  EA=1;

  IT1=1;EX1=1;

  TMOD=0x11;

  TH0=0;TL0=0;

  TR0=1;ET0=1;

  for(;;){

  DelayMy(100);

  if(IrOK==1) for(i=0;i《400;i++) Display_LED(Im[2]);

  IrOK=0;

  }

  }

声明: 本文由入驻OFweek公众平台的作者撰写,观点仅代表作者本人,不代表OFweek立场。如有侵权或其他问题,请联系举报。

我来说两句

(共0条评论,0人参与)

请输入评论内容...

请输入评论/评论长度6~500个字

您提交的评论过于频繁,请输入验证码继续

暂无评论

暂无评论

文章纠错
x
*文字标题:
*纠错内容:
联系邮箱:
*验 证 码:

粤公网安备 44030502002758号