力求最简,由于只有万用表,电感啊什么的凑得
#include<iom16v.h>
#define uchar unsigned char
#define uint unsigned int
#define a 122.11
#define b 248
#define N 12
#define T 10000
uint ADData;
uint filter()
{
int count,i,j;
long value_buf[N],temp;
long sum=0;
for(count=0;count<N;count++)
{
value_buf[count] = (long)AD_GetData();
}
for(j=0;j<N-1;j++)
{
for(i=0;i<N-j;i++)
{
if ( value_buf[i]>value_buf[i+1] )
{
temp = value_buf[i];
value_buf[i] = value_buf[i+1];
value_buf[i+1] = temp;
}
}
}
for(count=1;count<N-1;count++)
sum+=value_buf[count];
return ((int)(sum/(N-2)*2505/1024*a/1000));
}
void Delay_ms(uint xms)
{ int i,j;
for(i=0;i<xms;i++)
{for(j=0;j<2280;j++);}
}
void Port_init()
{DDRB|=(1<<[s:9]B3);
PORTB&=(0<<[s:9]B3);
PORTA=0X00;
DDRA=0X00;
}
void time0_init()
{TCCR0=(1<<WGM01)|(1<<WGM00)|(1<<COM01)|(1<<COM00)|(1<<CS00);
OCR0=255;
SREG=0X80;
}
void AD_init()
{ADMUX|=(1<<REFS1)|(1<<REFS0);
ADCSRA|=(1<<ADEN)|(1<<ADPS2)|(1<<ADPS0);
}
uint AD_GetData()
{
ADCSRA|=(1<<ADSC);
while(!(ADCSRA&(1<<ADIF)));
ADCSRA|=(1<<ADIF);
return ADC;
}
void test ()
{OCR0=b;
Delay_ms(2000);
while(1)
{
ADData=filter();
if(ADData<40)
{Delay_ms(1000);
ADData=filter();
if(ADData<40)
slow();
}
}
}
void slow()
{setv(100);
setv(140);
setv(170);
setv(190);
setv(200);
setv(220);
while(1)
{setv(220);}
}
void setv(uint v)
{int i;
for(i=0;i<T;i++)
{
ADData=filter();
if(ADData>=250)
{Delay_ms(60);
ADData=filter();
if(ADData>=250)
test();
}
if(ADData>=v)
OCR0++;
else
OCR0--;
}
}
void main()
{ Port_init();
AD_init();
Delay_ms(5000);
time0_init();
test();
}
200字以内,仅用于支线交流,主线讨论请采用回复功能。