2748|0

12

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

MSP430(f149)学习笔记——红外遥控发射 [复制链接]

最近由于项目需求,研究了一下MSP430,总体感觉MSP430还是非常不错的单片机,不亏是TI的产品。项目中用MSP430实现了红外遥控功能,下面我们先来分析一下红外的发送原理。
红外发送原理

红外发送实际上是按照一定的时间间隔,断断续续的发送红外射线来进行数据传输,为了提高数据传输的准确定和降低功耗,红外一般是采用38K的红外调制信号,其中,38K允许上下浮动1K以内的误差。红外发送的开头需要一个引导位,引导位是发送9ms,然后停止4.5ms,如果发送完一个数据之后还需要再发数据的话还需要连发码,连发码是先发送9ms,然后停止4.5ms。引导码和连发码的波形如下:

引导码和连发码之后是32位数据位,这32位数据位实际上是一个字节,其中,前16位是用户自定义地址码,用来区分红外是发给谁的,比如,电视的红外遥控是不能操作冰箱或空调的,剩下的16位是传输的数据,其中前8位是要传送的一个字节,后8位是这个字节的反码,用来校验数据传输的是否正确的,数据位无非就是0或1,其中0是先发送560us红外,然后停止565us,1是先发送560us然后停止1685us,0和1的波形如下:

每次传输实际上就是一个引导码加32位数据位或者一个连发码加32位数据位,整体的波形如下:

注意,你上所有的波形都是接收时的波形,由于红外接收头,如HS0038B,在采集到38K红外线时输出低电平,在采集不到38K红外线时输出高电平,所以,当发送红外线时在波形中为低电平,停止发送时反而为高电平。

实现电路
熟习了原理以后,再来设计电路图就非常简单了,用两个三极管停止串联,其中一个的基极(无论是PNP还是NPN,都是旁边那个脚)接到38K方波上,另一个的基极接到发送控制引脚上,我这里没有自己来绘制原理图,采用了一个网上的原理图,具体如下:

代码设计

下面的原理部分都理通了,下面,我们用MSP430来实现设计,其中P2.3口是MSP430的PWM输出引脚,这里是输出38K方波,P2.2口为发送停止控制引脚。具体代码如下:

  1. #include  <msp430x14x.h>  
  2.   
  3. static unsigned int cnt = 0;  
  4.   
  5. void delay_ms(unsigned int ms){  
  6.   cnt = ms;  
  7.    
  8.   TBCCR0 = 1000;  
  9.   TBCTL = CNTL_0 + TASSEL_2 + MC_1 + ID_3;  
  10.   TBCCTL0 = CCIE;  
  11.    
  12.   while(cnt != 0);  
  13.    
  14.   TBCTL = MC_0;  
  15. }  
  16.   
  17. void delay_us(unsigned int us){  
  18.   cnt = 1;  
  19.    
  20.   TBCCR0 = us;  
  21.   TBCTL = CNTL_0 + TASSEL_2 + MC_1 + ID_3;  
  22.   TBCCTL0 = CCIE;  
  23.    
  24.   while(cnt != 0);  
  25.    
  26.   TBCTL = MC_0;  
  27. }  
  28.   
  29. void ir_open(){  
  30.   P2DIR |= BIT2 | BIT3;//P2.2, P2.3输出  
  31.   P2SEL |= BIT3; //P2.2:IO P2.3:TA0  
  32.   P2OUT &= ~(BIT2 | BIT3);  
  33.    
  34.   //38K->P2.3  
  35.   CCR0 = (int)(26.3*8 + 0.5);  
  36.   CCTL1 = OUTMOD_6;  
  37.   CCR1 = (int)(13.15*8 + 0.5);  
  38.   
  39.   TACTL = TASSEL_2 + MC_1;  
  40. }  
  41.   
  42. void ir_start(){  
  43.   P2OUT |= BIT2;  
  44.   delay_us(9000);  
  45.    
  46.   P2OUT &= ~BIT2;  
  47.   delay_us(4500);  
  48. }  
  49.   
  50. void ir_next(){  
  51.   P2OUT |= BIT2;  
  52.   delay_us(9000);  
  53.    
  54.   P2OUT &= ~BIT2;  
  55.   delay_us(2250);  
  56. }  
  57.   
  58. void ir_send_byte(unsigned char c){  
  59.   unsigned char i;  
  60.    
  61.   for(i = 0; i != 8; ++i){  
  62.     P2OUT |= BIT2;  
  63.     delay_us(560);  
  64.       
  65.     P2OUT &= ~BIT2;  
  66.     if(c&0x01){  
  67.       delay_us(1685);  
  68.     }  
  69.     else{  
  70.       delay_us(565);  
  71.     }  
  72.       
  73.     c >>= 1;  
  74.   }  
  75. }  
  76.   
  77. void ir_end(){  
  78.   P2OUT |= BIT2;  
  79.   delay_us(300);  
  80.   P2OUT &= ~BIT2;  
  81. }  
  82.   
  83. void ir_put(unsigned char c){  
  84.   ir_start();  
  85.   ir_send_byte(0x00);  
  86.   ir_send_byte(0xff);  
  87.   ir_send_byte(c);  
  88.   ir_send_byte(~c);  
  89.   ir_end();  
  90. }  
  91.   
  92. void ir_close(){  
  93.   P2SEL &- ~BIT3;  
  94.   P2DIR |= BIT3;  
  95.   P2OUT &= ~BIT3;  
  96.   TACTL = TACLR;  
  97. }  
  98.   
  99. void main(void)  
  100. {  
  101.   WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT  
  102.    
  103.   BCSCTL1&=~XT2OFF;  //使能XT2  
  104.   do  
  105.   {  
  106.     IFG1&=~OFIFG;        //清除XT2标志  
  107.     _NOP();      
  108.   }   
  109.   while((IFG1&OFIFG));   // 等待外部晶振稳定  即寄存器IFGI的OFIFG位等于0  
  110.   BCSCTL2|=SELM_2;       //将MCLK配置为XT2  
  111.   BCSCTL2|=SELS;  //将SMCLK配置1/2XT2 即4M   
  112.    
  113.   _EINT();  
  114.            
  115.   ir_open();  
  116.   //ir_close();//关闭红外函数,这里不用  
  117.    
  118.   while(1){  
  119.     delay_ms(1000);  
  120.     //P2OUT ^= BIT2;  
  121.     ir_put(0x83);  
  122.   }  
  123. }  
  124.   
  125. #pragma vector=TIMERB0_VECTOR  
  126. __interrupt void timerb_handler(){  
  127.   --cnt;  
  128. }  
复制代码

好了,看过上面这些资料,红外的发送就不会有什么疑问了,调试的时候我是用51单片机的红外解码测试程序来调试的,现在已经完全没有问题了,如果有什么疑问,欢迎留言讨论。


 
点赞 关注

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

随便看看
查找数据手册?

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
快速回复 返回顶部 返回列表