同樣是開發闆中的例程,對關鍵的地方做了說明,程式如下:
/*********************************************************
程式注意點:
首先可以選擇是否開啟内部參考電壓還是使用外部參考電壓
每個通道可以獨立選擇參考電壓
如果連接配接了外部參考電壓應該注意關閉内部參考電壓防止損壞
單片機
程式功能: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,如需轉載請自行聯系原作者