ATmega8/16的AD转换实验
扫描二维码
随时随地手机看文章
/********************************************************************
程序名称:片内模数转换演示实验
时钟频率:内部RC 1M
引脚 :接键盘与显示部分
**PC0.......PC7 键盘与显示a.....g**
**PD0.......PD7 键盘与显示1.....8**
**PA0 模拟电压**
**Aref 电源正极**
********************************************************************/
#include
#include
#include
#include
#pragma interrupt_handler ad:15
unsigned long m=0;
unsigned int adc,adc1=0,adc2=0,adc3=0,adc4=0,l;
const unsigned char f[]=
{
0x7e,0x0c,0xb6,0x9e,0xcc,0xda,0xfa,0x0e,0xfe,0xde
};//码段转换
void adcc(void)
{
PORTA=0x00;
DDRA=0xf0;
PORTD=0x00;
DDRD=0xff;
PORTC=0x00;
DDRC=0xff;
ADMUX=0x40; //ADC状态寄存器定义
ADCSRA=0x8e;//ADC状态寄存器定义
SREG=0x80;//开放全局中断
ADCSRA|=BIT(ADSC);//启动一次转换
}
/*******************************************状态寄存器设置******************/
void Delay(void)
{
unsigned int a, b;
for (a = 1; a<20; a++)
for (b = 1; b<20; b++)
;
}
/****************************延时******************/
void ad(void)
{
if (adc3==2)
adc1=ADC;
if (adc3==4)
adc2=ADC;
if (adc1==adc2)
adc=adc1;
adc3++;
if (adc3>4)
adc3=0;
ADCSRA|=BIT(ADSC);
}
/************************AD采样中断服务子程序**************************/
void main(void)//主程序
{
char i=0;
adcc();
while(1)
{
if (i==20)
m=(long)adc*5000/1023,i=0;
PORTC=f[m%10];
PORTD=0xfe;
Delay();
PORTC=f[m/10%10];
PORTD=0xfd;
Delay() ;
PORTC=f[m/100%10];
PORTD=0xfb;
Delay() ;
PORTC=f[m/1000%10]|0x01;
PORTD=0xf7;
Delay() ;
i++;
}
}