930电子网

 找回密码
 立即注册
艾克姆科技推出最新产品STC32G12K128开发板
查看: 7093|回复: 2

STC8--DHT11代码

[复制链接]

2

主题

3

帖子

46

积分

新手上路

Rank: 1

积分
46
发表于 2021-11-7 13:19:26 | 显示全部楼层 |阅读模式
本帖最后由 xiaoxuesheng 于 2021-11-7 13:21 编辑

DHT11.C
  1. #include "DHT11.H"

  2. //温湿度定义
  3. uchar R_H,R_L,T_H,T_L,RH,RL,TH,TL,revise;
  4. DHT11VALUE DHT11Value;

  5. void DHT11_Start(void)   //向传感器发送启动信号
  6. {
  7.           DATA_PIN=0;                //dht11低电平
  8.     delay_ms(20);  //延时大于18MS
  9.     DATA_PIN=1;         //dht11高电平
  10.     Delay_10us();                //延时40us
  11.     Delay_10us();                        
  12.     Delay_10us();
  13.     Delay_10us();
  14. }

  15. /******************************************************************************
  16. * 描  述 : 温湿度传感写操作:写入1个字节
  17. * 入  参 : 无
  18. * 返回值 : 无
  19. *****************************************************************************/


  20. unsigned char DHT11_rec_byte()   
  21. {     
  22.     unsigned char i,dat=0;         
  23.     for(i=0;i<8;i++)    //
  24.     {
  25.         while(!DATA_PIN);        //等待50us低电平过去
  26.         Delay_10us();        //延时30us
  27.         Delay_10us();
  28.         Delay_10us();
  29.                                 dat<<=1;        //移位接收8位数据  数据为零时直接移位
  30.         if(DATA_PIN)
  31.                                         dat+=1;
  32.         while(DATA_PIN);         
  33.     }
  34.         return dat;               
  35. }
  36. /******************************************************************************
  37. * 描  述 : DHT11写操作:写入1个字节
  38. * 入  参 : 无
  39. * 返回值 : 无
  40. *****************************************************************************/
  41. void DHT11_receive()         //接收数据
  42. {
  43.         DHT11_Start();                //发送dht11启动信号
  44.     if(!DATA_PIN)         //等待dht11低电平
  45.     {
  46.         while(!DATA_PIN);   
  47.         while(DATA_PIN);
  48.         R_H=DHT11_rec_byte();                //接收湿度高八位
  49.         R_L=DHT11_rec_byte();                //接收湿度低八位
  50.         T_H=DHT11_rec_byte();                //接收温度高八位
  51.         T_L=DHT11_rec_byte();                //接收温度低八位
  52.         revise=DHT11_rec_byte();                //接收校验
  53.         DATA_PIN=1;
  54.         if((R_H+R_L+T_H+T_L)==revise)      //校正  判断温湿度高八位和低八位相加和校验是否相同
  55.         {
  56.             RH=R_H;
  57.             RL=R_L;
  58.             TH=T_H;
  59.             TL=T_L;
  60.         }
  61.                                 DHT11Value.tempH = TH/10;        //数值转换
  62.         DHT11Value.tempL = TH%10;//数值转换
  63.         
  64.         DHT11Value.humyH = RH/10; //数值转换
  65.         DHT11Value.humyL = RH%10; //数值转换                                
  66.     }
  67. }  



  68. void dis()        //lcd1602显示温湿度
  69. {
  70.         LCD_ShowString(1,1,"T:");
  71.         LCD_ShowNum(1,3,TH,2);
  72.         LCD_ShowChar(1,5,0X43);
  73.         LCD_ShowString(1,7,"H:");
  74.         LCD_ShowNum(1,9,RH,2);
  75.         LCD_ShowChar(1,11,0X25);
  76.        
  77. }
复制代码
DHT11.H
  1. #ifndef __DHT11_H__
  2. #define __DHT11_H__

  3. #include "delay.h"       
  4. #include "lcd1602.h"

  5. /**********************
  6. 引脚别名定义
  7. ***********************/       
  8. sbit DATA_PIN=P4^1;       //DHT11数据引脚,该引脚必须接上拉电阻

  9. typedef struct DHT11_VALUE
  10. {
  11.     uint tempH;  //温度高字节(十位)
  12.     uchar  tempL;  //温度低位节(个位)
  13.     uchar  humyH;   //湿度高字节(十位)
  14.     uchar  humyL;  //湿度高字节(个位)

  15. }DHT11VALUE;

  16. extern   DHT11VALUE DHT11Value;


  17. void DHT11_Start(void);   //向传感器发送启动信号
  18. unsigned char DHT11_rec_byte();
  19. void DHT11_receive();        //接收数据
  20. void dis();
  21. #endif
复制代码
delay.c
  1. #include "delay.h"

  2. //========================================================================
  3. // 函数: void  delay_ms(unsigned char ms)
  4. // 描述: 延时函数。
  5. // 参数: ms,要延时的ms数, 这里只支持1~255ms. 自动适应主时钟.
  6. // 返回: none.
  7. // 版本: VER1.0
  8. // 日期: 2013-4-1
  9. // 备注:
  10. //========================================================================
  11. void  delay_ms(unsigned char ms)
  12. {
  13.      unsigned int i;
  14.                  do
  15.                  {
  16.               i = MAIN_Fosc / 13000;
  17.                                 while(--i)        ;   //14T per loop
  18.      }
  19.                  while(--ms);
  20. }

  21. void  delay_2000ms(void)
  22. {
  23.         unsigned char i;
  24.         for(i=0;i<10;i++)
  25.         {
  26.                 delay_ms(200);
  27.         }
  28. }

  29. /******************************************************************************
  30. * 描  述 : 10 us延时
  31. * 入  参 : 无
  32. * 返回值 : 无
  33. *****************************************************************************/
  34. void Delay_10us()
  35. {
  36.         uint j,i;   
  37.         for(j=0;j<2;j++)   
  38.         {   
  39.                 for(i=0;i<7;i++);   
  40.         }  
  41. }
复制代码
delay.h
  1. #ifndef        __DELAY_H
  2. #define        __DELAY_H

  3. #define MAIN_Fosc                11059200L        //定义主时钟
  4. #include        "STC8.H"

  5. #define  uchar    unsigned char
  6. #define  uint   unsigned int  


  7. void  delay_ms(unsigned char ms);
  8. void  delay_2000ms(void);
  9. void Delay_10us();
  10. #endif
复制代码
自学,代码属于拼凑型,以上测试可以运行,

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

101

主题

332

帖子

7422

积分

版主

Rank: 7Rank: 7Rank: 7

积分
7422
发表于 2021-11-8 08:56:43 | 显示全部楼层
点赞
回复

使用道具 举报

2

主题

12

帖子

60

积分

注册会员

Rank: 2

积分
60
发表于 2021-11-16 12:13:08 | 显示全部楼层
比我做的好
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|手机版|官方淘宝店|930电子网 ( 皖ICP备16000695号-2 )

Copyright © 合肥艾克姆电子科技有限公司
快速回复 返回顶部 返回列表