标题:
STM32+dht11温度采集系统程序设计
[打印本页]
作者:
tonygengli
时间:
2020-12-29 11:15
标题:
STM32+dht11温度采集系统程序设计
这是上周学习ARM做的基于stm32 温度采集系统
利用到串口 中断 外设等知识,实现对led控制 蜂鸣器 从而实现温度采集的功能。
请多指教。
单片机源程序如下:
#include "dht11.h"
#include "dida.h"
//初始化DHT11引脚函数
void dht11_init(void)
{
GPIO_InitTypeDef GPIOInitType;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
GPIOInitType.GPIO_Mode = GPIO_Mode_Out_PP;
GPIOInitType.GPIO_Pin = GPIO_Pin_7;
GPIOInitType.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIOInitType);
//将7号引脚置一
GPIO_SetBits(GPIOA,GPIO_Pin_7);
}
//初始化推挽输出
void mode_output(void)
{
GPIO_InitTypeDef GPIOInitMode;
GPIOInitMode.GPIO_Mode = GPIO_Mode_Out_PP;
GPIOInitMode.GPIO_Pin = GPIO_Pin_7;
GPIOInitMode.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIOInitMode);
}
//初始化上拉输入
void mode_input(void)
{
GPIO_InitTypeDef GPIOInitMode;
GPIOInitMode.GPIO_Mode = GPIO_Mode_IPU;
GPIOInitMode.GPIO_Pin = GPIO_Pin_7;
GPIOInitMode.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIOInitMode);
}
//一次输出八位数据
uint8_t output_8bit(void)
{
uint8_t i, temp=0;
for(i=0;i<8;i++)
{
//每位以50us低电平标志开始,直到发出的50us低电平结束
while(Bit_RESET == GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_7));
/*DHT11 以26~28us的高电平表示“0”,以70us高电平表示“1”,
*通过检测 x us后的电平即可区别这两个状 ,x 即下面的延时
*/
//延时x us 这个延时需要大于数据0持续的时间即可
Delay_us(30);
// 30us后仍为高电平表示数据“1”
if(Bit_SET == GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_7))
{
while(Bit_SET == GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_7));// 等待数据1的高电平结束
temp|=(uint8_t)(0x01<<(7-i)); //把第7-i位置1,,MSB先行,0x01<<(7-i)是向右移动(7-i)位
}
else // 30 us后为低平表示数据“0”
{
temp&=(uint8_t)~(0x01<<(7-i)); //把第7-i位置0,MSB先行,~取反
}
}
return temp;
}
//输出所有的温度值,遵循高位先出原则
uint8_t DHT11_Read_data(DHT11_Data_TypeDef *DHT11_Data)
{
mode_output();//输出模式//
GPIO_ResetBits(GPIOA,GPIO_Pin_7);//主机拉低,开始输出为0
Delay_ms(18); //延时18ms
GPIO_SetBits(GPIOA,GPIO_Pin_7); //总线拉高 主机延时30us
Delay_us(30); //延时30us
mode_input();//主机设为输入 判断从机响应信号
/*判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行*/
if(Bit_RESET ==GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_7))
{
/*轮询直到从机发出 的80us 低电平 响应信号结束*/
while(Bit_RESET == GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_7));
/*轮询直到从机发出的 80us 高电平 标置信号结束*/
while(Bit_SET == GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_7));
/*开始接收数据*/
DHT11_Data->humidness_int= output_8bit();
DHT11_Data->humidness_deci=output_8bit();
DHT11_Data->T_int= output_8bit();
DHT11_Data->T_deci= output_8bit();
DHT11_Data->text_sum= output_8bit();
/*读取结束,引脚改为输出模式*/
mode_output();
/*主机拉高*/
GPIO_SetBits(GPIOA,GPIO_Pin_7);
/*检查读取的数据是否正确*/
if(DHT11_Data->text_sum == DHT11_Data->humidness_int + DHT11_Data->humidness_deci + DHT11_Data->T_int+ DHT11_Data->T_deci)
return SUCCESS;
else
return ERROR;
}
else
return ERROR;
}
复制代码
所有资料51hei提供下载:
温度采集系统.7z
(192.43 KB, 下载次数: 48)
2020-12-30 03:42 上传
点击文件名下载附件
包含 串口 中断 led控制灯
下载积分: 黑币 -5
作者:
chjchj816
时间:
2020-12-30 15:27
也来学习一下 提高提高
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1