專注電子技術(shù)學(xué)習(xí)與研究
當(dāng)前位置:單片機(jī)教程網(wǎng) >> Arduino >> 瀏覽文章

AVR atmega 328P在Atmel Studio6下的ADC轉(zhuǎn)換代碼

作者:huqin   來源:本站原創(chuàng)   點擊數(shù):  更新時間:2014年04月25日   【字體:

 筆者才疏學(xué)淺,只會用as6, 所以為幫助后來者學(xué)習(xí)使用as6 ,在本機(jī)調(diào)試成功avr328p的AD代碼發(fā)出來供大家參考,如有不足,歡迎指正

 
# define F_CPU 16000000UL//定義CPU頻率,本人用5v arduino pro mini的最小系統(tǒng)版,所以頻率16M
#include //使用統(tǒng)一的頭文件  這是與ICC AVR編譯器  不同的地方
#include //這個頭文件可以使用系統(tǒng)自己帶的 _delay_us();_delay_ms();兩個延時函數(shù)
#include //含有中斷的宏定義 有些中斷聲明發(fā)生變化
 
#define uchar unsigned char
#define uint unsigned int
 
 
void AD_Init(void)
{
 //參考電壓AVCC  要加電容穩(wěn)壓,左對齊,ADC5單端輸入
 ADMUX |= (0<<REFS1)|(1<<REFS0)|(1 << ADLAR) ;//(1 << MUX0)
 //AD使能, 連續(xù)轉(zhuǎn)換,中斷使能,32分頻, 6M / 32 = 187.5khz
 ADCSRA |= (1 << ADEN) | (1 << ADATE) | (1 << ADIE) | (1 << ADPS2) | (1 << ADPS0);
 //AD開始轉(zhuǎn)換
 ADCSRA |= (1 << ADSC);
}
 
int main(void)
{
 
 DDRC=(0<<PC0);
 PORTC=(0<<PC0);//注意adc輸入口的設(shè)置  輸入0
 
 //AD初始化
 AD_Init();
 
 
 //開總中斷
 sei();
 
 while(1);
 
 
 return 0;
}
 
int result = 0;
 
 
ISR(ADC_vect)//中斷函數(shù)命名方式的變化
{
 result = ADCH;
 //result = result * 500 / 255;
 if(result>=128)
 {
  DDRB=(1<<PB5);
  PORTB=(1<<PB5);//檢測led的變化  因為pb5  接有l(wèi)ed
 }
 else
 {DDRB=(0<<PB5);
  PORTB=(0<<PB5);//微亮
  
 }
 }
 
 
#include
 
 
 
 
void AD_Init(void)
{
 //參考電壓AREF,左對齊,ADC5單端輸入
 ADMUX |= (0<<REFS1)|(1<<REFS0)|(1 << ADLAR) ;//(1 << MUX0)
 //AD使能, 連續(xù)轉(zhuǎn)換,中斷使能,32分頻, 6M / 32 = 187.5khz
 ADCSRA |= (1 << ADEN) | (1 << ADATE) | (1 << ADIE) | (1 << ADPS2) | (1 << ADPS0);
 //AD開始轉(zhuǎn)換
 ADCSRA |= (1 << ADSC);
}
 
int main(void)
{
 
 DDRC=(0<<PC0);
 PORTC=(0<<PC0);
 //LCD初始化
 
 //AD初始化
 AD_Init();
 
 
 //開總中斷
 sei();
 
 while(1);
 
 
 return 0;
}
 
int result = 0;
 
 
ISR(ADC_vect)
{
 result = ADCH;
 //result = result * 500 / 255;
 if(result>=128)
 {
  DDRB=(1<<PB5);
  PORTB=(1<<PB5);
 }
 else
 {DDRB=(0<<PB5);
  PORTB=(0<<PB5);//微亮
  
 }
 }
關(guān)閉窗口

相關(guān)文章