用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 != '\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;; }}
包含整理后的红外发送和接收,放在这里做个记录,有什么疑问欢迎留言讨论。