红外发射

#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;
}
时间: 2024-09-29 10:02:58

红外发射的相关文章

STC12C5A60S2 12M 红外发射

/* STC12C5A60S2 11.0592M  从串口获取数据,红外发射 串口发送请用16进制的格式 这里采用1T周期的STC12C5A60S2单片机,11.0592MHZ 正电源→红外LED→P0.0脚. 串口1默认选T1作为波特率发生器 TO用于中断 */ #include <STC12C5A60S2.H> #include <INTRINS.h> sbit  ISR_LED = P0^0; static bit wave;                   //载波标志

【最终版】STC12C5A60S2 12M 导线代替 红外发射

/* 项目名称:机顶盒频道锁定 日期:2016年1月31日  23:33 版本:2.0 设计:chunli 博客:http://990487026.blog.51cto.com/ 邮箱:[email protected] 编码环境:GBK2312简体中文 μVision 版本:4.72.9.0  代码类型:C语言 功能:用导线的方式实现红外控制功能 更新说明: 1, 废弃弃原来模拟按键的方式去控制机顶盒的频道,因为这种方式不稳定. 2,采用红外控制的思想,用导线代替红外发射,频道锁定迅速 为什么

【转载】浅谈38K红外发射接受编码

转自Doctor_A 坛友的笔记! 之前做接触过一次红外遥控器,现在有空想用简单的话来聊一聊,下面有错误的地方欢迎改正指出: 1:红外的概念不聊,那是一种物理存在.以下聊38K红外发射接收,主要讲可编程的红外编码. 2:红外遥控 红外遥控首先需要用来发“光”的红外发光管,还有一个接收光线的“接收管”(不是那种触发的红外对管),还有一个产生38K的信号源(可以是MCU中断实现还有就是市场上大把的红外编码IC),只需要简单的外围电路即可. 就单片机而言,为了增大红外发光管电流,需要用一个三极管驱动.

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

/* 89C52RC 12M晶振  红外发射试验, 在红外解码和机顶盒上都测试可用! 发射的编码是      SendIRdata(0x48,0x77,0x01);这个一个向下的按键编码 红外发射管的正极接VCC 5V 红外发射管的负极接21号引脚  */ #include <REG51.h>  static bit wave;              //红外发射管的亮灭 static unsigned int count;    //延时计数器 static unsigned int e

arduino红外控制led(发射与接收)

网上有关红外接收的帖子不少,但是关于使用arduino自制红外发射器的帖子却很少,经过网上搜索和自己摸索,给大家发个有arduino自制红外发射器控制led亮灭的例子.关于本例我使用了两块arduino板,一块用于发射,一块用于接收. 一.红外发射(开发板一) 1 /* 2 * 发射红外线讯号 3 * 注意! 红外线发射器(IR LED)必须接到 pin 3, 不能接其它脚位,头文件已经定义,所以下面不用设置pin3口的状态 4 */ 5 #include <IRremote.h> // 引用

[每日电路图] 2、红外遥控电路原理设计与解析【转+解读】

          楼主说:本文主要讲一个红外遥控电路的原理及设计,第四部分是重点,用电路图说明具体过程——接收,计数,满足条件触发控制电路! from elecfans:http://www.elecfans.com/article/88/131/198/2015/20151215394306.html 一.概述: 红外遥控的发射电路是采用红外发光二极管来发出经过调制的红外光波:红外接收电路由红外接收二极管.三极管或硅光电池组成,它们将红外发射器发射的红外光转换为相应的电信号,再送后置放大器.

18、红外

一.红外线工作原理 1.红外线系统的组成 红外线遥控器已被广泛使用在各种类型的家电产品上,它的出现给使用电器提供了很多的便利.红外线系统一般由红外发射装置和红外接收设备两大部分组成.红外发射装置又可由键盘电路.红外编码芯片.电源和红外发射电路组成.红外接收设备可由红外接收电路.红外解码芯片.电源和应用电路组成.通常为了使信号更好的被发射端发送出去,经常会将二进制数据信号调制成为脉冲信号,通过红外发射管发射.常用的有通过脉冲宽度来实现信号调制的脉宽调制(PWM)和通过脉冲串之间的时间间隔来实现信号

小X教你做智能家居玩具----手机万能红外遥控器

今天小X教你用你的智能手机做一个万能遥控器 需要准备一些材料: 1:一个搭载38K载波的红外发射管,(波长940nm) 标准模式:30KHz-60KHz:远程模式:38K. 我们的万能遥控器最好使用品牌的 品牌的38K+-5KB都适用 正常的38K+-3KB适用 部分山寨的遥控器载波最大到最大38K±20K,我们的遥控器将无法使用了, 所以我们的万能遥控器只能控制85%左右的红外设备 适用与于下列带红外控制的设备(电视,机顶盒,空调,投影仪,盒子,DVD,功放,单反,风扇,红外灯) 需要一个载波

智能家居之红外遥控---手机万能红外遥控器

今天小X教你用你的智能手机做一个万能遥控器 需要准备一些材料: 1:一个搭载38K载波的红外发射管,(波长940nm) 标准模式:30KHz-60KHz:远程模式:38K. 我们的万能遥控器最好使用品牌的 品牌的38K+-5KB都适用 正常的38K+-3KB适用 部分山寨的遥控器载波最大到最大38K±20K,我们的遥控器将无法使用了, 所以我们的万能遥控器只能控制85%左右的红外设备 适用与于下列带红外控制的设备(电视,机顶盒,空调,投影仪,盒子,DVD,功放,单反,风扇,红外灯) 需要一个载波