📄 adc-disp.c
字号:
/*
主程序
adc-disp.c
硬件:avr-51
时钟:内部4MHz
ATmega16
苏丹 2008-05-16
studio4.13+winavr071221
*/
#include <avr/io.h>
#include <util/delay.h>
#define uchar unsigned char
#define uint unsigned int
static uint g_aAdValue[8]; //A/D转换缓冲区
void IoInit(void)
{
PORTA&=~_BV(PA0); //初始化pa0
DDRC=0xff;
PORTC=0X00;
DDRA=0xf0;
PORTA=0xf0;
}
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_us(60);
while(ADCSRA&_BV(ADSC))
_delay_us(60);
ret=ADCL;
ret|=(uint)(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;
ADCSRA=0;//关闭ADC
return ret;
}
int Led_disp(void)
{
uchar g_aDisplayBuf[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
uint num,temp,a,b,c,d;
num=AdcConvert();
a=num/1000;
a=g_aDisplayBuf[a];
PORTC=a;
PORTA=~_BV(PA4)&0xf0;
_delay_us(1000);
PORTA=0xf0;
temp=num%1000;
b=temp/100;
b=g_aDisplayBuf[b];
PORTC=b;
PORTA=~_BV(PA5)&0xf0;
_delay_us(1000);
PORTA=0xf0;
temp=temp%100;
c=temp/10;
c=g_aDisplayBuf[c];
PORTC=c;
PORTA=~_BV(PA6)&0xf0;
_delay_us(1000);
PORTA=0xf0;
temp=temp%10;
d=temp;
d=g_aDisplayBuf[d];
PORTC=d;
PORTA=~_BV(PA7)&0xf0;
_delay_us(1000);
PORTA=0xf0;
return 0;
}
int main(void)
{
IoInit();
while(1)
{
Led_disp();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -