[DemoCode下载] M0516lbn读取DHT11

[复制链接]
881|3
 楼主| yiyigirl2014 发表于 2016-7-31 22:08 | 显示全部楼层 |阅读模式
  1. #include "delay.h"

  2. void delay_us(uint32_t unCnt)//delay_us(2)-->6US;delay_us(5)-->10US;delay_us(24);-->30US
  3. {
  4.         SYST_RVR = unCnt*12; //系统时钟频率 12MHz,计数一次1/12(us),所以乘以12
  5.         SYST_CVR = 0;
  6.         SYST_CSR |=1UL<<0;
  7.         while((SYST_CSR & 1UL<<16)==0);
  8. //        uint16_t i=0;
  9. //        uint16_t j=0;
  10. //        for(i=0;i<unCnt;i++)
  11. //        {
  12. //                j++;j++;j++;j++;        
  13. //        }
  14. }

  15. void delay_ms(uint32_t unCnt)
  16. {
  17.         SYST_RVR = unCnt*12000; //系统时钟频率 12MHz
  18.         SYST_CVR = 0;
  19.         SYST_CSR |=1UL<<0;
  20.         while((SYST_CSR & 1UL<<16)==0);
  21. //        uint16_t i,j;
  22. //        for(i=0;i<unCnt;i++)
  23. //        {
  24. //                for(j=0;j<1169;j++)
  25. //                {}        
  26. //        }
  27. }

  28. void delay_280us(void)
  29. {
  30.         uint16_t i;
  31.         for(i=0;i<415;i++)
  32.         {        
  33.         }
  34. }

  35. void delay_20ms(void)
  36. {
  37.         uint16_t i,j;
  38.         for(j=0;j<16800;j++)
  39.         {}        
  40. }

  41. void delay_10us(void)
  42. {
  43.         uint16_t i;
  44.         for(i=0;i<14;i++)
  45.         {        
  46.         }
  47. }

  48. void delay_5us(void)
  49. {
  50.         uint16_t i;
  51.         for(i=0;i<6;i++)
  52.         {        
  53.         }
  54. }

  55. void delay_30us(void)
  56. {
  57.         uint16_t i;
  58.         for(i=0;i<55;i++)
  59.         {        
  60.         }
  61. }

  62. void delay_40us(void)
  63. {
  64.         uint16_t i;
  65.         for(i=0;i<65;i++)
  66.         {        
  67.         }
  68. }
  69. void delay_80us(void)
  70. {
  71.         uint16_t i;
  72.         for(i=0;i<155;i++)
  73.         {        
  74.         }
  75. }


  76. #define DHT_OUT                  P0_PMD=P0_PMD&0XFFFC|0X0001
  77. #define DHT_IN                 P0_PMD=P0_PMD&0XFFFC
  78. #define DHT_IO                 P0_PMD=P0_PMD&0XFFFC|0X0003
  79. #define DHT_OD                 P0_PMD=P0_PMD&0XFFFC|0X0002
  80. #define DHT_H            P0_DOUT|=(1<<0)
  81. #define DHT_L            P0_DOUT&=~(1<<0)
  82. #define DHT_DATA    P0_PIN&0X01

  83. uint8_t DHTSTA=1;

  84. uint8_t DHT11_ReadDis(void)
  85. {
  86.         uint8_t i=0,j=0,dat1,dat2,dat3,dat4,dat5;
  87.         DHT_IO;
  88.         DHT_L;
  89.         delay_20ms();
  90.         DHT_H;
  91.         delay_us(5);//延时10us
  92.         //等待DHT11的低电平响应
  93.         while(((*((volatile unsigned long *)0x50004010UL))&0X01));//((*((volatile unsigned long *)0x50004010UL)) --> P0_PIN,换成P0_PIN就不行,读不出数据了
  94.         //DHT11响应80us的低电平后会有一个80us的高电平
  95.         while(!((*((volatile unsigned long *)0x50004010UL))&0X01));//DHT11会拉高40~80us,等待高电平                       -_↓_----               
  96.         //开始接收数据
  97.         for(i=0;i<8;i++)
  98.         {
  99.                 dat1<<=1;
  100.                 while(((*((volatile unsigned long *)0x50004010UL))&0X01)); //等待低电平
  101.                 while(!((*((volatile unsigned long *)0x50004010UL))&0X01));//等待高电平
  102.                 delay_30us();//30us之后还是高电平,那此位为1
  103.                 if((*((volatile unsigned long *)0x50004010UL))&0X01)
  104.                 {
  105.                         dat1|=0x01;
  106.                 }
  107.         }
  108.         for(i=0;i<8;i++)
  109.         {
  110.                 dat2<<=1;
  111.                 while(((*((volatile unsigned long *)0x50004010UL))&0X01));
  112.                 while(!((*((volatile unsigned long *)0x50004010UL))&0X01));delay_30us();
  113.                 if((*((volatile unsigned long *)0x50004010UL))&0X01)
  114.                 {
  115.                         dat2|=0x01;
  116.                 }
  117.         }
  118.         for(i=0;i<8;i++)
  119.         {
  120.                 dat3<<=1;
  121.                 while(((*((volatile unsigned long *)0x50004010UL))&0X01));
  122.                 while(!((*((volatile unsigned long *)0x50004010UL))&0X01));delay_30us();
  123.                 if((*((volatile unsigned long *)0x50004010UL))&0X01)
  124.                 {
  125.                         dat3|=0x01;
  126.                 }
  127.         }
  128.         for(i=0;i<8;i++)
  129.         {
  130.                 dat4<<=1;
  131.                 while(((*((volatile unsigned long *)0x50004010UL))&0X01));
  132.                 while(!((*((volatile unsigned long *)0x50004010UL))&0X01)); delay_30us();
  133.                 if((*((volatile unsigned long *)0x50004010UL))&0X01)
  134.                 {
  135.                         dat4|=0x01;
  136.                 }
  137.         }
  138.         for(i=0;i<8;i++)
  139.         {
  140.                 dat5<<=1;
  141.                 while(((*((volatile unsigned long *)0x50004010UL))&0X01));
  142.                 while(!((*((volatile unsigned long *)0x50004010UL))&0X01));
  143.                 delay_30us();
  144.                 if((*((volatile unsigned long *)0x50004010UL))&0X01)
  145.                 {
  146.                         dat5|=0x01;
  147.                 }
  148.         }
  149.         //DHT响应完毕,准备接收数据        
  150.         if(dat5==(dat1+dat2+dat3+dat4))
  151.         {
  152.                 LCD3029_DisHZ16Num(216,223,111,126,&num[dat1%100/10][0],WHITE,BLACK);
  153.                 LCD3029_DisHZ16Num(224,231,111,126,&num[dat1%10][0],WHITE,BLACK);
  154.                 LCD3029_DisHZ16Num(216,223,130,145,&num[dat3%100/10][0],WHITE,BLACK);
  155.                 LCD3029_DisHZ16Num(224,231,130,145,&num[dat3%10][0],WHITE,BLACK);               
  156.         }

  157.         return        DHTSTA;
  158. }


 楼主| yiyigirl2014 发表于 2016-7-31 22:10 | 显示全部楼层
