其他地方都没错,就是标注的部分,我想要求100个点中最大的5个,和最小的5个,用的是1k的正弦波,幅值0~20V,AD是12位,DA是8位,望高手指点
#include <iom16v.h>
#inlcude <macros.h>
#include <stdio.h>
#include <AVR_PQ1A.h>
#define uchar unsigned char
#define uint unsigned int
uchar max1,max2,max3,max4,max5,min1,min2,min3,min4,min5;
unsigned int AD_DATA;
void ad_accept()
{
uchar STS;
uchar i;
uchar AD_H,AD_L;
PORTD|=BIT(6);//STS输入带上拉电阻
STS=PIND;
STS=STS&0X40;
while(STS!=0)
{
STS = PIND;
STS&=BIT(6);
}
PORTD|=BIT(4);//RC输出1,读取数据
PORTB=0XFF;//AD4-11输入带上拉电阻
AD_H=PINB;
PORTD=PORTD|0X0F;//AD0-3位输入带上拉电阻
AD_L=PIND;
PORTD&=~BIT(4);//RC输出0,启动AD转换
AD_L=AD_L&0X0F;
AD_DATA=AD_H;
AD_DATA=AD_DATA<<4;
AD_DATA=AD_DATA+AD_L;
}
main()
{
uchar mum;
uchar hemp = 0 ;
DDRB=0;//AD4-11位设置为输入
DDRD=0X30;//AD0-3位设置为输入;RC(AD)输出;CE(AD)输出;STS(AD)输出
DDRA=0xFF;//DA0-7位设置为输出
DDRC|=BIT(0)|BIT(1);//CS(DA),CE(DA)设置为输出
PORTC=PORTC&0XFC;
PORTD|=BIT(5);//CE输出1
PORTD&=~BIT(4);//RC输出0,启动AD转换
max1=max2=max3=max4=max5=0;
min1=min2=min3=min4=min5=255;
while(1)
{
ad_accept();
AD_DATA=AD_DATA/16;//12位输入转8位输出
hemp=(uchar)AD_DATA;
/*********关键部分,要问的就是一下的数据处理***********/
if(hemp>=128)
{ if(max5<=hemp) max5=hemp;
else if(max4<=hemp) max4=hemp;
else if(max3<=hemp) max3=hemp;
else if(max2<=hemp) max2=hemp;
else if(max1<=hemp) max1=hemp;
}
else{
if(min5>=hemp) min5=hemp;
else if(min4>=hemp) min4=hemp;
else if(min3>=hemp) min3=hemp;
else if(min2>=hemp) min2=hemp;
else if(min1>=hemp) min1=hemp;
}
/*********关键部分,要问的就是以上的数据处理***********/
mum++;
if(mum==100)
{
mum=0;
mum=(max2+max3+max4-min2-min3-min4)/3;
PORTA=mum
max1=max2=max3=max4=max5=0;
min1=min2=min3=min4=min5=255;
}
}
} |