//Проект термометр на аналаговом датчике KYT 82/220 //МК Мега8 на 1 МГц #include #include #include #define FIRST_ADC_INPUT 0 #define LAST_ADC_INPUT 0 unsigned int adc_data[LAST_ADC_INPUT-FIRST_ADC_INPUT+1]; #define ADC_VREF_TYPE 0x40 int temp; int number=0; int number1=0; int number2=0; int i=0; // Timer 1 output compare A interrupt service routine interrupt [TIM1_COMPA] void timer1_compa_isr(void) { PORTD=0x00; //выключаем все индикаторы switch(i) { case 0: //если =0 значит работаем с 1 индикатором { number=number1; //выводим на общую шину конфигу 1 числа PORTD.6=1; //зажигаем 1 индикатор i++; //переходим к следующему индикатору break; } // все аналогично case 1: { number=number2; PORTD.7=1; i=0; break; } } //зажигаем разряд switch(number) { case 0:{PORTB=0b00111111; break;} case 1:{PORTB=0b00000110; break;} case 2:{PORTB=0b01011011; break;} case 3:{PORTB=0b01001111; break;} case 4:{PORTB=0b01100110; break;} case 5:{PORTB=0b01101101; break;} case 6:{PORTB=0b01111101; break;} case 7:{PORTB=0b00000111; break;} case 8:{PORTB=0b01111111; break;} case 9:{PORTB=0b01101111; break;} } } // ADC interrupt service routine // with auto input scanning interrupt [ADC_INT] void adc_isr(void) { unsigned char input_index=0; // Read the AD conversion result adc_data[input_index]=ADCW; // Select next ADC input if (++input_index > (LAST_ADC_INPUT-FIRST_ADC_INPUT)) input_index=0; ADMUX=(FIRST_ADC_INPUT | (ADC_VREF_TYPE & 0xff))+input_index; // Delay needed for the stabilization of the ADC input voltage delay_us(10); // Start the AD conversion ADCSRA|=0x40; } //Наша главная функция void main(void) { PORTB=0xFF; DDRB=0xFF; PORTD=0xE0; DDRD=0xFF; // Timer/Counter 1 initialization // Clock source: System Clock // Clock value: 1000,000 kHz // Mode: CTC top=OCR1A // OC1A output: Discon. // OC1B output: Discon. // Noise Canceler: Off // Input Capture on Falling Edge // Timer 1 Overflow Interrupt: Off // Input Capture Interrupt: Off // Compare A Match Interrupt: On TCCR1A=0x00; TCCR1B=0x0A; // делитель на 8 TCNT1H=0x00; TCNT1L=0x00; ICR1H=0x00; ICR1L=0x00; OCR1AH=0x04; OCR1AL=0xE2; // Timer(s)/Counter(s) Interrupt(s) initialization TIMSK=0x10; ACSR=0x80; //Отключаем компаратор SFIOR=0x00;// Отключаем компаратор ADCSRA=0x00; ADMUX=FIRST_ADC_INPUT | (ADC_VREF_TYPE & 0xff); //внутренний ИОН, ADC0 ADCSRA=0xCE; //Вкл АЦП,режим одиночного преобразования, делитель на 128 // Global enable interrupts #asm("sei") while (1) { if(adc_data[0]>360) { temp = ((adc_data[0]-361)*10)/19; //расчет положительной температуры } if(adc_data[0]<361) { temp = ((361-adc_data[0])*10)/19; PORTD.5=1; //зажигаем знак "-" } number1 = temp%10; number2 = temp/10; } }