?? ad.c
字號:
#include <avr/signal.h>
#include <avr/interrupt.h>
#include <stdlib.h>
#include <inttypes.h>
#include <pgmspace.h>
#include <avr/wdt.h>
//======================全局變量======================================
uint16_t ad0_result; //存放AD0轉換結果
//******************************延時子程序*****************************************
void delay_us(uint16_t u) //延時2us左右,delay(240)=100us;
{
while(u)
{
u--;
}
}
// 延時nms
void delay_ms(uint16_t m)
{
uint16_t i;
for(i=0;i<m;i++)
{
delay_us(2400); //延時1ms
}
}
//延時ns
void delay_s(uint16_t n)
{
uint16_t j;
for(j=0;j<n;j++)
{
delay_ms(1000); //延時1s
}
}
//================================AD轉換設置,并啟動轉換=========================
void AD0_SETTING_AND_START()
{
//Avcc作為基準電壓源,AREF引腳外加濾波電容,通道0
ADMUX = 0x00;
//AD時鐘的分頻因子為128(AD轉換頻率為115.2k),啟動AD轉換
ADCSRA=0x87;
}
//=================================AD轉換濾波====================================
// AD轉換 采樣10次 去首尾求平均濾波
void AD0_RESULT_FILTER(void)
{
uint8_t i,index1,index2,low;
uint16_t result_array[10],sum,temp=0x00;
float ad0_average;
//Avcc作為基準電壓源,AREF引腳外加濾波電容,通道0
ADMUX=0x00;
for(i=0;i<10;i++)
{
//AD時鐘的分頻因子128
ADCSRA=0x87;
ADCSRA|=1<<ADSC;
loop_until_bit_is_set(ADCSRA,ADIF); //等待AD轉換結束
ADCSRA=ADCSRA|(1<<ADIF);
low=ADCL;
temp=ADCH;
temp=temp<<8;
temp=temp+low;
result_array[i]=temp;//AD轉換結果
ADCSRA=ADCSRA &(~(1<<ADEN));
delay_us(100);
}
index1=0;//最大數對應序號
index2=0;//最小數對應序號
for(i=0;i<10;i++)
{
if(result_array[i]>result_array[index1])
{
index1=i;
}
if(result_array[i]<result_array[index2])
{
index2=i;
}
}
sum=0;
for(i=0;i<10;i++)
{
if((i==index1)||(i==index2))
continue;
sum=sum+result_array[i];
}
if(index1==index2)
ad0_average=sum/9;
else
ad0_average=sum/8;
ad0_result=ad0_average;
}
//主程序
int main(void)
{ for(;;)
{AD0_RESULT_FILTER();//讀壓力傳感器并濾波,碼值存入全局變量ad0_result
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -