本帖最后由 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个点,做平均数计算然后给显示数组。 但是不知道是定时器问题还是什么问题.求指导
|