برای اینکه تمام سوالتان احتمالی آینده هم جواب داده شوند کد های مربوطه را در ذیل قرار میدهم. سخت افزار هم خیلی ساده مانند شکل فوق است.
#include <mega16.h>
#include <stdlib.h>
#include <delay.h>
#include <alcd.h>
//#define HOT_VALUE 30
//#define COLD_VALUE 20
//#define HotAlarm PORTC.2
//#define ColdAlarm PORTC.0
// for Display degree sign save in Program code
// because Character map in LCD Different from PC
flash char degree_signC[3]={0xDF,0x43,0},degree_signF[3]={0xDF,0x46,0};
unsigned char display_flag=0;
char *DigitText; //Variable For save numbers to ASCII
int TempF ;
int temperature;
// Timer1 overflow interrupt service routine
interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{
TCNT1=0xc240;
display_flag=1;
}
#define ADC_VREF_TYPE 0xC0
// ADC interrupt service routine
interrupt [ADC_INT] void adc_isr(void)
{
temperature=(int)(ADCW>>2);
}
void read_adc(void)
{
delay_us(20);
#asm
in r30,mcucr
cbr r30,__sm_mask
sbr r30,__se_bit | __sm_adc_noise_red
out mcucr,r30
sleep
cbr r30,__se_bit
out mcucr,r30
#endasm
}
void main(void)
{
PORTC=0x00;
DDRC=0x07;
TCCR1A=0x00;
TCCR1B=0x03;
TCNT1H=0xc2;
TCNT1L=0x40;
TIMSK=0x04;
UCSRB=0x00;
ACSR=0x80;
// ADC initialization
ADMUX=ADC_VREF_TYPE & 0xff;
ADCSRA=0x8A;
lcd_init(16);
delay_ms(50);
lcd_putsf(" Wait");
// Global enable interrupts
#asm("sei")
ADCSRA|=0x40;
while (1)
{
if(display_flag){
lcd_clear();
// ***** *****
lcd_gotoxy(0,1);
lcd_putsf("Temp: ");
itoa(temperature,DigitText);
lcd_puts(DigitText);
lcd_putsf(degree_signC);
// *******************
/*if (temperature < COLD_VALUE)
ColdAlarm=1;
else if (temperature > HOT_VALUE)
HotAlarm=1;
else {
HotAlarm=0;
ColdAlarm=0;
} */
lcd_gotoxy(6,0);
TempF=(int)((temperature*9/5)+32);
itoa(TempF,DigitText);
lcd_puts(DigitText);
lcd_putsf(degree_signF);
display_flag=0;
read_adc();
}
};
}