找回密码
 立即注册

QQ登录

只需一步,快速开始

帖子
查看: 508|回复: 0
打印 上一主题 下一主题
收起左侧

DHT11温湿度模块 单片机程序不完整

[复制链接]
跳转到指定楼层
楼主
资料代码分享

  1. #include "DHT11.h"
  2. extern unsigned char temperature,humidity;

  3. //选择PA4作为 data线
  4. void SET_PA4_OUTPUT(void)
  5. {
  6.         //Gec_GPIO_Init(GPIOA, GPIO_Pin_4, GPIO_MODE_OUT_PP);
  7.         GPIO_InitTypeDef g;

  8.         RCC_AHB1PeriphClockCmd( RCC_AHB1Periph_GPIOA,  ENABLE);

  9.         g.GPIO_Pin = GPIO_Pin_4;
  10.         g.GPIO_Mode = GPIO_Mode_OUT;
  11.         g.GPIO_OType = GPIO_OType_PP;
  12.         g.GPIO_Speed = GPIO_Speed_50MHz;
  13.         GPIO_Init( GPIOA, &g);
  14. }

  15. void  SET_PA4_INPUT(void)
  16. {
  17.         // Gec_GPIO_Init(GPIOA, GPIO_Pin_4, GPIO_MODE_IN_PULLUP);
  18.         GPIO_InitTypeDef g;
  19.          
  20.         RCC_AHB1PeriphClockCmd( RCC_AHB1Periph_GPIOA,  ENABLE);

  21.         g.GPIO_Pin = GPIO_Pin_4;
  22.         g.GPIO_Mode = GPIO_Mode_IN;
  23.         g.GPIO_PuPd = GPIO_PuPd_NOPULL;
  24.         //g.GPIO_OType = GPIO_OType_PP;
  25.         //g.GPIO_Speed = GPIO_Speed_50MHz;
  26.         GPIO_Init( GPIOA, &g);
  27.         
  28. }

  29. static unsigned char Read_Byte(void)
  30. {
  31.         SET_PA4_INPUT();
  32.         unsigned char i,ByteData=0;
  33.         for(i=0;i<8;i++)
  34.         {
  35.                 ByteData <<= 1;//先左移一位,因为数据是高位先出
  36.                 while(!(PAin(4)==0));//每个bit都是从50us的低电平开始
  37.                 while(!(PAin(4)==1));//等待变为高电平
  38.                 udelay(30);//延时30us
  39.                
  40.                 if(PAin(4) == 1)//说明该Bit位就是1
  41.                 {
  42.                         ByteData |=  1;//把最低位变为1
  43.                 }  
  44.         }  
  45.         return ByteData;
  46. }

  47. /*
  48. Read_DHT11:向DHT11发送命令,读取温湿度数据
  49. 参数:

  50. 返回值:
  51. 读取成功返回1,失败返回0
  52. */
  53. int Read_DHT11(void)
  54. {
  55.         unsigned char ReadBuf[5];
  56.         /*主机发送开始信号*/
  57.         SET_PA4_OUTPUT();//设置为输出模式
  58.         PAout(4) = 0;
  59.         udelay(20000);//至少18ms

  60.         /*主机拉高20~40us*/
  61.         PAout(4) = 1;
  62.         udelay(40);

  63.         /*等待DHT11回响应信号*/
  64.         SET_PA4_INPUT();//设置为输入模式
  65.         while(!(PAin(4)==0));//等待总线变为低电平(响应信号)

  66.         /*等待DHT11拉高80us,DHT11开始传输数据*/
  67.         while(!(PAin(4)==1));

  68.         /*数据总共有40bits,即5个字节*/
  69.         ReadBuf[0] = Read_Byte();
  70.         ReadBuf[1] = Read_Byte();
  71.         ReadBuf[2] = Read_Byte();
  72.         ReadBuf[3] = Read_Byte();
  73.         ReadBuf[4] = Read_Byte();

  74.         /*校验*/
  75.         if((ReadBuf[0]+ReadBuf[1]+ReadBuf[2]+ReadBuf[3])%256 == ReadBuf[4])//校验成功
  76.         {
  77.                 humidity = ReadBuf[0];
  78.                 temperature = ReadBuf[2];
  79.                 return 1;
  80.         }
  81.         else
  82.         {
  83.                 return 0;
  84.         }

  85. }


复制代码



下载: DHT11.zip (2 MB, 下载次数: 0)
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

举报

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

本版积分规则

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

Powered by 单片机教程网

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