找到原因了,没进入前面的代码。
我读取DHT11的代码如下:
- /*********************************************************************************************
- 函数名:DHT11启动函数
- 调 用:无
- 参 数:无
- 返回值:无
- 结 果:DHT11开始工作
- 备 注:
- **********************************************************************************************/
- void DHT11_start() // 主机控制DHT11开始工作
- {
- DATA_1; // 主线空闲状态
- Delay30us();
- DATA_0; // 主机发送开始工作信号
- Delay20ms(); //延时18ms以上
- DATA_1; // 拉高并延时等待DHT11响应
- Delay30us();
- }
- void DHT11_OUTPUT(void)
- {
- GPIO_InitTypeDef GPIO_InitStruct = {0};
- /* USER CODE BEGIN MX_GPIO_Init_1 */
- /* USER CODE END MX_GPIO_Init_1 */
-
-
-
-
-
-
-
- GPIO_InitStruct.Pin = GPIO_PIN_12;
- GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
- GPIO_InitStruct.Pull = GPIO_NOPULL;
- GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
- HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
- }
- void DHT11_INPUT(void)
- {
- GPIO_InitTypeDef GPIO_InitStruct = {0};
- /* USER CODE BEGIN MX_GPIO_Init_1 */
- /* USER CODE END MX_GPIO_Init_1 */
-
-
-
-
-
-
-
- GPIO_InitStruct.Pin = GPIO_PIN_12;
- GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
- GPIO_InitStruct.Pull = GPIO_NOPULL;
- GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
- HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
- }
- /*********************************************************************************************
- 函数名:DHT11读数据函数
- 调 用:? = DHT11_rec_byte();
- 参 数:无
- 返回值:
- 结 果:读DHT11数据并保存到dat
- 备 注:
- **********************************************************************************************/
- uchar DHT11_rec_byte() //接收一个字节
- {
- uchar i,dat=0;
- DHT11_INPUT();
- //Delay30us();
- _nop_();
- for(i=0;i<8;i++) //从高到低依次接收8位数据
- {
- //DATA=1;
- while(!DATA); ////等待50us低电平过去
- Delay30us();
- Delay30us(); //延时60us,如果还为高则数据为1,否则为0
- dat<<=1; //左移位使正确接收8位数据,数据为0时直接移位
- //DATA=1;
- if(DATA==1) //数据为1时,使dat加1来接收数据1
- dat+=1;
- //DATA=1;
- while(DATA)
- {
- //DATA=1;
- ; //等待数据线拉低
- }
- }
- DHT11_OUTPUT();
- Delay30us();
- return dat;
- }
- /*********************************************************************************************
- 函数名:接收DHT11的40位的数据并校验
- 调 用:? = DHT11_receive();
- 参 数:无
- 返回值:无
- 结 果:结果保存到dat_r[i]中
- 备 注:
- **********************************************************************************************/
- void DHT11_receive() //接收40位的数据
- {
- uchar R_H,R_L,T_H,T_L,RH,RL,TH,TL,revise;
- DHT11_start(); // 主机控制DHT11开始工作
- DHT11_INPUT();
- _nop_();
- //while(DATA==1);
- if(DATA==0)
- {
- while(DATA==0)
- {
- //DATA=1; //等待拉高
- }
- Delay30us();
- Delay30us();
- Delay30us(); //拉高后延时80us
- R_H=DHT11_rec_byte(); //接收湿度高八位
- R_L=DHT11_rec_byte(); //接收湿度低八位
- T_H=DHT11_rec_byte(); //接收温度高八位
- T_L=DHT11_rec_byte(); //接收温度低八位
- revise=DHT11_rec_byte(); //接收校正位
- Delay30us(); //结束
- if((R_H+R_L+T_H+T_L)==revise) //校正
- {
- RH=R_H;
- RL=R_L;
- TH=T_H;
- TL=T_L;
- }
- /*数据处理,方便显示*/
- dat_r[0]=(RH/10);
- dat_r[1]=(RH%10);
- dat_r[2]=(TH/10);
- dat_r[3]=(TH%10);
- }
- DHT11_OUTPUT();
- Delay30us();
- }
在DHT11_receive()这个函数里,if(DATA==0)
发现DATA不会等于0.
这是什么原因?谢谢
|