历史上的今天
返回首页

历史上的今天

今天是:2025年04月15日(星期二)

正在发生

2020年04月15日 | MSP430(F149)学习笔记——红外接收

2020-04-15 来源:eefocus

用MSP430(F149)做红外接收比发送更为简单,我采用的红外传感器是HS0038B,这个原件在接收到38K红外时输出低电平,否则输出高电平,因此,我们就可以从这点开始编写程序了,由于HS0038B的电路图很多,我这里就不贴出来了,下面是具体的代码:

#include

#include "delay.h"

 

static unsigned short addr = 0x00;

static unsigned char ir_rx_buf[256];

static unsigned char ir_rx_w_offset = 0;

static unsigned char ir_rx_r_offset = 0;

 

void ir_tx_open(){

  P2DIR |= BIT2 | BIT3;//P2.2, P2.3输出

  P2SEL |= BIT3; //P2.2:IO P2.3:TA0

  P2SEL &= ~BIT2; //

  P2OUT &= ~(BIT2 | BIT3);

  

  //38K->P2.3

  CCR0 = (int)(26.3*8 + 0.5);

  CCTL1 = OUTMOD_6;

  CCR1 = (int)(13.15*8 + 0.5);

 

  TACTL = TASSEL_2 + MC_1;

}

 

void ir_set_addr(unsigned char addr){

  addr = (unsigned char)(0xff&addr);

}

 

static void ir_start(){

  P2OUT |= BIT2;

  delay_us(9000);

  

  P2OUT &= ~BIT2;

  delay_us(4500);

}

 

static void ir_next(){

  P2OUT |= BIT2;

  delay_us(9000);

  

  P2OUT &= ~BIT2;

  delay_us(2250);

}

 

static void ir_send_byte(unsigned char c){

  unsigned char i;

  

  for(i = 0; i != 8; ++i){

    P2OUT |= BIT2;

    delay_us(560);

    

    P2OUT &= ~BIT2;

    if(c&0x01){

      delay_us(1685);

    }

    else{

      delay_us(565);

    }

    

    c >>= 1;

  }

}

 

static void ir_end(){

  P2OUT |= BIT2;

  delay_us(300);

  P2OUT &= ~BIT2;

}

 

void ir_put_char(unsigned char c){

  ir_start();

  ir_send_byte(addr);

  ir_send_byte(~addr);

  ir_send_byte(c);

  ir_send_byte(~c);

  ir_end();

}

 

void ir_put_string(char* str){

  if(*str != '')

    ir_start();

  else

    return;

  while(1){

    ir_send_byte(addr);

    ir_send_byte(~addr);

    ir_send_byte(*str);

    ir_send_byte(~(*str));

    

    ++str;

    

    if(*str != ''){

      ir_next();

    }

    else{

      ir_end();

    }

  }

}

 

void ir_put_array(unsigned char* array, unsigned int length){

  unsigned int i;

  

  ir_start();

  

  for(i = 0; i != length; ++i){

    ir_send_byte(addr);

    ir_send_byte(~addr);

    ir_send_byte(array[i]);

    ir_send_byte(array[i]);

    

    if(i < length-1){

      ir_next();

    }

    else{

      ir_end();

    }

  }

}

 

void ir_tx_close(){

  P2SEL &- ~BIT3;

  P2DIR |= BIT3;

  P2OUT &= ~BIT3;

  TACTL = TACLR;

}

 

void ir_rx_open(){

  P2SEL &= ~BIT0; //I/O

  P2DIR &= ~BIT0; //Input

  P2IES |= BIT0;  //High->Low

  P2IE  |= BIT0;  //Enable interrupt

}

 

void ir_rx_close(){

  P2IE  &= ~BIT0;  //Disable interrupt

}

 

unsigned char ir_get(){

  while(ir_rx_r_offset == ir_rx_w_offset);

  return ir_rx_buf[ir_rx_r_offset++];

}

 

#pragma vector=PORT2_VECTOR

__interrupt void port2_handler(){

  static unsigned char ir_code[4];

  unsigned char i, j;

  unsigned short time;

  

  if(P2IFG&BIT0){

    P2IE &= ~BIT0;

    P2IFG &= ~BIT0;

    _EINT();

    

    time_start(9500);

    while(!time_out() && !(P2IN&BIT0));

    time = time_end();

    if(!time_out() && time > 8500){

      time_start(5000);

      while(!time_out() && (P2IN&BIT0));

      time = time_end();

      if(!time_out() && time > 4000){

        for(i = 0; i != 4; ++i){

          for(j = 0; j != 8; ++j){

            while(!(P2IN&BIT0));//等待高电平

            time_start(2000);   //计时高电平

            while(!time_out() && (P2IN&BIT0));

            time = time_end();

            ir_code[i] >>= 1;

            if(!time_out() && time > 1500){

              //uart_put(0x03);

              ir_code[i] |= 0x80;

            }

            else{

              //uart_put(0x04);

              ir_code[i] &= 0x7f;

            }

          }

        }

        

        if(ir_code[0] == addr && (0xff == ir_code[0] + ir_code[1])){

          if(0xff == ir_code[2] + ir_code[3]){

            ir_rx_buf[ir_rx_w_offset++] = ir_code[2];

          }

        }

      }

    }

    

    P2IE |= BIT0;;

  }

}

