STC89C52单片机最小系统板设计与温湿度传感器测温实验仿真

本教程将引导你使用STC89C52单片机搭建最小系统板,并通过Proteus软件仿真温湿度传感器测温实验,将温度值显示在OLED显示屏上,保留小数点后三位。

操作步骤

  1. 确定STC89C52芯片外部电路

    包括晶振、复位电路、电源滤波电路等,具体电路图如下:

    STC89C52最小系统电路图

  2. 连接温湿度传感器与STC89C52芯片

    在Proteus中仿真电路图如下:

    温湿度传感器测温电路图

  3. 添加OLED显示屏并连接STC89C52芯片

    具体电路图如下:

    OLED显示屏电路图

  4. 编写程序

    包括温湿度传感器测温以及OLED显示温度的代码,具体代码如下:

    #include <STC89C5xRC.H>
    #include <intrins.h>
    #include <stdio.h>
    
    #define OLED_SCL P2_1
    #define OLED_SDA P2_0
    #define OLED_RST P2_2
    #define OLED_DC P2_3
    
    sbit DHT11 = P3^2;
    
    void delay(unsigned int i)
    {
        while (i--);
    }
    
    void init_oled()
    {
        OLED_SCL = 0;
        OLED_SDA = 1;
        OLED_RST = 0;
        delay(100);
        OLED_RST = 1;
    
        write_cmd(0xAE); // 关闭OLED显示
        write_cmd(0xD5); // 设置时钟分频因子/振荡器频率
        write_cmd(0x80); // 设置分频因子、震荡频率
        write_cmd(0xA8); // 设置多路复用比
        write_cmd(0x3F); // 设置扫描模式:从上到下,从左到右
        write_cmd(0xD3); // 设置显示偏移
        write_cmd(0x00); // 不偏移
        write_cmd(0x40); // 设置起始行
        write_cmd(0x8D); // 设置电荷泵
        write_cmd(0x14); // 使能电荷泵
        write_cmd(0x20); // 设置内存地址模式
        write_cmd(0x02); // 水平寻址模式
        write_cmd(0xA1); // 设置列扫描映射:从左到右
        write_cmd(0xC8); // 设置行扫描映射:从上到下
        write_cmd(0xDA); // 设置COM硬件配置
        write_cmd(0x12); // 修改COM硬件配置
        write_cmd(0x81); // 设置对比度
        write_cmd(0xCF); // 对比度设置
        write_cmd(0xD9); // 设置预充电周期
        write_cmd(0xF1); // 预充电周期设置
        write_cmd(0xDB); // 设置VCOMH
        write_cmd(0x40); // VCOMH设置
        write_cmd(0xA4); // 全局显示开启:显示RAM内容
        write_cmd(0xA6); // 设置显示方式:正常显示
        write_cmd(0xAF); // 打开OLED显示
    
        clear_oled();
    }
    
    void write_cmd(unsigned char cmd)
    {
        unsigned char i;
        OLED_DC = 0;
        for (i = 0; i < 8; i++)
        {
            OLED_SCL = 0;
            OLED_SDA = (cmd & 0x80) ? 1 : 0;
            OLED_SCL = 1;
            cmd <<= 1;
        }
    }
    
    void write_data(unsigned char data)
    {
        unsigned char i;
        OLED_DC = 1;
        for (i = 0; i < 8; i++)
        {
            OLED_SCL = 0;
            OLED_SDA = (data & 0x80) ? 1 : 0;
            OLED_SCL = 1;
            data <<= 1;
        }
    }
    
    void clear_oled()
    {
        unsigned char i, j;
        for (i = 0; i < 8; i++)
        {
            write_cmd(0xB0 + i); // 设置页地址
            write_cmd(0x00); // 设置低列地址
            write_cmd(0x10); // 设置高列地址
            for (j = 0; j < 128; j++)
            {
                write_data(0x00);
            }
        }
    }
    
    void show_string(unsigned char x, unsigned char y, unsigned char *str)
    {
        unsigned char i = 0;
        while (str[i] != '\0')
        {
            show_char(x, y, str[i]);
            x += 6;
            i++;
        }
    }
    
    void show_char(unsigned char x, unsigned char y, unsigned char c)
    {
        unsigned char i, j;
        c -= 32;
        if (x > 122)
        {
            x = 0;
            y++;
        }
        for (i = 0; i < 6; i++)
        {
            write_cmd(0xB0 + y);
            write_cmd(x + i);
            write_data(font_6x8[c][i]);
        }
    }
    
    void read_dht11(unsigned char *temp)
    {
        unsigned char i, j, data;
        float f;
        for (j = 0; j < 8; j++)
        {
            while (!DHT11); // 等待DHT11拉低
            delay(30);
            data = 0;
            for (i = 0; i < 8; i++)
            {
                while (DHT11); // 等待DHT11拉高
                delay(1);
                if (DHT11)
                {
                    data |= (1 << (7 - i));
                }
                while (!DHT11); // 等待DHT11拉低
            }
            temp[j] = data;
        }
        f = temp[2] * 256 + temp[3];
        f /= 10;
        sprintf(temp, '%.3f', f);
    }
    
    void main()
    {
        unsigned char temp[5];
        init_oled();
        while (1)
        {
            read_dht11(temp);
            show_string(0, 0, 'Temperature:');
            show_string(0, 1, temp);
            show_string(7 * 6, 1, 'C');
            delay(1000);
            clear_oled();
        }
    }
    
  5. 下载程序并仿真运行

    将程序下载到STC89C52芯片中,然后仿真运行即可看到OLED显示屏上显示出温度值,并保留小数点后三位。

辅助电路及元器件

  • 电阻规格型号可根据自身设计需要自由选择。

注意

  • 请确保已安装Proteus软件并配置好STC89C52芯片和相关元器件的库文件。
  • font_6x8数组是字符的点阵数据,需要自行定义或使用现有的字库。

希望本教程能够帮助你成功搭建STC89C52最小系统板并完成温湿度传感器测温实验!


原文地址: https://www.cveoy.top/t/topic/ojza 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录