天天看點

MSP430學習筆記10-ADC采集1602顯示

同樣是開發闆中的例程,對關鍵的地方做了說明,程式如下:

/********************************************************* 

程式注意點: 

首先可以選擇是否開啟内部參考電壓還是使用外部參考電壓 

每個通道可以獨立選擇參考電壓 

如果連接配接了外部參考電壓應該注意關閉内部參考電壓防止損壞 

單片機 

程式功能:MCU的片内ADC對P6.0端口的電壓進行轉換 

          将模拟電壓值顯示在1602液晶上。 

---------------------------------------------------------- 

撥碼開關設定:将LCD位撥至ON,其餘位撥至OFF 

測試說明:調節電位器W1的旋鈕觀察液晶顯示數字變化。 

*********************************************************/  

#include  <msp430x14x.h>  

#include  "cry1602.h"  

#include  "cry1602.c"  

//typedef unsigned char uchar;  

//typedef unsigned int  uint;  

#define   Num_of_Results   32  

uchar shuzi[] = {"0123456789."};  

uchar tishi[] = {"The volt is:"};  

static uint results[Num_of_Results];    //儲存ADC轉換結果的數組                                                      

void Trans_val(uint Hex_Val);             

/************************主函數****************************/  

void main(void)  

{  

    WDTCTL = WDTPW+WDTHOLD;                   //關閉看門狗  

    /*下面六行程式關閉所有的IO口*/  

    P1DIR = 0XFF;P1OUT = 0XFF;  

    P2DIR = 0XFF;P2OUT = 0XFF;  

    P3DIR = 0XFF;P3OUT = 0XFF;  

    P4DIR = 0XFF;P4OUT = 0XFF;  

    P5DIR = 0XFF;P5OUT = 0XFF;  

    P6DIR = 0XFF;P6OUT = 0XFF;  

    P6DIR |= BIT2;P6OUT |= BIT2;                //關閉電平轉換  

    LcdReset();                                 //複位1602液晶  

    DispNChar(2,0,12,tishi);                    //顯示提示資訊  

    Disp1Char(11,1,'V');                        //顯示電壓機關  

    P6SEL |= BIT0;                              // 使能ADC通道  

    ADC12CTL0 = ADC12ON+SHT0_8+MSC;             // 打開ADC,設定采樣時間  

    // 上面的配置中并沒有打開内部的參考電壓  

    // ADC12MCTLx用來選擇通道和參考電壓,這裡面沒有對此寄存器進行配置為預設值  

    // 預設值是參考電壓選擇AVCC(3.3V),通道是A0,是以測量範圍是0-3.3V  

    ADC12CTL1 = SHP+CONSEQ_2;                   // 使用采樣定時器  

    //上面的寄存器配置采樣保持觸發源選擇時ADC12SC,采集信号使用采樣時序電路産生的信号  

    // 轉換模式為單路重複轉換  上面的設定必須在ENC=0的情況下設定  

    ADC12IE = BIT0;                             // 使能ADC中斷  

    ADC12CTL0 |= ENC;                           // 使能轉換  

    ADC12CTL0 |= ADC12SC;                       // 開始轉換  

    _EINT();                                    //開啟全局中斷  

    LPM0;  

}  

/******************************************* 

函數名稱:ADC12ISR 

功    能:ADC中斷服務函數,在這裡用多次平均的 

          計算P6.0口的模拟電壓數值 

參    數:無        

傳回值  :無 

********************************************/  

#pragma vector=ADC_VECTOR  

__interrupt void ADC12ISR (void)  

    static uint index = 0;  

    results[index++] = ADC12MEM0;               // 将轉換的結果存入數組  

    if(index == Num_of_Results)                 //如果數組存滿  

    {  

        uchar i;  

        unsigned long sum = 0;  

        index = 0;                              //在從頭開始存,會覆寫原有的資料  

    for(i = 0; i < Num_of_Results; i++)          //計算和  

        sum += results[i];  

    }  

    sum >>= 5;                                    //除以32  

    Trans_val(sum);  

函數名稱:Trans_val 

功    能:将16進制ADC轉換資料變換成三位10進制 

          真實的模拟電壓資料,并在液晶上顯示 

參    數:Hex_Val--16進制資料 

          n--變換時的分母等于2的n次方        

void Trans_val(uint Hex_Val)  

    unsigned long caltmp;  

    uint Curr_Volt;  

    uchar t1,i;  

    uchar ptr[4];  

    caltmp = Hex_Val;  

    caltmp = (caltmp << 5) + Hex_Val;           //caltmp = Hex_Val * 33  

    caltmp = (caltmp << 3) + (caltmp << 1);     //caltmp = caltmp * 10  

    Curr_Volt = caltmp >> 12;                   //Curr_Volt = caltmp / 2^n  

    // 參考電壓為3.3V,是以計算公式應該為Hex_val*3.3/2^n   

    // 乘除計算通過移位來進行可以有效的提高程式運作效率  

    ptr[0] = Curr_Volt / 100;                   //Hex->Dec變換  

    t1 = Curr_Volt - (ptr[0] * 100);  

    ptr[2] = t1 / 10;  

    ptr[3] = t1 - (ptr[2] * 10);  

    ptr[1] = 10;                                //shuzi表中第10位對應符号"."  

    //在液晶上顯示變換後的結果  

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

        Disp1Char((6 + i),1,shuzi[ptr[i]]);  

本文轉自emouse部落格園部落格,原文連結:http://www.cnblogs.com/emouse/archive/2010/08/08/2198209.html,如需轉載請自行聯系原作者

繼續閱讀