Перейти к содержанию

Nelson001

Members
  • Постов

    0
  • Зарегистрирован

  • Посещение

Информация

  • Город
    Москва

Электроника

  • Стаж в электронике
    Менее года
  • Сфера радиоэлектроники
    микроконтроллеры

Достижения Nelson001

Новичок

Новичок (1/14)

  • Неделя на форуме
  • Месяц на форуме
  • Год на форуме

Последние значки

0

Репутация

  1. Привет всем! Помогите пожалуйста переделать код, мне необходимо, чтобы МК (Atmega8) каждые 5 сек выводил значение (температуры и влажности) датчика (DHT11) на экран. Код в таком виде выводит значение датчика только при запуске на экран и все, при изменении показателей датчика ничего не происходит (код и схема в Proteus прилагается) Заранее благодарю за помощь компилятор используется AtmelStudio 6.2 файл dht11.c #define F_CPU 1000000UL #include <stdio.h> #include <string.h> #include <avr/io.h> #include <util/delay.h> #include "dht11.h" #define DHT11_ERROR 255 /* * get data from dht11-получить данные из DHT11 */ uint8_t dht11_getdata(uint8_t select) { uint8_t bits[5]; uint8_t i,j = 0; memset(bits, 0, sizeof(bits)); //reset port DHT11_DDR |= (1<<DHT11_INPUTPIN); //output DHT11_PORT |= (1<<DHT11_INPUTPIN); //high _delay_ms(100); //send request DHT11_PORT &= ~(1<<DHT11_INPUTPIN); //low - низкая _delay_ms(18); DHT11_PORT |= (1<<DHT11_INPUTPIN); //high - высокая _delay_us(1); DHT11_DDR &= ~(1<<DHT11_INPUTPIN); //input - вход _delay_us(39); //check start condition 1 - начала проверки состояния 1 if((DHT11_PIN & (1<<DHT11_INPUTPIN))) { return DHT11_ERROR; } _delay_us(80); //check start condition 2 - начала проверки состояния 2 if(!(DHT11_PIN & (1<<DHT11_INPUTPIN))) { return DHT11_ERROR; } _delay_us(80); //read the data for (j=0; j<5; j++) { //read 5 byte uint8_t result=0; for(i=0; i<8; i++) {//read every bit - читать каждый бит while(!(DHT11_PIN & (1<<DHT11_INPUTPIN))); //wait for an high input _ ждать высокой входной _delay_us(30); if(DHT11_PIN & (1<<DHT11_INPUTPIN)) //if input is high after 30 us, get result- если вход имеет высокий уровень после 30-ти нас, получить результат result |= (1<<(7-i)); while(DHT11_PIN & (1<<DHT11_INPUTPIN)); //wait until input get low } bits[j] = result; } //reset port DHT11_DDR |= (1<<DHT11_INPUTPIN); //output DHT11_PORT |= (1<<DHT11_INPUTPIN); //low _delay_ms(100); //check checksum - проверять контрольную сумму if (bits[0] + bits[1] + bits[2] + bits[3] == bits[4]) { if (select == 0) { //return temperature - температура возвращаемого теплоносителя return(bits[2]); } else if(select == 1){ //return humidity - возвращение влажности return(bits[0]); } } return DHT11_ERROR; } /* * get temperature (0..50C) - получить температуру */ int8_t dht11_gettemperature() { uint8_t ret = dht11_getdata(0); if(ret == DHT11_ERROR) return -1; else return ret; } /* * get humidity (20..90%) - получить влажность */ int8_t dht11_gethumidity() { uint8_t ret = dht11_getdata(1); if(ret == DHT11_ERROR) return -1; else return ret; } файл dht11.h #ifndef DHT11_H_ #define DHT11_H_ #include #include //setup parameters #define DHT11_DDR DDRC #define DHT11_PORT PORTC #define DHT11_PIN PINC #define DHT11_INPUTPIN PC5 extern int8_t dht11_gettemperature(); extern int8_t dht11_gethumidity(); #endif файл mayn.c #include #include #include "lcd_lib.h" #include "dht11.h" #include char buffer[8]; int main( void ) { // Инициализация LCD LCDinit(); // Выключаем курсоор LCDcursorOFF(); // Очищаем дисплей LCDclr(); int8_t temperature = 0; int8_t humidity = 0; while(1) { humidity = dht11_gethumidity(); temperature = dht11_gettemperature(); LCDGotoXY(0,0); sprintf(buffer, "T=%02d", temperature); LCDstring(buffer,4); LCDGotoXY(0,1); sprintf(buffer, "H=%02d", humidity); LCDstring(buffer,4); } }
×
×
  • Создать...