久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1503|回復: 7
收起左側(cè)

單片機LCD12864沒有加入DHT11部分的代碼時可以顯示內(nèi)容,加入后就不顯示了

[復制鏈接]
ID:1031984 發(fā)表于 2023-6-9 15:16 | 顯示全部樓層 |閱讀模式
怎么解決啊
#include <reg52.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define LCD_DATA P0 // 數(shù)據(jù)口
sbit LCD_RS = P2^0; // 命令/數(shù)據(jù)選擇位
sbit LCD_RW = P2^1; // 讀/寫選擇位
sbit LCD_EN = P2^2; // 使能信號位
sbit PSB = P2^6;

//定義DHT11傳感器的引腳
sbit DHT11=P2^4;

void _nop_(void);

void delay(unsigned int t) { // 延時函數(shù)
    unsigned int i, j;
    for (i = t; i > 0; i--) {
        for (j = 110; j > 0; j--);
    }
}

void delay_us(int us)// 延時子程序
{
    char j;
    while(us--)
    {
        for(j=0;j<1200;j++);
    }
}

void WriteCommand(unsigned char cmd) { // 寫命令函數(shù)
    LCD_RS = 0; // RS=0,選擇命令
    LCD_RW = 0; // RW=0,寫入數(shù)據(jù)
    LCD_DATA = cmd; // 寫入命令
    LCD_EN = 1; // 使能
    _nop_(); // 等待
    LCD_EN = 0; // 失能
    delay(1); // 延時
}

void WriteData(unsigned char dat) { // 寫數(shù)據(jù)函數(shù)
    LCD_RS = 1; // RS=1,選擇數(shù)據(jù)
    LCD_RW = 0; // RW=0,寫入數(shù)據(jù)
    LCD_DATA = dat; // 寫入數(shù)據(jù)
    LCD_EN = 1; // 使能
    _nop_(); // 等待
    LCD_EN = 0; // 失能
    delay(1); // 延時
}

void InitLCD12864() { // 初始化函數(shù)
    WriteCommand(0x30); // 設(shè)置8位數(shù)據(jù)總線,基本指令集
    WriteCommand(0x0C); // 打開顯示,關(guān)閉光標
    WriteCommand(0x01); // 清屏
    WriteCommand(0x06); // 設(shè)置文字寫入方向,自動加地址
}

void lcd_write_str(unsigned char row, unsigned char col, char *str) { // 寫字符串函數(shù)
    unsigned char addr = 0;
    if (row == 0) { // 第1行
        addr = 0x80 + col;
    } else if (row == 1) { // 第2行
        addr = 0x90 + col;
    } else if (row == 2) { // 第3行
        addr = 0x88 + col;
    } else if (row == 3) { // 第4行
        addr = 0x98 + col;
    }
    WriteCommand(addr); // 設(shè)置DDRAM地址
    while (*str != '\0') { // 寫入字符串
        WriteData(*str++);
    }
}


void DHT11_start() { // 啟動DHT11傳感器函數(shù)
    DHT11 = 0; // 拉低數(shù)據(jù)線
    delay_us(18000); // 延時18ms
    DHT11 = 1; // 拉高數(shù)據(jù)線
    delay_us(40); // 延時40us
    while (!DHT11); // 等待DHT11響應(yīng)
    while (DHT11); // 等待DHT11響應(yīng)結(jié)束
}

void DHT11_read_data(unsigned char *humi, unsigned char *temp) {
    unsigned char i, j, f[5] = {0, 0, 0, 0, 0};
    DHT11_start(); // 啟動DHT11傳感器
    // 發(fā)送起始信號
    DHT11 = 1;
    delay_us(40);
    DHT11 = 0;
    delay_us(20);
    DHT11 = 1;
    // 等待DHT11響應(yīng)
    while (!DHT11);
    while (DHT11);
    while (!DHT11);
    // 讀取數(shù)據(jù)
    for (i = 0; i < 5; i++) {
        for (j = 0; j < 8; j++) {
            while (!DHT11);
            delay_us(30);
            if (DHT11) {
                f[ i] |= (1 << (7 - j));
            }
            while (DHT11);
        }
    }
    // 驗證數(shù)據(jù)
    if ((f[0] + f[1] + f[2] + f[3]) == f[4]) {
        *humi = f[0]; // 濕度
        *temp = f[2]; // 溫度
    } else {
        *humi = 0;
        *temp = 0;
    }
    delay(2000); // 延時2秒等待下一次讀取
}



