|
/*編寫時間2016.2.9*/
#include <iom16v.h>
#include <macros.h>
#define uint unsigned int
#define uchar unsigned char
#define PC7_1 PORTC|=1<<7
#define PC7_0 PORTC&=~(1<<7)
#define PC6_1 PORTC|=1<<6
#define PC6_0 PORTC&=~(1<<6)
void m16_init()//單片機初始化
{
DDRA=0x00;
PORTA=0x00;
DDRB=0xff;
PORTB=0x00;
DDRD=0xff;
PORTD=0x00;
DDRC=0xC0;
PORTC=0x00;
}
void delay(uint ms) //延時0.25ms
{
uint i,j;
for(i=0; i<ms; i++)
for(j = 0; j < 250; j++);
}
//AD初始化
void adc7_init()
{
ADMUX = 0x07; //外部參考電源,右對齊選,擇通道7
ADCSRA = 0x80; //使能,轉(zhuǎn)換器2分頻IE=0
}
/*
uint16_t ADC_Convert(void) // 得到AD結(jié)果
{
uint16_t temp1,temp2;
temp1=(uint16_t)ADCL;
temp2=(uint16_t)ADCH;
temp2=(temp2<<8)+temp1;
return(temp2);
}
*/
uint ADC_Convert(void)
{
uint i;
uint ret;
uint max_id, min_id, max_value, min_value;
ADMUX = (1<<MUX0); // 外部參考電壓,5通道
ADCSRA = (1<<ADEN); // 使能ADC,單次轉(zhuǎn)換模式
// 連續(xù)轉(zhuǎn)換8次
for(i=0;i<8;i++)
{
ADCSRA |= (1<<ADSC); //開始
delay(100);
while(ADIF==1)
delay(100);
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;
ADCSRA = 0x00; // 關(guān)閉ADC
return ret;
}
void Process(uint16_t i,uint8_t *p)
{
p[0]=i/1000;
i=i%1000;
p[1]=i/100;
i=i%100;
p[2]=i/10;
i=i%10;
p[3]=i;
}
int main(void)
{
uint16_t ret;
m16_init();
adc7_init();//就是這里卡住了 不往下執(zhí)行了
while(1)
{
ret = ADC_Convert();
//i = (i*5.0/1024)*1000; // 此處浮點也,MCU開支可不小!
ret *= 4.88; // 輸出原值
Process(ret,Data);
Display(Data);
}
return 0;
}
|
評分
-
查看全部評分
|