蓝桥杯嵌入式G431(hal库)——拓展板DS18B20和DHT11

ds18b20:直接使用官方提供的.c.h文件,初始化函数ds18b20_init_x();

需要自己编写ds18b20_read();

uint16_t ds18b20_read(void)//返回值为16位数据
{
  	u8 val1,val2;
	uint16_t val = 0;	

  	ow_reset();
  	ow_byte_wr(OW_SKIP_ROM);
  	ow_byte_wr(DS18B20_CONVERT);
  	delay_us(750000);

  	ow_reset();
  	ow_byte_wr( OW_SKIP_ROM );
  	ow_byte_wr ( DS18B20_READ );
	val1 = ow_byte_rd();        //低8位
  	val2 = ow_byte_rd();        //高8位

  	val  = (val2<<8);
    val  =val  |val1;        //整合成16位的温度值
	return val ;
}

dht11:直接使用官方提供的.c.h文件,初始化函数dht11_init();。(注意,下一届可能不提供驱动文件,2023年国赛提供了一部分驱动文件。)

使用DHT11_Read_Data()读取温湿度。

void dht11Proc(void)
{
	char chProc[21];
	u8 tem,him;
	DHT11_Read_Data(&tem,&him);
	if(tem>0&&him<100)
	{
		sprintf(chProc,(const char *)"T=%d    H=%d",tem,him);
		LCD_DisplayStringLine(Line3,(u8 *)chProc);
	}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,下面是使用HAL库读取DS18B20温度传感器的代码: 首先需要在CubeMX中配置GPIO引脚,将DS18B20的数据线连接到STM32开发的GPIO引脚上,这里假设为PA0。 然后在main.c文件中添加以下代码: ```c #include "main.h" #include "ds18b20.h" int main(void) { /* 初始化HAL库 */ HAL_Init(); /* 初始化温度传感器 */ DS18B20_Init(&htim2, GPIOA, GPIO_PIN_0); while (1) { /* 读取温度值 */ float temp = DS18B20_ReadTemp(); /* 打印温度值 */ printf("Temperature: %.2f Celsius\r\n", temp); /* 延时一段时间 */ HAL_Delay(1000); } } ``` 其中,DS18B20_Init()函数用于初始化温度传感器,DS18B20_ReadTemp()函数用于读取温度值。 接下来,需要创建一个名为ds18b20.h的头文件,用于声明函数和变量: ```c #ifndef __DS18B20_H #define __DS18B20_H #include "stm32f1xx_hal.h" /* 定义DS18B20的相关命令 */ #define DS18B20_SKIP_ROM 0xCC #define DS18B20_CONVERT_T 0x44 #define DS18B20_READ_SCRATCHPAD 0xBE /* 定义DS18B20的计算参数 */ #define DS18B20_RESOLUTION 0.0625 /* DS18B20初始化函数 */ void DS18B20_Init(TIM_HandleTypeDef *htim, GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin); /* DS18B20读取温度函数 */ float DS18B20_ReadTemp(void); #endif /* __DS18B20_H */ ``` 最后,在ds18b20.c文件中实现DS18B20_Init()和DS18B20_ReadTemp()函数: ```c #include "ds18b20.h" /* 定义全局变量 */ TIM_HandleTypeDef *htim; GPIO_TypeDef *GPIOx; uint16_t GPIO_Pin; /* DS18B20初始化函数 */ void DS18B20_Init(TIM_HandleTypeDef *htim_x, GPIO_TypeDef *GPIOx_x, uint16_t GPIO_Pin_x) { /* 保存参数到全局变量 */ htim = htim_x; GPIOx = GPIOx_x; GPIO_Pin = GPIO_Pin_x; /* 设置GPIO引脚为推挽输出 */ GPIO_InitTypeDef GPIO_InitStruct = {0}; GPIO_InitStruct.Pin = GPIO_Pin; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(GPIOx, &GPIO_InitStruct); HAL_GPIO_WritePin(GPIOx, GPIO_Pin, GPIO_PIN_RESET); /* 延时500毫秒 */ HAL_Delay(500); } /* DS18B20读取温度函数 */ float DS18B20_ReadTemp(void) { uint8_t buf[9]; uint16_t raw_temp; float temp; /* 发送复位脉冲 */ HAL_GPIO_WritePin(GPIOx, GPIO_Pin, GPIO_PIN_RESET); HAL_Delay(480); HAL_GPIO_WritePin(GPIOx, GPIO_Pin, GPIO_PIN_SET); HAL_Delay(60); /* 跳过ROM序列号 */ HAL_TIM_PWM_Start(htim, TIM_CHANNEL_1); DS18B20_SendByte(DS18B20_SKIP_ROM); DS18B20_SendByte(DS18B20_CONVERT_T); HAL_TIM_PWM_Stop(htim, TIM_CHANNEL_1); /* 等待转换完成 */ HAL_Delay(750); /* 跳过ROM序列号 */ HAL_TIM_PWM_Start(htim, TIM_CHANNEL_1); DS18B20_SendByte(DS18B20_SKIP_ROM); DS18B20_SendByte(DS18B20_READ_SCRATCHPAD); for (int i = 0; i < 9; i++) { buf[i] = DS18B20_RecvByte(); } HAL_TIM_PWM_Stop(htim, TIM_CHANNEL_1); /* 计算温度值 */ raw_temp = buf[1] << 8 | buf[0]; temp = (float)raw_temp * DS18B20_RESOLUTION; return temp; } /* DS18B20发送字节函数 */ void DS18B20_SendByte(uint8_t byte) { for (int i = 0; i < 8; i++) { if ((byte >> i) & 0x01) { HAL_GPIO_WritePin(GPIOx, GPIO_Pin, GPIO_PIN_RESET); HAL_Delay(2); HAL_GPIO_WritePin(GPIOx, GPIO_Pin, GPIO_PIN_SET); HAL_Delay(60); } else { HAL_GPIO_WritePin(GPIOx, GPIO_Pin, GPIO_PIN_RESET); HAL_Delay(60); HAL_GPIO_WritePin(GPIOx, GPIO_Pin, GPIO_PIN_SET); HAL_Delay(2); } } } /* DS18B20接收字节函数 */ uint8_t DS18B20_RecvByte(void) { uint8_t byte = 0x00; for (int i = 0; i < 8; i++) { HAL_GPIO_WritePin(GPIOx, GPIO_Pin, GPIO_PIN_RESET); HAL_Delay(2); HAL_GPIO_WritePin(GPIOx, GPIO_Pin, GPIO_PIN_SET); HAL_Delay(8); byte |= HAL_GPIO_ReadPin(GPIOx, GPIO_Pin) << i; HAL_Delay(60); } return byte; } ``` 其中,DS18B20_SendByte()和DS18B20_RecvByte()函数用于发送和接收字节,DS18B20_ReadTemp()函数中实现了读取温度值的具体步骤。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值