⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 adc.c

📁 采用Atmega16的变频式超声波发生器的源代码
💻 C
字号:
#include"main.h"


//extern volatile ulong test_data;
extern volatile uint adc_sum;
void adc_init(uchar channel,uint volt_ref)
{   

    cbi(ddra,channel);
	cbi(porta,channel);
	
    
	ADMUX=(volt_ref<<REFS1)|(1<<REFS0)|(channel<<MUX0);
//channel PA0~3;ref volt 0:AVCC,1:internal 2.56
	
	/*
	REFS1,0:
	00:AREF
	01:AVCC
	11:2.56
	MUX4,3,2,1,0
    00000:ADC0
	01000:ADC0X10
	01010:ADC0X200
	*/

	ADCSRA=(1<<ADEN)|(1<<ADATE)|(1<<ADPS2)|(1<<ADPS1)|(0<<ADPS0);
    /*ADPS2,1,0:prescaler
	        000:2
	        001:2
	          ...
	          X2
			100:16
	          ...
	        111:128
	  */
    sbi(ADCSRA,ADSC);

	}

void start_an_adc(void)
{
      //start an A/D conversion
	 sbi(ADCSRA,ADIE);
     loop_until_bit_is_set(ADCSRA,ADIF);
	 cbi(ADCSRA,ADIE);
	 	
}


ISR(SIG_ADC)
{
  	adc_sum=ADC;
}

void write_adc(void)
{   
    uint j=0;
    uchar adc[5];

    switch(ADMUX&0xc0)
	{
	case 0x40:j=(ulong)adc_sum*50000/1024;break;//AVCC
	case 0xc0:j=(ulong)adc_sum*25600/1024;break;//internal 2.56v
	}

	adc[0]=j/10000;
    j=j%10000;
	adc[1]=j/1000;
	j=j%1000;
	adc[2]=j/100;
	j=j%100;
	adc[3]=j/10;
	adc[4]=j%10;
	

	write_number(adc[0]);
	write_data('.');
	write_number(adc[1]);
	write_number(adc[2]);
	write_number(adc[3]);
	write_number(adc[4]);
	write_data('V');


	
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -