MSP430學(xué)習(xí)筆記11-八路ADC采集諾基亞5110液晶顯示
本程序采用的是八路ADC單次采集的模式,根據(jù)配置,在單次的模式下轉(zhuǎn)換完成后ADC12SC會自動復(fù)位,因此需要在循環(huán)中進(jìn)行ADC12CTL0 |= ADC12SC;操作,而如果配置成連續(xù)采集的模式,只需要在程序開始將ADC12SC置位一次就可以,但是就需要注意當(dāng)進(jìn)入中斷后如果不手動禁止中斷會一直停留在循環(huán)中,因此在采集到需要的數(shù)據(jù)后需要將ADC關(guān)閉或者中斷使能禁止才能重新回到主函數(shù),這一點(diǎn)需要注意。
八路單次采集的程序如下:
/***************************************
八路AD多路單次采集基亞5110液晶顯示
采集模式:多路單次
****************************************/
#include
#include"LCD5110.h"
#defineuintunsignedint
#defineucharunsignedchar
unsignedcharad0[]="1:0.0V";
unsignedcharad1[]="2:0.0V";
unsignedcharad2[]="3:0.0V";
unsignedcharad3[]="4:0.0V";
unsignedcharad4[]="5:0.0V";
unsignedcharad5[]="6:0.0V";
unsignedcharad6[]="7:0.0V";
unsignedcharad7[]="8:0.0V";
ucharflag=1;
uinttemp0,temp1,temp2,temp3,temp4,temp5,temp6,temp7;
voidInit_Clk()
{
uchari;
BCSCTL1&=~XT2OFF;//打開XT振蕩器
do
{
IFG1&=~OFIFG;//清除振蕩錯誤標(biāo)志
for(i=0;i<100;i++)
_NOP();//延時等待
}
while((IFG1&OFIFG)!=0);//如果標(biāo)志為1繼續(xù)循環(huán)等待
IFG1&=~OFIFG;
BCSCTL2|=SELM1+SELS;//MCLK8MandSMCLK1M
}
voidInit_ADC()
{
P6SEL|=0XFF;//信號采集端口選擇第二功能
ADC12CTL0=ADC12ON+SHT0_8+MSC;//打開ADC+設(shè)置采樣時間
ADC12CTL1=SHP+CONSEQ_1;//使用采樣時序電路信號+多路單次模式
//上面的寄存器配置采樣保持觸發(fā)源選擇時ADC12SC,采集信號使用采樣時序電路產(chǎn)生的信號
//轉(zhuǎn)換模式為多路單次復(fù)轉(zhuǎn)換上面的設(shè)置必須在ENC=0的情況下設(shè)置
//設(shè)置每個通道的輸入端口和參考電壓,參考電壓默認(rèn)為AVCC3.3V
ADC12MCTL0=INCH_0;
ADC12MCTL1=INCH_1;
ADC12MCTL2=INCH_2;
ADC12MCTL3=INCH_3;
ADC12MCTL4=INCH_4;
ADC12MCTL5=INCH_5;
ADC12MCTL6=INCH_10;
ADC12MCTL7=INCH_11+EOS;//最后一個通道
ADC12IE=BIT7;//最后一個通道轉(zhuǎn)換完成后使能ADC中斷
ADC12CTL0|=ENC;//使能轉(zhuǎn)換
}
/*******************************************
函數(shù)名稱:Trans_val
功能:將16進(jìn)制ADC轉(zhuǎn)換數(shù)據(jù)變換成三位10進(jìn)制
真實的模擬電壓數(shù)據(jù),并在液晶上顯示
參數(shù):Hex_Val--16進(jìn)制數(shù)據(jù)
n--變換時的分母等于2的n次方
返回值:無
********************************************/
voidTrans_val(ucharptr[6],uintHex_Val)
{
unsignedlongcaltmp;
uintCurr_Volt;
caltmp=Hex_Val;
caltmp=(caltmp<<5)+Hex_Val;//caltmp=Hex_Val*3
Curr_Volt=caltmp>>12;//Curr_Volt=caltmp/2^n
//參考電壓為3.3V,所以計算公式應(yīng)該為Hex_val*3.3/2^n
//乘除計算通過移位來進(jìn)行可以有效的提高程序運(yùn)行效率
ptr[2]=(Curr_Volt/10)+0x30;//個位
ptr[4]=(Curr_Volt%10)+0x30;//小數(shù)位
}
voidmain()
{
Init_Clk();
Init_ADC();
WDTCTL=WDTPW+WDTHOLD;
LCD_init();
LCD_showsh(0,0,"電壓采集:");
_EINT();//開啟全局中斷
P5DIR|=BIT5;
P3OUT|=~BIT5;
while(1)
{
ADC12CTL0|=ADC12SC;
LCD_prints(0,2,ad0);
LCD_prints(8,2,ad1);
LCD_prints(0,3,ad2);
LCD_prints(8,3,ad3);
LCD_prints(0,4,ad4);
LCD_prints(8,4,ad5);
LCD_prints(0,5,ad6);
LCD_prints(8,5,ad7);
}
}
/*******************************************
函數(shù)名稱:ADC12ISR
功能:ADC中斷服務(wù)函數(shù)
參數(shù):無
返回值:無
********************************************/
#pragmavector=ADC_VECTOR
__interruptvoidADC12ISR(void)
{
temp0=ADC12MEM0;
Trans_val(ad0,temp0);
temp1=ADC12MEM1;
Trans_val(ad1,temp1);
temp2=ADC12MEM2;
Trans_val(ad2,temp2);
temp3=ADC12MEM3;
Trans_val(ad3,temp3);
temp4=ADC12MEM4;
Trans_val(ad4,temp4);
temp5=ADC12MEM5;
Trans_val(ad5,temp5);
temp6=ADC12MEM6;
Trans_val(ad6,temp6);
temp7 = ADC12MEM7;