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

📄 adc._c

📁 AVR单片机ATMEGA128实习之—AD转换器(附带Proteus仿真例子)
💻 _C
字号:
#include <iom128.h>
#include <macros.h>
#include <math.h>
//LED 开关定义

#define   ADC_start			0x40

#define	  Red_LED_on		PORTB&~BIT(0)
#define	  Red_LED_off		PORTB|(1<<0)
#define	  Green_LED_on		PORTB&(~(1<<1))
#define	  Green_LED_off		PORTB|(1<<1)
#define	  Yellow_LED_on		PORTB&(~(1<<2))
#define	  Yellow_LED_off	PORTB|(1<<2)
#define	  Blue_LED_on		PORTB&(~(1<<3))
#define	  Blue_LED_off		PORTB|(1<<3)

unsigned int AD_sample_value;
//UART
//unsigned char Rx_counter = 0;
//unsigned char Tx_counter = 0;
//unsigned char Tx_data_buf[] = {222,111,100,50,20,10,5,2,1,22};
//unsigned char Tx_data;
//unsigned char Rx_data_buf[12];
//unsigned char Rx_data;
//unsigned char UART0_TX_flag	= 1;
//unsigned char UART0_RX_flag	= 1;
unsigned char Type_flag = 0;
unsigned char channel_0_flag = 1;
unsigned char channel_1_flag = 1;
unsigned char channel_2_flag = 1;
unsigned char channel_3_flag = 1;
//Display
unsigned char number_baifen;
unsigned char number_shifen;
unsigned char number_ge_dot;
unsigned char Display_type;
unsigned char Display_value;
unsigned char Display_flag = 0;
unsigned char LED_table[]=
{  
   0x3F,  //"0"
   0x06,  //"1"
   0x5B,  //"2"
   0x4F,  //"3"
   0x66,  //"4"
   0x6D,  //"5"
   0x7D,  //"6"
   0x07,  //"7"
   0x7F,  //"8"
   0x6F,  //"9"
   0x77,  //"A"
   0x7C,  //"B"
   0x39,  //"C"
   0x5E,  //"D"
   0x79,  //"E"
   0x71,  //"F"
   0x76,  //"H"
   0x38,  //"L"
   0x37,  //"n"
   0x3E,  //"u"
   0x73,  //"P"
   0x5C,  //"o"
   0x40,  //"-"
   0x00,  //熄灭                     
};

//use for test;
unsigned char m;

//define Interrupt Vactor

//#pragma interrupt_handler UART0_TX_INT:21		//外部中断0
//#pragma interrupt_handler UART0_RX_INT:19		//外部中断1
#pragma interrupt_handler External_INT_0:2		//外部中断0
#pragma interrupt_handler External_INT_1:3		//外部中断1
#pragma interrupt_handler External_INT_2:4		//外部中断2
#pragma interrupt_handler ADC_INT:22		//ADC中断

//pre_define

void Port_initialize(void);
void INT_initialize(void);
//void UART_initialize(void);

//void UART0_TX_INT(void);
//void UART0_RX_INT(void);

void External_INT_0(void);
void External_INT_1(void);
void External_INT_2(void);

void LED_Display(unsigned char Channel_num,unsigned int Data);
void DATA_to_NUM(unsigned int data);
void Delay(void);


