打印

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

[复制链接]
3138|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
LaunchPad演示应用:内部温度测量



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




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

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

#include "msp430g2231.h"


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

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

#define LED_DIR P1DIR

#define LED_OUT P1OUT




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

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

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

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

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

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

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

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


#define TXD BIT1 // TXD on P1.1

#define RXD BIT2 // RXD on P1.2


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

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


#define TIMER_PWM_MODE 0

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

#define TIMER_PWM_PERIOD 2000

#define TIMER_PWM_OFFSET 20


#define TEMP_SAME 0

#define TEMP_HOT 1

#define TEMP_COLD 2


#define TEMP_THRESHOLD 5


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

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

#define Bitime 13*4//0x0D


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



unsigned char BitCnt;



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

unsigned char timerMode = TIMER_PWM_MODE;


unsigned char tempMode;

unsigned char calibrateUpdate = 0;

unsigned char tempPolarity = TEMP_SAME;

unsigned int TXByte;


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

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

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

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


long tempCalibrated, tempDifference;




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

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

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

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

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

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

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

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



void main(void)

{

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

unsigned char i;


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


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

InitializeButton(); //配置按键

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

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

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


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

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

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

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


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


/* Main Application Loop */

while(1)

{

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

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



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

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

if (tempMeasuredPosition == 8)

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

tempAverage = 0;

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

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

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


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

{

ConfigureTimerUart();

if (calibrateUpdate)

{

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

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

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

}

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


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


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

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

}


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

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

{

tempDifference = -tempDifference; //差值取正

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

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

}

else

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

{

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

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

}

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

{

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

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

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

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

}


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

{

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

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

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

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

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

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

}

} //返回主循环

}


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

void PreApplicationMode(void)

{

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

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

LED_OUT &= ~LED2; //红灯灭


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

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


TACCR0 = 1200; //

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

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

TACCR1 = 600;

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

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

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

}


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

void ConfigureAdcTempSensor(void)

{

unsigned char i;

/* Configure ADC Temp Sensor Channel */

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

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

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

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

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

tempCalibrated = ADC10MEM;

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

tempMeasured[i] = tempCalibrated;

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

}


//配置定位器为PWM模式

void ConfigureTimerPwm(void)

{

timerMode = TIMER_PWM_MODE;


TACCR0 = TIMER_PWM_PERIOD; //

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

TACCTL0 = CCIE;

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

TACCR1 = 1;

}


//配置定时器为Uart模式

void ConfigureTimerUart(void)

{

timerMode = TIMER_UART_MODE; // Configure TimerA0 UART TX


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

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

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

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

}


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

void Transmit()

{

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


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

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

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

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


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


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

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

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

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


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

}




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

void InitializeLeds(void)

{

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

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

}


}





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

主题

805

帖子

2

粉丝