MSP430學(xué)習(xí)筆記10-ADC采集1602顯示
同樣是開(kāi)發(fā)板中的例程,對(duì)關(guān)鍵的地方做了說(shuō)明,程序如下:
/*********************************************************
程序注意點(diǎn):
首先可以選擇是否開(kāi)啟內(nèi)部參考電壓還是使用外部參考電壓
每個(gè)通道可以獨(dú)立選擇參考電壓
如果連接了外部參考電壓應(yīng)該注意關(guān)閉內(nèi)部參考電壓防止損壞
單片機(jī)
程序功能:MCU的片內(nèi)ADC對(duì)P6.0端口的電壓進(jìn)行轉(zhuǎn)換
將模擬電壓值顯示在1602液晶上。
----------------------------------------------------------
撥碼開(kāi)關(guān)設(shè)置:將LCD位撥至ON,其余位撥至OFF
測(cè)試說(shuō)明:調(diào)節(jié)電位器W1的旋鈕觀察液晶顯示數(shù)字變化。
*********************************************************/
#include
#include"cry1602.h"
#include"cry1602.c"
//typedefunsignedcharuchar;
//typedefunsignedintuint;
#defineNum_of_Results32
ucharshuzi[]={"0123456789."};
uchartishi[]={"Thevoltis:"};
staticuintresults[Num_of_Results];//保存ADC轉(zhuǎn)換結(jié)果的數(shù)組
voidTrans_val(uintHex_Val);
/************************主函數(shù)****************************/
voidmain(void)
{
WDTCTL=WDTPW+WDTHOLD;//關(guān)閉看門狗
/*下面六行程序關(guān)閉所有的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;//關(guān)閉電平轉(zhuǎn)換
LcdReset();//復(fù)位1602液晶
DispNChar(2,0,12,tishi);//顯示提示信息
Disp1Char(11,1,'V');//顯示電壓?jiǎn)挝?/p>
P6SEL|=BIT0;//使能ADC通道
ADC12CTL0=ADC12ON+SHT0_8+MSC;//打開(kāi)ADC,設(shè)置采樣時(shí)間
//上面的配置中并沒(méi)有打開(kāi)內(nèi)部的參考電壓
//ADC12MCTLx用來(lái)選擇通道和參考電壓,這里面沒(méi)有對(duì)此寄存器進(jìn)行配置為默認(rèn)值
//默認(rèn)值是參考電壓選擇AVCC(3.3V),通道是A0,所以測(cè)量范圍是0-3.3V
ADC12CTL1=SHP+CONSEQ_2;//使用采樣定時(shí)器
//上面的寄存器配置采樣保持觸發(fā)源選擇時(shí)ADC12SC,采集信號(hào)使用采樣時(shí)序電路產(chǎn)生的信號(hào)
//轉(zhuǎn)換模式為單路重復(fù)轉(zhuǎn)換上面的設(shè)置必須在ENC=0的情況下設(shè)置
ADC12IE=BIT0;//使能ADC中斷
ADC12CTL0|=ENC;//使能轉(zhuǎn)換
ADC12CTL0|=ADC12SC;//開(kāi)始轉(zhuǎn)換
_EINT();//開(kāi)啟全局中斷
LPM0;
}
/*******************************************
函數(shù)名稱:ADC12ISR
功能:ADC中斷服務(wù)函數(shù),在這里用多次平均的
計(jì)算P6.0口的模擬電壓數(shù)值
參數(shù):無(wú)
返回值:無(wú)
********************************************/
#pragmavector=ADC_VECTOR
__interruptvoidADC12ISR(void)
{
staticuintindex=0;
results[index++]=ADC12MEM0;//將轉(zhuǎn)換的結(jié)果存入數(shù)組
if(index==Num_of_Results)//如果數(shù)組存滿
{
uchari;
unsignedlongsum=0;
index=0;//在從頭開(kāi)始存,會(huì)覆蓋原有的數(shù)據(jù)
for(i=0;i
{
sum+=results[i];
}
sum>>=5;//除以32
Trans_val(sum);
}
}
/*******************************************
函數(shù)名稱:Trans_val
功能:將16進(jìn)制ADC轉(zhuǎn)換數(shù)據(jù)變換成三位10進(jìn)制
真實(shí)的模擬電壓數(shù)據(jù),并在液晶上顯示
參數(shù):Hex_Val--16進(jìn)制數(shù)據(jù)
n--變換時(shí)的分母等于2的n次方
返回值:無(wú)
********************************************/
voidTrans_val(uintHex_Val)
{
unsignedlongcaltmp;
uintCurr_Volt;
uchart1,i;
ucharptr[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