Комнатный термометр на DS18b20

Плата создана на базе микроконтроллера ATMega16A. Программа написана в Codevision. Алгоритм программы следующий: - по прерыванию от таймера программа проводит отображение информации на индикатор. Индикация - динамическая. - также по прерыванию изменяется переменная, отвечающая за скорость опроса датчика. - в основном цикле по достижении переменной нужного значения, производится считывание информации. В общем всё. Плата представлена на рисунках.

[spoiler=Код программы в Codevision]

#include <mega16.h>
#include <delay.h>
// 1 Wire Bus functions
#asm
.equ __w1_port=0x15 ;PORTC
.equ __w1_bit=7
#endasm
#include <1wire.h>
// DS1820 Temperature Sensor functions
#include <ds18b20.h>
//char buffer[10]; //буфер для хранения данных для вывода
int temp; //ѕеременная для хранения значения температуры
char t;
char b;
//char k;
char t0=0;
char t1=0;
char t2=0;
// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
t++;
if(t==8){t=0; b++;}

if(t==1){
PORTA=0b00000001;
switch (t0)
{
case 0:{PORTB=~0b01101111; break;}
case 1:{PORTB=~0b00001100; break;}
case 2:{PORTB=~0b01011011; break;}
case 3:{PORTB=~0b01011101; break;}
case 4:{PORTB=~0b00111100; break;}
case 5:{PORTB=~0b01110101; break;}
case 6:{PORTB=~0b01110111; break;}
case 7:{PORTB=~0b01001100; break;}
case 8:{PORTB=~0b01111111; break;}
case 9:{PORTB=~0b01111101; break;}
}
PORTA=0b00010001;
}
if(t==3){
PORTA=0b00000001;
switch (t1)
{
case 0:{PORTB=~0b01101111; break;}
case 1:{PORTB=~0b00001100; break;}
case 2:{PORTB=~0b01011011; break;}
case 3:{PORTB=~0b01011101; break;}
case 4:{PORTB=~0b00111100; break;}
case 5:{PORTB=~0b01110101; break;}
case 6:{PORTB=~0b01110111; break;}
case 7:{PORTB=~0b01001100; break;}
case 8:{PORTB=~0b01111111; break;}
case 9:{PORTB=~0b01111101; break;}
}
PORTA=0b00000101;
}
if(t==5){
PORTA=0b00000001;
switch (t2)
{
case 0:{PORTB=~0b01101111; break;}
case 1:{PORTB=~0b00001100; break;}
case 2:{PORTB=~0b01011011; break;}
case 3:{PORTB=~0b01011101; break;}
case 4:{PORTB=~0b00111100; break;}
case 5:{PORTB=~0b01110101; break;}
case 6:{PORTB=~0b01110111; break;}
case 7:{PORTB=~0b01001100; break;}
case 8:{PORTB=~0b01111111; break;}
case 9:{PORTB=~0b01111101; break;}
}
PORTA=0b00000011;
}
if(t==7){
PORTA= 0b00000001;
PORTB=~0b01111000;
PORTA=0b00100001;
}
}
// Declare your global variables here
void main(void)
{
// Declare your local variables here
// Input/Output Ports initialization
// Port A initialization
// Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out
// State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0
PORTA=0x00;
DDRA=0xFF;
// Port B initialization
// Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out
// State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0
PORTB=0x00;
DDRB=0xFF;
// Port C initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTC=0x00;
DDRC=0x00;
// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTD=0x00;
DDRD=0x00;
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 1000,000 kHz
// Mode: Normal top=FFh
// OC0 output: Disconnected
TCCR0=0x02;
TCNT0=0x00;
OCR0=0x00;
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer 1 Stopped
// Mode: Normal top=FFFFh
// 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: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer 2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// INT2: Off
MCUCR=0x00;
MCUCSR=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x01;
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;
// 1 Wire Bus initialization
w1_init();
// Global enable interrupts
#asm("sei")
while (1)
{
if(b==50)
{
temp=ds18b20_temperature(0)*10; //читаем температуру
t2=temp/100;
t1=(temp%100)/10;
t0=temp%10;
}
};
}

[/spoiler]

Температура измеряется от 0 до 99 градусов, что вполне достаточно для использования в качестве домашнего термометра. Питание схемы осуществляется от USB. Поскольку у меня имеется в наличие data-кабель (преобразователь usb-uart), то предусмотрел и общение по uart-у с компьютером, что использую для автозагрузки программ. Программа подходит только для моей разводки платы, но принцип действия по программе понять можно.
Ссылки на документацию: DS18B20 и FYQ-2541BG11.
15:23
561

Комментарии

Нет комментариев. Ваш будет первым!
Список контента
Ролик антикоррупционной направленности
Мы проводим конкурс. Подробности.
Муниципальный этап республиканского конкурса"Сердце отдаю детям"
Члены детского отряда милосердия (ДОМ) совместно со школьниками МБОУ ООШ №12 приступили к реализации проекта "Добрый волшебник", разработанного воспитанниками объединений "Проектная деятельность" и "Начальное техническое моделирование" МБОУ ДО ЦДТТ.