最近需要用到4011自带的adc,然后再官方例程的基础上将程序进行修改,想实现用通道0来处理3个模拟输入,现在的问题是当执行到第三个转换的时候直接又从for语句重新开始。并没有产生中断,转换也没有完成。程序挺简单的,但是不知道哪里没有改好,希望大神帮忙看一下。谢谢下面贴上我的代码
#include<p30f4011.h>
_FOSC(CSW_FSCM_OFF&XT_PLL4);//4分频
_FWDT(WDT_OFF);
_FBORPOR(PBOR_OFF&MCLR_EN);
_FGS(CODE_PROT_OFF);
#define Fcy 73728
void delay(unsigned int z)
{
unsigned int x,y,t;
for(x=z;x>0;x--)
for(y=300;y>0;y--);
}
void ConfigAdc()//只转换一个通道,不仅要选择通道还要设置通道的输入类型(配置只需要配置这6个方面即可)
{
ADCON1=0x0004;//关闭adc,数据输出的是整数,采用时钟计数,每次转换完成后继续自动采样,转换未完成,按顺序采集多个输入
ADCON2=0x0408;//选择通道CH0,只是用这一个通道,每完成3个转换完成后产生中断其余的置零
ADCON3=0x1fbf;//采集时间是31TAD,TAD=31Tcy,使用rc时钟
ADCHS=0x0000;//选择通道CH0
ADPCFG=0xfff8;//选择RN0,RN1,RN2的输入模式为模拟输入其余的为数字输入
ADCSSL=0x0007;//对an0,an1,an2输入进行扫描
IEC0bits.ADIE=1;//给adc后的中断使能
IPC2bits.ADIP=7;//给adc的中断设置优先级
IFS0bits.ADIF=0;
}
//这里需要初始化一下lcd;
void _ISR _AdcInterrupt(void)
{
IFS0bits.ADIF=0;//清除flag即可
}
int main(void)
{
unsigned int T,I,U,cnt;
ConfigAdc();
ADCON1bits.ADON=1;
TRISB=1;
while(1)
{
while(!ADCON1bits.SAMP);//确定第一个信号已经采集好了
for(cnt=0;cnt<3;cnt++)
{
while(!ADCON1bits.SAMP);//为了确定第二个第三个信号采集完成
ADCON1bits.SAMP=0;//开始转换
delay(100);//等待转换完成
}
while(!ADCON1bits.DONE);//三次循环后判断一次ad转换完成
T=ADCBUF0;
U=ADCBUF1;
}
}
此帖出自
小平头技术问答
一周热门 更多>