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;                   //载波标志
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.693ms
     else  SendIRdata_38KHZ(43, 0);   //0为窄电平,13.02*43=0.560ms
     irdata=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);  
 
  //发送总的结束位1bit
  SendIRdata_38KHZ(43, 1);     //13.02*43=0.56ms

  wave_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;
}
时间: 2024-10-18 20:13:14

STC12C5A60S2 12M 红外发射的相关文章

【最终版】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,采用红外控制的思想,用导线代替红外发射,频道锁定迅速 为什么

【经典程序】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

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

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

红外发射

#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 iraddr

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

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

基于STC12系列单片机的通用红外遥控信号分析程序(一)

前言 最近学51单片机学习到红外遥控解码与发送部分,开发板的相关教程只有NEC协议的解码,基本的解码套路是1838接收头输出管脚接单片机外部中断0,当接收到红外信号时产生下降沿触发中断,在中断函数中先延时9ms判断电平再延时4.5ms判断电平,从而跳过引导码:再分别延时560us.1690us左右不等的时间判断电平来解码“0”或“1”,直到结束:红外发送思路就是根据NEC协议及红外码值的二进制码分别控制高低电平,并延时相应的时间.但存在这么几个问题: 1. 解码逻辑写死在中断处理函数中,不方便扩

[原创]基于51单片机的红外遥控课程设计

[注]: 一眨眼,大学接近尾声,具有找工作需要,所以把大学做的电子设计“劣作”放上来.希望考研失意,还能赶上“好工作”的春招班车.如果大伙有什么工作推荐也可以联系我哦,因为一年考研少接触了这方面,所以难免有些生疏.但请相信我!给我机会我会很认真学的! 邮箱:[email protected] 转载请注明出处呀! 基于51单片机的红外遥控课程设计 目录 第一章 设计简介... 3 第二章 系统方案... 3 一.设计方案对比... 3 二.方案设计... 4 第三章 硬件设计... 5 一.红外遥

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

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

18、红外

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