/***************************** 2010 05 30 作者: 功能:ADC转换,然后发送到串口去。波特率9600; ADC采样频率为:400HZ; 精度为10位; ******************************/ #include <iom16v.h> #include <macros.h>
#define F_CPU 4000000 #define BAUD 9600
unsigned char adc_data_l=0,adc_data_h=0,time_2ms_ok=0,AdcConCom = 0;
void USART_INIT() { UBRRH =(F_CPU/BAUD/16 -1)/256; UBRRL =(F_CPU/BAUD/16 -1)%256; UCSRB =(1<<RXEN)|(1<<TXEN); UCSRC =(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0); }
void port_init(void) { PORTA = 0x00; DDRA = 0x00; PORTB = 0x00; DDRB = 0x00; PORTC = 0x00; //m103 output only DDRC = 0x00; PORTD = 0x00; DDRD = 0x00; }
//call this routine to initialize all peripherals void init_devices(void) { CLI(); //disable all interrupts port_init();
MCUCR = 0x00; GICR = 0x00; TIMSK = 0x00; //timer interrupt sources SEI(); //re-enable interrupts } void adc_init()//ADC初始化; { DDRA =0x00; PORTA =0x00; //ADCSRA =0XAD; ADCSRA=0x00; ADMUX = 0x47; //参加电源为AVCC,ADC7单端输入; ACSR =(1 <<ACD); ADCSRA = (1<<ADEN)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS0);//32分频; }
void T_init()//T/C0初始化; { TCCR0 =0x0B;//内部时钟,64分频,CTC模式; TCNT0 =0x00;// OCR0 =0x7C;//OCR0 = 0X7C,(124+1)/62.5KZH=2MS TIMSK = 0x02;//使能T/CO比较中断; }
#pragma interrupt_handler timer0_ovf:20 void timer0_ovf() { time_2ms_ok=1;// } #pragma interrupt_handler adc_isr:15 void adc_isr(void) { }
void USART_TX(unsigned char data) { while(!(UCSRA & (1<<UDRE))); UDR =data; }
void main() { init_devices(); T_init(); adc_init(); USART_INIT(); while(1) { if(time_2ms_ok) { ADCSRA |=(1<<ADSC);//启动一次AD转换; while(!(ADCSRA&(1<<ADIF)));//等待转换完成 //while(!(ADCSRA&(1<<ADIF)));//等待转换完成 //ADCSRA|=1<<ADIF;//必须手动清除标志位 ADCSRA|=1<<ADIF;//必须手动清除标志位 adc_data_l=ADCL; adc_data_h =ADCH; PORTC = adc_data_l; USART_TX(adc_data_l); USART_TX(adc_data_h); time_2ms_ok =0;
}
}
}
接上面的;
|