|
/*******************************************
功能: ATmega8查询方式A/D转换测试程序
文件名:ad_0.c
时钟:11.0592MHz
I/O: ADC用内部参考电压源2.56,PC0/ADC0
编译 WinAVR-20070525rc2,优化选项:00
********************************************/
#include <avr/io.h>
#include <avr/delay.h>
#include <stdio.h>
#define uchar unsigned char
#define uint unsigned int
static uint g_aAdValue[8]; //A/D转换缓冲区
//向UART写入一字节
int usart_putchar(char c)
{
if(c == '\n')
usart_putchar('\r');
loop_until_bit_is_set(UCSRA,UDRE);
UDR = c;
return 0;
}
//从标准设备中输入一个字节
int usart_getchar(void)
{
loop_until_bit_is_set(UCSRA,RXC);
return UDR;
}
void IoInit(void)
{
//I/O流UART连接
UCSRB = _BV(TXEN)|_BV(RXEN);
UBRRL = 71; //设置波特率为9600
fdevopen(usart_putchar,usart_getchar);
}
uint AdcConvert(void)
{
uchar i;
uint ret;
uchar max_id,min_id,max_value,min_value;
ADMUX = 0xC0; //内部2.56V参考电压,0通道
ADCSRA = _BV(ADEN); //使能ADC,单次转换模式
//连续转换8次
for (i=0;i<8;i++)
{
ADCSRA |= _BV(ADSC);
_delay_ms(5);
while(ADCSRA&_BV(ADSC))
_delay_ms(5);
ret = ADCL;
ret |= (uint)(ADCH<<8);
g_aAdValue=ret;
}
ret =0;
//下列代码抛弃第一次转换结果
for (i=1;i<8;i++)
ret += g_aAdValue;
//找到最大值和最小索引
ret /=7;
max_id=min_id=1;
max_value=min_value=0;
for(i=1;i<8;i++)
{
if(g_aAdValue>ret)
{
if(g_aAdValue-ret>max_value)
{
max_value=g_aAdValue-ret;
max_id = i;
}
}
else
{
if(ret-g_aAdValue>min_value)
{
min_value = ret-g_aAdValue;
min_id = i;
}
}
}
//去掉第一个,最大值和最小值后的平均值;
ret = 0;
for (i=1;i<8;i++)
{
if((i!=min_id)&&(i!=max_id))
ret+=g_aAdValue;
}
if(min_id!=max_id)
ret/=5;
else
ret/=6;
ADCSRA = 0; //关闭ADC
return ret;
}
int main(void)
{
uchar i;
IoInit();
while(1)
{
scanf("%c",&i);
if(i=='c')
printf("ADC转换结果:%d\n\r",AdcConvert());
}
} |
阿莫论坛20周年了!感谢大家的支持与爱护!!
曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……
|