|
我使用的是MEGA16内部AD转换,是不是中断位置放的不对啊,还是分频设的不精确,我用的是内部RC振荡,1MHZ.
#include<iom16v.h>
#include<macros.h>
#define osccal 0xB9 //内部RC校正常数
#define Vref 5000 //参考电压值
unsigned int adc_rel; //AD转换结果
//延时程序
void delayUs(unsigned int time)
{
do
{
time--;
}
while(time>1);
}
void delayMs(unsigned int time)
{
while(time!=0)
{
delayUs(500);
time--;
}
}
//显示程序
void Disp(unsigned char data_disp)
{
unsigned int i, data,temp;
unsigned char ledtable[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
DDRD=0xff;
PORTD=0xff;
DDRB|=0xf0;
PORTB|=0xff;
data=data_disp;
for(i=0;i<4;i++)
{
temp=data%10;
data=data/10;
PORTD=ledtable[temp];
if(i==2)
{PORTD=0x7f;} //设置小数点
PORTB=(1<<(4+i));
delayMs(1);
PORTB|=0xf0;
}
}
void adc_init(void) //ADC初始化
{
DDRA=0x00; //设置为高阻态输入
PORTA=0x00;
ADCSRA=0x00;
ADMUX=0x40|(1<<ADLAR); // AVCC 片内基准电压 /select adc input 0/
ACSR=(1<<ACD); //关闭模拟比较器
ADCSRA=(1<<ADEN)|(1<<ADSC)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS0);
}
#pragma interrupt_handler adc_isr:15 //ADC完成中断
void adc_isr(void)
{
adc_rel=ADC&0x3ff;
}
void ADCtoBCD(unsigned int temp) //ADC结果转换成电压值
{
temp=(unsigned int)(((unsigned long)((unsigned long)temp*Vref))/0x3ff);
}
void main(void)
{
unsigned char i;
OSCCAL=osccal; //校正内部RC振荡频率
adc_init(); //ADC初始化
SEI();
for(i=0;i<200;i++) //复位后显示一段时间8888
{
Disp(8888);
}
PORTD=0xff;
delayMs(1000);
while(1)
{
adc_rel=ADC;
ADCtoBCD(adc_rel);
Disp(adc_rel);
}
} |
阿莫论坛20周年了!感谢大家的支持与爱护!!
知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)
|