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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值