void main(void)
{
	unsigned char i;
	
	Port_initialize();
	//UART_initialize();
	INT_initialize();
	ADC_initialize();
		
	for (; ; )
	{
		
		switch (Type_flag)
		{
			/*case 0:				//发送的数值
			{
				Display_type = 0;
				Display_value = Tx_data;
			
			}break;
			*/
			case 1:				//发送计数
			{
				Display_type = 1;
				//Display_value = Tx_counter;
			
			}break;

			case 2:				//接收的数值
			{
				Display_type = 2;
				//Display_value = Rx_data;

			}break;

			case 3:				//接收计数
			{
				Display_type = 3;
				//Display_value = Rx_counter;
			
			}break;

			default:
			{
				Display_type = 0x0;
				
			}break;
		}

		if (Display_flag == 1)
		{
			LED_Display(Display_type,AD_sample_value);		//数码管显示
			
		}
		else
		{
		 	LED_Display(Display_type,AD_sample_value);	
			DDRB &=0x1F; 
		}
		
		
		
		if (channel_0_flag == 0)
		{
			PORTB = Red_LED_on;

			for (i=0;i<10 ;i++ )
			{
				Delay();
			}

			channel_0_flag = 1;
		}
		else
		{
			PORTB = Red_LED_off;
		}
		
		if (channel_1_flag == 0)
		{
			PORTB = Green_LED_on;

			for (i=0;i<10 ;i++ )
			{
				Delay();
			}

			channel_1_flag = 1;
		}
		else
		{
			PORTB = Green_LED_off;
		}

		if (channel_2_flag == 0)
		{
			PORTB = Yellow_LED_on;

			for (i=0;i<10 ;i++ )
			{
				Delay();
			}

			channel_2_flag = 1;
		}
		else
		{
			PORTB = Yellow_LED_off;
		}
		
		if (channel_3_flag == 0)
		{
			PORTB = Blue_LED_on;

			for (i=0;i<10 ;i++ )
			{
				Delay();
			}

			channel_3_flag = 1;
		}
		else
		{
			PORTB = Blue_LED_off;
		}
	}
}

void Port_initialize(void)
{
	DDRA = 0xFF;
	DDRB = 0xFF;
	DDRD = 0x00;
	PORTB = 0xFF;
}
void ADC_initialize(void)
{
	ADMUX = 0x40;	//Vref = AVCC,right,channel = 0
	ADCSR = 0x89;	//enable ADC,not start now,not continuous,F--,clock = f/2


}
void INT_initialize(void)
{
	EICRA = 0xaa;		//fall edge trigger
	EICRB = 0x00;		//no influence
	EIMSK = 0x0f;

	SEI();

}
void UART_initialize(void)
{
	CLI();
	
	UBRR0H = 0x00;
	UBRR0L = 0x67;		//波特率9600bps
	UCSR0A = 0x00;
	UCSR0B = 0x98;		//11011000接收与发送使能
	UCSR0C = 0x26;		//00100110帧格式: 8bits,1stop bit,P 校验

	SEI();
}
void Delay(void)
{
	unsigned int i;

	for ( i = 0; i < 6000; i++ )
	{
		NOP();
	}
}



void External_INT_0(void)
{
	
	ADCSR |= ADC_start;
	Display_flag = 1;
	/*UCSR0B |= 0x40;
	UCSR0B &= ~(0x80);*/
}

void ADC_INT(void)
{
	AD_sample_value = ADC; 
	//PORTB = Blue_LED_on;
	switch (Type_flag)
	{
		case 1:				
		{
			channel_1_flag = 0; 
		
		}break;

		case 2:				
		{
			channel_2_flag = 0;

		}break;

		case 3:				
		{
			channel_3_flag = 0;
		
		}break;

		default:
		{
			channel_0_flag = 0;
			
		}break;
	}
}

void External_INT_1(void)
{
	if (Type_flag < 3 )
	{
		Type_flag += 1;
	}
	else
	{
		Type_flag = 0;
	}

	ADMUX = (ADMUX&0xf8)|Type_flag;	//0x41;  //
	Display_flag = 0;
}
void External_INT_2(void)
{
 	
	

	
}
void LED_Display(unsigned char Channel_num,unsigned int Data)
{
	
	DATA_to_NUM(Data);
	
	PORTA = LED_table[number_baifen] ;
	PORTB = (PORTB|0xf0)&0x7F;
	Delay();

	PORTA = LED_table[number_shifen];
	PORTB = (PORTB|0xf0)&0xBF;
	Delay();
	
	PORTA = LED_table[number_ge_dot] + 0x80;
	PORTB = (PORTB|0xf0)&0xDF;
	Delay();

	PORTA = LED_table[Channel_num];
	PORTB =	(PORTB|0xf0)&0xEF;
	Delay();
}

void DATA_to_NUM(unsigned int data)
{
	unsigned int temp;

	temp = (unsigned int)(((float)data)*500/1024);

	number_ge_dot = temp/100;
	number_shifen = (temp%100)/10;
	number_baifen = (temp%100)%10;
}

⌨️ 快捷键说明

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