void main() {
    unsigned char humi, temp; // 定義溫濕度變量
    char temp_str[5], humi_str[5]; // 定義字符串變量,用于存放溫濕度值
    InitLCD12864(); // 初始化LCD12864顯示屏
    while (1) {
        DHT11_read_data(&humi, &temp); // 讀取溫濕度數(shù)據(jù)
        sprintf(temp_str, "%d", temp); // 將溫度值轉(zhuǎn)換為字符串類型
        sprintf(humi_str, "%d", humi); // 將濕度值轉(zhuǎn)換為字符串類型
        lcd_write_str(0, 0, "當前溫度:"); // 在第1行第1列顯示"當前溫度:"
        lcd_write_str(1, 0, "當前濕度:"); // 在第2行第1列顯示"當前濕度:"
        lcd_write_str(0, 7, temp_str); // 在第1行第7列顯示當前溫度
        lcd_write_str(1, 7, humi_str); // 在第2行第7列顯示當前濕度
        delay(1000); // 延時1秒
    }
}
回復

使用道具 舉報

ID:807182 發(fā)表于 2023-6-9 19:12 | 顯示全部樓層
因為你DHT11的延時太長了,LCD屏幕是SPI驅(qū)動的,對時序有一定要求
回復

使用道具 舉報

ID:1031984 發(fā)表于 2023-6-9 20:22 | 顯示全部樓層
暖西夏 發(fā)表于 2023-6-9 19:12
因為你DHT11的延時太長了,LCD屏幕是SPI驅(qū)動的,對時序有一定要求

可是DHT11好像就是要兩秒才能讀取一次
回復

使用道具 舉報

ID:965189 發(fā)表于 2023-6-10 06:52 來自手機 | 顯示全部樓層
while (DHT11); // 等待DHT11響應(yīng)結(jié)束 }到這里還能出來嗎?
回復

使用道具 舉報

ID:855733 發(fā)表于 2023-6-10 09:21 | 顯示全部樓層
這個情況很明顯是在DHT11程序里沒跳出來,猜測是你的幾個while函數(shù)導致一直在死循環(huán)。你可以把while注釋掉再試試
回復

使用道具 舉報

ID:116103 發(fā)表于 2023-6-10 10:38 | 顯示全部樓層
把 lcd_write_str(0, 0, "當前溫度:"); // 在第1行第1列顯示"當前溫度:"放在WHILE(1)之前,在主循環(huán)之前讓12864顯示,之后慢慢調(diào)顯示數(shù)據(jù).
回復

使用道具 舉報

ID:1031984 發(fā)表于 2023-6-10 21:33 | 顯示全部樓層
熱度三分 發(fā)表于 2023-6-10 09:21
這個情況很明顯是在DHT11程序里沒跳出來,猜測是你的幾個while函數(shù)導致一直在死循環(huán)。你可以把while注釋掉 ...

注釋掉也不顯示
回復

使用道具 舉報

ID:141497 發(fā)表于 2023-6-10 22:16 | 顯示全部樓層
用定時器定時3S刷新DHT11,時間到讀取數(shù)據(jù)再更新顯示數(shù)據(jù)就好。
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表
主站蜘蛛池模板: av网站在线免费观看 | 亚洲一二三区不卡 | av手机在线 | www成年人视频 | 一级毛片在线播放 | 欧美成ee人免费视频 | 免费国产视频 | 国产成人99久久亚洲综合精品 | 红桃视频一区二区三区免费 | 自拍偷拍视频网 | xx视频在线观看 | 久久久久久综合 | 久久a久久 | 亚洲传媒在线 | 一级一级毛片免费看 | 成人在线一区二区 | 亚洲 欧美 日韩在线 | 国产精品综合 | 国产精品久久久久久久模特 | 97超碰人人草 | 欧美国产视频一区二区 | 欧美一区二区三区视频 | 99久久免费精品国产男女高不卡 | 日韩免费av | 久久亚洲免费 | 国产成人精品一区二区三区在线观看 | 久久成人一区 | 日韩精品专区在线影院重磅 | 亚洲激情在线视频 | 91精品国产综合久久久亚洲 | 亚洲综合色丁香婷婷六月图片 | 中文字幕99 | 中文字幕av网站 | 欧美精品一区二区免费视频 | 久久久久91 | 在线男人天堂 | 日韩精品免费播放 | 久久网一区二区 | 北条麻妃一区二区三区在线视频 | 91精品久久久久久久 | 亚洲一区二区在线视频 |