找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2086|回复: 0
收起左侧

IAP15F2K61S2单片机+DHT11源程序

[复制链接]
ID:484359 发表于 2019-7-17 13:29 | 显示全部楼层 |阅读模式
IAP15F2K61S2单片机 + DHT11 亲测可以实现功能,欢迎大家下载

单片机源程序如下:
  1. /*********************************************************************************************
  2. 程序名:    DHT11驱动程序
  3. *********************************************************************************************
  4. 说明:1、单片机是IAP15F61S2,晶振频率12MHz,实验成功。换用12T单片机或别的晶振的时候要修改        
  5.           延时函数和JUDGE。程序里判断超时的变量t的阀值也要改。15F单片机处理速度快一点,51的慢,
  6.           2、好东西要共享,大家随意折腾~~
  7. *********************************************************************************************/

  8. char Check (void);
  9. typedef unsigned char        uchar;
  10. typedef unsigned int        uint;
  11. #define JUDGE        30                //用于判断通信的0和1,与单片机速度和晶振频率有关
  12. sbit DATA = P1^1;                //定义数据引脚
  13. uchar dat_r[5],checkout;                        //用于存放从DHT11读取到的数值

  14. /*        checkout 为校验位;
  15.         dat_r[0]->温度整数
  16.         dat_r[1]->温度小数
  17.         dat_r[2]->湿度整数
  18.         dat_r[3]->湿度小数
  19.         dat_r[4]->校验位
  20.         dat_r[1]->温度小数
  21. */
  22. /*********************************************************************************************
  23. 函数名:延时函数
  24. 调  用:Delay30us();/Delay20ms();/Delay1s();
  25. 参  数:无
  26. 返回值:无
  27. 结  果:延时相应时间
  28. 备  注:振荡晶体为12MHz(所有延时函数Copy自STC-ISP(v6.85).exe)
  29. **********************************************************************************************/
  30. void Delay30us()                //@12.000MHz
  31. {
  32.     unsigned char i;
  33.     i = 87;
  34.     while (--i);
  35. }
  36. void Delay20ms()                //@12.000MHz
  37. {
  38.     unsigned char i, j, k;
  39.     i = 1;
  40.     j = 234;
  41.     k = 113;
  42.     do
  43.     {
  44.             do
  45.             {
  46.                     while (--k);
  47.             } while (--j);
  48.     } while (--i);
  49. }
  50. void Delay1s()                //@12.000MHz
  51. {
  52.     unsigned char i, j, k;
  53.     i = 46;
  54.     j = 153;
  55.     k = 245;
  56.     do
  57.     {
  58.         do
  59.         {
  60.                 while (--k);
  61.         } while (--j);
  62.     } while (--i);
  63. }

  64. /*********************************************************************************************
  65. 函数名:DHT11读数据函数
  66. 调  用:? = GetData();
  67. 参  数:无
  68. 返回值:失败->-1,-2,-3,-4;成功->0
  69. 结  果:读DHT11数据并保存到数组dat_r[]
  70. 备  注:
  71. **********************************************************************************************/
  72. char GetData (void)
  73. {
  74.     uchar i,j;                                //for循环变量
  75.     uchar t;                                //超时判断
  76.     uchar dat8=0;                        //一次读取的8位数据,需要读5次
  77.     DATA = 0;                                //主机发起始信号
  78.     Delay20ms();                        //主机拉低总线至少18ms
  79.     DATA = 1;                                //主机拉高总线20~40us
  80.     Delay30us();
  81.     t = 80;                                        //设置超时等待时间
  82.     while(DATA && t--);                //等待DHT11拉低总线
  83.     if(t == 0)                                //超时
  84.     {
  85.             DATA = 1;
  86.             return -1;                        //通信错误退出,返回错误信号:-1
  87.     }
  88.     //等80us响应信号
  89.     t = 250;                                //设置超时等待时间
  90.     while(!DATA && t--);        //等待DHT11拉高总线
  91.     if(t == 0)                                //超时
  92.     {
  93.             DATA = 1;
  94.             return -2;                        //通信错误退出,返回错误信号:-2
  95.     }
  96.     //等80us响应信号
  97.     t = 250;                                //设置超时等待时间
  98.     while(DATA && t--);                //等待DHT11拉低总线
  99.     if(t == 0)                                //超时
  100.     {
  101.             DATA = 1;
  102.             return -3;                        //通信错误退出,返回错误信号:-3
  103.     }
  104.     for(j=0; j<5; j++)                //5次读取
  105.     {
  106.         for(i=0; i<8; i++)                        //1次8个位
  107.         {
  108.             //等待50us开始时隙
  109.             t = 150;                                //设置超时等待时间
  110.             while(!DATA && t--);        //等待DHT11拉高总线
  111.             if(t == 0)                                //超时
  112.             {
  113.                     DATA = 1;
  114.                     return -4;                        //通信错误退出,返回错误信号:-4
  115.             }
  116.             t = 0;                                        //记录时间清零
  117.             while(DATA && ++t);                //等待并记录高电平持续时间
  118.             dat8 <<= 1;
  119.             if(t > JUDGE)                        //高电平持续时间较长(70us)
  120.                     dat8 += 1;                        //传输值为1
  121.             //else dat8 += 0;
  122.         }
  123.         dat_r[j] = dat8;
  124.     }
  125.     Delay30us();                //等待DHT11拉低50us
  126.     Delay30us();
  127.     DATA = 1;                        //结束,拉高总线
  128.         checkout = Check();
  129.         if(checkout == 0)return 0;            //校验成功,返回成功信号
  130.         else return(88);        //返回不成功                        
  131. }

  132. /*********************************************************************************************
  133. 函数名:数据校验函数
  134. 调  用:? = Check();
  135. 参  数:无
  136. 返回值:成功->0;失败->-1;
  137. 结  果:数据校验
  138. 备  注:数据传送正确时校验和数据等于“8bit湿度整数数据+8bit湿度小数数据+8bi温度整数数据+8bit温度小数数据”所得结果的末8位。
  139. **********************************************************************************************/
  140. char Check (void)
  141. {
  142.         uchar i;                        //for循环变量
  143.         uint chk=0;                        //校验和
  144.         for(i=0; i<4; i++)
  145.                 chk += dat_r[i];                //累加
  146.         if((uchar)chk != dat_r[4])        //比对
  147.                 return -1;                                //返回错误信号:-1
  148.         else
  149.                 return 0;                                //返回正确信号:0
  150. }

复制代码

  1. #include <REGX51.H>
  2. #include <init.c>
  3. #include <DHT11.c>
  4. unsigned int cp,adc,cp1;
  5. char kk,mm,temp,hum;
  6. void display()
  7. {
  8.         unsigned char j;
  9.         P0 = 0xff;
  10.         switch(j)
  11.         {
  12.                 case 0:display_mm(0x01,0xc0);break;
  13.                 case 1:display_mm(0x02,0xc0);break;
  14.                 case 2:display_mm(0x04,seg[hum/10]);break;
  15.                 case 3:display_mm(0x08,seg[hum%10]);break;
  16.                 case 4:display_mm(0x10,0xbf);break;
  17.                 case 5:display_mm(0x20,0xbf);break;
  18.                 case 6:display_mm(0x40,seg[temp/10]);break;
  19.                 case 7:display_mm(0x80,seg[temp%10]);break;               
  20.         }j++;if(j >= 8) j = 0;
  21. }
  22. void T0_isr()interrupt 1
  23. {
  24.         TH0 = (65536-2000)/256;
  25.         TL0 = (65536-2000)%256;
  26.         cp++;
  27.         
  28.         display();

  29. }
  30. void T0_init()
  31. {
  32.         TMOD = 0x01;
  33.         TH0 = (65536-2000)/256;
  34.         TL0 = (65536-2000)%256;
  35.         EA = 1;
  36.         ET0 = 1;
  37.         TR0 = 1;
  38. }
  39. void main()
  40. {
  41.         T0_init();
  42.         ULN2003(0x00);
  43.         led(0x00);
  44.         Delay1s();
  45.         while(1)
  46.         {
  47.                 if(cp >= 1000)         //读取数据时间不能小于1秒 时间 > 1s
  48.                 {
  49.                         cp = 0;
  50.                         kk = GetData();//读取数据               
  51.                 }
  52.                 if(kk == 0)          //数据读取成功
  53.                 {
  54.                         hum = dat_r[0];
  55.                         temp =         dat_r[2];
  56.                 }        

  57.         }
  58. }
复制代码

所有资料51hei提供下载:
温湿度传感器—DHT11.zip (27.06 KB, 下载次数: 18)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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