什么是ADC的中断方式和查询方式

什么是ADC的中断方式和查询方式,第1张

AD转换是需要一定时间的,是让程序就地等待转换结果读取数据,还是让ADC转换结束之后自动处理结果,可以有两种选择。选择前者就是查询方式,选择后者就是中断方式。ADC转换结束之后有一个标志会置位,查询方式就是让程序等待这个标志位置位。而如果开放了ADC中断,这个标志位置位的同时会发生中断,程序暂时挂起,自动进入中断服务程序处理ADC转换结果,处理结束之后继续敬大被挂起的程序。你提问中的两种方式,和其它诸如定时器、I/O、串行接口等模块的应用,道理都是一样的。当然,我说的仅限于单片机片辩磨内ADC,至亮灶竖于外挂的ADC那是另一番情景了。

我刚好写完 完全可以显示正确的数值

复制给你:

//初始化ADC12

P6SEL = 0x01// 使能ADC通道

ADC12CTL0 = ADC12ON+SHT0_8+MSC// 打开ADC,设置采样时间

// ADC12CTL0= REFON+REF2_5V;

// ADC12MCTL0=SREF_1//选择内部参考电压源誉悄陪

ADC12CTL1 = SHP+CONSEQ_2//庆蠢 使用采样定运清时器

ADC12IE = 0x01// 使能ADC中断

ADC12CTL0 = ENC// 使能转换

ADC12CTL0 = ADC12SC// 开始转换

pragma vector=ADC_VECTOR

__interrupt void conversion()

{

uint buffer[32]

static uint index=0

buffer[index++]=ADC12MEM0

if(index==32)

{

index=0

uchar i

unsigned long sum=0

for(i=0i32i++)

sum+=buffer[i]

sum=sum/32

}

}

得到的sum就是平滑滤波得到的数值,

确实,STC11F-10FXX系列不提供ADC中断功能,如果你用STC12C系列就培察举支持ADC中断了,手册里有详细的方法.

void InitADC()

{

Uint16 i

ADC_CONTR = 0xC0 //ADC模块加电,420周期转换一配碧次

for(i=0i<20000i++) //ADC电没腔源开启后,延时

//设置P口外AD模式

P1M0 = 0x03 //ADC0/1 高阻输入

P1M1 = 0x00

EADC_SPI = 1 //开放ADCSPI总中断

ADC_DATA = 0

AUXR = EADCI //开放ADC中断

memset(&ADC,0,sizeof(STADC))

//启动0号通道

ADC.Curch = 0

ADC_CONTR |= ADC.Curch//设置下一通道

ADC.Run = TRUE//标志ADC正在转换

ADC_CONTR |= ADC_START //启动AD转换器

}

void ADCISR() interrupt ADC_VECTOR

{

ADC_CONTR &= ADC_STOP //stop AD

ADC.Run = FALSE

ADC.tempCvData[ADC.CvTimes] = ADC_DATA//取转换值

ADC_DATA = 0

ADC.CvTimes++

ADC.CvTimes %= 6

if(ADC.CvTimes!=0)

{

ADC_CONTR |= ADC_START //启动AD转换器

ADC.Run = TRUE }

ADC_CONTR &= ADC_FLAG //清除ADC_FLAG 中断标志

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/8201014.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-14
下一篇 2023-04-14

发表评论

登录后才能评论

评论列表(0条)

保存