[STM32F3] STM32F303调试出现的怪问题

[复制链接]
39|1
Tom952331 发表于 2026-5-24 08:52 | 显示全部楼层 |阅读模式
我用STM32F303ZET6读取DHT11的温度和湿度值,显示不对。

我调试,设断点观察变量:
2.jpg

dat_r的值都是0
可是dat_r[0]=0X30+(RH/10);

        dat_r[1]=0X30+(RH%10);

        dat_r[2]=0X30+(TH/10);

        dat_r[3]=0X30+(TH%10);
我在读取值都加了0x30,方便显示。
按说就是RH,TH都等于0,dat_r也应该等于0X30。
这是怎么回事呀?谢谢
 楼主| Tom952331 发表于 2026-5-24 09:20 | 显示全部楼层
找到原因了,没进入前面的代码。
我读取DHT11的代码如下:
  1. /*********************************************************************************************

  2. 函数名:DHT11启动函数

  3. 调  用:无

  4. 参  数:无

  5. 返回值:无

  6. 结  果:DHT11开始工作

  7. 备  注:

  8. **********************************************************************************************/

  9. void DHT11_start()                 // 主机控制DHT11开始工作

  10. {

  11.    DATA_1;                                 // 主线空闲状态

  12.    Delay30us();

  13.    DATA_0;                                 // 主机发送开始工作信号

  14.    Delay20ms();   //延时18ms以上

  15.    DATA_1;                                 // 拉高并延时等待DHT11响应

  16.    Delay30us();

  17. }
  18. void DHT11_OUTPUT(void)
  19. {
  20.         GPIO_InitTypeDef GPIO_InitStruct = {0};
  21. /* USER CODE BEGIN MX_GPIO_Init_1 */
  22. /* USER CODE END MX_GPIO_Init_1 */

  23.   

  24.   


  25.        
  26.        
  27.        
  28.         GPIO_InitStruct.Pin = GPIO_PIN_12;
  29.   GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  30.   GPIO_InitStruct.Pull = GPIO_NOPULL;
  31.   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  32.   HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
  33. }
  34. void DHT11_INPUT(void)
  35. {
  36.         GPIO_InitTypeDef GPIO_InitStruct = {0};
  37. /* USER CODE BEGIN MX_GPIO_Init_1 */
  38. /* USER CODE END MX_GPIO_Init_1 */

  39.   

  40.   


  41.        
  42.        
  43.        
  44.         GPIO_InitStruct.Pin = GPIO_PIN_12;
  45.   GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  46.   GPIO_InitStruct.Pull = GPIO_NOPULL;
  47.   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  48.   HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
  49. }

  50. /*********************************************************************************************

  51. 函数名:DHT11读数据函数

  52. 调  用:? = DHT11_rec_byte();

  53. 参  数:无

  54. 返回值:

  55. 结  果:读DHT11数据并保存到dat

  56. 备  注:

  57. **********************************************************************************************/



  58. uchar DHT11_rec_byte()      //接收一个字节

  59. {

  60.    uchar i,dat=0;
  61.         DHT11_INPUT();
  62.         //Delay30us();
  63.         _nop_();
  64.   for(i=0;i<8;i++)    //从高到低依次接收8位数据

  65.    {         
  66.                         //DATA=1;
  67.       while(!DATA);   ////等待50us低电平过去

  68.       Delay30us();

  69.           Delay30us();     //延时60us,如果还为高则数据为1,否则为0

  70.       dat<<=1;           //左移位使正确接收8位数据,数据为0时直接移位
  71.                         //DATA=1;
  72.       if(DATA==1)    //数据为1时,使dat加1来接收数据1

  73.          dat+=1;
  74.                         //DATA=1;
  75.       while(DATA)
  76.                         {
  77.                                 //DATA=1;
  78.                                 ;  //等待数据线拉低   
  79.                         }

  80.     }  
  81.                 DHT11_OUTPUT();
  82.                 Delay30us();
  83.     return dat;

  84. }



  85. /*********************************************************************************************

  86. 函数名:接收DHT11的40位的数据并校验

  87. 调  用:? = DHT11_receive();

  88. 参  数:无

  89. 返回值:无

  90. 结  果:结果保存到dat_r[i]中

  91. 备  注:

  92. **********************************************************************************************/

  93. void DHT11_receive()      //接收40位的数据

  94. {

  95.     uchar R_H,R_L,T_H,T_L,RH,RL,TH,TL,revise;

  96.     DHT11_start();                 // 主机控制DHT11开始工作
  97.                 DHT11_INPUT();
  98.                 _nop_();
  99.                 //while(DATA==1);
  100.     if(DATA==0)

  101.     {

  102.         while(DATA==0)
  103.                                 {
  104.                                         //DATA=1;   //等待拉高     
  105.                                 }
  106.         Delay30us();

  107.                 Delay30us();

  108.                 Delay30us();  //拉高后延时80us

  109.         R_H=DHT11_rec_byte();    //接收湿度高八位  

  110.         R_L=DHT11_rec_byte();    //接收湿度低八位  

  111.         T_H=DHT11_rec_byte();    //接收温度高八位  

  112.         T_L=DHT11_rec_byte();    //接收温度低八位

  113.         revise=DHT11_rec_byte(); //接收校正位



  114.         Delay30us();    //结束



  115.         if((R_H+R_L+T_H+T_L)==revise)      //校正

  116.         {

  117.             RH=R_H;

  118.             RL=R_L;

  119.             TH=T_H;

  120.             TL=T_L;

  121.         }

  122.         /*数据处理,方便显示*/

  123.         dat_r[0]=(RH/10);

  124.         dat_r[1]=(RH%10);

  125.         dat_r[2]=(TH/10);

  126.         dat_r[3]=(TH%10);

  127.     }
  128.                 DHT11_OUTPUT();
  129.                 Delay30us();
  130. }
在DHT11_receive()这个函数里,if(DATA==0)
发现DATA不会等于0.
这是什么原因?谢谢
您需要登录后才可以回帖 登录 | 注册

本版积分规则

129

主题

573

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部
0