MSP430F5438无线温度发送

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

你可能感兴趣的:(发送)