最近看了ATmega16的ADC,寫下這個簡單的程序,瞭解下ADC的簡單控制。
程序用Proteus仿真的,用的是ICCAVR7 的編譯器(頭文件有所不同,自己掂量)
程序的內容是:通過PA1外部電壓的讀入並動態的顯示在3位數碼管上
#include<iom16v.h>
#include<AVRdef.h>
unsigned char tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//數碼管0~9
void display(unsigned char smg);
unsigned char temp;
void delay_1ms(unsigned int z)
{
unsigned int i,j;
for(i=0;i<z;i++)
for(j=0;j<150;j++);
}
void main()
{
DDRC=0xff;
PORTC=0;//PC輸出數碼管段選
DDRD=0xff;
PORTD=0;//PD5~PD7爲數碼管位選
ADCSRA=0;//關閉ADC
ADMUX=(1<<ADLAR)|(1<<REFS0)|(1);//左對齊,參考電壓AVCC,通道1
ADCSRA=(1<<ADEN)|(1<<ADSC)|(1<<ADIE)|(7);//使能adc和中斷,預分頻128,啓動ADC,不設置連續轉化模式(|(1<<ADATE))
//SFIOR=0;//連續轉換模式
SEI();
while(1)
{
display(temp);//動態顯示數碼管
}
}
#pragma interrupt_handler adc:iv_ADC
void adc()
{
temp=ADCH;//讀取轉換的數據
ADCSRA|=0X40;//重新啓動ADC,設置ADCSRA的ADATE和連續轉換模式時不用
}
void display(unsigned char smg)//3位數碼管動態顯示
{
unsigned char bai,shi,ge;
bai=smg/100;//百位
shi=smg%100/10;//十位
ge=smg%10;//個位
PORTC=tab[bai];
PORTD=0x80;
PORTD=0;
delay_1ms(2);
PORTC=tab[shi];
PORTD=0x40;
PORTD=0;
delay_1ms(2);
PORTC=tab[ge];
PORTD=0x20;
PORTD=0;
delay_1ms(1);
}
#include<AVRdef.h>
unsigned char tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//數碼管0~9
void display(unsigned char smg);
unsigned char temp;
void delay_1ms(unsigned int z)
{
unsigned int i,j;
for(i=0;i<z;i++)
for(j=0;j<150;j++);
}
void main()
{
DDRC=0xff;
PORTC=0;//PC輸出數碼管段選
DDRD=0xff;
PORTD=0;//PD5~PD7爲數碼管位選
ADCSRA=0;//關閉ADC
ADMUX=(1<<ADLAR)|(1<<REFS0)|(1);//左對齊,參考電壓AVCC,通道1
ADCSRA=(1<<ADEN)|(1<<ADSC)|(1<<ADIE)|(7);//使能adc和中斷,預分頻128,啓動ADC,不設置連續轉化模式(|(1<<ADATE))
//SFIOR=0;//連續轉換模式
SEI();
while(1)
{
display(temp);//動態顯示數碼管
}
}
#pragma interrupt_handler adc:iv_ADC
void adc()
{
temp=ADCH;//讀取轉換的數據
ADCSRA|=0X40;//重新啓動ADC,設置ADCSRA的ADATE和連續轉換模式時不用
}
void display(unsigned char smg)//3位數碼管動態顯示
{
unsigned char bai,shi,ge;
bai=smg/100;//百位
shi=smg%100/10;//十位
ge=smg%10;//個位
PORTC=tab[bai];
PORTD=0x80;
PORTD=0;
delay_1ms(2);
PORTC=tab[shi];
PORTD=0x40;
PORTD=0;
delay_1ms(2);
PORTC=tab[ge];
PORTD=0x20;
PORTD=0;
delay_1ms(1);
}