msp430 ADC10單通道多次轉(zhuǎn)換
MSP430 ADC10單通道多次轉(zhuǎn)換
#include"msp430x22x4.h"
#defineucharunsignedchar
#defineuintunsignedint
#defineLCDen0X80;//P3的高三位做控制線
#definelcdrw0X40;
#definelcdrs0X20;
voiddelay(uintz)//延時程序
{
uintx,y;
for(x=z;x>0;x--)
for(y=100;y>0;y--);
}
voidwrite_com(ucharcom)//寫指令
{
P3OUT&=~lcdrs;
P4OUT=com;
delay(5);
P3OUT|=lcden;
delay(5);
P3OUT&=~lcden;
}
voidwrite_data(uchardate)//寫數(shù)據(jù)
{
P3OUT|=lcdrs;
P4OUT=date;
delay(5);
P3OUT|=lcden;
delay(5);
P3OUT&=~lcden;
}
voidinit()//初始化
{
P3OUT&=~lcdrw;
P3OUT&=~lcden;
write_com(0x38);//顯示模式設(shè)置
write_com(0x0f);//
write_com(0x06);//
write_com(0x01);//
write_com(0x80+0x00);//
}
ucharnum;
uchartable[]="0123456789";
uintdada[5];
volatilefloatad_value;
voidmain(void)
{
WDTCTL=WDTPW+WDTHOLD;//關(guān)看門狗
BCSCTL1=CALBC1_1MHz;//設(shè)定DCO為1MHZ
DCOCTL=CALBC1_1MHZ;
P2SEL=0X01;
P3SEL=0X00;
P3DIR=0XFF;
P3OUT=0X00;
P4SEL=0X00;
P4DIR=0XFF;
P4OUT=0X00;
init();
//時鐘源選AD內(nèi)部時鐘并4分頻,選通道10,AD啟動信號來源選TA.OUT1,選單通道連續(xù)采樣
ADC10CTL1=ADC10DIV_3+INCH_0+SHS_1+CONSEQ_2;
//選1.5V為正向參考,地為負(fù)參考,AD中斷使能,打開參考,啟動AD模塊(不是啟動AD轉(zhuǎn)換)
ADC10CTL0=SREF_1+ADC10SHT_3+ADC10IE+REFON+ADC10ON+REF2_5V;
TACCR0=30;//延時等待參考穩(wěn)定
TACCTL0|=CCIE;//CCR0中斷使能
TACTL=TACLR+MC_1+TASSEL_2;//TA增計(jì)數(shù),時鐘源為smclk
_BIS_SR(LPM0_bits+GIE);//進(jìn)入低功耗0,使能總中斷,等待參考穩(wěn)定
TACCTL0&=~CCIE;//CCR0中斷禁止
_BIC_SR(GIE);//關(guān)總中斷
ADC10CTL0|=ENC;//AD轉(zhuǎn)換使能
TACCTL1=OUTMOD_4;//CCR1選輸出模式4,當(dāng)TAR=0時,輸出高電平
TACTL=TASSEL_2+MC_2;//TA改為連續(xù)計(jì)數(shù),smclk時鐘源
while(1)
{
_BIS_SR(LPM0_bits+GIE);//進(jìn)入低功耗0,使能總中斷,等待10AD完成
write_com(0x80+0x00);
for(num=0;num<5;num++)
{
write_data(table[dada[num]]);
delay(5);
}
_BIS_SR(GIE);
}
}
#pragmavector=TIMERA0_VECTOR//TA0中斷服務(wù),用來參考穩(wěn)定
__interruptvoidta0_isr(void)
{
TACTL=0;//關(guān)TA
_BIC_SR_IRQ(LPM0_bits);//退出低功耗
}
#pragmavector=ADC10_VECTOR//ADC10中斷服務(wù)
__interruptvoidadc_isr(void)
{
_BIC_SR_IRQ(LPM0_bits);
ad_value=ADC10MEM/409.2;//保存AD結(jié)果
for(uchari=0;i<5;i++)
{
dada[i]=ad_value;
ad_value=ad_value-dada[i];
ad_value=ad_value*10;
}
_BIC_SR(GIE);
}