Как разработать программный код для использования дисплея LM016L и датчика SHT10 с микроконтроллером Atmega8?

Как написать код для Atmega8 с использованием дисплея LM016L и датчика SHT10, который будет выводить значения с датчика на дисплей в десятичной системе счисления в программе Proteus? Пожалуйста, помогите!
  • 23 октября 2023 г. 15:09
Ответы на вопрос 3
Для начала, вам понадобится настроить подключение дисплея LM016L и датчика SHT10 к микроконтроллеру Atmega8. 

Подключение дисплея LM016L:
- Подключите контакты RS, RW и E дисплея к порту B микроконтроллера.
- Подключите контакты D0-D7 дисплея к порту C микроконтроллера.

Подключение датчика SHT10:
- Подключите контакт DATA датчика к порту D микроконтроллера.
- Подключите контакты SCK и VCC датчика к питанию 5V.
- Подключите контакты GND и VSS датчика к земле.

Вот код, который вы можете использовать для вывода значений датчика на дисплей:

#include <avr/io.h>
#include <util/delay.h>
#include "lcd.h" // заголовочный файл для работы с дисплеем

#define DATA_PORT PORTD // порт для подключения датчика
#define DATA_DDR DDRD
#define DATA_PIN PIND
#define DATA_BIT PD0

void sht10_init() {
    // настройка порта для подключения датчика
    DATA_DDR |= (1 << DATA_BIT);
    DATA_PORT |= (1 << DATA_BIT);
}

void sht10_send_command(uint8_t command) {
    // отправляем команду датчику
    DATA_DDR |= (1 << DATA_BIT);
    DATA_PORT &= ~(1 << DATA_BIT);
    _delay_us(2);
    DATA_DDR &= ~(1 << DATA_BIT);
    _delay_us(20);
    DATA_DDR |= (1 << DATA_BIT);
    _delay_us(2);
    PORTD = command;
    _delay_us(20);
    PORTD &= ~(1 << DATA_BIT);
}

uint16_t sht10_read_data() {
    uint8_t msb, lsb, crc;

    DATA_DDR &= ~(1 << DATA_BIT);
    _delay_us(2);
    DATA_DDR |= (1 << DATA_BIT);
    _delay_us(2);
    
    msb = sht10_read_byte();
    sht10_send_ack();
    
    lsb = sht10_read_byte();
    sht10_send_ack();
    
    crc = sht10_read_byte();
    sht10_send_nack();
    
    return (msb << 8) | lsb;
}

void sht10_send_ack() {
    DATA_DDR |= (1 << DATA_BIT);
    _delay_us(2);
    DATA_DDR &= ~(1 << DATA_BIT);
    _delay_us(20);
}

void sht10_send_nack() {
    DATA_DDR |= (1 << DATA_BIT);
    _delay_us(2);
    DATA_DDR &= ~(1 << DATA_BIT);
    _delay_us(20);
    DATA_DDR |= (1 << DATA_BIT);
}

uint8_t sht10_read_byte() {
    uint8_t byte = 0;

    DATA_DDR &= ~(1 << DATA_BIT);
    _delay_us(2);
    DATA_DDR |= (1 << DATA_BIT);
    _delay_us(2);
    
    for (int i = 7; i >= 0; i--) {
        if ((DATA_PIN & (1 << DATA_BIT))) {
            byte |= (1 << i);
        }
        DATA_DDR &= ~(1 << DATA_BIT);
        _delay_us(2);
        DATA_DDR |= (1 << DATA_BIT);
        _delay_us(2);
    }
    
    return byte;
}

int main(void) {
    lcd_init(LCD_DISP_ON); // инициализация дисплея

    sht10_init(); // инициализация датчика

    while (1) {
        sht10_send_command(0x03); // отправка команды измерения температуры
        _delay_ms(10);
        uint16_t temperature = sht10_read_data(); // чтение данных температуры
        
        sht10_send_command(0x05); // отправка команды измерения влажности
        _delay_ms(10);
        uint16_t humidity = sht10_read_data(); // чтение данных влажности
        
        lcd_clrscr(); // очистка экрана дис
Atmega8+LM016L 
 Atmega8+SHT10
Похожие вопросы