?? adc(中斷查詢方式).txt
字號:
//ICC-AVR application builder : 2007-7-28 下午 02:23:48
// Target : M16
// Crystal: 4.0000Mhz
/*******************************************
ADC(中斷查詢方式)
*******************************************/
#include <iom16v.h>
#include <macros.h>
#define unchar unsigned char
//#define setbit(regestername,bitnumber) regestername|=(1<<bitnumber)
//#define clearbit(regestername,bitnumber) regestername&=~(1<<bitnumber)
volatile unsigned long ADC_TEMP=0;
volatile unsigned char ADC_COMPLETE=0; //ADC轉換結束標志位
unchar code[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
void delay()//精確延時函數,晶振4M時延時1002us
{
unsigned int i=500;//延時時間=2*(i+1)us
while(--i);
}
void port_init(void)
{
PORTA = 0x00; //模擬信號的輸入通道,不能使能上拉電阻
DDRA = 0x00;
PORTB = 0x00;
DDRB = 0xFF;
PORTC = 0x00; //m103 output only
DDRC = 0x00;
PORTD = 0x00;
DDRD = 0x0F;
}
void adc_init(void)
{
ADCSR = 0x00; //disable adc
ADMUX = 0x40; //select adc input 0,基準電源AVCC
ACSR = 0x80; //關閉比較器
ADCSR = (1<<ADEN)|(1<<ADIE)|0x04; //16分頻
}
//call this routine to initialize all peripherals
void init_devices(void)
{
//stop errant interrupts until set up
CLI(); //disable all interrupts
port_init();
adc_init();
MCUCR = 0x00; //選擇M16工作方式
GICR = 0x00; //外部中斷有關
TIMSK = 0x00; //timer interrupt sources
SEI(); //re-enable interrupts
//all peripherals are now initialized
}
void display(unchar digit,unchar num)
{
switch (digit)
{
case 0:
PORTD=0xFE;
PORTB=code[num];
break;
case 1:
PORTD=0xFD;
PORTB=code[num];
break;
case 2:
PORTD=0xFB;
PORTB=code[num];
break;
case 3:
PORTD=0xF7;
PORTB=code[num];
break;
default:
PORTB=0x00;
break;
}
}
void display_adc(unsigned int i)
{
display(3,i%10);
i/=10;
delay();
display(2,i%10);
i/=10;
delay();
display(1,i%10);
i/=10;
delay();
display(0,i);
delay();
}
#pragma interrupt_handler adc_isr:15
void adc_isr(void)
{
//conversion complete, read value (int) using...
// value=ADCL; //Read 8 low bits first (important)
// value|=(int)ADCH << 8; //read 2 high bits and shift into top byte
ADC_TEMP=ADC;
ADC_TEMP*=5110;//實測參考電壓值
ADC_TEMP/=1024;
ADC_COMPLETE=1;
}
unsigned long read_adc(unchar channel_n)//0=<channel_n<=7
{
SEI();
ADMUX|=channel_n;//選擇通道n
ADCSRA|=(1<<ADSC)|(1<<ADIE);//開中斷并開始AD轉換
while(ADC_COMPLETE==0);
ADCSRA&=~(1<<ADIE);//關閉中斷
ADC_COMPLETE=0;
return ADC_TEMP;
}
void main(void)
{
unsigned long k;
init_devices();
while(1)
{
k=read_adc(1);//讀通道1的模擬信號值
display_adc(k);
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -