2400|1

2015

帖子

0

TA的资源

纯净的硅(中级)

楼主
 

MSP430F149-红外接收 [复制链接]

用MSP430(F149)做红外接收比发送更为简单,我采用的红外传感器是HS0038B,这个原件在接收到38K红外时输出低电平,否则输出高电平,因此,我们就可以从这点开始编写程序了,由于HS0038B的电路图很多,我这里就不贴出来了,下面是具体的代码:
[cpp] view plain copy
#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 != '\0')  
    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 != '\0'){  
      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;;  
  }  
}  
包含整理后的红外发送和接收,放在这里做个记录,有什么疑问欢迎留言讨论。

最新回复

nice  详情 回复 发表于 2018-3-19 13:22
 
点赞 关注

回复
举报

24

帖子

0

TA的资源

一粒金砂(中级)

沙发
 
nice
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表