ADC实例

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

A/D转换实例

一、单次触发---查询

如图,V REF=5V(A VCC),0~5V的模拟电压从PA0输入,A/D转换后的10位结果从高到低由PD1,PD0,PC7~PC0输出。系统时钟采用片内的4MHZ时钟。

注:1、采用32分频,则A/D采样时钟=4M/32=125KHZ。AD转换的时钟一般要在50KHZ~200KHZ之间。

2、A VCC必须接VCC。采用内部的A VCC时,AREF要外接0.1UF的电容,增强抗干扰能力。

3、观察LED灯时,应从下往上看,高位在下,低位在上。

4、采用内部RC振荡源时,熔丝位SUT:11为保留选项,不可用。

//4MHZ系统时钟

#include

void main(void)

{

DDRC=0XFF;

PORTC=0X00;

DDRD.0=1;

DDRD.1=1;

PORTD.0=0;

PORTD.1=0;

ADMUX=0B01000000; //基准电压选A VCC,结果右对齐,ADC0单端输入

ADCSRA=0B11000101; //使能ADC,开始转换,32分频,ADC时钟=4M/32=125KHZ

while(1)

{

while(ADCSRA.4==0); //查询转换完成标志位ADIF(中断标志位),=0等待,=1读结果

ADCSRA.4=1; //中断标志ADIF位清0(注:通过写1来清0)

ADCSRA.6=1; //ASSC置1,重新开始转换

PORTC=ADCL; //必须先读低位字节,再读高位字节

PORTD=ADCH;

}

二、单次触发---中断

如图,V REF=5V(A VCC),0~5V的模拟电压从PA7输入,A/D转换后的10位结果从高到低由PD1,PD0,PC7~PC0输出。系统时钟采用片外的16MHZ晶体。

注:1、采用片外时钟时相关的设置要更改:

2、采用128分频,则A/D采样时钟=16M/128=125KHZ。

//16MHZ外部时钟

#include

interrupt [15] void aaa(void)

{

ADCSRA.6=1; //ADSC置1,重新开始转换

PORTC=ADCL;

PORTD=ADCH;

}

void main(void)

{

DDRC=0XFF;

PORTC=0X00;

DDRD.0=1;

DDRD.1=1;

PORTD.0=0;

PORTD.1=0;

ADCSRA=0B11001111; //使能ADC,开始转换,128分频,ADC时钟=16M/128=125KHZ,开中断

SREG.7=1;

while(1);

}

三、自动触发---连续转换模式---中断

如图,V REF=5V(A VCC),0~5V的模拟电压从PA0输入,A/D转换后的10位结果从高到低由PD1,PD0,PC7~PC0输出。系统时钟采用片外的16MHZ晶体。

注:自动触发的连续转换模式(ADSC=1,ADATE=1,ADTS2=ADTS1=ADTS0=0),是以中断标志ADIF作为触发源的,只要转换一结束,下一次转换马上开始,即一次接着一次一直转换下去,注意初始化时(第一次)必须要让ADSC=1。

//16MHZ外部时钟

#include

interrupt [15] void aaa(void)

{

//ADCSRA.6=1; //ADSC置1,重新开始转换

PORTC=ADCL;

PORTD=ADCH;

}

void main(void)

{

DDRC=0XFF;

PORTC=0X00;

DDRD.0=1;

DDRD.1=1;

PORTD.0=0;

PORTD.1=0;

ADCSRA=0B11101111; //使能ADC,开始转换,自动触发中断,128分频,ADC时钟=16M/128=125KHZ,开中断

SFIOR=0X00; //连续自由转换

SREG.7=1;

while(1);

}

四、自动触发---外部中断0触发

如图,V REF=5V(A VCC),0~5V的模拟电压从PA0输入,A/D转换后的10位结果从高到低由PD1,PD0,PC7~PC0输出。系统时钟采用片外的16MHZ晶体。要求按一次按钮,PB7上的LED灯取反,且A/D转换一次。

注:1、初始化时(第一次)置ADSC=1也行,ADSC=0也行。

2、该题中是以外部中断0的标志位INTF0作为触发源的,只要INTF0=1则不仅进入外部中断,且进行一次AD转换。

//16MHZ外部时钟

#include

interrupt [15] void aaa(void)

{

//ADCSRA.6=1; //ADSC置1,重新开始转换

PORTC=ADCL;

PORTD=ADCH;

}

interrupt [2] void ccc(void)

{

PORTB.7=~PORTB.7;

}

相关文档
最新文档