STC89C52单片机最小系统板设计与温湿度传感器测温实验仿真
STC89C52单片机最小系统板设计与温湿度传感器测温实验仿真
本教程将引导你使用STC89C52单片机搭建最小系统板,并通过Proteus软件仿真温湿度传感器测温实验,将温度值显示在OLED显示屏上,保留小数点后三位。
操作步骤
-
确定STC89C52芯片外部电路
包括晶振、复位电路、电源滤波电路等,具体电路图如下:

-
连接温湿度传感器与STC89C52芯片
在Proteus中仿真电路图如下:

-
添加OLED显示屏并连接STC89C52芯片
具体电路图如下:

-
编写程序
包括温湿度传感器测温以及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(); } } -
下载程序并仿真运行
将程序下载到STC89C52芯片中,然后仿真运行即可看到OLED显示屏上显示出温度值,并保留小数点后三位。
辅助电路及元器件
- 电阻规格型号可根据自身设计需要自由选择。
注意
- 请确保已安装Proteus软件并配置好STC89C52芯片和相关元器件的库文件。
- font_6x8数组是字符的点阵数据,需要自行定义或使用现有的字库。
希望本教程能够帮助你成功搭建STC89C52最小系统板并完成温湿度传感器测温实验!
原文地址: https://www.cveoy.top/t/topic/ojza 著作权归作者所有。请勿转载和采集!