您的位置 首页 解答

MSP430(f149)学习笔记——红外遥控发射

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

最近因为项目需求,研讨了一下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. staticunsignedintcnt=0;
  3. voiddelay_ms(unsignedintms){
  4. cnt=ms;
  5. TBCCR0=1000;
  6. TBCTL=CNTL_0+TASSEL_2+MC_1+ID_3;
  7. TBCCTL0=CCIE;
  8. while(cnt!=0);
  9. TBCTL=MC_0;
  10. }
  11. voiddelay_us(unsignedintus){
  12. cnt=1;
  13. TBCCR0=us;
  14. TBCTL=CNTL_0+TASSEL_2+MC_1+ID_3;
  15. TBCCTL0=CCIE;
  16. while(cnt!=0);
  17. TBCTL=MC_0;
  18. }
  19. voidir_open(){
  20. P2DIR|=BIT2|BIT3;//P2.2,P2.3输出
  21. P2SEL|=BIT3;//P2.2:IOP2.3:TA0
  22. P2OUT&=~(BIT2|BIT3);
  23. //38K->P2.3
  24. CCR0=(int)(26.3*8+0.5);
  25. CCTL1=OUTMOD_6;
  26. CCR1=(int)(13.15*8+0.5);
  27. TACTL=TASSEL_2+MC_1;
  28. }
  29. voidir_start(){
  30. P2OUT|=BIT2;
  31. delay_us(9000);
  32. P2OUT&=~BIT2;
  33. delay_us(4500);
  34. }
  35. voidir_next(){
  36. P2OUT|=BIT2;
  37. delay_us(9000);
  38. P2OUT&=~BIT2;
  39. delay_us(2250);
  40. }
  41. voidir_send_byte(unsignedcharc){
  42. unsignedchari;
  43. for(i=0;i!=8;++i){
  44. P2OUT|=BIT2;
  45. delay_us(560);
  46. P2OUT&=~BIT2;
  47. if(c&0x01){
  48. delay_us(1685);
  49. }
  50. else{
  51. delay_us(565);
  52. }
  53. c>>=1;
  54. }
  55. }
  56. voidir_end(){
  57. P2OUT|=BIT2;
  58. delay_us(300);
  59. P2OUT&=~BIT2;
  60. }
  61. voidir_put(unsignedcharc){
  62. ir_start();
  63. ir_send_byte(0x00);
  64. ir_send_byte(0xff);
  65. ir_send_byte(c);
  66. ir_send_byte(~c);
  67. ir_end();
  68. }
  69. voidir_close(){
  70. P2SEL&-~BIT3;
  71. P2DIR|=BIT3;
  72. P2OUT&=~BIT3;
  73. TACTL=TACLR;
  74. }
  75. voidmain(void)
  76. {
  77. WDTCTL=WDTPW+WDTHOLD;//StopWDT
  78. BCSCTL1&=~XT2OFF;//使能XT2
  79. do
  80. {
  81. IFG1&=~OFIFG;//铲除XT2标志
  82. _NOP();
  83. }
  84. while((IFG1&OFIFG));//等候外部晶振安稳即寄存器IFGI的OFIFG位等于0
  85. BCSCTL2|=SELM_2;//将MCLK装备为XT2
  86. BCSCTL2|=SELS;//将SMCLK装备1/2XT2即4M
  87. _EINT();
  88. ir_open();
  89. //ir_close();//封闭红外函数,这儿不必
  90. while(1){
  91. delay_ms(1000);
  92. //P2OUT^=BIT2;
  93. ir_put(0x83);
  94. }
  95. }
  96. #pragmavector=TIMERB0_VECTOR
  97. __interruptvoidtimerb_handler(){
  98. –cnt;
  99. }

好了,看过上面这些材料,红外的发送就不会有什么疑问了,调试的时分我是用51单片机的红外解码测验程序来调试的,现在现已彻底没有问题了,假如有什么疑问,欢迎留言评论。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/changshang/jieda/319466.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部