复制给你:
//初始化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 中断标志
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)