以下程序是通过cvavr生成,然后加入显示和取数部分。
cvavr可以选择分频,参考电源,是否中断,采样方式。
#include <mega16.h>
#include <delay.h>
#define ADC_VREF_TYPE 0x00
flash int table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
int i,ad[4];
long ada;
// Read the AD conversion result 这是cvavr自动生成的采样函数,输入adc口就可以了。
unsigned int read_adc(unsigned char adc_input)
{
ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
// Delay needed for the stabilization of the ADC input voltage
delay_us(10);
// Start the AD conversion
ADCSRA|=0x40;
// Wait for the AD conversion to complete
while ((ADCSRA & 0x10)==0); // 通过读中断标志位,看采样是否结束。
ADCSRA|=0x10; //写1清零
return ADCW; // 这个adcw,在头文件中有定义,是个16位的寄存器,就是高位+低位。这个返回值就是adc寄
存器的值。
}
void show(char j,char k) // 数码管显示程序
{
DDRA|=1<<(3);
DDRA|=1<<(4);
DDRB=0XFF;
PORTA|=1<<(3);
PORTB=table[j];
PORTA&=~(1<<(3));
PORTB=0XFF;
PORTB&=~(1<<(k));
PORTA|=1<<(4);
PORTA&=~1<<(4);
delay_ms(1);
}
void main(void)
{
// ADC initialization
// ADC Clock frequency: 1000.000 kHz
// ADC Voltage Reference: AREF pin
// ADC Auto Trigger Source: Free Running
ADMUX=ADC_VREF_TYPE & 0xff;
ADCSRA=0xA3; //控制寄存器的初始化
SFIOR&=0x1F;
while(1)
{
ada="read"_adc(0);//
for(i=0;i<4;i++) //变成4位 ,这个模块可以记忆一下,以后用。
{
ad[3-i]=ada%10;
ada=ada/10;
}
for(i=0;i<4;i++)
{
show(ad,i);
delay_ms(2);
DDRA|=1<<(3); //这几句其实用不到了
DDRA|=1<<(4);
DDRB=0XFF;
}
}
}
文章评论(0条评论)
登录后参与讨论