📄 adled.c
字号:
#include <avr/io.h>
#include <util/delay.h>
#include <stdio.h>
#include <stdint.h>
static uint16_t g_aAdValue[8]; //A/D转换缓冲区
/*void IoInit(void)
{
//初始化uart,查询方式读写
UCSRB=_BV(RXEN)|_BV(TXEN);/*(1<<RXCIE)|(1<<TXCIE)|
UBRRL=25; //9600 baud 4MHz:25
stdout=&mystd;
stdin=&mystd;
} */
//AD转换8次去掉最高和最低后取平均值返回
uint16_t AdcConvert(void)
{
uint8_t i;
uint16_t ret;
uint8_t max_id,min_id,max_value,min_value;
ADMUX=0Xc0;//内部2.56V参考电压,0通道
ADCSR=_BV(ADEN);//使能ADC,单次转换模式
//连续转换8次
for(i=0;i<8;i++)
{
ADCSR|=_BV(ADSC);
_delay_loop_1(60);
while(ADCSR&_BV(ADSC))
_delay_loop_1(60);
ret=ADCL;
ret|=(uint16_t)(ADCH<<8);
g_aAdValue[i]=ret;
}
ret=0;
for(i=1;i<8;i++)
ret+=g_aAdValue[i];
//找到最大和最小值索引
ret/=7;
max_id=min_id=1;
max_value=min_value=0;
for(i=1;i<8;i++)
{
if(g_aAdValue[i]>ret)
{
if(g_aAdValue[i]-ret>max_value)
{
max_value=g_aAdValue[i]-ret;
max_id=i;
}
}
else
{
if(ret-g_aAdValue[i]>min_value)
{
min_value=ret-g_aAdValue[i];
min_id=i;
}
}
}
//去掉第一个和最大最小值后的平均值
ret=0;
for(i=1;i<8;i++)
{
if((i!=min_id)&&(i!=max_id))
ret+=g_aAdValue[i];
}
if(min_id!=max_id)
ret/=5;
else
ret/=6;
ADCSR=0;//关闭ADC
return ret;
}
int main(void)
{
uint8_t i;
//IoInit();
while(1)
{
scanf("%c",&i);
if(i=='c')
printf("%d\n",AdcConvert());
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -