找回密码
 立即注册
搜索
热搜: 中医 针灸 咳嗽
查看: 164|回复: 0

DHT11温度采集

[复制链接]

3711

主题

1

回帖

1万

积分

管理员

积分
11937
发表于 2023-1-18 11:37:04 | 显示全部楼层 |阅读模式
  1. /*DHT11*/
  2. #include <reg52.h>
  3. #include <intrins.h>
  4. #define Uint  unsigned int
  5. #define Uchar unsigned char
  6. #define Ulong unsigned long

  7. //数据类型定义
  8. typedef unsigned char  U8;       /* defined for unsigned 8-bits integer variable       无符号8位整型变量  */
  9. typedef signed   char  S8;       /* defined for signed 8-bits integer variable          有符号8位整型变量  */
  10. typedef unsigned int   U16;      /* defined for unsigned 16-bits integer variable       无符号16位整型变量 */
  11. typedef signed   int   S16;      /* defined for signed 16-bits integer variable       有符号16位整型变量 */
  12. typedef unsigned long  U32;      /* defined for unsigned 32-bits integer variable       无符号32位整型变量 */
  13. typedef signed   long  S32;      /* defined for signed 32-bits integer variable       有符号32位整型变量 */
  14. typedef float          F32;      /* single precision floating point variable (32bits) 单精度浮点数(32位长度) */
  15. typedef double         F64;      /* double precision floating point variable (64bits) 双精度浮点数(64位长度) */

  16. sbit DU = P2 ^ 6; // 数码管段选
  17. sbit WE = P2 ^ 7; // 位选
  18. sbit P3_6  = P3^6 ;     //DHT11数据针脚

  19. /* 8位选参照表
  20. FE 1
  21. FD 2
  22. fb 3
  23. f7 4
  24. ef 5
  25. df 6
  26. bf 7
  27. 7f 8
  28. */
  29. // 段选参照表
  30. //  0x06,  //"1"
  31. //  0x5B,  //"2"
  32. //  0x4F,  //"3"
  33. //  0x66,  //"4"
  34. //  0x6D,  //"5"
  35. //  0x7D,  //"6"
  36. //  0x07,  //"7"
  37. //  0x7F,  //"8"
  38. //  0x6F,  //"9"
  39. //  0x7C,  //"B"
  40. //  0x39,  //"C"
  41. //  0x5E,  //"D"
  42. //  0x79,  //"E"
  43. //  0x71,  //"F"
  44. //  0x76,  //"H"
  45. //  0x38,  //"L"
  46. //  0x40,  //"-"
  47. //  0x00,  //熄灭
  48. //  */



  49. //----------------------------------------------//
  50. //----------------数据存储和数据缓存区----------//
  51. //----------------------------------------------//
  52. U8  U8FLAG;
  53. U8  U8temp;
  54. U8  U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;
  55. U8  U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;
  56. U8  U8comdata;




  57. // 函数声明

  58. void showval(Uchar val, Uchar WEval);
  59. void delay(Uchar z, int mod);
  60. void display(Ulong Z);
  61. void Delay_10us(void);
  62. void COM(void);
  63. void RH(void);
  64. void Init(Ulong Z);
  65. int delay_display(Uchar z,Uchar val,uchar);

  66. U8 code led[10]={0x3F,0x06,0x5b, 0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
  67. Uchar code DUtabel[] = {
  68.     0x3F,
  69.     0x06,
  70.     0x5B,
  71.     0x4F,
  72.     0x66,
  73.     0x6D,
  74.     0x7D,
  75.     0x07,
  76.     0x7F,
  77.     0x6F,
  78.     0x77,
  79.     0x7C,
  80.     0x39,
  81.     0x5E,
  82.     0x79,
  83.     0x71,
  84.     0x76,
  85.     0x38,
  86.     0x40,
  87.     0x00,
  88. };

  89. Uchar code WEtabel[] = {
  90.     0x00, // 全亮,补位选空位
  91.     0xFE,
  92.     0xFD,
  93.     0xfb,
  94.     0xf7,
  95.     0xef,
  96.     0xdf,
  97.     0xbf,
  98.     0x7f,
  99. };

  100. void main()
  101. {
  102.     //报警值区域
  103.     // U8 tempAlarmMin = 20;
  104.     // U8 tempALarmMax = 32;
  105.     // U8 HumidityMin = 45;
  106.     // U8 HumidityMax = 65;

  107.     //显示循环次数
  108.     U8 number = 250;
  109.     U8 count = 0;

  110.     //系统初始化
  111.     //Init();

  112.         while (1)
  113.     {
  114.      
  115.         count =0;
  116.         Init(17);//初始化
  117.          delay(1,2);
  118.         RH();
  119.       
  120.              Init(11);//湿度初始化标识
  121.              delay(1,2);
  122.              delay_display(50,U8T_data_H,12);
  123.              Init(15);//温度初始化标识
  124.              delay(1,2);
  125.              delay_display(50,U8RH_data_H,16);

  126.         Init(888);//初始化
  127.       
  128.       
  129.         
  130.     }


  131. }
  132. /*
  133. 数码管显示函数:
  134. 参数1:显示的数据0-9
  135. 参数2:需要在显示的位1-8
  136. */
  137. void showval(Uchar val, Uchar WEval)
  138. {

  139.    
  140.     WE = 1;              // 打开位选锁存
  141.     P0 = WEtabel[WEval]; // 选择位选
  142.     WE = 0;              // 位锁存
  143.    
  144.    
  145.     DU = 1;            // 打开段选锁存器
  146.     P0 = DUtabel[val]; // 送数据
  147.     DU = 0;            // 段锁存
  148.    
  149.    
  150. }
  151. /*
  152. 延迟函数.
  153. 参数1:z为数量
  154. 参数2:mod为模式
  155. 1:毫秒
  156. 2:秒
  157. */
  158. void delay(Uchar z, int mod)
  159. {
  160.     Ulong i;
  161.     if (mod == 1) {
  162.         for (i = 0; i < z; i++) {

  163.             unsigned char a, b;
  164.             for (b = 102; b > 0; b--)
  165.                 for (a = 3; a > 0; a--)
  166.                     ;
  167.         }
  168.     }

  169.     else if (mod == 2) {
  170.         for (i = 0; i < z * 1000; i++) {
  171.             // 10000us //误差 -0.000000000002us
  172.             unsigned char a, b;
  173.             for (b = 102; b > 0; b--)
  174.                 for (a = 3; a > 0; a--) ;
  175.         }
  176.     }
  177. }
  178. /*显示长数字*/
  179. void display(Ulong Z)

  180. {
  181.     // Z长度
  182.     int Zlen = 0;
  183.     /*存储Z每个位的数字数组变量*/
  184.     int val[8];
  185.     int i;

  186.     while (Z != 0) {
  187.         // 提取n的各个数位上的数
  188.         val[Zlen++] = Z % 10;
  189.         Z /= 10;
  190.     }

  191.     for (i = 0; i < Zlen; i++) {
  192.         P0 = 0XFF;           // 清除段码
  193.         showval(val[i], 8 - i);
  194.          
  195.         delay(5, 1);
  196.     }
  197.   
  198.    
  199. }

  200. /*延时程序10us*/
  201. void  Delay_10us(void)
  202. {
  203.     U8 i;
  204.     i--;
  205.     i--;
  206.     i--;
  207.     i--;
  208.     i--;
  209.     i--;
  210. }
  211. /*
  212. //--------------------------------
  213. //-----湿度读取子程序 ------------
  214. //--------------------------------
  215. //----以下变量均为全局变量--------
  216. //----温度高8位== U8T_data_H------
  217. //----温度低8位== U8T_data_L------
  218. //----湿度高8位== U8RH_data_H-----
  219. //----湿度低8位== U8RH_data_L-----
  220. //----校验 8位 == U8checkdata-----
  221. //----调用相关子程序如下----------
  222. //---- Delay();, Delay_10us();,COM();
  223. //--------------------------------
  224. */
  225. void COM(void)
  226. {

  227.     U8 i;

  228.     for(i=0;i<8;i++)
  229.     {

  230.            U8FLAG=2;
  231.            while((!P3_6)&&U8FLAG++);

  232.         Delay_10us();
  233.         Delay_10us();
  234.         Delay_10us();

  235.         U8temp=0;

  236.         if(P3_6)U8temp=1;
  237.             U8FLAG=2;

  238.         while((P3_6)&&U8FLAG++);

  239.            //超时则跳出for循环
  240.             if(U8FLAG==1)
  241.              break;

  242.            //判断数据位是0还是1
  243.         // 如果高电平高过预定0高电平值则数据位为 1

  244.         U8comdata<<=1;
  245.            U8comdata|=U8temp;        //0
  246.     }//rof

  247. }

  248. /*总线数据读取*/
  249. void RH(void)
  250. {
  251.        //主机拉低18ms
  252.        P3_6=0;
  253.        delay(18,1);

  254.        //总线由上拉电阻拉高 主机延时20us
  255.        P3_6=1;
  256.        Delay_10us();
  257.        Delay_10us();
  258.        Delay_10us();
  259.        Delay_10us();

  260.     //主机设为输入 判断从机响应信号
  261.        P3_6=1;

  262.       //判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行
  263.    if(!P3_6)         //T !
  264.     {
  265.         U8FLAG=2;
  266.         //判断从机是否发出 80us 的低电平响应信号是否结束
  267.         while((!P3_6)&&U8FLAG++);

  268.         U8FLAG=2;
  269.         //判断从机是否发出 80us 的高电平,如发出则进入数据接收状态
  270.         while((P3_6)&&U8FLAG++);


  271.         //数据接收状态
  272.         COM();
  273.         U8RH_data_H_temp=U8comdata;
  274.         COM();
  275.         U8RH_data_L_temp=U8comdata;
  276.         COM();
  277.         U8T_data_H_temp=U8comdata;
  278.         COM();
  279.         U8T_data_L_temp=U8comdata;
  280.         COM();
  281.         U8checkdata_temp=U8comdata;

  282.         //数据读取完后拉高总线电平
  283.         P3_6=1;

  284.          //数据校验
  285.         U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp);
  286.         if(U8temp==U8checkdata_temp)
  287.         {
  288.             U8RH_data_H=U8RH_data_H_temp;
  289.             U8RH_data_L=U8RH_data_L_temp;
  290.             U8T_data_H=U8T_data_H_temp;
  291.             U8T_data_L=U8T_data_L_temp;
  292.             U8checkdata=U8checkdata_temp;
  293.         }
  294.     }

  295. }
  296. /*
  297. //----------------------------------------------//
  298. //------------温度湿度数码管显示区--------------//
  299. //----------------------------------------------//
  300. //设置温度值
  301. */


  302. /*
  303. //----------------------------------------------//
  304. //-----系统初始化点亮报警灯和显示数码管---------//
  305. //-----点亮报警灯,显示数码管88------------------//
  306. //----------------------------------------------//
  307. //系统初始化
  308. */
  309. void Init(Ulong Z)
  310. {
  311.     U8 number = 1000; //闪烁频率
  312.     U8 count = 0;      //计数

  313.     while(count < number)
  314.     {
  315.         //设置温度
  316.        // display(Z);
  317.        if (Z==11)
  318.        {
  319.         P0 = 0XFF;
  320.         showval(12, 1);
  321.         //delay(5, 1);
  322.         //P0 = 0XFF;
  323.        }
  324.        else if (Z==15)
  325.        {
  326.         P0 = 0XFF;
  327.         showval(16, 1);
  328.         //delay(5, 1);
  329.         //P0 = 0XFF;
  330.        }
  331.        else
  332.        {
  333.         P0 = 0XFF;
  334.         showval(18, 1);
  335.         //delay(5, 1);
  336.        // P0 = 0XFF;
  337.        }
  338.       
  339.       
  340.       
  341.         count++;
  342.     }
  343.    

  344.    
  345. }

  346. int delay_display(Uchar z,Uchar val,Uchar typeshow)
  347. {
  348.     Ulong i;
  349.    
  350.         for (i = 0; i < z; i++) {

  351.             unsigned char a, b;
  352.            display(val);
  353.            if(typeshow==12){
  354.             showval(12, 1);
  355.            }else if (typeshow==16)
  356.            {
  357.             showval(16, 1);
  358.            }else{}
  359.            
  360.             for (b = 102; b > 0; b--)
  361.             
  362.                 for (a = 3; a > 0; a--){
  363.                     
  364.                
  365.                 }
  366.         }
  367.    
  368.     return 0;
  369. }
复制代码
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|私人站点 ( 冀ICP备2023028127号-2 )

GMT+8, 2025-7-5 05:28 , Processed in 0.078190 second(s), 21 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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