AVR之簡單的ADC程序

最近看了ATmega16的ADC,寫下這個簡單的程序,瞭解下ADC的簡單控制。
程序用Proteus仿真的,用的是ICCAVR7 的編譯器(頭文件有所不同,自己掂量)
程序的內容是:通過PA1外部電壓的讀入並動態的顯示在3位數碼管上
#include<iom16v.h>
#include<AVRdef.h>
unsigned char tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//數碼管0~9
void display(unsigned char smg);
unsigned char temp;
void delay_1ms(unsigned int z)
{
    unsigned int i,j;
  for(i=0;i<z;i++)
    for(j=0;j<150;j++);
}
void main()
{
    DDRC=0xff;
  PORTC=0;//PC輸出數碼管段選
  DDRD=0xff;
  PORTD=0;//PD5~PD7爲數碼管位選
    ADCSRA=0;//關閉ADC
  ADMUX=(1<<ADLAR)|(1<<REFS0)|(1);//左對齊,參考電壓AVCC,通道1
  ADCSRA=(1<<ADEN)|(1<<ADSC)|(1<<ADIE)|(7);//使能adc和中斷,預分頻128,啓動ADC,不設置連續轉化模式(|(1<<ADATE))
  //SFIOR=0;//連續轉換模式
  SEI();
  while(1)
  {
      display(temp);//動態顯示數碼管
  }
}
#pragma interrupt_handler adc:iv_ADC
void adc()
{
    temp=ADCH;//讀取轉換的數據
  ADCSRA|=0X40;//重新啓動ADC,設置ADCSRA的ADATE和連續轉換模式時不用
}
void display(unsigned char smg)//3位數碼管動態顯示
{
    unsigned char bai,shi,ge;
  bai=smg/100;//百位
  shi=smg%100/10;//十位
  ge=smg%10;//個位
  PORTC=tab[bai];
  PORTD=0x80;
  PORTD=0;
  delay_1ms(2);
  PORTC=tab[shi];
  PORTD=0x40;
  PORTD=0;
  delay_1ms(2);
  PORTC=tab[ge];
  PORTD=0x20;
  PORTD=0;
  delay_1ms(1);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章