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