ATmega8/16的AD轉(zhuǎn)換實(shí)驗(yàn)
/********************************************************************
程序名稱:片內(nèi)模數(shù)轉(zhuǎn)換演示實(shí)驗(yàn)
時(shí)鐘頻率:內(nèi)部RC 1M
引腳 :接鍵盤與顯示部分
**PC0.......PC7 鍵盤與顯示a.....g**
**PD0.......PD7 鍵盤與顯示1.....8**
**PA0 模擬電壓**
**Aref 電源正極**
********************************************************************/
#include
#include
#include
#include
#pragma interrupt_handler ad:15
unsigned long m=0;
unsigned int adc,adc1=0,adc2=0,adc3=0,adc4=0,l;
const unsigned char f[]=
{
0x7e,0x0c,0xb6,0x9e,0xcc,0xda,0xfa,0x0e,0xfe,0xde
};//碼段轉(zhuǎn)換
void adcc(void)
{
PORTA=0x00;
DDRA=0xf0;
PORTD=0x00;
DDRD=0xff;
PORTC=0x00;
DDRC=0xff;
ADMUX=0x40; //ADC狀態(tài)寄存器定義
ADCSRA=0x8e;//ADC狀態(tài)寄存器定義
SREG=0x80;//開放全局中斷
ADCSRA|=BIT(ADSC);//啟動(dòng)一次轉(zhuǎn)換
}
/*******************************************狀態(tài)寄存器設(shè)置******************/
void Delay(void)
{
unsigned int a, b;
for (a = 1; a<20; a++)
for (b = 1; b<20; b++)
;
}
/****************************延時(shí)******************/
void ad(void)
{
if (adc3==2)
adc1=ADC;
if (adc3==4)
adc2=ADC;
if (adc1==adc2)
adc=adc1;
adc3++;
if (adc3>4)
adc3=0;
ADCSRA|=BIT(ADSC);
}
/************************AD采樣中斷服務(wù)子程序**************************/
void main(void)//主程序
{
char i=0;
adcc();
while(1)
{
if (i==20)
m=(long)adc*5000/1023,i=0;
PORTC=f[m%10];
PORTD=0xfe;
Delay();
PORTC=f[m/10%10];
PORTD=0xfd;
Delay() ;
PORTC=f[m/100%10];
PORTD=0xfb;
Delay() ;
PORTC=f[m/1000%10]|0x01;
PORTD=0xf7;
Delay() ;
i++;
}
}