经典程序STC89C52RC 12M红外二极管发射测试成功

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了经典程序STC89C52RC 12M红外二极管发射测试成功相关的知识,希望对你有一定的参考价值。

/*
89C52RC 12M晶振  红外发射试验,

在红外解码和机顶盒上都测试可用!

发射的编码是      SendIRdata(0x48,0x77,0x01);这个一个向下的按键编码

红外发射管的正极接VCC 5V
红外发射管的负极接21号引脚 

*/
#include <REG51.h> 
static bit wave;              //红外发射管的亮灭
static unsigned int count;    //延时计数器
static unsigned int endcount; //终止延时计数
static bit flag;              //红外发送标志
sbit Send_wave=P2^0;
 
void delay(){    //1秒的延时
  int i,j;
  for(i=0;i<400;i++)  {
    for(j=0;j<100;j++)    {
    }
  }
}
 
void SendByte(unsigned char OneByte){  //发送一个8bit数据
unsigned char irdata,i;
 irdata=OneByte;
  for(i=0;i<8;i++)  {
     endcount=10;
     flag=1;
     count=0;
     do{}while(count<endcount);
     if(irdata & 1){endcount=41;} //如果末位是1,电平持续时间会长一些
     else{ endcount=15;}          //如果末位是0,电平持续时间短长一些
     flag=0;
     count=0;
     do{}while(count<endcount);
     irdata=irdata>>1;
  }
}


void SendIRdata(char usercode1,char usercode2,char keycode){

  endcount=223;  //发送9ms的起始码,在接受端的红外一体化输出,会有一个下降沿
  flag=1;
  count=0;
  do{}while(count<endcount);

  endcount=117;        //发送4.5ms的结果码
  flag=0;
  count=0;
  do{}while(count<endcount);

SendByte(usercode1);        //发送十六位地址的前八位
SendByte(usercode2);        //发送十六位地址的后八位
SendByte(keycode);          //发送编码
SendByte(~keycode);          //发送编码的反码

    endcount=10;
  flag=1;
  count=0;
  do{}while(count<endcount);
  flag=0;
}
 
 
 
 void timeinit(void){   //12M晶振  产生38K载波
  EA = 1; //允许CPU中断 
  TMOD = 0x11; //设定时器0和1为16位模式1 
  ET0 = 1; //定时器0中断允许 
  TH0 = 0xFF; 
  TL0 = 0xE6; //设定时值0为38K 也就是每隔26us中断一次  
  TR0 = 1;//开始计数 
}
 
void main(void) {
  count = 0;
  flag = 0;
  wave = 0;
  Send_wave = 0;
  timeinit();
  while(1){
      delay();
      SendIRdata(0x48,0x77,0x01);
  }
} 
 
//定时器0中断处理 
void timeint(void) interrupt 1 {  //12M晶振,产生38K的载波
  TH0=0xFF; 
  TL0=0xE6; //设定时值为38K 也就是每隔26us中断一次
  count++;
  if (flag){wave=~wave;}
  else{wave = 0;}
  Send_wave = wave;
}









经典程序2:

不用红外与机顶盒交互

/*
89C52RC 12M晶振  不用任何红外,用连线的方式,与机顶盒交互
  
 
在机顶盒上测试可用!
 
发射的编码是      SendIRdata(0x48,0x77,0x01);这个一个向下的按键编码
 
机顶盒的GND接单片机的GND

机顶盒的红外接收引脚接单片机第21号引脚 

注意是:接的是机顶盒 一体化红外接收的OUT引脚
 
*/
#include <REG51.h> 
static bit wave;              //红外发射管的亮灭
static unsigned int count;    //延时计数器
static unsigned int endcount; //终止延时计数
static bit flag;              //红外发送标志
sbit Send_wave=P2^0;
  
void delay(){    //1秒的延时
  int i,j;
  for(i=0;i<400;i++)  {
    for(j=0;j<100;j++)    {
    }
  }
}
  
void SendByte(unsigned char OneByte){  //发送一个8bit数据
unsigned char irdata,i;
 irdata=OneByte;
  for(i=0;i<8;i++)  {
     endcount=10;
     flag=1;
     count=0;
     do{}while(count<endcount);
     if(irdata & 1){endcount=41;} //如果末位是1,电平持续时间会长一些
     else{ endcount=15;}          //如果末位是0,电平持续时间短长一些
     flag=0;
     count=0;
     do{}while(count<endcount);
     irdata=irdata>>1;
  }
}
 
 
void SendIRdata(char usercode1,char usercode2,char keycode){
 
  endcount=223;  //发送9ms的起始码,在接受端的红外一体化输出,会有一个下降沿
  flag=1;
  count=0;
  do{}while(count<endcount);
 
  endcount=117;        //发送4.5ms的结果码
  flag=0;
  count=0;
  do{}while(count<endcount);
 
SendByte(usercode1);        //发送十六位地址的前八位
SendByte(usercode2);        //发送十六位地址的后八位
SendByte(keycode);          //发送编码
SendByte(~keycode);          //发送编码的反码
 
    endcount=10;
  flag=1;
  count=0;
  do{}while(count<endcount);
  flag=0;
}
  
  
  
 void timeinit(void){   //12M晶振  产生38K载波
  EA = 1; //允许CPU中断 
  TMOD = 0x11; //设定时器0和1为16位模式1 
  ET0 = 1; //定时器0中断允许 
  TH0 = 0xFF; 
  TL0 = 0xE6; //设定时值0为38K 也就是每隔26us中断一次  
  TR0 = 1;//开始计数 
}
  
void main(void) {
  count = 0;
  flag = 0;
  wave = 0;
  Send_wave = 0;
  timeinit();
  while(1){
      delay();
      SendIRdata(0x48,0x77,0x01);
  }
} 
  
//定时器0中断处理 
void timeint(void) interrupt 1 {  //12M晶振,产生38K的载波
  TH0=0xFF; 
  TL0=0xE6; //设定时值为38K 也就是每隔26us中断一次
  count++;
//  if (flag){wave=~wave;}
  if (flag){wave=1;}
  else{wave = 0;}
  Send_wave = ~wave;
}


本文出自 “魂斗罗” 博客,谢绝转载!

以上是关于经典程序STC89C52RC 12M红外二极管发射测试成功的主要内容,如果未能解决你的问题,请参考以下文章

8051单片机实战分析(以STC89C52RC为例) | 01 - 点亮一个LED

8051单片机实战分析(以STC89C52RC为例) | 04 - 蜂鸣器驱动

基于STC89C52的oled红外遥控闹钟

STC89C52RC单片机额外篇 | 05 - 把NOP指令封装成微秒级延时函数

8051单片机实战分析(以STC89C52RC为例) | 09 - LED点阵显示数字

STC12C5A60S2 12M 红外发射