DHT11是一款有已校准数字信号输出的温湿度传感器。 精度湿度+-5%RH, 温度+-2℃,量程湿度20-90%RH, 温度0~50℃。
 楼主| yiyigirl2014 发表于 2016-7-31 22:12 | 显示全部楼层
DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器,它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性和卓越的长期稳定性。传感器包括一个电阻式感湿元件和一个NTC测温元件,并与一个高性能8位单片机相连接。因此该产品具有品质卓越、超快响应、抗干扰能力强、性价比极高等优点。每个DHT11传感器都在极为精确的湿度校验室中进行校准。校准系数以程序的形式存在OTP内存中,传感器内部在检测信号的处理过程中要调用这些校准系数。单线制串行接口,使系统集成变得简易快捷。超小的体积、极低的功耗,使其成为该类应用中,在苛刻应用场合的最佳选择。产品为4针单排引脚封装,连接方便。
 楼主| yiyigirl2014 发表于 2016-7-31 22:12 | 显示全部楼层
  1. //****************************************************************//
  2. // DHT21使用范例
  3. //单片机 : AT89S52 或 STC89C52RC
  4. // 功能 :串口发送温湿度数据 波特率 9600
  5. //硬件连接: P2.0口为通讯口连接DHT11,DHT11的电源和地连接单片机的电源和地,单片机串口加MAX232连接电脑
  6. #include <reg51.h>
  7. #include <intrins.h>
  8. //
  9. typedef unsigned char U8; /* defined for unsigned 8-bits integer variable 无符号8位整型变量 */
  10. typedef signed char S8; /* defined for signed 8-bits integer variable 有符号8位整型变量 */
  11. typedef unsigned int U16; /* defined for unsigned 16-bits integer variable 无符号16位整型变量 */
  12. typedef signed int S16; /* defined for signed 16-bits integer variable 有符号16位整型变量 */
  13. typedef unsigned long U32; /* defined for unsigned 32-bits integer variable 无符号32位整型变量 */
  14. typedef signed long S32; /* defined for signed 32-bits integer variable 有符号32位整型变量 */
  15. typedef float F32; /* single precision floating point variable (32bits) 单精度浮点数(32位长度) */
  16. typedef double F64; /* double precision floating point variable (64bits) 双精度浮点数(64位长度) */
  17. //
  18. #define uchar unsigned char
  19. #define uint unsigned int
  20. #define Data_0_time 4
  21. //--------------- --------------------//
  22. //----------------IO口定义区--------------------//
  23. //-------------- --------------------------//
  24. sbit P2_0 = P2^0 ;//DATA
  25. sbit P2_1 = P2^1 ;
  26. sbit P2_2 = P2^2 ;
  27. sbit P2_3 = P2^3 ;
  28. //--------- ------------------------------------//
  29. //----------------定义区--------------------//
  30. //--------------------- -----------------------//
  31. U8 U8FLAG,k;
  32. U8 U8count,U8temp;
  33. U8 U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;
  34. U8 U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;
  35. U8 U8comdata;
  36. U8 outdata[5]; //定义发送的字节数
  37. U8 indata[5];
  38. U8 count, count_r=0;
  39. U8 str[5]={"RS232"};
  40. U16 U16temp1,U16temp2;
  41. SendData(U8 *a)
  42. {
  43. outdata[0] = a[0];
  44. outdata[1] = a[1];
  45. outdata[2] = a[2];
  46. outdata[3] = a[3];
  47. outdata[4] = a[4];
  48. count = 1;
  49. SBUF=outdata[0];
  50. }
  51. void Delay(U16 j)
  52. { U8 i;
  53. for(;j>0;j--)
  54. {
  55. for(i=0;i<27;i++);
  56. }
  57. }
  58. void Delay_10us(void)
  59. {
  60. U8 i;
  61. i--;
  62. i--;
  63. i--;
  64. i--;
  65. i--;
  66. i--;
  67. }
  68. void COM(void)
  69. {
  70. U8 i;
  71. for(i=0;i<8;i++)
  72. {
  73. U8FLAG=2;
  74. //----------------------
  75. P2_1=0 ; //T
  76. P2_1=1 ; //T
  77. //----------------------
  78. while((!P2_0)&&U8FLAG++);
  79. Delay_10us();
  80. Delay_10us();
  81. // Delay_10us();
  82. U8temp=0;
  83. if(P2_0)U8temp=1;
  84. U8FLAG=2;
  85. while((P2_0)&&U8FLAG++);
  86. //----------------------
  87. P2_1=0 ; //T
  88. P2_1=1 ; //T
  89. //----------------------
  90. //超时则跳出for循环
  91. if(U8FLAG==1)break;
  92. //判断数据位是0还是1
  93. // 如果高电平高过预定0高电平值则数据位为 1
  94. U8comdata<<=1;
  95. U8comdata|=U8temp; //0
  96. }//rof
  97. }
  98. //------------  --------------------
  99. //-----湿度读取子程序 ------------
  100. //----------------------  ----------
  101. //----以下变量均为全局变量--------
  102. //----温度高8位== U8T_data_H------
  103. //----温度低8位== U8T_data_L------
  104. //----湿度高8位== U8RH_data_H-----
  105. //----湿度低8位== U8RH_data_L-----
  106. //----校验 8位 == U8checkdata-----
  107. //----调用相关子程序如下----------
  108. //---- Delay();, Delay_10us();COM();
  109. //---------------------    -----------
  110. void RH(void)
  111. {
  112. //主机拉低18ms
  113. P2_0=0;
  114. Delay(180);
  115. P2_0=1;
  116. //总线由上拉电阻拉高 主机延时20us
  117. Delay_10us();
  118. Delay_10us();
  119. Delay_10us();
  120. Delay_10us();
  121. //主机设为输入 判断从机响应信号
  122. P2_0=1;
  123. //判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行
  124. if(!P2_0) //T !
  125. {
  126. U8FLAG=2;
  127. //判断从机是否发出 80us 的低电平响应信号是否结束
  128. while((!P2_0)&&U8FLAG++);
  129. U8FLAG=2;
  130. //判断从机是否发出 80us 的高电平,如发出则进入数据接收状态
  131. while((P2_0)&&U8FLAG++);
  132. //数据接收状态
  133. COM();
  134. U8RH_data_H_temp=U8comdata;
  135. COM();
  136. U8RH_data_L_temp=U8comdata;
  137. COM();
  138. U8T_data_H_temp=U8comdata;
  139. COM();
  140. U8T_data_L_temp=U8comdata;
  141. COM();
  142. U8checkdata_temp=U8comdata;
  143. P2_0=1;
  144. //数据校验
  145. U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp);
  146. if(U8temp==U8checkdata_temp)
  147. {
  148. U8RH_data_H=U8RH_data_H_temp;
  149. U8RH_data_L=U8RH_data_L_temp;
  150. U8T_data_H=U8T_data_H_temp;
  151. U8T_data_L=U8T_data_L_temp;
  152. U8checkdata=U8checkdata_temp;
  153. }//fi
  154. }//fi
  155. }

  156. //---------------------------------------
  157. //main()功能描述: AT89C51 11.0592MHz 串口发
  158. //送温湿度数据,波特率 9600

  159. //----------------------------------------------
  160. void main()
  161. {
  162. U8 i,j;
  163. //uchar str[6]={"RS232"};
  164. /* 系统初始化 */
  165. TMOD = 0x20; //定时器T1使用工作方式2
  166. TH1 = 253; // 设置初值
  167. TL1 = 253;
  168. TR1 = 1; // 开始计时
  169. SCON = 0x50; //工作方式1,波特率9600bps,允许接收
  170. ES = 1;
  171. EA = 1; // 打开所以中断
  172. TI = 0;
  173. RI = 0;
  174. SendData(str) ; //发送到串口
  175. Delay(1); //延时100US(12M晶振)
  176. while(1)
  177. {
  178. //------------------------
  179. //调用温湿度读取子程序
  180. RH();
  181. //串口显示程序
  182. //--------------------------
  183. str[0]=U8RH_data_H;
  184. str[1]=U8RH_data_L;
  185. str[2]=U8T_data_H;
  186. str[3]=U8T_data_L;
  187. str[4]=U8checkdata;
  188. SendData(str) ; //发送到串口
  189. //读取模块数据周期不易小于 2S
  190. Delay(20000);
  191. }//elihw
  192. }// main
  193. void RSINTR() interrupt 4 using 2
  194. {
  195. U8 InPut3;
  196. if(TI==1) //发送中断
  197. {
  198. TI=0;
  199. if(count!=5) //发送完5位数据
  200. {
  201. SBUF= outdata[count];
  202. count++;
  203. }
  204. }
  205. if(RI==1) //接收中断
  206. {
  207. InPut3=SBUF;
  208. indata[count_r]=InPut3;
  209. count_r++;
  210. RI=0;
  211. if (count_r==5)//接收完4位数据
  212. {
  213. //数据接收完毕处理。
  214. count_r=0;
  215. str[0]=indata[0];
  216. str[1]=indata[1];
  217. str[2]=indata[2];
  218. str[3]=indata[3];
  219. str[4]=indata[4];
  220. P0=0;
  221. }
  222. }
  223. }


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

本版积分规则

230

主题

3676

帖子

10

粉丝
快速回复 在线客服 返回列表 返回顶部