MSP430F5438无线温度发送

来源:互联网 发布:f35知乎 编辑:程序博客网 时间:2024/05/01 11:40

 

Code:
  1. //===========================================================================//  
  2. //                    北京理工大学珠海学院 徐方鑫                            //  
  3. //                           280599580@qq.com                                //  
  4. //                            2011.3.31                                      //  
  5. //===========================================================================//  
  6. #include "msp430x54x.h"  
  7. #include <stdlib.h>  
  8. #include <stdio.h>  
  9. #include <string.h>  
  10. #include <math.h>  
  11. #include "LED.H"  
  12. #include "DS18B20.H"  
  13. #include "PIN_DEF.H"  
  14.   
  15. #define uchar unsigned char  
  16. #define uint unsigned int  
  17. #define  FLL_FACTOR     749                                          // FLL_FACTOR: DCO倍频系数      
  18.   
  19. unsigned int Do1Convert(void);  
  20. void Delay(unsigned int cnt);  
  21. void Init_CLK(void);  
  22. void Init_Port(void);  
  23. void Init_RSUART(void);  
  24. void Send232(char *tx_buf);  
  25.   
  26. char  event, RXBuffer[2];  
  27. int TEMP;  
  28. float  temp;  
  29. LED_STRUCT LED[8];   
  30. char Thermometer[5];  
  31. char Thermometer_send[4];  
  32. uchar Thermometer_sendData;  
  33.   
  34. unsigned char SMG[10]=  
  35. {  
  36.   ~(SEGA+SEGB+SEGC+SEGD+SEGE+SEGF)       ,  
  37.   ~(SEGB+SEGC)                           ,  
  38.   ~(SEGA+SEGB+SEGD+SEGE+SEGG)            ,  
  39.   ~(SEGA+SEGB+SEGC+SEGD+SEGG)            ,  
  40.   ~(SEGB+SEGC+SEGF+SEGG)                 ,  
  41.   ~(SEGA+SEGC+SEGD+SEGF+SEGG)            ,  
  42.   ~(SEGA+SEGC+SEGD+SEGE+SEGF+SEGG)       ,  
  43.   ~(SEGA+SEGB+SEGC)                      ,  
  44.   ~(SEGA+SEGB+SEGC+SEGD+SEGE+SEGF+SEGG)  ,  
  45.   ~(SEGA+SEGB+SEGC+SEGD+SEGF+SEGG)       ,  
  46. };  
  47.   
  48. //***************************************************************************//  
  49. //                                                                           //  
  50. //  主程序模块                                                //  
  51. //                                                                           //  
  52. //***************************************************************************//  
  53. void main( void )  
  54. {  
  55.   WDTCTL = WDTPW + WDTHOLD;  //禁止看门狗  
  56.   Ini_LED(10);    
  57.   Init_CLK();  //时钟初始化  
  58.   Init_Port();  //IO端口初始化  
  59.   Init_RSUART();  //串口初始化  
  60.   OW_DIO_PULLUP;    
  61.   SFRIE1|=WDTIE; // 使能WDT中断  
  62.   WDTCTL=WDT_ADLY_1000; // 设置WDT为INTERVAL模式,中断间隔100ms  
  63.   MAIN_POWER_ON;  
  64.   TBCTL = TBSSEL_1 + MC_1 + TBCLR + TBIE; // 时钟源 = ACLK  
  65.   TBCCR0 = 64; // 刷新频率 = 32768/64/8=64Hz   
  66.   _EINT();  //开启总中断  
  67.   TEMP=Do1Convert(); //读取温度转换数据  
  68.   __delay_cycles(10000);  
  69.   for(;;) //后台任务  
  70.   {  
  71.     LPM3;  
  72.     _NOP();  
  73.     if(event)  
  74.     {  
  75.       event   = 0x00;  
  76.       Send232(RXBuffer);  
  77.     }  
  78.   }  
  79. }  
  80.   
  81. //***************************************************************************//  
  82. //                                                                           //  
  83. //                                 延时程序                                  //  
  84. //                                                                           //  
  85. //***************************************************************************//  
  86. void Delay(unsigned int cnt)  
  87. {  
  88.   unsigned int i=0;  
  89.   for(i=0;i<cnt;i++)  
  90.   {  
  91.     _NOP();  
  92.   }  
  93. }  
  94.   
  95. //***************************************************************************//  
  96. //                                                                           //  
  97. //                 初始化主时钟: MCLK = XT1×(FLL_FACTOR+1)                  //  
  98. //                                                                           //  
  99. //***************************************************************************//  
  100. void Init_CLK(void)  
  101. {  
  102.   WDTCTL     = WDTPW + WDTHOLD                            ; // 关看门狗  
  103.   P7SEL     |= 0x03                                       ; // 端口选择外部低频晶振XT1  
  104.   UCSCTL6   &=~XT1OFF                                     ; // 使能外部晶振   
  105.   UCSCTL6   |= XCAP_3                                     ; // 设置内部负载电容  
  106.   UCSCTL3   |= SELREF_2                                   ; // DCOref = REFO  
  107.   UCSCTL4   |= SELA_0                                     ; // ACLK   = XT1    
  108.   __bis_SR_register(SCG0)                                 ; // 关闭FLL控制回路  
  109.   UCSCTL0    = 0x0000                                     ; // 设置DCOx, MODx  
  110.   UCSCTL1    = DCORSEL_7                                  ; // 设置DCO振荡范围  
  111.   UCSCTL2    = FLLD__1 + FLL_FACTOR                       ; // Fdco = ( FLL_FACTOR + 1)×FLLRef = (649 + 1) * 32768 = 21.2992MHz  
  112.   __bic_SR_register(SCG0)                                 ; // 打开FLL控制回路                                                              
  113.   __delay_cycles(1024000)                                 ;   
  114.   do  
  115.   {  
  116.     UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + XT1HFOFFG + DCOFFG); // 清除 XT2,XT1,DCO 错误标志                                                              
  117.     SFRIFG1 &= ~OFIFG                                     ;   
  118.   }while(SFRIFG1&OFIFG)                                   ; // 检测振荡器错误标志   
  119. }  
  120. //***************************************************************************//  
  121. //                                                                           //  
  122. //  Init_Port(void): 设置IO端口                                              //  
  123. //                                                                           //  
  124. //***************************************************************************//  
  125. void Init_Port(void)  
  126. {  
  127.   P5DIR  |= POWER                                                  ; // 主电源  
  128.   MAIN_POWER_ON                                                    ;  
  129.   P7DIR  |= LED_PWR                                                ; // 发光二极管电源  
  130.   P7OUT  &=~LED_PWR                                                ;  
  131.   INTERNAL_PULL_UP                                                 ; // 使能键盘端口内部上拉电阻   
  132.   ROW_IN_COL_OUT                                                   ; // 设置行输入,列输出0  
  133. }  
  134.   
  135. //***************************************************************************//  
  136. //                                                                           //  
  137. //  Init_RSUART(void): 初始化RS232/485端口                                   //  
  138. //                                                                           //  
  139. //***************************************************************************//  
  140. void Init_RSUART(void)  
  141. {   
  142.   RS_PORT_SEL    |= TXD + RXD                                      ; // 选择引脚功能  
  143.   RS_PORT_DIR    |= TXD                                            ; // 选择引脚功能  
  144.   UCA3CTL1        = UCSWRST                                        ; // 状态机复位  
  145.   UCA3CTL1       |= UCSSEL_1                                       ; // CLK = ACLK  
  146.   UCA3BR0         = 0x03                                           ; // 32kHz/9600=3.41   
  147.   UCA3BR1         = 0x00                                           ;   
  148.   UCA3MCTL        = UCBRS_3 + UCBRF_0                              ; // UCBRSx=3, UCBRFx=0  
  149.   UCA3CTL1       &= ~UCSWRST                                       ; // 启动状态机  
  150.   UCA3IE         |= UCRXIE                                         ; // 允许接收中断  
  151.   RS485_IN                                                         ;  
  152. }  
  153.   
  154. //***************************************************************************//  
  155. //                                                                           //  
  156. //  Send232(char *tx_buf): RS232端口发送程序                                    //  
  157. //                                                                           //  
  158. //***************************************************************************//  
  159. void Send232(char *tx_buf)  
  160. {  
  161.   unsigned char i,length                                           ;  
  162.   length = strlen(tx_buf)                                          ;  
  163.   for(i=0;i<length;i++)  
  164.   {  
  165.     UCA3TXBUF = *tx_buf++                                          ;   
  166.     while (!(UCA3IFG&UCTXIFG))                                     ;   
  167.   }  
  168. }  
  169. //***************************************************************************//  
  170. //                                                                           //  
  171. //  Send232_char(char *tx_buf): RS232端口发送程序                                    //  
  172. //                                                                           //  
  173. //***************************************************************************//  
  174. void Send232_char(uchar x)  
  175. {  
  176.     UCA3TXBUF = x                                                  ;   
  177.     while (!(UCA3IFG&UCTXIFG))                                     ;   
  178. }  
  179.   
  180. //***************************************************************************//  
  181. //                                                                           //  
  182. //  RS232接收中断服务程序                                                //  
  183. //                                                                           //  
  184. //***************************************************************************//  
  185. #pragma vector=USCI_A3_VECTOR  
  186. __interrupt void USCI_A3_ISR(void)  
  187. {  
  188.   switch(__even_in_range(UCA3IV,4))  
  189.   {  
  190.   case 0:break                                                     ; // Vector 0 - no interrupt  
  191.   case 2:                                                            // Vector 2 - RXIFG  
  192.       RXBuffer[0]      = UCA3RXBUF                                 ;  
  193.       event           |= 0x01                                      ;  
  194.       break                                                        ;  
  195.   case 4:break                                                     ;  // Vector 4 - TXIFG  
  196.   defaultbreak                                                   ;    
  197.   }    
  198. }  
  199.   
  200. //***************************************************************************//  
  201. //                                                                           //  
  202. //看门狗中断服务程序,刷新显示数据                                           //  
  203. //                                                                           //  
  204. //***************************************************************************//  
  205. #pragma vector=WDT_VECTOR  
  206. __interrupt void watchdog_timer (void)  
  207. {  
  208.   TEMP=Do1Convert(); //读取温度转换数据  
  209.   temp = TEMP>>4;  
  210.   temp += (float)(TEMP&0x000F)/16;  
  211.   LED_Disp_Float(temp,1,NO_ZERO);     
  212.   sprintf(Thermometer,"%2.1f",temp);  
  213.   //Send232(&Thermometer[3]);  
  214.   Thermometer_send[0]=Thermometer[0];  
  215.   Thermometer_send[1]=Thermometer[1];  
  216.   Thermometer_send[2]=Thermometer[3];  
  217.   Thermometer_sendData=(uchar)(atoi(Thermometer_send)/3);   //这里中继需要注意,必须int,否则会有问题  
  218.   Send232_char(Thermometer_sendData);  
  219.   __delay_cycles(5000000);  //串口延时  
  220.   LPM3_EXIT;  
  221. }  
  222. //***************************************************************************//  
  223. //                                                                           //  
  224. //    TIMERB1中断服务程序,数码管显示                                        //  
  225. //                                                                           //  
  226. //***************************************************************************//  
  227. #pragma vector=TIMERB1_VECTOR  
  228. __interrupt void TIMERB1_ISR(void)  
  229. {  
  230.   static unsigned char on_off         = 1            ;  
  231.   static unsigned char digit          = 1            ;   
  232.   static unsigned int  flicker_timer  = 0            ;  
  233.   P8OUT           = LED[digit-1].data                ;    
  234.   switch(digit)  
  235.   {  
  236.   case 1: case 2: case 3: case 4:  
  237.     MASK_DIGITS                                      ;  
  238.     if(LED[digit-1].mode&DIGIT_FLICKER)  
  239.       if(flicker_timer>256)   
  240.         break                                        ;  
  241.     if(LED[digit-1].mode&DIGIT_OFF)  
  242.       break                                          ;  
  243.     if(on_off)  
  244.     {  
  245.       LOW_DIGITS_OUT(~(0x01<<(digit-1)))             ;  
  246.       P8OUT           = LED[digit-1].data            ;          
  247.     }        
  248.     break                                            ;  
  249.   case 5: case 6: case 7: case 8:  
  250.     MASK_DIGITS                                      ;  
  251.     if(LED[digit-1].mode&DIGIT_FLICKER)  
  252.       if(flicker_timer>256)   
  253.         break                                        ;  
  254.     if(LED[digit-1].mode&DIGIT_OFF)  
  255.       break                                          ;  
  256.     if(on_off)  
  257.     {  
  258.       HIGH_DIGITS_OUT(~(0x10<<(digit-5)))            ;  
  259.       P8OUT           = LED[digit-1].data            ;          
  260.     }  
  261.     break                                            ;  
  262.   }  
  263.     
  264.   if(on_off)   
  265.     if(++flicker_timer>=512)   
  266.       flicker_timer = 0                              ;   
  267.   if(on_off)         
  268.     TBCCR0          = LED[digit-1].lightness         ; // 亮度调节  
  269.   else  
  270.     TBCCR0          = 64 - LED[digit-1].lightness    ;   
  271.   if(on_off)  
  272.     if(++digit>8)       
  273.       digit         = 1                              ;  
  274.   on_off           ^= 0x01                           ;  
  275.   TBCTL            &= ~TBIFG                         ;  
  276. }  

 

原创粉丝点击