这里推荐一款由深圳航天科技创新研究院推出的在线电路仿真软件,该软件不仅具备原理图绘制与代码编写功能,还支持在线编译代码、上传自定义代码以及进行仿真模拟,此外还能在线生成并允许下载.bin和.hex文件。
官网地址如下:Document
进入网页后先注册一个账号。 注册完账号后即可开始编写自己的仿真项目,点击 个人项目 栏
在随后的页面点击创建项目
给项目起一个非常Fashion非常Explosive的名字,可以的话加上内容描述,方便日后复习回顾,随后点击右侧的 电路
接下来进入原理图绘制界面,我们可以根据自己需求来挑选MCU,挑选好后直接拖拽到画布即可
在左侧有众多模块可供选择
和Proteus相同的接线方式,将一个小黑块连到另一个小黑块即代表电路链接
绘制原理图
完整版的原理图如下 :
温湿度传感器及OLED屏幕需要加入供电。
DHT11温湿度传感器的 DATA引脚 接芯片的 PA0引脚
OLED屏幕的 SCK(SCL)串行时钟线 接芯片的 PB6 ,SDA串行数据线 接芯片的 PB7
串口助手可有可无,需要的话 TX 接芯片的 PA10, RX 接芯片的 PA9
编写代码
点击右上角的 保存 ,随后点击 编码
接下来就可以快乐的敲码了,在 main.c 中编写运行代码
main.c 内容如下,直接复制过去即可:
#include "stm32f10x_conf.h"
#include "sys.h"
#include "dht11.h"
#include "delay.h"
#include "usart.h"
#include "iic_oled.h"
int main(void)
{
int temperature = 0;
int humidity = 0;
SystemInit(); // 配置系统时钟为72M
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
uart_init(115200);
// 初始化 OLED
IIC_OLED_Init();
IIC_OLED_Clear(); // 清屏
while (DHT11_Init())
{
printf("DHT11 is Error\n");
delay_ms(10);
}
delay_ms(10);
printf("DHT11 is OK\n");
while (1)
{
char tempStr[12];
snprintf(tempStr, sizeof(tempStr), "Temp: %d.%d C", temperature / 10, temperature % 10);
IIC_OLED_ShowString(0, 0, tempStr); // 显示温度
char humStr[12];
snprintf(humStr, sizeof(humStr), "Hum: %d.%d %%", humidity / 10, humidity % 10);
IIC_OLED_ShowString(0, 5, humStr); // 显示湿度
delay_ms(1000); // 每秒更新一次屏幕
while(DHT11_Read_Data(&temperature,&humidity));
temperature = temperature;
humidity = humidity;
printf("temperature is %d.%d\n", temperature/10, temperature%10);
printf("humidity is %d.%d\n", humidity/10, humidity%10); //显示湿度
delay_ms(10);
}
}
项目运行
代码编写完成后点击 保存 , 随后点击 编译 ,编译完成后可以下载源码和.bin与.hex文件
编译完后点击 运行
再次点击 运行
运行成功:
STM32F103C8引脚名称与含义表
引脚编号 | 引脚名称 | 含义/功能 |
---|---|---|
1 | PB8 | TIM4_CH3, PWM输出引脚之一 |
2 | PB9 | TIM4_CH4, PWM输出引脚之一 |
3 | BOOT0 | Boot选择,系统启动时工作模式选择 |
4 | VBAT | 电池电压输入,与VBAT输入端连接 |
5 | PC13 | TAMPER/WKUP, 实时钟振荡器字节功能, 触摸检测引脚 |
6 | OSC_IN | 外部时钟输入,双速内核时钟输入引脚 |
7 | OSC_OUT | 外部时钟输出,双速内核时钟输出引脚 |
8 | NRST | 复位引脚,复位状态表示 |
9 | VSSA | 模拟地,模拟电源地 |
10 | VDDA | 模拟电源,模拟电源 |
11-18 | PA0-PA7 | ADC1_IN0-ADC1_IN7, 模拟输入引脚之一 |
19-20 | PB0-PB1 | ADC1_IN8-ADC1_IN9, 模拟输入引脚之一 |
21 | VSS | 地,数字电源地 |
22 | VDD | 电源,数字电源 |
23 | PA8 | TIM1_CH1, PWM输出引脚之一 |
24 | PA9 | USART1_Tx, USART1的Tx引脚 |
25 | PA10 | USART1_Rx, USART1的Rx引脚 |
26 | PA11 | USB_DM, USB数据信号 |
27 | PA12 | USB_DP, USB数据信号 |
28-33 | PA13-PA15, PB3, PB4 | JTMS, JTCK/SWCLK, JTDI, JTDO/TRACESWO, JNTRST, 串行线调试引脚 |
34-35 | PB6-PB7 | I2C1_SCL, I2C1_SDA, I2C总线时钟和数据引脚 |
DHT11介绍
DHT11传感器内部集成了一个电阻式温度传感器和一个湿度电容式传感器,通过检测这两个传感器的电阻值和电容值,来计算出当前环境的温度和湿度值。DHT11传感器通常采用单线制串行接口,其引脚主要包括VDD(电源正极)、GND(电源负极)和DATA(数据线)。
接线时,VDD引脚应连接到单片机的VCC或其他稳定的电源正极,GND引脚应连接到单片机的GND或其他电源负极。注意电源电压应在DHT11的工作范围内,通常为3.3V至5.5V。DATA引脚是DHT11与单片机之间的通信接口,应连接到单片机的某个GPIO口,为了增强信号的抗干扰能力,DATA引脚在实际使用时通常需要并联一个5K以上的上拉电阻,一般常见的小模块上已经继承,上拉电阻的作用是在单片机不进行输出以及传感器待机时,使得DATA口为高电平。
DHT11与单片机之间的通信采用单总线协议,主机(单片机)通过DATA引脚向DHT11发送一个起始信号,该信号为一个低电平信号,持续时间至少18ms,以唤醒DHT11并进入通信状态。DHT11检测到起始信号后,会等待信号结束,然后发送一个80μs的低电平响应信号,紧接着发送一个80μs的高电平信号,表示已经准备好发送数据。DHT11开始通过DATA引脚向主机发送数据,数据格式为40位的脉冲信号,包含16位的湿度整数数据、8位的湿度小数数据(当前未使用,读出为零)、16位的温度整数数据、8位的温度小数数据(当前未使用,读出为零)以及8位的校验和。主机根据DATA引脚电平的变化接收数据,并解析出温湿度值。
0.96寸OLED介绍
这里使用到的0.96寸I2C OLED屏幕的工作原理主要基于OLED(有机发光二极管)技术和I2C(Inter-Integrated Circuit,集成电路总线)通信协议,0.96寸I2C OLED屏幕通常内置驱动芯片(如SSD1306),用于接收来自I2C总线的数据,并将其存储在内部显示存储器(GDDRAM)中。驱动芯片还负责控制OLED像素点的开关和亮度调节,从而实现图像的显示。
0.96寸I2C OLED屏幕的接线相对简单,通常只需连接四根线:VCC、GND、SDA和SCL。
-
VCC:电源正极,为OLED屏幕提供工作电压。根据屏幕规格,VCC通常连接到3.3V或5V电源。
-
GND:电源负极,即地线,与VCC一起构成电源回路。
-
SDA:数据线,用于在I2C总线上传输数据。SDA线连接到微控制器的I2C数据引脚。
-
SCL(SCK):时钟线,用于同步SDA线上的数据传输。SCL线连接到微控制器的I2C时钟引脚。