DHT11.c 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. #include <ioCC2530.h>
  2. #include "OnBoard.h"
  3. typedef unsigned char uchar;
  4. typedef unsigned int uint;
  5. #define DATA_PIN P0_7
  6. void Delay_us(void);
  7. void Delay_10us(void);
  8. void Delay_ms(uint Time);
  9. void COM(void);
  10. void DHT11(void);
  11. //温湿度定义
  12. uchar ucharFLAG,uchartemp;
  13. //uchar shidu_shi,shidu_ge,wendu_shi,wendu_ge=4;
  14. uchar shidu, wendu;
  15. uchar ucharT_data_H,ucharT_data_L,ucharRH_data_H,ucharRH_data_L,ucharcheckdata;
  16. uchar ucharT_data_H_temp,ucharT_data_L_temp,ucharRH_data_H_temp,ucharRH_data_L_temp,ucharcheckdata_temp;
  17. uchar ucharcomdata;
  18. //延时函数
  19. void Delay_us(void) //1 us延时
  20. {
  21. MicroWait(1);
  22. }
  23. void Delay_10us(void) //10 us延时
  24. {
  25. MicroWait(10);
  26. }
  27. void Delay_ms(uint Time)//n ms延时
  28. {
  29. unsigned char i;
  30. while(Time--)
  31. {
  32. for(i=0;i<100;i++)
  33. Delay_10us();
  34. }
  35. }
  36. //温湿度传感
  37. void COM(void) // 温湿写入
  38. {
  39. uchar i;
  40. for(i=0;i<8;i++)
  41. {
  42. ucharFLAG=2;
  43. while((!DATA_PIN)&&ucharFLAG++);
  44. Delay_10us();
  45. Delay_10us();
  46. Delay_10us();
  47. uchartemp=0;
  48. if(DATA_PIN)uchartemp=1;
  49. ucharFLAG=2;
  50. while((DATA_PIN)&&ucharFLAG++);
  51. if(ucharFLAG==1)break;
  52. ucharcomdata<<=1;
  53. ucharcomdata|=uchartemp;
  54. }
  55. }
  56. void DHT11(void) //温湿传感启动
  57. {
  58. P0SEL &= 0x7f;
  59. P0DIR |= 0x80; //重新配置IO口方向
  60. DATA_PIN=0;
  61. Delay_ms(19); //>18MS
  62. DATA_PIN=1;
  63. P0DIR &= ~0x80; //重新配置IO口方向
  64. Delay_10us();
  65. Delay_10us();
  66. Delay_10us();
  67. Delay_10us();
  68. if(!DATA_PIN)
  69. {
  70. ucharFLAG=2;
  71. while((!DATA_PIN)&&ucharFLAG++);
  72. ucharFLAG=2;
  73. while((DATA_PIN)&&ucharFLAG++);
  74. COM();
  75. ucharRH_data_H_temp=ucharcomdata;
  76. COM();
  77. ucharRH_data_L_temp=ucharcomdata;
  78. COM();
  79. ucharT_data_H_temp=ucharcomdata;
  80. COM();
  81. ucharT_data_L_temp=ucharcomdata;
  82. COM();
  83. ucharcheckdata_temp=ucharcomdata;
  84. DATA_PIN=1;
  85. uchartemp=(ucharT_data_H_temp+ucharT_data_L_temp+ucharRH_data_H_temp+ucharRH_data_L_temp);
  86. if(uchartemp==ucharcheckdata_temp)
  87. {
  88. ucharRH_data_H=ucharRH_data_H_temp;
  89. ucharRH_data_L=ucharRH_data_L_temp;
  90. ucharT_data_H=ucharT_data_H_temp;
  91. ucharT_data_L=ucharT_data_L_temp;
  92. ucharcheckdata=ucharcheckdata_temp;
  93. }
  94. wendu = ucharT_data_H;
  95. shidu = ucharRH_data_H;
  96. //wendu_shi=ucharT_data_H/10;
  97. //wendu_ge=ucharT_data_H%10;
  98. //shidu_shi=ucharRH_data_H/10;
  99. //shidu_ge=ucharRH_data_H%10;
  100. }
  101. else //没用成功读取,返回0
  102. {
  103. wendu = 0;
  104. shidu = 0;
  105. }
  106. P0DIR |= 0x80; //IO口需要重新配置
  107. }