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

📄 main.c

📁 Atmel AVR单片机 Mega88的AD采集并且通过串口发送出去
💻 C
字号:
#include <avr/io.h>
#include <util/delay.h>
#include <avr/signal.h>
#include <avr/interrupt.h>


#define fosc 12000000 //晶振12MHZ
#define baud 9600	 //波特率


unsigned char adcdata_temp[32];
unsigned char currenp;
unsigned char flag_start;


/********************* UART 初始化 ******************************/
void uart_Init(void)
{
	UCSR0A = 0x00;
	UCSR0B = (1<<RXEN0)|(1<<TXEN0)|(1<<RXCIE0);				//允许发送和接收
	/* 设置帧格式: 8 个数据位, 1 个停止位 */
	UCSR0C = (0<<USBS0)|(1<<UCSZ00)|(1<<UCSZ01);

	UBRR0L = (fosc/baud/16 - 1) % 256;
	UBRR0H = (fosc/baud/16 - 1) / 256;
}

/*************** 字符输出函数 ****************************/
void putchar(unsigned char c)
{	 
	while (!(UCSR0A&(1<<UDRE0)));
	UDR0=c;    
}

/**************** 字符输入函数 ***************************/	
unsigned char getchar(void)
{
	while(!(UCSR0A& (1<<RXC0)));
	return UDR0;
}

/*************** 字符串输出函数	*************************/	
int puts(char *s)
{
	while (*s)
	{
		putchar(*s);
		s++;
	}	
	putchar(0x0a);//回车换行
	putchar(0x0d);

	return 1;
}

/*************** 串口接收中断	*************************/
SIGNAL(SIG_USART_RECV)
{
	if(getchar()=='s') 
	{
		flag_start = 1;
		puts("ADC Start!");
	}

	if(getchar()=='q')
	{
		flag_start = 0;
		puts("ADC Stop...");
	}
}

/********************* 显示整数 ***********************/
void putnum(unsigned char  x) 
{ 
 	if(x>10)
		putnum(x/10); 		//判断是否大于10,大于10则继续调用函数本身,直到x<10,这里用了递归
 	putchar(x%10 + '0'); 	//否则小于10,或已执行上一步部,对十求余得个位数,然后通过字符"0"内码加一得各个位数字的内码
} 

/********************* 读取AD值 ******************************/
unsigned char ReadADC(void)
{
	unsigned int ADC_value;

	ADCSRA |= (1<<ADEN);                //使能ADC
	ADCSRA |= 0x06;                     //64分频,6M/64=93.75K

	ADMUX = 0x41;                       //AVCC, AREF 引脚外加滤波电容,左对齐,通道1
	ADMUX |= (1<<ADLAR); 				//左对齐,将读取ADCH(高8位),ADCL(最低2位)将抛弃

	ADCSRA |= (1<<ADSC);                //启动单次转化
	_delay_us(50);
	while(!(ADCSRA & (1<<ADIF)));       //等待转化结束
	ADCSRA |= (1<<ADIF);                //清除中断标志
	ADC_value = ADCH;					//只读高字节,当作8位AD使用
	ADCSRA = 0;                         //关闭ADC
	return(ADC_value);
}

/********************* 主函数 ******************************/

int main(void)
{
  	unsigned char i;
  	unsigned int adc_average, adc_temp;

	DDRC = 0x01;
	PORTC = 0x01;

	DDRD = 0xFE;
	PORTD = 0xFE;

	sei();

	uart_Init();

	while(1)
	{
		if(flag_start==1)
		{
			adc_temp = ReadADC();

			adcdata_temp[currenp] = adc_temp;
			currenp++;

			if(currenp>=32)
			{
				currenp = 0;
				adc_average = 0;
				for(i=0;i<32;i++)
				{
					adc_average = adc_average + (unsigned int)adcdata_temp[i];
				}
				adc_average = adc_average>>5;
				putnum(adc_average);
				putchar(0x0a);			//回车换行
				putchar(0x0d);
			}
  		}

		_delay_ms(2);

		PORTC ^= 0x01;
	}

  	return 0;
}


⌨️ 快捷键说明

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