【红外学习 2】【经典程序】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;
}


















初级程序

/*
12T 单片机红外发射程序

单片机的GND接红外二极管的GND
单片机的IO接红外二极管的正极
红外二极管的正极上拉一个500欧电阻到VCC

*/

#include <REG51.h> 
sfr AUXR  = 0x8E; 
static bit OP;        //红外发射管的亮灭
static unsigned int count;       //延时计数器
static unsigned int endcount; //终止延时计数
static unsigned char flag;      //红外发送标志
sbit P3_4=P0^0;
char iraddr1;  //十六位地址的第一个字节
char iraddr2;  //十六位地址的第二个字节
 
 
void delay()
{
  int i,j;
  for(i=0;i<400;i++)
  {
    for(j=0;j<100;j++)
    {
    }
  }
}
 
 
void SendIRdata(char usercode1,char usercode2,char keycode)
{
  int i;
  char irdata=usercode1;
  //发送9ms的起始码
  endcount=223;
  flag=1;
  count=0;
  do{}while(count<endcount);
  //发送4.5ms的结果码
  endcount=117;
  flag=0;
  count=0;
  do{}while(count<endcount);
  //发送十六位地址的前八位
  irdata=usercode1;
  for(i=0;i<8;i++)
  {
     endcount=10;
     flag=1;
     count=0;
     do{}while(count<endcount);
     if(irdata-(irdata/2)*2)
     {
        endcount=41;
     }
     else
     {
       endcount=15;
     }
     flag=0;
     count=0;
     do{}while(count<endcount);
     irdata=irdata>>1;
  }
 
 
 
 
//        for(i=0;i<8;i++)
//  {
//     //先发送0.56ms的38KHZ红外波(即编码中0.56ms的低电平)
//     endcount=10;
//     flag=1;
//     count=0;
//     do{}while(count<endcount);
////停止发送红外信号(即编码中的高电平)
//     if(irdata-(irdata/2)*2)  //判断二进制数个位为1还是0
//     {
//       endcount=41;  //1为宽的高电平
//     }
//    else
//     {
//     endcount=15;   //0为窄的高电平
//     }
//    flag=0;
//    count=0;
//    do{}while(count<endcount);
//    irdata=irdata>>1;
//  }
 
 
  //发送十六位地址的后八位
  irdata=usercode2;
  for(i=0;i<8;i++)
  {
     endcount=10;
     flag=1;
     count=0;
     do{}while(count<endcount);
     if(irdata-(irdata/2)*2)
     {
        endcount=41;
     }
     else
     {
       endcount=15;
     }
     flag=0;
     count=0;
     do{}while(count<endcount);
     irdata=irdata>>1;
  }
  //发送八位数据
  irdata=keycode;
  for(i=0;i<8;i++)
  {
     endcount=10;
     flag=1;
     count=0;
     do{}while(count<endcount);
     if(irdata-(irdata/2)*2)
     {
         endcount=41;
     }
     else
     {
       endcount=15;
     }
     flag=0;
     count=0;
     do{}while(count<endcount);
     irdata=irdata>>1;
  }
     
     
  //发送八位数据的反码
  irdata=~keycode;
  for(i=0;i<8;i++)
  {
     endcount=10;
     flag=1;
     count=0;
     do{}while(count<endcount);
     if(irdata-(irdata/2)*2)
     {
         endcount=41;
     }
     else
     {
       endcount=15;
     }
     flag=0;
     count=0;
     do{}while(count<endcount);
     irdata=irdata>>1;
  }
  endcount=10;
  flag=1;
  count=0;
  do{}while(count<endcount);
  flag=0;
}
 
 
 
 
 
 
 
void main(void) 
{
  count = 0;
  flag = 0;
  OP = 0;
  P3_4 = 0;
  EA = 1; //允许CPU中断 
  TMOD = 0x11; //设定时器0和1为16位模式1 
  ET0 = 1; //定时器0中断允许 
 
  TH0 = 0xFF; 
  TL0 = 0xE6; //设定时值0为38K 也就是每隔26us中断一次  
  TR0 = 1;//开始计数 
 
  do{
      delay();
      SendIRdata(0x48,0x77,0x11);
      delay();
      SendIRdata(0x48,0x77,0x12);
      delay();
      SendIRdata(0x48,0x77,0x13);
      delay();
      SendIRdata(0x48,0x77,0x14);
      delay();
      SendIRdata(0x48,0x77,0x15);
      delay();
      SendIRdata(0x48,0x77,0x16);
      delay();
      SendIRdata(0x48,0x77,0x17);
      delay();
      SendIRdata(0x48,0x77,0x18);
      delay();
      SendIRdata(0x48,0x77,0x19);
      delay();
      SendIRdata(0x48,0x77,0x10);
      delay();
      SendIRdata(0x48,0x77,0x00);
      delay();
      SendIRdata(0x48,0x77,0x01);
      delay();
      SendIRdata(0x48,0x77,0x02);
      delay();
      SendIRdata(0x48,0x77,0x03);
      delay();
      SendIRdata(0x48,0x77,0x1F);
  }while(1);
} 
 
 
 
 
//定时器0中断处理 
void timeint(void) interrupt 1 
{ 
     
  TH0=0xFF; 
  TL0=0xE6; //设定时值为38K 也就是每隔26us中断一次
  count++;
  if (flag==1)
  {
    OP=~OP;
  }
  else
  {
    OP = 0;
  }
  P3_4 = OP;
}










