#include<iom8v.h>
#include<macros.h>
#pragma interrupt_handler Time0_ov:iv_TIMER0_OVF
#pragma interrupt_handler ADC_deal:iv_ADC
#define TLED (1<<PB0)
#define INH (1<<PB5)
#define ACC_A (1<<PB2)
#define ACC_B (1<<PB3)
#define ACC_C (1<<PB4)
#define BCL_show (1<<PD7)
#define BL_show (1<<PD6)
#define BM_show (1<<PD2)
#define BR_show (1<<PD5)
#define BCR_show (1<<PD4)
#define FL_show (1<<PD3)
#define FM_show (1<<PD0)
#define FR_show (1<<PD1)
unsigned char irq_times,click;
unsigned char sampling_CF,unitary_CF;
unsigned char A_channel,C_sampling,C_sensor;
unsigned char D_value[8][3];
int P_variate,N_variate,AVE_differ;
struct S_V_sensor
{
unsigned char old_val;
unsigned char new_val;
int self_difference;
int ave_difference;
} ;
struct S_V_sensor V_sensor[8];
void timer_init(void)
{
TCCR0|=1<<CS02;
}
void interrupt_init(void)
{
_SEI();
TIMSK|=1<<TOIE0;
}
void port_init(void)
{
DDRB|=1<<PB0|1<<PB2|1<<PB3|1<<PB4|1<<PB5;
DDRD=0XFF;
PORTB|=INH;
}
void ADC_init(void)
{
ADMUX|=1<<REFS1|1<<REFS0|1<<ADLAR;
ADCSRA|=1<<ADEN|1<<ADIE|1<<ADPS2;//|1<<ADPS0;
}
void WDT_init(void)
{
_WDR();
WDTCR|=1<<WDCE|1<<WDE; //16mS
}
void Time0_ov(void)
{
TCNT0=6; //8MS
if(++irq_times>62)
{
irq_times=0;
click^=0xff;
//PORTB^=TLED;
}
}
void Analog_channel_choose(unsigned char ch)
{
switch(ch)
{
case 0:
{
PORTB&=~ACC_A&~ACC_B&~ACC_C;
} break;
case 1:
{
PORTB&=~ACC_B&~ACC_C;
PORTB|=ACC_A;
} break;
case 2:
{
PORTB&=~ACC_A&~ACC_C;
PORTB|=ACC_B;
} break;
case 3:
{
PORTB&=~ACC_C;
PORTB|=ACC_A|ACC_B;
} break;
case 4:
{
PORTB&=~ACC_A&~ACC_B;
PORTB|=ACC_C;
} break;
case 5:
{
PORTB&=~ACC_B;
PORTB|=ACC_A|ACC_C;
} break;
case 6:
{
PORTB&=~ACC_A;
PORTB|=ACC_B|ACC_C;
} break;
case 7:
{
PORTB|=ACC_A|ACC_B|ACC_C;
} break;
}
}
void ADC_deal(void)
{
D_value[A_channel][C_sampling]=ADCH;
if(++C_sampling>2)
{
C_sampling=0;
unitary_CF=1;
if(++A_channel>7)
{
A_channel=0;
sampling_CF=1;
}
Analog_channel_choose(A_channel);
}
if(!sampling_CF)
{
ADCSR|=1<<ADSC;
}
}
void digital_analyse(void)
{
unsigned char i,j,k=0;
V_sensor[C_sensor].old_val=V_sensor[C_sensor].new_val;
V_sensor[C_sensor].new_val=(D_value[C_sensor][0]+D_value[C_sensor][1]+D_value[C_sensor][2])/3;
V_sensor[C_sensor].self_difference=V_sensor[C_sensor].new_val-V_sensor[C_sensor].old_val;
if(++C_sensor>7)
{
C_sensor=0;
k=1;
}
if(sampling_CF&&k)
{
for(i=0;i<=7;i++)
{
V_sensor[i].ave_difference=0;
for(j=0;j<=7;j++)
{
if(i!=j)
V_sensor[i].ave_difference+=V_sensor[i].new_val-V_sensor[j].new_val;
}
V_sensor[i].ave_difference/=7;
}
if((V_sensor[0].self_difference>P_variate)||(V_sensor[0].ave_difference>AVE_differ))
{
PORTD|=BCR_show;
}
else if(V_sensor[0].self_difference<N_variate)
{
PORTD&=~BCR_show;
}
if((V_sensor[1].self_difference>P_variate)||(V_sensor[1].ave_difference>AVE_differ))
{
PORTD|=FR_show;
}
else if(V_sensor[1].self_difference<N_variate)
{
PORTD&=~FR_show;
}
if((V_sensor[2].self_difference>P_variate)||(V_sensor[2].ave_difference>AVE_differ))
{
PORTD|=FM_show;
}
else if(V_sensor[2].self_difference<N_variate)
{
PORTD&=~FM_show;
}
if((V_sensor[3].self_difference>P_variate)||(V_sensor[3].ave_difference>AVE_differ))
{
PORTD|=BM_show;
}
else if(V_sensor[3].self_difference<N_variate)
{
PORTD&=~BM_show;
}
if((V_sensor[4].self_difference>P_variate)||(V_sensor[4].ave_difference>AVE_differ))
{
PORTD|=BR_show;
}
else if(V_sensor[4].self_difference<N_variate)
{
PORTD&=~BR_show;
}
if((V_sensor[5].self_difference>P_variate)||(V_sensor[5].ave_difference>AVE_differ))
{
PORTD|=FL_show;
}
else if(V_sensor[5].self_difference<N_variate)
{
PORTD&=~FL_show;
}
if((V_sensor[6].self_difference>P_variate)||(V_sensor[6].ave_difference>AVE_differ))
{
PORTD|=BCL_show;
}
else if(V_sensor[6].self_difference<N_variate)
{
PORTD&=~BCL_show;
}
if((V_sensor[7].self_difference>P_variate)||(V_sensor[7].ave_difference>AVE_differ))
{
PORTD|=BL_show;
}
else if(V_sensor[7].self_difference<N_variate)
{
PORTD&=~BL_show;
}
sampling_CF=0;
ADCSR|=1<<ADSC;
}
}
void main(void)
{
port_init();
timer_init();
ADC_init();
WDT_init();
interrupt_init();
PORTB&=~INH;
AVE_differ=7;
P_variate=10;
N_variate=-10;
Analog_channel_choose(0);
ADCSR|=1<<ADSC;
while(1)
{
if(unitary_CF)
{
digital_analyse();
unitary_CF=0;
if(click) PORTB&=~TLED;
else PORTB|=TLED;
_WDR();
}
}
}
评论0