本帖最后由 qazq123 于 2015-10-13 15:40 编辑
//ADC初始化
void adc_init(void)
{
ADCSRA = 0x00;
ADMUX =0x46;//选择内部AVCC为基准
ACSR =(1<<ACD);//关闭模拟比较器
ADCSRA=(1<<ADEN)|(1<<ADSC)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1) ;//64分频
}
//定时器0初始化,定时625微妙,64分频
void timer0_init(void)
{
TCCR0A = 0x00; //正常端口操作,普通工作模式
TCCR0B = 0x00; //T/C不工作
TCNT0 = 0xB2; //TCNT0=178,即256-625/(1/(8/64))=178
TIMSK0=0x01; //T/C0中断屏蔽寄存器,T/C0溢出中断使能
TCCR0B=0x03; //64分频
}
//ADC完成中断
#pragma interrupt_handler adc_isr:iv_ADC
void adc_isr(void)
{
temp=ADC&0x3ff;
ADMUX =0x46;//选择内部AVCC为基准
ADCSRA|=(1<<ADSC);//启动AD转换
}
#pragma interrupt_handler timer0_ovf:17
void timer0_ovf(void)
{
TCNT0 = 0xB2; //重装计数初值
ADCSRA|=(1<<ADSC);//启动AD转换
flag++; //625微妙,标志位加1
temp=(unsigned int)(((unsigned long)((unsigned long)temp*750*Vref))/0x3ff);
temp_sum += temp;
}
//把计算出来的平均数给显示数组
void shuju(void)
{
unsigned char i;
for(i=0;i<4;i++)
{
led_buff[i]=duan[temp_ave%10];
temp_ave=temp_ave/10;
}
led_buff[1]&=0x7f;
}
//主函数里的循环
while(1)
{
//采集1600个点,进行数据平均数的计算
if(flag==1600)
{
temp_ave=(unsigned int)(temp_sum/1600);
flag = 0;
temp_sum = 0;
}
shuju();
for(j=0;j<20;j++)
{
display();
}
}
主芯片是mega48,求指导,没办法采集,本意的功能是:定时625微妙采集一次,1S采集1600个点,做平均数计算然后给显示数组。 但是不知道是定时器问题还是什么问题.求指导
|