📄 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 + -