最近看了ATmega16的ADC,写下这个简单的程序,了解下ADC的简单控制。
程序用Proteus仿真的,用的是ICCAVR7 的编译器(头文件有所不同,自己掂量)
程序的内容是:通过PA1外部电压的读入并动态的显示在3位数码管上
AVR之简单的ADC程序_ADC#include<iom16v.h>
AVR之简单的ADC程序_ADC#include<AVRdef.h>
AVR之简单的ADC程序_ADCunsigned char tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//数码管0~9
AVR之简单的ADC程序_ADCvoid display(unsigned char smg);
AVR之简单的ADC程序_ADCunsigned char temp;
AVR之简单的ADC程序_ADCvoid delay_1ms(unsigned int z)
AVR之简单的ADC程序_ADC{
AVR之简单的ADC程序_ADC    unsigned int i,j;
AVR之简单的ADC程序_ADC  for(i=0;i<z;i++)
AVR之简单的ADC程序_ADC    for(j=0;j<150;j++);
AVR之简单的ADC程序_ADC}
AVR之简单的ADC程序_ADCvoid main()
AVR之简单的ADC程序_ADC{
AVR之简单的ADC程序_ADC    DDRC=0xff;
AVR之简单的ADC程序_ADC  PORTC=0;//PC输出数码管段选
AVR之简单的ADC程序_ADC  DDRD=0xff;
AVR之简单的ADC程序_ADC  PORTD=0;//PD5~PD7为数码管位选
AVR之简单的ADC程序_ADC    ADCSRA=0;//关闭ADC
AVR之简单的ADC程序_ADC  ADMUX=(1<<ADLAR)|(1<<REFS0)|(1);//左对齐,参考电压AVCC,通道1
AVR之简单的ADC程序_ADC  ADCSRA=(1<<ADEN)|(1<<ADSC)|(1<<ADIE)|(7);//使能adc和中断,预分频128,启动ADC,不设置连续转化模式(|(1<<ADATE))
AVR之简单的ADC程序_ADC  //SFIOR=0;//连续转换模式
AVR之简单的ADC程序_ADC  SEI();
AVR之简单的ADC程序_ADC  while(1)
AVR之简单的ADC程序_ADC  {
AVR之简单的ADC程序_ADC      display(temp);//动态显示数码管
AVR之简单的ADC程序_ADC  }
AVR之简单的ADC程序_ADC}
AVR之简单的ADC程序_ADC#pragma interrupt_handler adc:iv_ADC
AVR之简单的ADC程序_ADCvoid adc()
AVR之简单的ADC程序_ADC{
AVR之简单的ADC程序_ADC    temp=ADCH;//读取转换的数据
AVR之简单的ADC程序_ADC  ADCSRA|=0X40;//重新启动ADC,设置ADCSRA的ADATE和连续转换模式时不用
AVR之简单的ADC程序_ADC}
AVR之简单的ADC程序_ADCvoid display(unsigned char smg)//3位数码管动态显示
AVR之简单的ADC程序_ADC{
AVR之简单的ADC程序_ADC    unsigned char bai,shi,ge;
AVR之简单的ADC程序_ADC  bai=smg/100;//百位
AVR之简单的ADC程序_ADC  shi=smg%100/10;//十位
AVR之简单的ADC程序_ADC  ge=smg%10;//个位
AVR之简单的ADC程序_ADC  PORTC=tab[bai];
AVR之简单的ADC程序_ADC  PORTD=0x80;
AVR之简单的ADC程序_ADC  PORTD=0;
AVR之简单的ADC程序_ADC  delay_1ms(2);
AVR之简单的ADC程序_ADC  PORTC=tab[shi];
AVR之简单的ADC程序_ADC  PORTD=0x40;
AVR之简单的ADC程序_ADC  PORTD=0;
AVR之简单的ADC程序_ADC  delay_1ms(2);
AVR之简单的ADC程序_ADC  PORTC=tab[ge];
AVR之简单的ADC程序_ADC  PORTD=0x20;
AVR之简单的ADC程序_ADC  PORTD=0;
AVR之简单的ADC程序_ADC  delay_1ms(1);
AVR之简单的ADC程序_ADC}