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

📄 mega32_adc.c

📁 MEGA32L 单片机的按键,LED,LCD等测试例程,ICCAVR编译器
💻 C
字号:
//======================================
//Mega32的AD模块源程序
//FileName =mega32_adc.c
//Date Time=20071214...20071215
//======================================
#include "mega32_adc.h"
#include "delay.h"

volatile struct	_st_adc_op	st_adc_op;		//ADC转换的操作函数
//--------------------------------------
//AD转换的初始化
//此时总的中断位没有打开
//--------------------------------------
void	init_adc_sets(void)
{
	DDRA	&= ~(BIT(CONST_ADC_CHANNEL_0) |
		     BIT(CONST_ADC_CHANNEL_1) );	//输入

	PORTA	|= (BIT(CONST_ADC_CHANNEL_0) |
		     BIT(CONST_ADC_CHANNEL_1) );	//高阻,外部PUD=1

	//ADC使用查询方式进行工作,禁止中断,单次转换方式	
	ADCSRA	=BIT(ADEN) |BIT(ADIF) | CONST_ADC_FEN_PIN_SETS;			//关闭中断,设置分频系数
	ADMUX	=CONST_ADMUX_REF_SELECT |CONST_ADC_CHANNEL_0;			//参考电压为内部VCC
			
	//先进行一次虚转换
	ADCSRA	|=	BIT(ADSC);
	while( (ADCSRA &BIT(ADIF)) ==0);
	ADCSRA |=	BIT(ADIF);	
						//最后没有自动触发和中断使能的设置!					
}


//--------------------------------------
//进行1次指定模拟输入通道的转换[MUX1...0]
//外部调用: 
//	这里的转换是外部Timer0没有启动
//的时候,使用查询方式的转换!  
//	已经ADATE=0,ADIE=I=0
//输入:	通道号	=0...1
//输出: AD转换值
//--------------------------------------
uint	do_adc_one_channel_change(uchar channel)
{
uint	tmp;
uchar	sreg_bak;

	//选择通道
	ADMUX	&=	~0x1f;
	ADMUX	|=	(channel &0x01);
	delay_20us();						//保证电压稳定
	
	ADCSRA	|=	( BIT(ADEN) |BIT(ADIF) |BIT(ADSC) );
	while( (ADCSRA &BIT(ADSC)) !=0 );	//ADSC由硬件自动清0!

	sreg_bak =SREG;
	_CLI();	
	tmp	=ADCL;
	tmp	=(tmp <<8) |ADCH;
	SREG	=sreg_bak;
		
	return(tmp);
}


//End Of File

⌨️ 快捷键说明

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