博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MSP430(F149)学习笔记——红外接收
阅读量:4322 次
发布时间:2019-06-06

本文共 3522 字,大约阅读时间需要 11 分钟。

用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;; }}

包含整理后的红外发送和接收,放在这里做个记录,有什么疑问欢迎留言讨论。

 

转载于:https://www.cnblogs.com/snake-hand/archive/2013/06/07/3125027.html

你可能感兴趣的文章
关于wxWidgets
查看>>
codevs 1160 蛇形矩阵
查看>>
在outlook中查找Skype的聊天记录
查看>>
netsh命令
查看>>
nginx set变量后lua无法改值
查看>>
baseAdapter
查看>>
别让你妈知道!
查看>>
JAVA设计模式之迭代子模式
查看>>
Java程序生成exe可执行文件
查看>>
什么是blob,mysql blob大小配置介绍
查看>>
模运算的规则
查看>>
CSS样式布局入门介绍,非常详尽
查看>>
android app崩溃日志收集以及上传
查看>>
3、VS2010+ASP.NET MVC4+EF4+JqueryEasyUI+Oracle项目开发之——用户登录
查看>>
面试记-(1)
查看>>
压力测试 相关
查看>>
android update automatically ( android 自动升级)
查看>>
session cookie
查看>>
POJ 1222 EXTENDED LIGHTS OUT(翻转+二维开关问题)
查看>>
【BZOJ-4059】Non-boring sequences 线段树 + 扫描线 (正解暴力)
查看>>