找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2738|回复: 1
收起左侧

STM32+dht11温度采集系统程序设计

[复制链接]
ID:870099 发表于 2020-12-29 11:15 | 显示全部楼层 |阅读模式
这是上周学习ARM做的基于stm32 温度采集系统
利用到串口  中断 外设等知识,实现对led控制 蜂鸣器 从而实现温度采集的功能。
请多指教。

单片机源程序如下:
  1. #include "dht11.h"
  2. #include "dida.h"

  3. //初始化DHT11引脚函数
  4. void dht11_init(void)
  5. {
  6.         GPIO_InitTypeDef GPIOInitType;
  7.         
  8.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
  9.         
  10.         GPIOInitType.GPIO_Mode = GPIO_Mode_Out_PP;
  11.         
  12.         GPIOInitType.GPIO_Pin = GPIO_Pin_7;
  13.         
  14.         GPIOInitType.GPIO_Speed = GPIO_Speed_50MHz;
  15.         
  16.         GPIO_Init(GPIOA,&GPIOInitType);
  17.         //将7号引脚置一
  18.         GPIO_SetBits(GPIOA,GPIO_Pin_7);
  19.         
  20. }

  21. //初始化推挽输出

  22. void mode_output(void)
  23. {
  24.         GPIO_InitTypeDef GPIOInitMode;
  25.         
  26.         GPIOInitMode.GPIO_Mode = GPIO_Mode_Out_PP;
  27.         GPIOInitMode.GPIO_Pin = GPIO_Pin_7;
  28.         GPIOInitMode.GPIO_Speed = GPIO_Speed_50MHz;
  29.         
  30.         GPIO_Init(GPIOA,&GPIOInitMode);        
  31. }

  32. //初始化上拉输入
  33. void mode_input(void)
  34. {
  35.         GPIO_InitTypeDef GPIOInitMode;
  36.         GPIOInitMode.GPIO_Mode = GPIO_Mode_IPU;
  37.         GPIOInitMode.GPIO_Pin = GPIO_Pin_7;
  38.         GPIOInitMode.GPIO_Speed = GPIO_Speed_50MHz;
  39.         GPIO_Init(GPIOA,&GPIOInitMode);
  40. }

  41. //一次输出八位数据
  42. uint8_t output_8bit(void)
  43. {
  44.         uint8_t i, temp=0;

  45.         for(i=0;i<8;i++)   
  46.         {
  47.                
  48.                 //每位以50us低电平标志开始,直到发出的50us低电平结束
  49.                 while(Bit_RESET == GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_7));

  50.                 /*DHT11 以26~28us的高电平表示“0”,以70us高电平表示“1”,
  51.                  *通过检测 x us后的电平即可区别这两个状 ,x 即下面的延时
  52.                  */
  53.                 //延时x us 这个延时需要大于数据0持续的时间即可               
  54.                 Delay_us(30);               
  55.                
  56.                 // 30us后仍为高电平表示数据“1”
  57.                 if(Bit_SET == GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_7))
  58.                 {
  59.                         while(Bit_SET == GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_7));// 等待数据1的高电平结束
  60.                         temp|=(uint8_t)(0x01<<(7-i));  //把第7-i位置1,,MSB先行,0x01<<(7-i)是向右移动(7-i)位
  61.                 }
  62.                 else         // 30 us后为低平表示数据“0”
  63.                 {                           
  64.                         temp&=(uint8_t)~(0x01<<(7-i)); //把第7-i位置0,MSB先行,~取反
  65.                 }
  66.         }        
  67.         return temp;
  68. }

  69. //输出所有的温度值,遵循高位先出原则
  70. uint8_t DHT11_Read_data(DHT11_Data_TypeDef *DHT11_Data)
  71. {  

  72.         mode_output();//输出模式//
  73.         
  74.         GPIO_ResetBits(GPIOA,GPIO_Pin_7);//主机拉低,开始输出为0

  75.         Delay_ms(18);        //延时18ms


  76.         GPIO_SetBits(GPIOA,GPIO_Pin_7);  //总线拉高 主机延时30us

  77.         Delay_us(30);   //延时30us

  78.         mode_input();//主机设为输入 判断从机响应信号

  79.         /*判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行*/   
  80.         if(Bit_RESET ==GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_7))     
  81.         {
  82.                 /*轮询直到从机发出 的80us 低电平 响应信号结束*/  
  83.                 while(Bit_RESET == GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_7));

  84.                 /*轮询直到从机发出的 80us 高电平 标置信号结束*/
  85.                 while(Bit_SET == GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_7));

  86.                 /*开始接收数据*/   
  87.                 DHT11_Data->humidness_int= output_8bit();

  88.                 DHT11_Data->humidness_deci=output_8bit();

  89.                 DHT11_Data->T_int= output_8bit();

  90.                 DHT11_Data->T_deci= output_8bit();

  91.                 DHT11_Data->text_sum= output_8bit();


  92.                 /*读取结束,引脚改为输出模式*/
  93.                 mode_output();
  94.                 /*主机拉高*/
  95.                 GPIO_SetBits(GPIOA,GPIO_Pin_7);

  96.                 /*检查读取的数据是否正确*/
  97.                 if(DHT11_Data->text_sum == DHT11_Data->humidness_int + DHT11_Data->humidness_deci + DHT11_Data->T_int+ DHT11_Data->T_deci)
  98.                         return SUCCESS;
  99.                 else
  100.                         return ERROR;
  101.         }
  102.         else
  103.                 return ERROR;
  104.         
  105. }
  106.         
  107.         
复制代码

所有资料51hei提供下载:
温度采集系统.7z (192.43 KB, 下载次数: 48)


回复

使用道具 举报

ID:120677 发表于 2020-12-30 15:27 | 显示全部楼层
也来学习一下  提高提高
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表