单片机的GND接红外接收头的GND

单片机的IO接红外接收头的TTL输出引脚

/*

89C52 @12M
 
*/

#include <REG51.h> 
sfr AUXR  = 0x8E; 
static bit RealOutput;                    //红外发射管的亮灭
static unsigned int count;        //延时计数器
static unsigned int endcount;     //终止延时计数
static unsigned char flag;        //红外发送标志
sbit Send_ISR=P2^0;
sbit Runled  =P2^1;

char iraddr1;  //十六位地址的第一个字节
char iraddr2;  //十六位地址的第二个字节

unsigned char code key_0=0x10;
unsigned char code key_1=0x11;
unsigned char code key_2=0x12;
unsigned char code key_3=0x13;
unsigned char code key_4=0x14;
unsigned char code key_5=0x15;
unsigned char code key_6=0x16;
unsigned char code key_7=0x17;
unsigned char code key_8=0x18;
unsigned char code key_9=0x19;


unsigned char code key_up=0x19;
unsigned char code key_down=0x19;
unsigned char code key_left=0x19;
unsigned char code key_right=0x19;

unsigned char code key_menu=0x19;
unsigned char code key_ok=0x19;
unsigned char code key_back=0x1C;


 
void delay(unsigned int a){  //12m@12t  1ms
    unsigned int i;
    while ( --a != 0 )    
    for (i=0;i<=20;i++);
}
 
void SendCode(unsigned char Code){
 unsigned char irdata,i;
 irdata=Code;            
  for(i=0;i<8;i++)  {
     endcount=10;
     flag=1;
     count=0;
     do{}while(count<endcount);
     if(irdata%2) {endcount=41;}
     else{endcount=15;}
     flag=0;
     count=0;
     do{}while(count<endcount);
     irdata=irdata>>1;
  }
}


void SendIRdata(char keycode){
  char usercode1=0x11;
  char usercode2=0x11;
  	
  char irdata=usercode1;
  endcount=223;                //发送9ms的起始码,.
  flag=1;
  count=0;
  do{}while(count<endcount);

	endcount=117;                //发送4.5ms的结果码
  flag=0;
  count=0;
  do{}while(count<endcount);
  
	SendCode(usercode1);
	SendCode(usercode2);
	SendCode(keycode);
	SendCode(~keycode);
		
		
  endcount=100;
  flag=1;
  count=0;
  do{}while(count<endcount);
  flag=0;
}
 
 
 
 
 
 
 
void main(void) 
{
  count = 0;
  flag = 0;
  RealOutput = 0;
  Send_ISR = 0;
  EA = 1;         //允许CPU中断 
  TMOD = 0x11;    //设定时器0和1为16位模式1 
  ET0 = 1;        //定时器0中断允许 
 
  TH0 = 0xFF; 
  TL0 = 0xE6;       //设定时值0为38K 也就是每隔26us中断一次  
  TR0 = 1;          //开始计数 
	
	while(1){
      SendIRdata(key_0);
      delay(1000);
      SendIRdata(key_1);
      delay(1000);
//		Runled=!Runled;
//      delay(1000);
		
		
  }
} 
 
void timeint(void) interrupt 1 { 
  TH0=0xFF; 
  TL0=0xE6; //设定时值为38K 也就是每隔26us中断一次
  count++;
//  if (flag) {RealOutput=~RealOutput;}
  if (flag) {RealOutput=0;}
  else{RealOutput = 1;}
  Send_ISR = RealOutput;
}



编译

Rebuild target 'Target 1'
assembling STARTUP.A51...
compiling send_ISR.C...
linking...
Program Size: data=17.1 xdata=0 code=337
creating hex file from "Send_ISR"...
"Send_ISR" - 0 Error(s), 0 Warning(s).



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

你可能感兴趣的:(测试成功,与导线连接,附初级程序,12M,红外二极管发射)