找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 675|回复: 0
打印 上一主题 下一主题
收起左侧

想设计一个1602显示时间,温湿度(DHT11器件),还可以通过串口助手输入0和1实现开关

[复制链接]
跳转到指定楼层
楼主
#include <reg52.h>
#include <stdio.h>

// 定义液晶显示屏引脚连接
sbit RS = P2^5; // 液晶显示屏的RS引脚
sbit RW = P2^6; // 液晶显示屏的RW引脚
sbit E = P2^7;  // 液晶显示屏的E引脚

// 定义液晶显示屏的数据线引脚
sbit D0 = P0^0;
sbit D1 = P0^1;
sbit D2 = P0^2;
sbit D3 = P0^3;
sbit D4 = P0^4;
sbit D5 = P0^5;
sbit D6 = P0^6;
sbit D7 = P0^7;

// 定义温湿度传感器的引脚
sbit DHT11_IO = P3^7;
sbit switch2 = P3^3;
sbit switch10 =P1^3;
sbit switch9=  P1^4;
sbit switch8 = P1^5;
sbit switch7 = P1^6;


// 定义液晶显示屏的命令码
#define CMD_CLEAR 0x01
#define CMD_DISPLAY_ON 0x0C
#define CMD_CURSOR_HOME 0x02
#define CMD_SET_CURSOR 0x80

// 定义温湿度传感器和时钟模块的相关函数和变量
// 请根据具体的传感器和时钟模块进行相应的实现

unsigned char temperature = 0; // 温度值
unsigned char humidity = 0;    // 湿度值


// 延时函数
void delay(unsigned int ms) {
    unsigned int i, j;
    for (i = ms; i > 0; i--)
        for (j = 110; j > 0; j--);
}


void LCD_WriteCmd(unsigned char cmd) {
    RS = 0; // 设置为命令模式
    RW = 0; // 设置为写入模式
    E = 1;
    P0 = (P0 & 0xF0) | (cmd >> 4); // 写入高4位命令
    E = 0;
    delay(1);
    E = 1;
    P0 = (P0 & 0xF0) | (cmd & 0x0F); // 写入低4位命令
    E = 0;
    delay(1);
}

// 初始化液晶显示屏
void LCD_Init() {
    delay(15);     // 延时等待液晶显示屏上电稳定
    LCD_WriteCmd(0x28); // 设置为4位数据总线、2行显示、5×7点阵字符
    LCD_WriteCmd(0x0C); // 显示开,光标关闭
    LCD_WriteCmd(0x06); // 写入字符后地址指针加1,不移动显示
    LCD_WriteCmd(0x01); // 清除显示
}



// 向液晶显示屏写入数据
void LCD_WriteData(unsigned char dat) {
    RS = 1; // 设置为数据模式
    RW = 0; // 设置为写入模式
    E = 1;
    P0 = (P0 & 0xF0) | (dat >> 4); // 写入高4位数据
    E = 0;
    delay(1);
    E = 1;
    P0 = (P0 & 0xF0) | (dat & 0x0F); // 写入低4位数据
    E = 0;
    delay(1);
}

// 设置液晶显示屏的光标位置
void LCD_SetCursor(unsigned char row, unsigned char col) {
    unsigned char addr;
    if (row == 0) {
        addr = 0x80 + col; // 第1行
    } else {
        addr = 0xC0 + col; // 第2行
    }
    LCD_WriteCmd(addr);
}

// 在液晶显示屏上显示字符串
void LCD_DisplayString(unsigned char row, unsigned char col, unsigned char *str) {
    LCD_SetCursor(row, col);
    while (*str != '\0') {
        LCD_WriteData(*str++);
    }
}
void DHT11_Start(void)
{
DHT11_IO =1;
DHT11_IO =0;
delay(20);
DHT11_IO =1;
delay(50);
}
char GetTemperature(void){       
        char i,flag,byteRead =0;
        for(i = 8;i<16;i++)
        {
         while(!DHT11_IO)
         delay(33);
         if(DHT11_IO ==1)
          {
                  flag=1;
                  while(DHT11_IO);
          }
          else
          {
           flag =0;
          }
        }
        byteRead<<=1;
        byteRead|=flag;
        return byteRead;
}
char GetHumidity(void){       
        char i,flag,byteRead =0;
        for(i = 0;i<8;i++)
        {
         while(!DHT11_IO)
         delay(33);
         if(DHT11_IO ==1)
          {
                  flag=1;
                  while(DHT11_IO);
          }
          else
          {
           flag =0;
          }
        }
        byteRead<<=1;
        byteRead|=flag;
        return byteRead;
}


// 获取温湿度值
void GetTemperatureHumidity() {
        delay(500);delay(500);delay(500);
        DHT11_Start();

    // 请根据具体的温湿度传感器进行相应的实现
    // 这里仅作为示例,假设获取温湿度的函数为GetTemperatureHumidity()
    temperature = GetTemperature();
        DHT11_Start();
    humidity = GetHumidity();
}







// 发送温湿度值到串口助手
void SendTemperatureHumidityToSerial() {
    // 将温湿度值转换为字符串
    char tempStr[4];
    char humiStr[4];
    sprintf(tempStr, "%d", temperature);

    sprintf(humiStr, "%d", humidity);

    // 发送温湿度值到串口助手
    UART_SendString("Temperature: ");
    UART_SendString(tempStr);
    UART_SendString("C, Humidity: ");
    UART_SendString(humiStr);
    UART_SendString("%\r\n");
}










// 主函数
void main() {
    // 初始化液晶显示屏
    LCD_Init();

    while (1) {
        // 获取温湿度值
        GetTemperatureHumidity();

        // 在液晶显示屏上显示温湿度
        LCD_DisplayString(0, 0, "Temp: ");
        LCD_WriteData(temperature);
        LCD_DisplayString(0, 8, "C");
        LCD_DisplayString(1, 0, "Humid: ");
        LCD_WriteData(humidity);
        LCD_DisplayString(1, 8, "%");

        // 检查串口接收到的命令
        if (receivedData) {
            switch (receivedData) {
                case '0':
                    // 关闭液晶显示屏
                    LCD_WriteCmd(CMD_DISPLAY_ON);
                    break;
                case '1':
                    // 打开液晶显示屏
                    LCD_WriteCmd(CMD_DISPLAY_ON | 0x04);
                    break;
                default:
                    break;
            }
            receivedData = 0; // 清空接收数据缓存
        }

        // 检查开关状态
        if (switch2) {
            // 发送实时温湿度到串口助手
            SendTemperatureHumidityToSerial();
        }

        if (switch10) {
            // 时间加1
            IncreaseTime();
        }

        if (switch9) {
            // 时间减1
            DecreaseTime();
        }

        if (switch8) {
            // 切换时间位(秒、分、时)
            SwitchTimeUnit();
        }

        if (switch9) {
            // 暂停时间
            PauseTime();
        }

        // 延时一段时间,避免过于频繁地刷新液晶显示屏
        delay(1000);
    }
}

屏幕截图 2023-06-26 144543.png (345.48 KB, 下载次数: 38)

屏幕截图 2023-06-26 144543.png
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表