include mega8 asm equ __lcd_port 0x18 PORTB endasm include lcd include

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#include <mega8.h>
#asm
.equ __lcd_port=0x18 ;PORTB
#endasm
#include <lcd.h>
#include <delay.h>
#include <stdio.h>
#include <math.h>
#include <interrupt.h>
#include <sleep.h>
char string1[13],string2[13];
float Temp,RT,RH,RHT,Vout,VT;
int data;
void update(void){
lcd_gotoxy(0,0);
lcd_puts(string1);
lcd_gotoxy(0,1);
lcd_puts(string2);
return;
}
interrupt [TIM1_COMPA] void timer1_compa_isr(void)
{
delay_ms(50); // задержка для точности
ADCSR |= 0x40; // предделитель
data = ADCW; // получение значения
VT = (float) data*0.0048828; // расчет
RT=(5*10000)/VT-10000; // по форулам
Temp=1/(0.00082+0.0002*log(RT)+0.00000008*log(RT)*log(RT)*log(RT))-273; // температуры
sprintf(string2, "T: %1.2f ", Temp); // вывод в строку
ADMUX^= (1 << 0); // смена активного ацп
delay_ms(50);// задержка для точности
ADCSR |= 0x40; // предделитель
data = ADCW; // получение значения
Vout = (float) data*0.0048828; // расчет
RH = -131.29*(0.16*5-Vout)/Vout; // по форулам
RHT = RH /(1.0546-0.00216*Temp); // влажности
sprintf(string1, "RH: %1.2f ", RHT); // вывод в строку
ADMUX^= (1 << 0);// смена активного ацп
update(); //вывести на лед
TCNT1=0; //обнуляем таймер
}
void main(void)
{
DDRD=0xFF;
ACSR=0x80; //настройка ацп
ADCSR=0x85; //настройка ацп
TCCR1A=0x00; //настройка таймера
TCCR1B=0x05; //настройка таймера
TCNT1=0x00; //здесь увеличиваются тики
OCR1A=0x1FFF; //записываем число в регистр сравнения
TIMSK=0x10; //разрешаем прерывание по совпадению
#asm("sei") // разрешаем прерывания
lcd_init(16); //включаем ЖКИ
while(1) // бесконечность - не предел
{
idle(); // спать
#asm("cli") // как проснулись - даем право еще раз поспать
}
}