msp430 ADC10单通道多次转换
扫描二维码
随时随地手机看文章
MSP430 ADC10单通道多次转换
#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)//写数据
{
P3OUT|=lcdrs;
P4OUT=date;
delay(5);
P3OUT|=lcden;
delay(5);
P3OUT&=~lcden;
}
voidinit()//初始化
{
P3OUT&=~lcdrw;
P3OUT&=~lcden;
write_com(0x38);//显示模式设置
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;//关看门狗
BCSCTL1=CALBC1_1MHz;//设定DCO为1MHZ
DCOCTL=CALBC1_1MHZ;
P2SEL=0X01;
P3SEL=0X00;
P3DIR=0XFF;
P3OUT=0X00;
P4SEL=0X00;
P4DIR=0XFF;
P4OUT=0X00;
init();
//时钟源选AD内部时钟并4分频,选通道10,AD启动信号来源选TA.OUT1,选单通道连续采样
ADC10CTL1=ADC10DIV_3+INCH_0+SHS_1+CONSEQ_2;
//选1.5V为正向参考,地为负参考,AD中断使能,打开参考,启动AD模块(不是启动AD转换)
ADC10CTL0=SREF_1+ADC10SHT_3+ADC10IE+REFON+ADC10ON+REF2_5V;
TACCR0=30;//延时等待参考稳定
TACCTL0|=CCIE;//CCR0中断使能
TACTL=TACLR+MC_1+TASSEL_2;//TA增计数,时钟源为smclk
_BIS_SR(LPM0_bits+GIE);//进入低功耗0,使能总中断,等待参考稳定
TACCTL0&=~CCIE;//CCR0中断禁止
_BIC_SR(GIE);//关总中断
ADC10CTL0|=ENC;//AD转换使能
TACCTL1=OUTMOD_4;//CCR1选输出模式4,当TAR=0时,输出高电平
TACTL=TASSEL_2+MC_2;//TA改为连续计数,smclk时钟源
while(1)
{
_BIS_SR(LPM0_bits+GIE);//进入低功耗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中断服务,用来参考稳定
__interruptvoidta0_isr(void)
{
TACTL=0;//关TA
_BIC_SR_IRQ(LPM0_bits);//退出低功耗
}
#pragmavector=ADC10_VECTOR//ADC10中断服务
__interruptvoidadc_isr(void)
{
_BIC_SR_IRQ(LPM0_bits);
ad_value=ADC10MEM/409.2;//保存AD结果
for(uchari=0;i<5;i++)
{
dada[i]=ad_value;
ad_value=ad_value-dada[i];
ad_value=ad_value*10;
}
_BIC_SR(GIE);
}