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

📄 m21_adc.txt

📁 CoreRiver MCU C语言程序集! 包括:ADC/POWER/PWM/UART/TIME0
💻 TXT
字号:
// File : m21_adc.c 

#include <gc89c520_tq32i.h>

#define ADC_DIVIDE_OSC_2_DEFALUT    0
#define ADC_DIVIDE_OSC_2   			1
#define ADC_DIVIDE_OSC_4   			2
#define ADC_DIVIDE_OSC_8   			3
#define ADC_DIVIDE_OSC_16  			4
#define ADC_DIVIDE_OSC_32  			5
#define ADC_DIVIDE_OSC_64  			6
#define ADC_DIVIDE_OSC_128 			7
#define MAX_ADC 28

unsigned char channel;
unsigned char adc_intr;
unsigned int adc_result;
unsigned char value;
unsigned char i;

void pwm_clock_selection(unsigned char divide)
{
	PWMCON &= 0x1f;
	PWMCON +=(divide << 4);
}

void m21_adc_clock_divide(unsigned char divide)
{
	if(divide == ADC_DIVIDE_OSC_2_DEFALUT)
	{
		ADCON &= 0xfb;
		return;
	}

	ADCON |= 0x04;

	//pwm_counter_start_enable();		 // ??
	pwm_clock_selection(divide);
}

void m21_adc_channel_selection(unsigned char adc_num)
{
	// adc_num : [0 ~ 11]  ADC0  ~ ADC11
	// adc_num : [12 ~ 27] ADCH0 ~ ADCH15
	
	if(adc_num <= 3)
	{
		ADCSEL &= ~(1 << (adc_num + 4));
	}
	else if((4<=adc_num)&&(adc_num<=11))
	{
		ADCSELH &= ~(1 << (adc_num - 4));
	}
	else if((12<=adc_num)&&(adc_num<=19))
	{
		ADCHL &= ~(1 << (adc_num - 12));
	}
	else if((20<=adc_num)&&(adc_num<=27))
	{
		ADCHH &= ~(1 << (adc_num - 20));
	}	
}

void adc_enable()
{
	ADCON |= 0x80;
}

void adc_disable()
{
	value = ADCON;			
	value &= 0x7f;
	ADCON = value;	
}

void adc_request()
{
	value = ADCON;			
	value |= 0x40;
	ADCON = value;	
}

void adc_clear_interrupt_flag()
{
	value = ADCON;			
	value &= 0xef;
	ADCON =  value;	
}

void m21_adc_mux_selection(unsigned char channel)
{
	if(channel <= 11)
	{
		ADCHSEL &= 0x7f;
		ADCSEL &= 0xf0;
		ADCSEL += channel;
	}
	else
	{
		ADCHSEL |= 0x80;
		ADCHSEL &= 0xf0;
		ADCHSEL += channel - 12;
	}
}

unsigned int adc_10bit_result()
{
	unsigned int temp,temp1;
	temp = ADCON & 0x03;
	temp1 = ADCR << 2;
	temp1 += temp;
	return temp1;	
}

void adc_interrupt_enable()
{
	EADC = 1;
}

void adc_run(unsigned char channel)
{
	m21_adc_mux_selection(channel);
	adc_request();	
	while (!adc_intr);
	adc_intr = 0;
	adc_result = adc_10bit_result();
}

void enable_all_interrupt()
{
	EA = 1;
}

void adc_port_pullup_off()
{
	P0SEL = 0xff;
	P1SEL = 0xff;
	P2SEL = 0xff;
	P3SEL = 0xff;
}

void adc_init()
{
	adc_intr = 0;
	adc_port_pullup_off();
	
	enable_all_interrupt();
	adc_interrupt_enable();	
	adc_enable();
	
	m21_adc_clock_divide(ADC_DIVIDE_OSC_2);

	ALTSEL |= 0x40; // resetb to IO.	
	
	for(i=3;i<MAX_ADC;i++) // MAX_ADC
	{
		m21_adc_channel_selection(i);	
	}

	for(channel=0;channel<MAX_ADC;channel++) //MAX_ADC
	{
		adc_run(channel);
	}
}

void adc_int(void) interrupt ADC_VECTOR
{
	adc_clear_interrupt_flag();
	adc_intr = 1;
}

void main()
{
	adc_init();
	while(1);
}

⌨️ 快捷键说明

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