先簡單說一下動作。利用msp430f5529內部的溫度傳感器,量測電壓後
,經過ADC轉換,在經公式轉換數值,最後顯示在4和1共陽極7段顯示器上。
希望能夠幫助也在研究MSP430的朋友,也希望有人能回答我的問題!
有錯請指正。
#include <msp430f5529.h>
volatile unsigned int temp;
volatile unsigned int degC;
int i;
int seg[]= {0x80,0xf1,0x48,0x60,0x31,0x24,0x05,0xf0,0x00,0x30}; // 7段顯示器用的陣列,這跟你接的PIN角有關,小數點不用
void main(void) {
WDTCTL = WDTPW | WDTHOLD; // Stop watchdog timer
ADC12CTL0 &= ~ADC12ENC; // 以下是ADC12的程式,ADC內核採用ACLK,以TimerA控制採樣頻率
REFCTL0 &= ~REFMSTR;
ADC12CTL0 = ADC12SHT0_5+ ADC12ON+ADC12REFON+ADC12REF2_5V; // 打開內部參考電壓,選2.5V,選擇採樣保持時間
ADC12CTL1 =ADC12SHS_1+ADC12CONSEQ_2+ADC12SSEL_1+ADC12SHP; // 選擇單通道連續採樣模式,採樣頻率以TimerA控制
ADC12CTL2=ADC12RES_2; // 轉換精度12位
ADC12MCTL0 =ADC12INCH_10+ADC12SREF_1; // 選擇參考電壓及轉換通道
ADC12IE=BIT0; // 使能ADC12IFG0
_delay_cycles(200);
UCSCTL4=SELA_2; //ACLK=refoclk 32768HZ
// UCSCTL5=DIVA_5; //32
TA0CTL = MC_1+TASSEL_1+TACLR; //ACLK // 不解釋
TA0CCTL1=OUTMOD_3;
TA0CCR1 =59950;
TA0CCR0 =60000;
P2DIR = 0xff; // 7段顯示器角位設定
P2DS= 0xff;
P3DIR =BIT5+BIT6;
P4DIR = BIT1+BIT2;
P4OUT &= ~BIT1;
P4OUT &= ~BIT2;
P2OUT=0xff;
ADC12CTL0 |= ADC12ENC ;
_BIS_SR(GIE); // 打開全局使能
while(1)
{
ADC12CTL0 |= ADC12SC; // 開始轉換,ADC轉換完成前,不斷掃描顯示器
degC=(271*temp-302200); // 將ADC12的數值做公式運算,得到溫度
i=degC/1000;
P3OUT &= ~BIT5;
P3OUT &= ~BIT6;
P4OUT = BIT1;
P2OUT = seg[ i%10]; //個位
_delay_cycles(20);
P2OUT= 0xff;
_delay_cycles(5);
P4OUT = BIT2;
P2OUT = seg[( i%100)/10]; //十位
_delay_cycles(20);
P2OUT=0xff;
_delay_cycles(5);
P4OUT &=~(BIT1+BIT2);
P3OUT =BIT5;
P2OUT = seg[( i%1000)/100]; //百位
_delay_cycles(20);
P2OUT=0xff;
_delay_cycles(5);
P3OUT =BIT6;
P2OUT = seg[ i/1000]; //千位
_delay_cycles(20);
P2OUT=0xff;
_delay_cycles(5);
}
}
#pragma vector = ADC12_VECTOR //ADC12轉換完成,觸發中斷
__interrupt void ADC12ISR(void)
{
switch(__even_in_range(ADC12IV,34))
{
case 0:break;
case 2:break;
case 4:break;
case 6:
temp = ADC12MEM0; //將轉換結果寫入temp中
case 8:break;
case 10:break;
case 12:break;
case 14:break;
case 16:break;
case 18:break;
case 20:break;
case 22:break;
case 24:break;
case 26:break;
case 27:break;
case 28:break;
case 30:break;
case 32:break;
case 34:break;
default:break;
}
}
問題來了,本來我是寫 degC=(271*temp-302200)/1000
後面直接除1000,但是測試時都無法計算出正確值,值會很大。
所以只好再轉另一個變數/1000。
問題在哪裡呢?
還有個感想是,算式裡最好不要出現小數,否則運算速度會超慢。