LaunchPad点火倒计时 八.....

[复制链接]
 楼主| nwx8899 发表于 2012-6-9 22:19 | 显示全部楼层 |阅读模式
LaunchPad演示应用:内部温度测量



LaunchPad 试验板包括一个已安装到目标插座中的预先烧录程序的MSP430G2231 器件。通过 USB 连接  LaunchPad 后,演示将启动,同时LED 交替变亮。按下按钮 P1.3 可将应用切换到温度测量模式。此模式开始会显示一个参考温度,LaunchPad 信号的LED分别通过板上红或绿光LED 的亮度变化来指示温度的升或降。所收集的温度数据还可经由反向通道 UART 通过 USB 仿真电路传回PC。传输的值表示使用MSP430G2231 内部温度传感器测量的华氏温度值,终端应用上的温度传感器 GUI 显示这些值




首先 检查电脑是否安装java程序,如果没有安装请百度JRE安装JAVA程序
因为显示温度的上位机要求你的电脑安装Java的一个组件

因为那块G2231芯片已有程序,若没有下载其他程序,跳过这一步
若自己下载过程序,重新下载一下以下程序即可  

  1. #include "msp430g2231.h"


  2. #define LED1 BIT0 //绿灯,BIT0,BIT6之类的是宏定义,请在头文件"msp430g2231.h"中查看

  3. #define LED2 BIT6 //红灯,参见MSP-EXP430G2 LaunchPad Experimenter Board User's Guide

  4. #define LED_DIR P1DIR

  5. #define LED_OUT P1OUT




  6. #define BUTTON BIT3 //P1.3为板上按键S2

  7. #define BUTTON_OUT P1OUT //端口输出寄存器

  8. #define BUTTON_DIR P1DIR //端口方向控制寄存器

  9. #define BUTTON_IN P1IN //端口输入寄存器

  10. #define BUTTON_IE P1IE //端口中断允许寄存器

  11. #define BUTTON_IES P1IES //端口中断触发沿控制寄存器

  12. #define BUTTON_IFG P1IFG //端口中断标志寄存器

  13. #define BUTTON_REN P1REN //端口上下拉电阻使能控制寄存器


  14. #define TXD BIT1 // TXD on P1.1

  15. #define RXD BIT2 // RXD on P1.2


  16. #define APP_STANDBY_MODE 0 //待机模式标志,也就是接上电源(或USB)后红绿灯交替闪的状态

  17. #define APP_APPLICATION_MODE 1 //应用模式标志,也就是待机模式时按按键后进入的状态,也就是测量温度


  18. #define TIMER_PWM_MODE 0

  19. #define TIMER_UART_MODE 1 //串口模式状态

  20. #define TIMER_PWM_PERIOD 2000

  21. #define TIMER_PWM_OFFSET 20


  22. #define TEMP_SAME 0

  23. #define TEMP_HOT 1

  24. #define TEMP_COLD 2


  25. #define TEMP_THRESHOLD 5


  26. // Conditions for 9600/4=2400 Baud SW UART, SMCLK = 1MHz

  27. #define Bitime_5 0x05*4 // ~ 0.5 bit length + small adjustment

  28. #define Bitime 13*4//0x0D


  29. #define UART_UPDATE_INTERVAL 1000 //主循环次数进行一次串口发送温度值



  30. unsigned char BitCnt;



  31. unsigned char applicationMode = APP_STANDBY_MODE; //功能模式标志,初始值为待机模式

  32. unsigned char timerMode = TIMER_PWM_MODE;


  33. unsigned char tempMode;

  34. unsigned char calibrateUpdate = 0;

  35. unsigned char tempPolarity = TEMP_SAME;

  36. unsigned int TXByte;


  37. /* Using an 8-value moving average filter on sampled ADC values */

  38. long tempMeasured[8]; //定义数组以计算8次10位ADC温度采样的平均值

  39. unsigned char tempMeasuredPosition=0; //温度测量值数组索引

  40. long tempAverage; //8次10位ADC温度采样的平均值


  41. long tempCalibrated, tempDifference;




  42. void InitializeLeds(void); //IO端口初始化,设置两颗LED对应的端口并两设置为熄灭初始状态

  43. void InitializeButton(void); //IO端口初始化,配置按键

  44. void PreApplicationMode(void); //进入待机模式,红绿灯交替闪,等待按键 Blinks LED, waits for button press

  45. void ConfigureAdcTempSensor(void); //配置温度传感器模数转换

  46. void ConfigureTimerPwm(void); //配置定位器为PWM模式

  47. void ConfigureTimerUart(void); //配置定时器为Uart模式

  48. void Transmit(void); //串口发送子程序

  49. void InitializeClocks(void); //初始化时钟系统



  50. void main(void)

  51. {

  52. unsigned int uartUpdateTimer = UART_UPDATE_INTERVAL; //主循环次数进行一次串口发送温度值

  53. unsigned char i;


  54. WDTCTL = WDTPW + WDTHOLD; // 停止看门狗 Stop WDT


  55. InitializeClocks(); //初始化时钟系统

  56. InitializeButton(); //配置按键

  57. InitializeLeds(); //设置端口并两设置两颗LED对应为熄灭初始状态

  58. PreApplicationMode(); //进入待机模式,红绿灯交替闪,等待按键 Blinks LEDs, waits for button press

  59. //执行PreApplicationMode()将进入低功耗模式,程序停止在此,直到有按键按下


  60. /* 进入应用模式 Application Mode begins */

  61. applicationMode = APP_APPLICATION_MODE; //功能模式标志变成应用模式

  62. ConfigureAdcTempSensor(); //配置温度传感器模数转换

  63. ConfigureTimerPwm(); //配置定位器PWM模式


  64. __enable_interrupt(); //使能全局中断 Enable interrupts.


  65. /* Main Application Loop */

  66. while(1)

  67. {

  68. ADC10CTL0 |= ENC + ADC10SC; //ADC使能,ADC开始转换一次 Sampling and conversion start

  69. __bis_SR_register(CPUOFF + GIE); //进入省电模式LPM0,等待AD转换完成中断 LPM0 with interrupts enabled



  70. /* Moving average filter out of 8 values to somewhat stabilize sampled ADC */

  71. tempMeasured[tempMeasuredPosition++] = ADC10MEM; //将温度采样值存入温度值数组下一位

  72. if (tempMeasuredPosition == 8)

  73. // tempMeasuredPosition = 0; 复位温度采样值数组索引

  74. tempAverage = 0;

  75. for (i = 0; i < 8; i++)

  76. tempAverage += tempMeasured[i]; //累加温度采样值数组各值

  77. tempAverage >>= 3; //除以8得到平均值 Divide by 8 to get average


  78. if ((--uartUpdateTimer == 0) || calibrateUpdate ) //如果主循环了UART_UPDATE_INTERVAL次或者参考温度按键按过

  79. {

  80. ConfigureTimerUart();

  81. if (calibrateUpdate)

  82. {

  83. TXByte = 248; // A character with high value, outside of temp range

  84. Transmit(); //串口发送值248表示按键按下进行了校准参考

  85. calibrateUpdate = 0; //复位参考温度校准标志变量

  86. }

  87. TXByte = (unsigned char)( ((tempAverage - 630) * 761) / 1024 ); //计算温度华氏值


  88. Transmit(); //串口发送华氏温度值


  89. uartUpdateTimer = UART_UPDATE_INTERVAL; //复位循环计数变量

  90. ConfigureTimerPwm(); //配置定时器回PWM模式

  91. }


  92. tempDifference = tempAverage - tempCalibrated; //计算相对于参考温度的差值

  93. if (tempDifference < -TEMP_THRESHOLD) //如果采样温度值低于参考温度值差值TEMP_THRESHOLD

  94. {

  95. tempDifference = -tempDifference; //差值取正

  96. tempPolarity = TEMP_COLD; //极性变量设为值TEMP_COLD

  97. LED_OUT &= ~ LED1; //LED1绿灯置灭

  98. }

  99. else

  100. if (tempDifference > TEMP_THRESHOLD) //如果采样温度值高于参考温度值差值TEMP_THRESHOLD

  101. {

  102. tempPolarity = TEMP_HOT; //极性变量设为值TEMP_COLD

  103. LED_OUT &= ~ LED2; //LED2红灯置灭

  104. }

  105. else //如果相对于参考温度值偏差没有超过阈值TEMP_THRESHOLD

  106. {

  107. tempPolarity = TEMP_SAME; //性变量设为值TEMP_SAME

  108. TACCTL0 &= ~CCIE; //关TACCTL0中断使能

  109. TACCTL1 &= ~CCIE; //关TACCTL1中断使能

  110. LED_OUT &= ~(LED1 + LED2); //置两灯皆灭

  111. }


  112. if (tempPolarity != TEMP_SAME) //如果相对于参考温度值偏差超过阈值TEMP_THRESHOLD

  113. {

  114. tempDifference <<= 3; //温度偏差值乘以8

  115. tempDifference += TIMER_PWM_OFFSET; //加上一个偏置值

  116. TACCR1 = ( (tempDifference) < (TIMER_PWM_PERIOD-1) ? (tempDifference) : (TIMER_PWM_PERIOD-1) ); //置TACCR1,最大为TIMER_PWM_PERIOD-1。

  117. //TACCR1值控制亮的时间,定时器计数到TACCR1在中断中将关闭灯,在TACCR0中断中亮灯

  118. TACCTL0 |= CCIE; //开TACCTL0中断使能

  119. TACCTL1 |= CCIE; //开TACCTL1中断使能

  120. }

  121. } //返回主循环

  122. }


  123. //进入待机模式,红绿灯交替闪,等待按键

  124. void PreApplicationMode(void)

  125. {

  126. LED_DIR |= LED1 + LED2; //p1.0和P1.6口为输出

  127. LED_OUT |= LED1; //绿灯亮 To enable the LED toggling effect

  128. LED_OUT &= ~LED2; //红灯灭


  129. BCSCTL1 |= DIVA_1; //辅助时钟分频设置为2 ,ACLK=6KHz

  130. BCSCTL3 |= LFXT1S_2; //辅助时钟源选择VLOCLK,12KHz //ACLK = VLO


  131. TACCR0 = 1200; //

  132. TACTL = TASSEL_1 | MC_1; //定时器时钟源选择辅助时钟ACLK,增计数模式 // TACLK = SMCLK, Up mode.

  133. TACCTL1 = CCIE + OUTMOD_3; //捕获/比较控制寄存器1设置为比较模式,输出模式为“置位/复位” ,中断允许 // TACCTL1 Capture Compare

  134. TACCR1 = 600;

  135. __bis_SR_register(LPM3_bits + GIE); // LPM0 with interrupts enabled ??低功耗模式LPM3

  136. //此时cpu停止,等待中断,如果是比较1中断,则进入中断程序:ta1_isr(void),因为是CC1。

  137. //如果是按键中断,则进入PORT1_ISR(void)中断服务程序,在PORT1_ISR(void)中将退出此低功耗模式

  138. }


  139. //配置温度传感器模数转换

  140. void ConfigureAdcTempSensor(void)

  141. {

  142. unsigned char i;

  143. /* Configure ADC Temp Sensor Channel */

  144. ADC10CTL1 = INCH_10 + ADC10DIV_3; //选择ADC通道为温度传感器,时钟4分频 // Temp Sensor ADC10CLK/4

  145. ADC10CTL0 = SREF_1 + ADC10SHT_3 + REFON + ADC10ON + ADC10IE; // VR+ = VREF+ and VR- = VSS,采样保持时间=64×ADC10CLK周期,打开内部参考电压,打开ADC模块,ADC中断允许

  146. __delay_cycles(1000); //延时等待ADC参考电压建立 // Wait for ADC Ref to settle

  147. ADC10CTL0 |= ENC + ADC10SC; //ADC使能,ADC开始转换一次 // Sampling and conversion start

  148. __bis_SR_register(CPUOFF + GIE); //进入省电模式LPM0,等待AD转换完成中断 // LPM0 with interrupts enabled

  149. tempCalibrated = ADC10MEM;

  150. for (i=0; i < 8; i++)

  151. tempMeasured[i] = tempCalibrated;

  152. tempAverage = tempCalibrated; //第一次转换,平均温度取样值和校准值相等

  153. }


  154. //配置定位器为PWM模式

  155. void ConfigureTimerPwm(void)

  156. {

  157. timerMode = TIMER_PWM_MODE;


  158. TACCR0 = TIMER_PWM_PERIOD; //

  159. TACTL = TASSEL_2 | MC_1; //定时器时钟源选择辅助时钟SMCLK,增计数模式 // TACLK = SMCLK, Up mode.

  160. TACCTL0 = CCIE;

  161. TACCTL1 = CCIE + OUTMOD_3; //捕获/比较控制寄存器1设置为比较模式,输出模式为“置位/复位” ,中断允许 ??OUTMOD_3有什么用? // TACCTL1 Capture Compare

  162. TACCR1 = 1;

  163. }


  164. //配置定时器为Uart模式

  165. void ConfigureTimerUart(void)

  166. {

  167. timerMode = TIMER_UART_MODE; // Configure TimerA0 UART TX


  168. TACCTL0 = OUT; //输出为高电平 // TXD Idle as Mark

  169. TACTL = TASSEL_2 + MC_2 + ID_3; //定时器时钟源选择辅助时钟SMCLK,连续计数模式 ,时钟8分频 // SMCLK/8, continuous mode

  170. P1SEL |= TXD + RXD; //打开P1.1,P1.2引脚特殊功能

  171. P1DIR |= TXD; //P1.1端口方向为输出

  172. }


  173. //串口发送子程序 Function Transmits Character from TXByte

  174. void Transmit()

  175. {

  176. BitCnt = 0xA; //低电平起始位+8位数据+高电平停止位共10位 // Load Bit counter, 8data + ST/SP


  177. /* Simulate a timer capture event to obtain the value of TAR into the TACCR0 register */

  178. //模仿捕捉模式以获得当前的TAR值赋予TACCR0

  179. TACCTL0 = CM_1 + CCIS_2 + SCS + CAP + OUTMOD0; //上升沿捕捉,输入源为GND,输出模式置位模式 //capture on rising edge, initially set to GND as input // clear CCIFG flag

  180. TACCTL0 |= CCIS_3; //改变输入源为VCC,相当于输入源上升沿变化,触发捕捉//change input to Vcc, effectively rising the edge, triggering the capture action


  181. while (!(TACCTL0 & CCIFG)); //查询TACCTL0中断标志位 //allowing for the capturing//updating TACCR0.


  182. TACCR0 += Bitime ; //首位发送延时 // Some time till first bit

  183. TXByte |= 0x100; //增加停止位 // Add mark stop bit to TXByte

  184. TXByte = TXByte << 1; //左移一位右边添加一位0表示起始位 // Add space start bit

  185. TACCTL0 = CCIS0 + OUTMOD0 + CCIE; //比较模式,OUTMOD0=OUTMOD_1输出模式为置位模式,清中断标志,中断允许 // TXD = mark = idle


  186. while ( TACCTL0 & CCIE ); //循环,直到反复中断中完成发送 // Wait for TX completion

  187. }




  188. //TACCR0中断专用, Timer A0 interrupt service routine

  189. void InitializeLeds(void)

  190. {

  191. LED_DIR |= LED1 + LED2; //P1DIR=BIT1+BIT6 p1.0和P1.6口为输出

  192. LED_OUT &= ~(LED1 + LED2); //两个LED低电平熄灭

  193. }


  194. }





2、在设备管理器查看 串口号
如图 我得知com1

TEST  RST两个跳线拔掉
打开
MSP-EXP430G2-Launchpad User Experience\src\LaunchPad_Temp_GUI\application.windows\LaunchPad_Temp_GUI.exe

显示如下图



根据com端号 输入数字

我的就输入0


enter


按P1.3切换华氏温度

加热g2231,温度迅速身高,不知准不准

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
梅花望青竹 发表于 2012-6-10 09:18 | 显示全部楼层
这个试验过了,建议搂主自己写个程序试一试!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名: 宁静致远

61

主题

811

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部