MSP430F149ADC12單通道單次轉(zhuǎn)換
#define uint unsigned int
#define uchar unsigned char
static uchar adc_flag = 0 ;
uint AD_TEMP = 0 ;
void int_clk()
{
uchar i ;
BCSCTL1&=~XT2OFF; //打開XT振蕩器
BCSCTL2|=SELM1+SELS; //MCLK為8MHz,SMCLK為8MHz
do
{
IFG1&=~OFIFG; //清除振蕩錯誤標志
for(i=0;i<100;i++)
_NOP(); //延時等待
}
while((IFG1&OFIFG)!=0); //如果標志為1,則繼續(xù)循環(huán)等待
IFG1&=~OFIFG;
}
int_adc()
{
P6SEL |= BIT0 ; //選擇AD通道
ADC12CTL0 |= ADC12ON + SHT0_2 + REF2_5V + REFON ; //采樣保持時間為16個ADC12CLK
/*ADC12ON ADC模塊電源控制位;
REF2_5V 內(nèi)部參考電壓選擇位0:1.5V 1:2.5V
REFON 參考電壓模塊控制位0:關(guān)閉 1:打開*/
ADC12CTL1 |= ADC12SSEL0 + ADC12SSEL1 ; //ADC12時鐘源選擇控制位 00ADC12OSC 01ACLK 10MCLK 11SMCLK
ADC12MCTL0 = 0x10; // 連續(xù)轉(zhuǎn)換結(jié)束通道,CHANNEL = A0 參考選擇控制位
ADC12IE |= 0x01; //使能A/D轉(zhuǎn)換器
ADC12CTL0 |= ENC ; //AD轉(zhuǎn)換使能
}
#pragma vector = ADC_VECTOR
__interrupt void ADC12ISR(void)
{
while((ADC12CTL1 & 0x01)== 1); //等待轉(zhuǎn)換完
adc_flag = 1 ;
AD_TEMP = ADC12MEM0 ; //設(shè)置AD轉(zhuǎn)換完成標志,并讀取ADC值
}
void main()
{
WDTCTL = WDTPW + WDTHOLD ;
int_clk();
int_adc();
_EINT(); //使能中斷
adc_flag = 1 ;
while(1)
{
while(adc_flag == 1)
{
ADC12CTL0 |= ADC12SC ; //開啟轉(zhuǎn)換
ADC12CTL0 &= ~ADC12SC ;
adc_flag = 0 ; //清中斷標志
}
}
}
評論