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

为什么要这么设计?
   因为该环境内有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.693ms
     else  SendSingle(43, 0);   //0为窄电平,13.02*43=0.560ms
     irdata=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
// 黑龙江卫视    25
    DELAY_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).
时间: 2024-10-09 13:54:23

【最终版】STC12C5A60S2 12M 导线代替 红外发射的相关文章

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;                   //载波标志

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

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

jQuery 3.0最终版发布,十大新特性眼前一亮

jQuery 3.0在日前发布了最终的全新版本.从2014年10月,jQuery团队对这个主要大版本进行维护开始,web开发者社区便一直在期待着这一刻的到来,终于在2016年6月他们迎来了这一个最终版www.lampbrother.net. 通过jQuery 3.0的版本更新说明,我们看到了一个保持着向后兼容的更轻便,更快速的jQuery.在本文中,我们将介绍一些令人眼前一亮的jQuery 3.0全新特性. 开始前的说明 如果你想要下载jQuery 3.0进行亲自实验,可以通过该页面进行下载.另

最终版的Web(Python实现)

天啦,要考试了,要期末考试了,今天把最终版的Python搭建Web代码先写这里记下了.详细的过程先不写了. 这次是在前面的基础上重写 HTTPServer 与 BaseHTTPRequestHandler,主要利用 python 提供 的 socket 进行编程,从而实现消息的接收与相应:然后再接着引入多线程,分别处理来自客户端的请求:最后实现根据客户端传递的参数动态生成页面的功能. 主要步骤如下: 一. .重写 HTTPServer 与 BaseHTTPRequestHandlerPython

结对项目--四则运算图形化最终版

四则运算器图形化最终版 (然而被我做成了奇怪的东西 组员:13070030张博文 13070033刘云峰 一.概念阶段 最初是想试试用android做个计算器app,无奈从零学起着实太赶,而且这个计划在试用了无比卡顿占内存的android studio后就彻底搁浅了. 然后就被路人谣传说MFC好用,无奈从零学起着实太赶,而且这个计划在无人指导的摸黑下也顺手搁浅了. 最终便沦为了EasyX旧传统,好歹有点基础,但果然还是不太甘心. 以及因为当初想做app,所以抠了iphone计算器的图想当UI,结

理解《JavaScript设计模式与开发应用》发布-订阅模式的最终版代码

最近拜读了曾探所著的<JavaScript设计模式与开发应用>一书,在读到发布-订阅模式一章时,作者不仅给出了基本模式的通用版本的发布-订阅模式的代码,最后还做出了扩展,给该模式增加了离线空间功能和命名空间功能,以达到先发布再订阅的功能和防止名称冲突的效果.但是令人感到遗憾的是最终代码并没有给出足够的注释.这让像我一样的小白就感到非常的困惑,于是我将这份最终代码仔细研究了一下,并给出了自己的一些理解,鉴于能力有限,文中观点可能并不完全正确,望看到的大大们不吝赐教,谢谢! 下面是添加了个人注释的

成为C++高手之最终版计算器

下面做我们的计算器最终版. 当前还存在的问题是用户只能算一次.如果有人买一个一次性计算器,那么他肯定是个土豪.我们的计算器不能只给土豪用,所以要改成可以反复使用的. 使用循环语句就可以了,但是循环哪些代码呢?从用户输入到打印出结果这个过程要反复执行,代码如是: enum OPT{ jia = 1, jian, cheng, chu }; int main(void) { //保存用户输入的数 int number1; int number2; int opt;//运算符 //循环从输入到输出结果

20172333 2017-2018-2 《程序设计与数据结构》实验2报告(最终版)

20172333 2017-2018-2 <程序设计与数据结构>实验2报告(最终版) 1.结对成员 李楠20172330 领航员:李楠 驾驶员:严域俊 成绩分配:五五开 2.相关测试过程及截图 [x] 完整一套流程截图(创建题目,中缀转后缀,计算后缀,对比答案,答案正确个数.) [x] 分数测试类单独测试截图 [x] 整数测试类单独测试截图 [x] 中缀转后缀单独测试截图 3.测试中遇到的问题及解决办法 这周主要问题所在:由于在最后计算测试类编写的时候运用的方法来自几个类的合并,导致了在输出答

25岁,我习得了自愈近视的魔法-最终版(填坑版)

转自:http://blog.sina.com.cn/s/blog_624791ed0100ftp9.html#comment4 距离上次发帖差不多有2个月了,之前的帖子差了很多东西,很糙,特别是没和所发资料有所关联.而且那段时间我比较忙.压力也比较大,没时间去整理自己的想法.而且所发书上所述不是完全正确的,特别是台湾和日本的那两本,没什么理论根据.近几天我把这些书又翻了一遍,决定按照毕业论文的格式再写一遍,也算是对上次不怎么负责任的发帖的补偿吧.感谢S1er的支持,不废话了. 简述 简述一下整