推荐阅读

史海拾趣

Astema公司的发展小趣事

随着技术的不断成熟,Astema开始积极拓展市场。公司制定了一系列市场策略,包括与大型电子设备制造商建立合作关系、参加国际电子展等,以扩大品牌影响力。通过这些努力,Astema逐渐打开了国际市场的大门,其产品远销海外,市场份额稳步提升。

Hi-Tech Resistors Pvt Ltd公司的发展小趣事

随着业务的迅速增长,Astema意识到供应链管理的重要性。公司开始优化供应链管理流程,提高生产效率和产品质量。同时,Astema还与供应商建立了紧密的合作关系,确保原材料供应的稳定性和可靠性。这些举措使得Astema在激烈的市场竞争中保持了稳定的运营。

Greenconn Corp公司的发展小趣事
确保冰箱内部和外部的线路连接牢固,如有松动需重新连接。
Dino-Lite公司的发展小趣事

Dino-Lite公司自创立之初,就专注于数字显微镜技术的研发与创新。公司研发团队不断探索新技术,将传统显微镜与现代数字技术相结合,成功推出了一系列高性能、易用性强的Dino-Lite数字显微镜产品。这些产品以其高清画质、便捷操作和广泛适用性,迅速赢得了市场的认可。

随着技术的不断进步,Dino-Lite公司不断推出新产品,满足了不同行业对数字显微镜的需求。例如,公司针对医疗领域推出了高分辨率、低光环境下的专业显微镜,为医疗诊断和治疗提供了有力支持;同时,针对教育行业推出了性价比高的入门级产品,让更多的学生和老师能够接触和使用到先进的显微镜技术。

Baumer Electric Ag公司的发展小趣事

Baumer Electric Ag公司创立于1952年,初期主要专注于微动开关的生产。面对市场竞争的激烈,公司创始人Herbert Baumer凭借其敏锐的市场洞察力和坚定的决心,带领团队不断研发新产品,提升技术水平。1960年,公司成功推出首个程序控制系列,标志着Baumer在电控生产流程监控和控制领域取得了重要突破。

Facon公司的发展小趣事

在发展过程中,Facon遇到了许多技术难题。然而,他们从未放弃过对技术的追求和突破。经过数年的研究和实践,Facon成功研发出了一款具有划时代意义的低功耗芯片,该芯片在保持高性能的同时,大大降低了能耗,为电子产品的续航能力带来了革命性的提升。这一技术突破让Facon在行业中声名鹊起,吸引了众多合作伙伴的关注。

问答坊 | AI 解惑

被动元件基础知识

电感,电容,电磁兼容的基础知识。…

查看全部问答>

PCF8591T实现AD转换的程序,有几点不懂,求高人指点

#include #include #define  PCF8591 0x90    //PCF8591 地址 //else IO sbit    LS138A=P2^2;   sbit    LS138B=P2^3; sbit    LS138C=P2^4;   //此表为 LED 的 ...…

查看全部问答>

请问谁知道在wc上很酷很炫的界面如何是实现的,带有3d效果的那种。

请问谁知道在wc上很酷很炫的界面如何是实现的,带有3d效果的那种。 …

查看全部问答>

请问opera能在vxworks下运行吗?

opera好像还是风河的合作伙伴吧。…

查看全部问答>

如何往嵌入式开发板内加vi

有一嵌入式开发板做学习用,但命令过于精简了,竟然没有vi。请问如何加到班子里??…

查看全部问答>

USB口HID类设备的数据读取

采用WINDOWS2003 DDK开发,vs.net2003,VC7,硬件为一个读取电话号码的小模块。 问题: 1,该硬件在系统显示为两个,人体学接口设备,显示为KEYBORD; 2,用BH500可以抓到相关数据包,没有问题,但是用HID类访读不到数据; 3,HIDD_GETGUID得到 ...…

查看全部问答>

PWM脉冲时的三角载波的频率和幅值应该如何设置啊

请问在产生PWM脉冲时的三角载波的频率和幅值应该如何设置啊?…

查看全部问答>

stm8s 在中断里采集AD问题

我在定时器1中断里用定时器4来计时,在定时器4中断中采集一次AD 通道6,当程序跑到定时器1中断中时再采一次AD 通道5,这时程序就会卡死在while(!EOC);一直在等待转换完成,这是什么样的情况,请大虾帮忙看看啊   //定时器1中断子程序 @far ...…

查看全部问答>

关于GPS/北斗/SBAS/GLONS相关知识了解

GPS是英文Global Positioning System(全球定位系统)的简称。GPS起始于1958年美国军方的一个项目,1964年投入使用。20世纪70年代,美国陆海空三军联合研制了新一代卫星定位系统GPS 。主要目的是为陆海空三大领域提供实时、全天候和全球性的导航服 ...…

查看全部问答>