⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 adc(中断查询方式).txt

📁 mega16内部自带的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 + -