1,红外LED发射NEC编码.C
2,导线直连,发送NEC编码,与机顶盒交互.C
3,[最终版]用导线的方式实现红外控制功能.C

/*
1,红外LED发射NEC编码.C
单片机:STC15f104W
功能:红外LED发射NEC编码
接线:VCC -- 红外LED--第3号引脚
控制器:STC15F104W ,晶振设定12M
作者:chunli
日期:2016年2月2日 23:22控制器引脚定义:
1 P3.4
2 VCC  3.8--5.5V
3 P3.5
4 GND
5 P3.0 接烧录器的TXD
6 P3.1 接烧录器的RXD
7 P3.2
8 P3.3
*/
#include <STC15F104E.H>
#include <INTRINS.h>
sbit  ISR_LED = P3^5;
static bit wave;                   //载波标志
static unsigned int count;         //中断次数计数器
static unsigned int g_endcount;    //终止延时计数
static bit wave_flag;              //载波发送标志
unsigned char code usercode1=0x48;           //十六位地址的第一个字节
unsigned char code usercode2=0x77;           //十六位地址的第二个字节void DELAY_MS (unsigned int a) {unsigned int i;while ( --a != 0 ){for (i=0;i<=600;i++);}
}void SendIRdata_38KHZ(unsigned int temp1, bit temp2){g_endcount=temp1; wave_flag=temp2;EA=0; count=0; EA=1;  //避免中断影响count置数while(1){   EA=0; if( count < g_endcount ) EA=1;  //避免中断影响count比较else{EA=1; break;}  }
}void SendIRdata_BYTE(unsigned char irdata){unsigned char i;for(i=0;i<8;i++)  {//先发送0.56ms的38KHZ红外波(即编码中0.56ms的高电平)SendIRdata_38KHZ(43, 1);   //13.02*43=0.56ms//判断最低位为1还是0。   低位先发送!!if(irdata & 1)  SendIRdata_38KHZ(130, 0);         //1为宽电平,13.02*130=1.693mselse  SendIRdata_38KHZ(43, 0);   //0为窄电平,13.02*43=0.560msirdata=irdata>>1;  //数据右移,原先的最低位移出}
}void SendIRdata(unsigned char p_irdata){//有的遥控器会发一个前脉冲,如果不灵,可试试加上前脉冲//发送起始码前脉冲,高电平有38KHZ载波//SendIRdata_38KHZ(18, 1);//发送起始码前脉冲,低电平无38KHZ载波//SendIRdata_38KHZ(18, 0);//发送9ms的起始码,高电平有38KHZ载波SendIRdata_38KHZ(692, 1); //13.02*692=9.010ms//发送4.5ms的结果码,低电平无38KHZ载波SendIRdata_38KHZ(346, 0);    //13.02*346=4.505ms//发送十六位地址的前八位SendIRdata_BYTE(usercode1);//发送十六位地址的后八位SendIRdata_BYTE(usercode2);//发送八位数据SendIRdata_BYTE(p_irdata);//发送八位数据的反码SendIRdata_BYTE(~p_irdata);  //发送总的结束位SendIRdata_38KHZ(43, 1);     //13.02*43=0.56mswave_flag=0;
}void TimerInit(void){  // 12M @12T  13微秒中断
//串口和中断定时器设置
TMOD = 0x02; //(定时器0 方式2,8位自动重装)//  1S/38K=26.31微秒 ,1/2的占空比方波,需要13微秒的中断
TH0 = 0xF3;
TL0 = 0xF3;
TR0 = 1;   //开始计数
ET0 = 1;   //定时器0中断允许
EA = 1;    //允许CPU中断
}void main(void) {count = 0;wave_flag = 0;wave = 1; ISR_LED = 1;   TimerInit();while(1){DELAY_MS(1000);SendIRdata(0x00);   //发送红外数据}
}void timeint(void) interrupt 1 { count++;if (wave_flag)    wave=~wave;else    wave = 1;    //LED不点亮ISR_LED = wave;
}/*
2,导线直连,发送NEC编码,与机顶盒交互.C
单片机:STC15f104W
功能:导线直连,发送NEC编码,与机顶盒交互
接线:
单片机GND 接 机顶盒的GND
单片机第3号引脚 接 机顶盒红外接收的OUT引脚控制器:STC15F104W ,晶振设定12M
作者:chunli
日期:2016年2月2日 23:22控制器:STC15F104W引脚定义
1 P3.4
2 VCC  3.8--5.5V
3 P3.5
4 GND
5 P3.0 接烧录器的TXD
6 P3.1 接烧录器的RXD
7 P3.2
8 P3.3
*/#include <STC15F104E.H>
#include <INTRINS.h>
sbit  ISR_LED = P3^5;
static bit wave;                   //载波标志
static unsigned int count;         //中断次数计数器
static unsigned int g_endcount;    //终止延时计数
static bit wave_flag;              //载波发送标志
unsigned char code usercode1=0x48;           //十六位地址的第一个字节
unsigned char code usercode2=0x77;           //十六位地址的第二个字节void DELAY_MS (unsigned int a){unsigned int i;while ( --a != 0 ) {for (i=0;i<=600;i++);}
}void SendIRdata_38KHZ(unsigned int temp1, bit temp2){g_endcount=temp1; wave_flag=temp2;EA=0; count=0; EA=1;  //避免中断影响count置数while(1){   EA=0; if( count < g_endcount ) EA=1;  //避免中断影响count比较else{EA=1; break;}  }
}void SendIRdata_BYTE(unsigned char irdata){unsigned char i;for(i=0;i<8;i++)  {//先发送0.56ms的38KHZ红外波(即编码中0.56ms的高电平)SendIRdata_38KHZ(43, 1);   //13.02*43=0.56ms//判断最低位为1还是0。   低位先发送!!if(irdata & 1)  SendIRdata_38KHZ(130, 0);         //1为宽电平,13.02*130=1.693mselse  SendIRdata_38KHZ(43, 0);   //0为窄电平,13.02*43=0.560msirdata=irdata>>1;  //数据右移,原先的最低位移出}
}void SendIRdata(unsigned char p_irdata){//有的遥控器会发一个前脉冲,如果不灵,可试试加上前脉冲//发送起始码前脉冲,高电平有38KHZ载波//SendIRdata_38KHZ(18, 1);//发送起始码前脉冲,低电平无38KHZ载波//SendIRdata_38KHZ(18, 0);//发送9ms的起始码,高电平有38KHZ载波SendIRdata_38KHZ(692, 1); //13.02*692=9.010ms//发送4.5ms的结果码,低电平无38KHZ载波SendIRdata_38KHZ(346, 0);    //13.02*346=4.505ms//发送十六位地址的前八位SendIRdata_BYTE(usercode1);//发送十六位地址的后八位SendIRdata_BYTE(usercode2);//发送八位数据SendIRdata_BYTE(p_irdata);//发送八位数据的反码SendIRdata_BYTE(~p_irdata);  //发送总的结束位1bitSendIRdata_38KHZ(43, 1);     //13.02*43=0.56mswave_flag=0;
}void TimerInit(void){  // 12M @12T  13微秒中断
//串口和中断定时器设置
TMOD = 0x02; //(定时器0 方式2,8位自动重装)//  1S/38K=26.31微秒 ,1/2的占空比方波,需要13微秒的中断
TH0 = 0xF3;
TL0 = 0xF3;
TR0 = 1;   //开始计数
ET0 = 1;   //定时器0中断允许
EA = 1;    //允许CPU中断
}void main(void) {count = 0;wave_flag = 0;wave = 1; ISR_LED = 1;   TimerInit();while(1){DELAY_MS(1000);SendIRdata(0x00);   //发送红外数据}
}void timeint(void) interrupt 1 { count++;
//  if (wave_flag)    wave=~wave;if (wave_flag)    wave=0;else    wave = 1;    //LED不点亮ISR_LED = wave;
}/*
3,[最终版]用导线的方式实现红外控制功能.C
项目名称:机顶盒频道锁定
日期:2016年2月2日  23:33
版本:2.0
设计:chunli
博客:http://990487026.blog.51cto.com/
邮箱:linux_lcl@163.com
编码环境:GBK2312简体中文
μVision 版本:4.72.9.0
代码类型:C语言
功能:用导线的方式实现红外控制功能更新说明:
1, 废弃弃原来模拟按键的方式去控制机顶盒的频道,因为这种方式不稳定。
2,采用红外控制的思想,用导线代替红外发射,频道锁定迅速为什么要这么设计?因为该环境内有7个同批次机顶盒同时在工作,如果只想控制其中的一个机顶盒,用发射红外的方式,必然带来对其他机顶盒的干扰。用导线的方式代替发射红外,彻底杜绝红外发射对其他机顶盒的干扰。、而且频道锁定迅速,单片机:STC15f104W
烧录晶振设定12M接线:
1,单片机的GND 接 机顶盒的 GND
1,单片机的3号脚 接 机顶盒红外接收一体化的OUT引脚STC15f104W引脚
1 P3.4
2 VCC  3.8--5.5V
3 P3.5
4 GND
5 P3.0 接烧录器的TXD
6 P3.1 接烧录器的RXD
7 P3.2
8 P3.3*/#include <STC15F104E.H>
#define waiting 70     //开机初始化的时间  值应该为60,单位秒钟  范围:0--65535秒
#define rollback 15    //轮询锁定频道,    值应该为30,单位分钟  范围:0--255分钟
//在 void channel(void)函数内   设定频道锁定sbit  ISR_Single = P3^5;
static unsigned int count;        //中断次数计数器
static unsigned int End_Times;    //终止延时计数
static bit Single_flag;           //0、1电平 标志unsigned char code usercode1=0x48;           //用户码前8位
unsigned char code usercode2=0x77;           //用户码后8位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_menu=0x07;
unsigned char code key_back=0x1C;
unsigned char code key_ok=0x1F;
unsigned char code key_up=0x00;
unsigned char code key_down=0x01;
unsigned char code key_left=0x03;
unsigned char code key_right=0x02; void DELAY_MS (unsigned int a)    {unsigned int i;while ( --a != 0 )       {for (i=0;i<=600;i++);}
}void sleep_s (unsigned int a){unsigned int i;for (i=0;i<a;i++){DELAY_MS(1000);}
}void sleep_m (unsigned int a){unsigned int i;for (i=0;i<a;i++){sleep_s(60);}
}void SendSingle(unsigned int temp1, bit temp2){  //电信号持续时间控制End_Times=temp1; Single_flag=temp2;EA=0; count=0; EA=1;                            //避免中断影响count置数while(1){   EA=0; if( count < End_Times ) EA=1;  //避免中断影响count比较else{EA=1; break;}  }
}void SendI_Byte(unsigned char irdata){    //发射一个8为数据unsigned char i;for(i=0;i<8;i++)  {//先发送0.56ms的38KHZ红外波(即编码中0.56ms的高电平)SendSingle(43, 1);   //13.02*43=0.56ms//判断最低位为1还是0。   低位先发送!!if(irdata & 1)  SendSingle(130, 0);         //1为宽电平,13.02*130=1.693mselse  SendSingle(43, 0);   //0为窄电平,13.02*43=0.560msirdata=irdata>>1;  //数据右移,原先的最低位移出}
}void Send_Code(unsigned char Code){//有的遥控器会发一个前脉冲,如果不灵,可试试加上前脉冲//SendSingle(18, 1);   //发送起始码前脉冲,高电平有38KHZ载波//SendSingle(18, 0);   //发送起始码前脉冲,低电平无38KHZ载波SendSingle(692, 1);    //13.02*692=9.010ms   //发送9ms的起始码,高电平有38KHZ载波SendSingle(346, 0);    //发送4.5ms的结果码,低电平无38KHZ载波 //13.02*346=4.505ms    SendI_Byte(usercode1); //发送十六位地址的前八位SendI_Byte(usercode2); //发送十六位地址的后八位SendI_Byte(Code);      //发送八位数据SendI_Byte(~Code);     //发送八位数据的反码SendSingle(43, 1);     //发送总的结束位1bit  //13.02*43=0.56ms  Single_flag=0;
}void TimerInit(void){  // 12M @12T  13微秒中断
TMOD = 0x02; //(定时器0 方式2,8位自动重装)
//  1S/38K=26.31微秒 ,1/2的占空比方波,需要13微秒的中断
TH0 = 0xF3;
TL0 = 0xF3;
TR0 = 1;   //开始计数
ET0 = 1;   //定时器0中断允许
EA = 1;    //允许CPU中断
}void channel(void){
// CCTV 5  体育  20  CCTV5 是20号频道,先按2 再按0
// CCTV 13 新闻  22
// CCTV 14 少儿  87
// 湖南卫视      39
// 安徽卫视      55
// 东方卫视      33
// 黑龙江卫视    25DELAY_MS(500); Send_Code(key_down);   DELAY_MS(500);      Send_Code(key_down);   DELAY_MS(500);
}void main(void) {count = 0;Single_flag = 0;ISR_Single = 1;   TimerInit();sleep_s(waiting);   //等待机顶盒初始化完成channel();          //开始锁定频道while(1){sleep_m(rollback);channel();           //再次锁定频道}
}void timeint(void) interrupt 1 { count++;if (Single_flag) ISR_Single=0;else           ISR_Single=1;    }//编译结果
//Rebuild target 'Target 1'
//assembling STARTUP.A51...
//compiling send_ISR.C...
//linking...
//Program Size: data=17.2 xdata=0 code=358
//creating hex file from "Send_ISR"...
//"Send_ISR" - 0 Error(s), 0 Warning(s).

原始代码

STC15f104W 红外led发射,导线交互 2种方式/*单片机:STC15f104W
红外发射:
接线:VCC -- 红外LED--第3号引脚STC15F104W ,晶振设定12M
1 P3.4
2 VCC  3.8--5.5V
3 P3.5
4 GND
5 P3.0 接烧录器的TXD
6 P3.1 接烧录器的RXD
7 P3.2
8 P3.3
*/
#include <STC15F104E.H>
#include <INTRINS.h>
sbit  ISR_LED = P3^5;
static bit wave;                   //载波标志
static unsigned int count;         //中断次数计数器
static unsigned int g_endcount;    //终止延时计数
static bit wave_flag;              //载波发送标志
unsigned char code usercode1=0x48;           //十六位地址的第一个字节
unsigned char code usercode2=0x77;           //十六位地址的第二个字节void DELAY_MS (unsigned int a){unsigned int i;while ( --a != 0 ){for (i=0;i<=600;i++);}
}void SendIRdata_38KHZ(unsigned int temp1, bit temp2){g_endcount=temp1; wave_flag=temp2;EA=0; count=0; EA=1;  //避免中断影响count置数while(1){   EA=0; if( count < g_endcount ) EA=1;  //避免中断影响count比较else{EA=1; break;}  }
}void SendIRdata_BYTE(unsigned char irdata){unsigned char i;for(i=0;i<8;i++)  {//先发送0.56ms的38KHZ红外波(即编码中0.56ms的高电平)SendIRdata_38KHZ(43, 1);   //13.02*43=0.56ms//判断最低位为1还是0。   低位先发送!!if(irdata & 1)  SendIRdata_38KHZ(130, 0);         //1为宽电平,13.02*130=1.693mselse  SendIRdata_38KHZ(43, 0);   //0为窄电平,13.02*43=0.560msirdata=irdata>>1;  //数据右移,原先的最低位移出}
}void SendIRdata(unsigned char p_irdata){//有的遥控器会发一个前脉冲,如果不灵,可试试加上前脉冲//发送起始码前脉冲,高电平有38KHZ载波//SendIRdata_38KHZ(18, 1);//发送起始码前脉冲,低电平无38KHZ载波//SendIRdata_38KHZ(18, 0);//发送9ms的起始码,高电平有38KHZ载波SendIRdata_38KHZ(692, 1); //13.02*692=9.010ms//发送4.5ms的结果码,低电平无38KHZ载波SendIRdata_38KHZ(346, 0);    //13.02*346=4.505ms//发送十六位地址的前八位SendIRdata_BYTE(usercode1);//发送十六位地址的后八位SendIRdata_BYTE(usercode2);//发送八位数据SendIRdata_BYTE(p_irdata);//发送八位数据的反码SendIRdata_BYTE(~p_irdata);  //发送总的结束位1bitSendIRdata_38KHZ(43, 1);     //13.02*43=0.56mswave_flag=0;
}void TimerInit(void){  // 12M @12T  13微秒中断
//串口和中断定时器设置
TMOD = 0x02; //(定时器0 方式2,8位自动重装)//  1S/38K=26.31微秒 ,1/2的占空比方波,需要13微秒的中断
TH0 = 0xF3;
TL0 = 0xF3;
TR0 = 1;   //开始计数
ET0 = 1;   //定时器0中断允许
EA = 1;    //允许CPU中断
}void main(void) {count = 0;wave_flag = 0;wave = 1; ISR_LED = 1;   TimerInit();while(1){DELAY_MS(1000);SendIRdata(0x00);   //发送红外数据}
}void timeint(void) interrupt 1 { count++;if (wave_flag)    wave=~wave;else    wave = 1;    //LED不点亮ISR_LED = wave;
}=============================================================================/*单片机:STC15f104W
红外发射:
接线:VCC -- 红外LED--第3号引脚STC15F104W ,烧录晶振设定12M功能:通过导线,与机顶盒交互
单片机GND 接 机顶盒的GND
单片机第3号引脚 接 机顶盒红外接收的OUT引脚1 P3.4
2 VCC  3.8--5.5V
3 P3.5
4 GND
5 P3.0 接烧录器的TXD
6 P3.1 接烧录器的RXD
7 P3.2
8 P3.3*/#include <STC15F104E.H>
#include <INTRINS.h>
sbit  ISR_LED = P3^5;
static bit wave;                   //载波标志
static unsigned int count;         //中断次数计数器
static unsigned int g_endcount;    //终止延时计数
static bit wave_flag;              //载波发送标志
unsigned char code usercode1=0x48;           //十六位地址的第一个字节
unsigned char code usercode2=0x77;           //十六位地址的第二个字节void DELAY_MS (unsigned int a){unsigned int i;while ( --a != 0 ){for (i=0;i<=600;i++);}
}void SendIRdata_38KHZ(unsigned int temp1, bit temp2){g_endcount=temp1; wave_flag=temp2;EA=0; count=0; EA=1;  //避免中断影响count置数while(1){   EA=0; if( count < g_endcount ) EA=1;  //避免中断影响count比较else{EA=1; break;}  }
}void SendIRdata_BYTE(unsigned char irdata){unsigned char i;for(i=0;i<8;i++)  {//先发送0.56ms的38KHZ红外波(即编码中0.56ms的高电平)SendIRdata_38KHZ(43, 1);   //13.02*43=0.56ms//判断最低位为1还是0。   低位先发送!!if(irdata & 1)  SendIRdata_38KHZ(130, 0);         //1为宽电平,13.02*130=1.693mselse  SendIRdata_38KHZ(43, 0);   //0为窄电平,13.02*43=0.560msirdata=irdata>>1;  //数据右移,原先的最低位移出}
}void SendIRdata(unsigned char p_irdata){//有的遥控器会发一个前脉冲,如果不灵,可试试加上前脉冲//发送起始码前脉冲,高电平有38KHZ载波//SendIRdata_38KHZ(18, 1);//发送起始码前脉冲,低电平无38KHZ载波//SendIRdata_38KHZ(18, 0);//发送9ms的起始码,高电平有38KHZ载波SendIRdata_38KHZ(692, 1); //13.02*692=9.010ms//发送4.5ms的结果码,低电平无38KHZ载波SendIRdata_38KHZ(346, 0);    //13.02*346=4.505ms//发送十六位地址的前八位SendIRdata_BYTE(usercode1);//发送十六位地址的后八位SendIRdata_BYTE(usercode2);//发送八位数据SendIRdata_BYTE(p_irdata);//发送八位数据的反码SendIRdata_BYTE(~p_irdata);  //发送总的结束位1bitSendIRdata_38KHZ(43, 1);     //13.02*43=0.56mswave_flag=0;
}void TimerInit(void){  // 12M @12T  13微秒中断
//串口和中断定时器设置
TMOD = 0x02; //(定时器0 方式2,8位自动重装)//  1S/38K=26.31微秒 ,1/2的占空比方波,需要13微秒的中断
TH0 = 0xF3;
TL0 = 0xF3;
TR0 = 1;   //开始计数
ET0 = 1;   //定时器0中断允许
EA = 1;    //允许CPU中断
}void main(void) {count = 0;wave_flag = 0;wave = 1; ISR_LED = 1;   TimerInit();while(1){DELAY_MS(1000);SendIRdata(0x00);   //发送红外数据}
}void timeint(void) interrupt 1 { count++;
//  if (wave_flag)    wave=~wave;if (wave_flag)    wave=0;else    wave = 1;    //LED不点亮ISR_LED = wave;
}【最终版】STC12C5A60S2 12M 导线代替 红外发射
/*
项目名称:机顶盒频道锁定
日期:2016年1月31日  23:33
版本:2.0
设计:chunli
博客:http://990487026.blog.51cto.com/
邮箱:linux_lcl@163.com
编码环境:GBK2312简体中文
μVision 版本:4.72.9.0
代码类型:C语言
功能:用导线的方式实现红外控制功能更新说明:
1, 废弃弃原来模拟按键的方式去控制机顶盒的频道,因为这种方式不稳定。
2,采用红外控制的思想,用导线代替红外发射,频道锁定迅速为什么要这么设计?因为该环境内有7个同批次机顶盒同时在工作,如果只想控制其中的一个机顶盒,用发射红外的方式,必然带来对其他机顶盒的干扰。用导线的方式代替发射红外,彻底杜绝红外发射对其他机顶盒的干扰。、而且频道锁定迅速,单片机:STC15f104W
烧录晶振设定12M接线:
1,单片机的GND 接 机顶盒的 GND
1,单片机的3号脚 接 机顶盒红外接收一体化的OUT引脚STC15f104W引脚
1 P3.4
2 VCC  3.8--5.5V
3 P3.5
4 GND
5 P3.0 接烧录器的TXD
6 P3.1 接烧录器的RXD
7 P3.2
8 P3.3*/#include <STC15F104E.H>
#define waiting 70     //开机初始化的时间  值应该为60,单位秒钟  范围:0--65535秒
#define rollback 15    //轮询锁定频道,    值应该为30,单位分钟  范围:0--255分钟
//在 void channel(void)函数内   设定频道锁定sbit  ISR_Single = P3^5;
static unsigned int count;        //中断次数计数器
static unsigned int End_Times;    //终止延时计数
static bit Single_flag;           //0、1电平 标志unsigned char code usercode1=0x48;           //用户码前8位
unsigned char code usercode2=0x77;           //用户码后8位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_menu=0x07;
unsigned char code key_back=0x1C;
unsigned char code key_ok=0x1F;
unsigned char code key_up=0x00;
unsigned char code key_down=0x01;
unsigned char code key_left=0x03;
unsigned char code key_right=0x02; void DELAY_MS (unsigned int a)    {unsigned int i;while ( --a != 0 )       {for (i=0;i<=600;i++);}
}void sleep_s (unsigned int a){unsigned int i;for (i=0;i<a;i++){DELAY_MS(1000);}
}void sleep_m (unsigned int a){unsigned int i;for (i=0;i<a;i++){sleep_s(60);}
}void SendSingle(unsigned int temp1, bit temp2){  //电信号持续时间控制End_Times=temp1; Single_flag=temp2;EA=0; count=0; EA=1;                            //避免中断影响count置数while(1){   EA=0; if( count < End_Times ) EA=1;  //避免中断影响count比较else{EA=1; break;}  }
}void SendI_Byte(unsigned char irdata){    //发射一个8为数据unsigned char i;for(i=0;i<8;i++)  {//先发送0.56ms的38KHZ红外波(即编码中0.56ms的高电平)SendSingle(43, 1);   //13.02*43=0.56ms//判断最低位为1还是0。   低位先发送!!if(irdata & 1)  SendSingle(130, 0);         //1为宽电平,13.02*130=1.693mselse  SendSingle(43, 0);   //0为窄电平,13.02*43=0.560msirdata=irdata>>1;  //数据右移,原先的最低位移出}
}void Send_Code(unsigned char Code){//有的遥控器会发一个前脉冲,如果不灵,可试试加上前脉冲//SendSingle(18, 1);   //发送起始码前脉冲,高电平有38KHZ载波//SendSingle(18, 0);   //发送起始码前脉冲,低电平无38KHZ载波SendSingle(692, 1);    //13.02*692=9.010ms   //发送9ms的起始码,高电平有38KHZ载波SendSingle(346, 0);    //发送4.5ms的结果码,低电平无38KHZ载波 //13.02*346=4.505ms    SendI_Byte(usercode1); //发送十六位地址的前八位SendI_Byte(usercode2); //发送十六位地址的后八位SendI_Byte(Code);      //发送八位数据SendI_Byte(~Code);     //发送八位数据的反码SendSingle(43, 1);     //发送总的结束位1bit  //13.02*43=0.56ms  Single_flag=0;
}void TimerInit(void){  // 12M @12T  13微秒中断
TMOD = 0x02; //(定时器0 方式2,8位自动重装)
//  1S/38K=26.31微秒 ,1/2的占空比方波,需要13微秒的中断
TH0 = 0xF3;
TL0 = 0xF3;
TR0 = 1;   //开始计数
ET0 = 1;   //定时器0中断允许
EA = 1;    //允许CPU中断
}void channel(void){
// CCTV 5  体育  20  CCTV5 是20号频道,先按2 再按0
// CCTV 13 新闻  22
// CCTV 14 少儿  87
// 湖南卫视      39
// 安徽卫视      55
// 东方卫视      33
// 黑龙江卫视    25DELAY_MS(500); Send_Code(key_down);   DELAY_MS(500);      Send_Code(key_down);   DELAY_MS(500);
}void main(void) {count = 0;Single_flag = 0;ISR_Single = 1;   TimerInit();sleep_s(waiting);   //等待机顶盒初始化完成channel();          //开始锁定频道while(1){sleep_m(rollback);channel();           //再次锁定频道}
}void timeint(void) interrupt 1 { count++;if (Single_flag) ISR_Single=0;else           ISR_Single=1;    }//编译结果
//Rebuild target 'Target 1'
//assembling STARTUP.A51...
//compiling send_ISR.C...
//linking...
//Program Size: data=17.2 xdata=0 code=358
//creating hex file from "Send_ISR"...
//"Send_ISR" - 0 Error(s), 0 Warning(s).

转载于:https://my.oschina.net/u/3776585/blog/1617277

【红外学习 4】【最终版】STC15f104W 红外led发射,导线交互 2种方式 测试成功相关推荐

  1. 基岩版刷铁傀儡机制和Java_我的世界:Java版1.14获得铁傀儡的四种方式,第三种千万别忘记...

    在沙盒游戏我的世界中,铁傀儡是守护村庄和村民的生物,它们的攻击力很强,即使是玩家们也不敢轻易地惹怒它们!当玩家们进入Jaa版1.14生存模式之时,拥有四种获得铁傀儡的方式,接下来就为玩家们介绍一下!第 ...

  2. 终于完工!Linux学习路线最终版

    如今的软件开发行业,服务器端市场基本被 Linux 系统占领了.移动端中的 Android 系统是基于 Linux 内核开发的,那些很火的虚拟化.消息队列.云计算.大数据等技术,都默认支持 Linux ...

  3. 前端学习(2968):实现路由跳转的两种方式

  4. 前端学习(1290):nodejs模块化的开发导出另一种方式

    demo04.js const greeting = _name => `hello ${_name}`;module.exports.greeting = greeting; demo05.j ...

  5. 前端学习(530):等分布局得间距方案第二种方式

    <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8" ...

  6. pyecharts学习(part1)--绘制图表的三种方式

    学习笔记,仅供参考,有错必究 文章目录 pyecharts学习 绘制图表的三种方式 绘制的图表生成HTML jupyter notebook 内嵌展示 pyecharts生成图片 pyecharts学 ...

  7. STM32 学习笔记3-智能小车-红外避障

    目录 红外避障基本原理: 硬件: 红外传感元器件:红外,眼睛,探测前方障碍物的情况,并反馈给小车 控制模块:STM32  F103 系列         LM393 :比较电压 电路图: 软件: 逻辑 ...

  8. 手里没有USB转TTL模块调试红外学习模块不要紧,利用最小系统板自己焊接一个

    网友邮来一个红外学习模块,玩起来还不错,利用它可以把我家的电视.空调控制起来,今天给大家分享一下这个模块的调试过程,如果手里没有USB转TTL模块的,可以利用咱们的最小系统核心板,自己制作一个USB转 ...

  9. 2021爱智先行者—红外学习模块(空调遥控器)

    [本文正在参与"2021爱智先行者-征文大赛"活动]https://mp.weixin.qq.com/s/I2s99dZpbP0QpMiKFneYJA 前言 之前做了两个传感器20 ...

最新文章

  1. 10分钟部署一个数据中心
  2. CSS 高级布局技巧
  3. C++加号运算符重载
  4. gulimall(谷粒商城) 是一个综合性的B2C平台,包括前台商城系统以及后台管理系统
  5. Oracle日期范围
  6. 20191126_2_英文情感分析
  7. SOLID原则(转载)
  8. 在计算机设备中 麦克风属于( ),计算机一级考试基础及MSOffice应用单选真题
  9. 最全jar包下载地址
  10. Less 颜色操作函数Mix的计算方法
  11. 计算机英语新词的认知语义阐释论文,英语新词的认知语义分析
  12. html 链接nofollow,超链接的noopener、noreferrer以及nofollow属性
  13. Wannacrypt蠕虫老树开花?又见Wannacrypt
  14. ValueError:Traceback(most ...)数据集中图片 not exists
  15. Testin云测平台操作步骤
  16. 致奋斗的年轻人 阿里云在云栖大会等你
  17. 【艾琪出品】《计算机应用基础》【试题汇总1】
  18. 一般各类模具开模周期
  19. 利用声音传感器控制led灯功能_树莓派 LED+蜂鸣+声音传感器+红外模块组合打造声控/红外控制LED...
  20. 80端口进不去问题解析

热门文章

  1. JS判断当前设备(手机、电脑、iPad)
  2. 实体类或对象序列化时,忽略为空属性
  3. css任意返回100以内的随机整数(可连续点击)
  4. jmeter-察看结果树-响应数据中的中文显示乱码
  5. android 面试
  6. 浅析kubernates的pv和pvc
  7. 最最最详细讲解Vuex (你值得拥有!!!)
  8. MSB8040: Spectre-mitigated libraries
  9. 国考计算机怎么评分标准,国考评分标准
  10. 推荐一款好用且能兼职赚钱的自动化工具 - Hamibot