пятница, 11 мая 2012 г.

Измерение температуры воздуха

Сегодня начал разбиратся с датчиком 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мс
      };
}

Комментариев нет:

Отправить комментарий