Сегодня начал разбиратся с датчиком DS18b20. Заданием на сегодня было вывести показания температуры на экран ПК и на LCD. Для решения этой задачи выбрал Codevision AVR, так как для него уже есть готовые библиотеки.
Схема:
Программа (для 8 МГц):
#include <mega8.h>
#include <delay.h> //библиотека задержки
#asm //сообщаем куда подключен датчик
.equ __w1_port=0x15; PORTC
.equ __w1_bit=3
#endasm
#asm //сообщаем куда подключён экран
.equ __lcd_port=0x18
#endasm
#include <lcd.h> //библиотека для LCD
#include <1wire.h> //библиотека работы с 1Wire
#include <ds18b20.h> //библиотека для работы с датчиком ds18b20
#include <stdio.h> //библиотека стандартных функций ввода-вывода
char lcd_buffer[33]; //массив с данными для экрана
void main(void)
{
unsigned char devices; //переменная в которой количество присоединённых датчиков
int temp; //переменная для хранения температуры
UCSRA=0x00; // инициализация UART
UCSRB=0x18;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x33;
lcd_init(16); //инициализация LCD, и говорим что он на 16 символов
devices=w1_init(); //ищем датчики
while(devices>0) //бесконечный цикл, если датчик подключен
{
temp=ds18b20_temperature(0); //читаем температуру
if (temp>1000){ //если датчик выдаёт больше 1000
temp=4096-temp; //отнимаем от данных 4096
temp=-temp; //и ставим знак "минус"
}
printf("t=%i.%u\n\r",temp,temp%1); //выводим в порт
sprintf(lcd_buffer,"t=%i.%u\xdfC",temp,temp%1); // записуем в массив для экрана температуру
lcd_clear(); //чистим дисплей перед выводом
lcd_puts(lcd_buffer); //выводим масив на LCD
delay_ms(500); //ждём 500мс
};
}
Схема:
Программа (для 8 МГц):
#include <mega8.h>
#include <delay.h> //библиотека задержки
#asm //сообщаем куда подключен датчик
.equ __w1_port=0x15; PORTC
.equ __w1_bit=3
#endasm
#asm //сообщаем куда подключён экран
.equ __lcd_port=0x18
#endasm
#include <lcd.h> //библиотека для LCD
#include <1wire.h> //библиотека работы с 1Wire
#include <ds18b20.h> //библиотека для работы с датчиком ds18b20
#include <stdio.h> //библиотека стандартных функций ввода-вывода
char lcd_buffer[33]; //массив с данными для экрана
void main(void)
{
unsigned char devices; //переменная в которой количество присоединённых датчиков
int temp; //переменная для хранения температуры
UCSRA=0x00; // инициализация UART
UCSRB=0x18;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x33;
lcd_init(16); //инициализация LCD, и говорим что он на 16 символов
devices=w1_init(); //ищем датчики
while(devices>0) //бесконечный цикл, если датчик подключен
{
temp=ds18b20_temperature(0); //читаем температуру
if (temp>1000){ //если датчик выдаёт больше 1000
temp=4096-temp; //отнимаем от данных 4096
temp=-temp; //и ставим знак "минус"
}
printf("t=%i.%u\n\r",temp,temp%1); //выводим в порт
sprintf(lcd_buffer,"t=%i.%u\xdfC",temp,temp%1); // записуем в массив для экрана температуру
lcd_clear(); //чистим дисплей перед выводом
lcd_puts(lcd_buffer); //выводим масив на LCD
delay_ms(500); //ждём 500мс
};
}
Комментариев нет:
Отправить комментарий