【IAR工程】STM8S基于ST标准库读取DHT11数据
- ✨申明:本文章仅发表在CSDN网站,任何其他网站,未注明来源,见此内容均为盗链和爬取,请多多尊重和支持原创!
- 🍁对于文中所提供的相关资源链接将作不定期更换。
- 🔖基于ST STM8S/A标准外设库:STSW-STM8069,版本号:
2.3.1
- 📌STSW-STM8069官方资源下载地址:
https://www.st.com/zh/embedded-software/stsw-stm8069.html
- 🔧IAR编译器版本:IAR Assembler for STMicroelectronics STM8
3.11.1
- 📌STM8S207/208RBT6最小系统板:
https://oshwhub.com/perseverance51/stm8s207rbt6-kai-fa-ban
- 🎯本工程使用STM8S208RB+DHT11实物验证没有问题。
- 📜通过串口对于爱你DHT11数据:
文章来源地址https://www.toymoban.com/news/detail-424378.html
- 🌿温湿度传感器
📑引脚定义
- ✨如果是其他型号可以根据自由更换其他引脚。注意修改相关定义。
STM8S单片机-->DHT11
PC2-->DAT
3.3V----VCC
📓STM8驱动代码
- 🌿DHT11.C
#include "dht11.h"
static uint8_t debug[5] = {0};
/**
* @brief 获得DHT11 1 bit数据
* @param None
* @retval 数据
*/
static uint8_t dht11_bit_get( void )
{
uint8_t temp = 0;
for( int j = 0; j < 8; j++ ) //获取一个字节
{
while( DHT11_READ == RESET ); //等待字节起始低电平结束
delay_us( 40 );//大于40us (要求大于30us,小于70us)
temp <<= 1;
if( DHT11_READ != RESET )
{
temp |= 0x01;
}
while( DHT11_READ != RESET ); //等待高电平结束
}
return temp;
}
/**
* @brief 获得DHT11温湿度数据
* @param data 数据接收缓存(5字节)
* @retval true 获取成功 false 获取失败
* @note 采样间隔必须大于1s,采样过程禁止打断
*/
static BitStatus dht11_data_get( uint8_t *data )
{
DHT11_OUT;
DHT11_H; //准备--总线空闲
delay_ms( 2 ); //延时2ms
DHT11_L; //总线拉低--主机开始信号
delay_ms( 25 ); //保持25ms --大于18ms
DHT11_H; //结束开始信号
delay_us( 30 );//延时 20us~40us
DHT11_IN; //切换输入模式 准备读响应
if( DHT11_READ != RESET ) //未检测到应答
{
return RESET;
}
while( DHT11_READ == RESET ); //等待应答结束
while( DHT11_READ != RESET ); //等待DHT11发送起始高电平结束
for( int i = 0; i < 5; i++ ) //共5字节
{
data[i] = dht11_bit_get();
}
DHT11_OUT;
DHT11_H; //准备--总线空闲
return SET;
}
/**
* @brief 获得DHT11温湿度数据
* @param temp 温度 hum 湿度
* @retval false 数据错误 true 数据正常
*/
BitStatus dht11_read_data( double *temp, double *hum )
{
uint8_t dht11_data[5] = {0};
if( !dht11_data_get( dht11_data ) )
return RESET;
memcpy( debug, dht11_data, 5 );
if( dht11_data[0] + dht11_data[1] + dht11_data[2] + dht11_data[3] != dht11_data[4] )
return RESET;
*hum = dht11_data[0] + dht11_data[1] * 0.1;
*temp = dht11_data[2] + dht11_data[3] * 0.1;
return SET;
}
- 🌿DHT11.h
#ifndef _DHT11_H
#define _DHT11_H
#include <stm8s.h>
#include "delay.h"
#include <string.h>
#define DHT11_PORT GPIOC
#define DHT11_PIN GPIO_PIN_2
#define DHT11_OUT GPIO_Init(DHT11_PORT, DHT11_PIN, GPIO_MODE_OUT_PP_HIGH_FAST) //输出模式
#define DHT11_IN GPIO_Init(DHT11_PORT, DHT11_PIN, GPIO_MODE_IN_PU_NO_IT) //输入模式
#define DHT11_H GPIO_WriteHigh(DHT11_PORT,DHT11_PIN) //输出高
#define DHT11_L GPIO_WriteLow(DHT11_PORT,DHT11_PIN) //输出低
#define DHT11_READ GPIO_ReadInputPin(DHT11_PORT,DHT11_PIN) //数据读出
BitStatus dht11_read_data(double *temp,double *hum);
#endif
📝主程序代码
/**************************************************************************************
实验现象:打开串口调试助手,选择CH340对应串口号,波特率设置9600, 串口助手上会显示DHT11数据:
"DHT11_Temp: 25. 9℃ DHT11_Hum:95. 0%"
接线说明: 1、STM8S单片机-->LED1 ->PC7
LED2 ->PC6
-------------------------------------------------------
PC2-->DHT11 DATA
DHT11对延时要求比较高,微妙延时函数(delay_us()) 中的形参调整为:nCount*=3;
如果使用其他参数将会导致读取的数据不对。
注意事项: 1、采用内部16MHz晶振频率。
2、针对读取DHT11传感器,确保微妙延时函数形参:nCount*=3;
3、点击“Download active application”按钮,程序下载完成后,即可运行程序。
4、串口1使用的是PA4和PA5引脚,所以这两个IO口不要被占用
***************************************************************************************/
#include "stm8s.h" /* 添加库函数头文件 */
#include "delay.h"
#include "led.h"
#include "usart.h"
#include "dht11.h"
#include <stdio.h>//包含此头文件调用printf函数串口才能有输出
/* 主函数 */
int main( void )
{
u8 i = 0;
double temp, hum;
disableInterrupts(); //关闭系统中断
//内部时钟为1分频 = 16Mhz
CLK_SYSCLKConfig( CLK_PRESCALER_HSIDIV1 );
LED_Init();
USART1_Init( 9600 ); //初始化USART1 , 并设置波特率为9600
while( dht11_read_data(&temp,&hum) == RESET ) //DS18B20初始化
{
printf( "DHT11 Error \r\n" );
delay_ms( 500 );
}
enableInterrupts(); //使能系统中断
while( 1 )
{
i++;
if( i % 20 == 0 )
{
LED1_TOGGLE;
LED2_TOGGLE;
}
if( i % 100 == 0 )
{
if( dht11_read_data(&temp,&hum) ) //判断是否获取到数据
{
printf( "DHT11_Temp: %2d.%2d℃ DHT11_Hum:%2d.%2d%%\r\n", ( u16 )temp, Get_decimal( temp, 2 ) ,( u16 ) hum,Get_decimal( hum, 2 ) );
}
else
{
printf( "DHT11 Error \r\n" );
}
}
delay_ms( 10 );
}
}
//是一个宏定义;在固件库中,它的作用就是检测传递给函数的参数是否是有效的参数
void assert_failed( u8* file, u32 line )
{
while ( 1 )
{
}
}
📚程序源码
- ✨申明:本文章仅发表在CSDN网站,任何其他网站,未注明来源,见此内容均为盗链和爬取,请多多尊重和支持原创!
- 🍁对于文中所提供的相关资源链接将作不定期更换。
链接: https://pan.baidu.com/s/1uFtVokUx_AXLEy6VgmTpAQ
提取码: 9h9x
文章来源:https://www.toymoban.com/news/detail-424378.html
到了这里,关于【IAR工程】STM8S基于ST标准库读取DHT11数据的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!