新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > MSP430(f149)學習筆記——紅外遙控發射

        MSP430(f149)學習筆記——紅外遙控發射

        作者: 時間:2016-11-28 來源:網絡 收藏
        最近由于項目需求,研究了一下MSP430,總體感覺MSP430還是非常不錯的單片機,不虧是TI的產品。項目中用MSP430實現了紅外遙控功能,下面我們先來分析一下紅外的發送原理。
        紅外發送原理

        紅外發送實際上是按照一定的時間間隔,斷斷續續的發送紅外射線來進行數據傳輸,為了提高數據傳輸的準確定和降低功耗,紅外一般是采用38K的紅外調制信號,其中,38K允許上下浮動1K以內的誤差。紅外發送的開頭需要一個引導位,引導位是發送9ms,然后停止4.5ms,如果發送完一個數據之后還需要再發數據的話還需要連發碼,連發碼是先發送9ms,然后停止4.5ms。引導碼和連發碼的波形如下:

        本文引用地址:http://www.104case.com/article/201611/322815.htm

        引導碼和連發碼之后是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單片機的紅外解碼測試程序來調試的,現在已經完全沒有問題了,如果有什么疑問,歡迎留言討論。


        評論


        技術專區

        關閉
        主站蜘蛛池模板: 丰台区| 桦南县| 崇州市| 麻阳| 仲巴县| 贞丰县| 玉屏| 加查县| 灯塔市| 翁源县| 皋兰县| 灌南县| 金乡县| 陆丰市| 稻城县| 武威市| 资源县| 莒南县| 太和县| 泽州县| 集安市| 故城县| 南部县| 新乡县| 达拉特旗| 临夏县| 社旗县| 武定县| 漠河县| 合江县| 西盟| 福鼎市| 绵竹市| 大化| 大兴区| 德清县| 稻城县| 吉木萨尔县| 浑源县| 山西省| 金门县|