设为首页收藏本站帮助中心
查看: 60|回复: 0
收起左侧

STC-Y3系列单片机实现驱动DHT11数字温湿度传感器模块 程序源码 并通过串口发送显示

[复制链接]
发表于 2023-12-17 21:05:33 | 显示全部楼层 |阅读模式
单片机型号:STC12C5A60S2 晶振频率:12Mhz 串口波特率:3125 DHT11接P3.2

DHT11.png
  1. #include "stc12c5a60s2.h"
  2. #include "intrins.h"
  3. #include "stdlib.h"
  4. #include "stdio.h"
  5. #define u8 unsigned char
  6. #define u16 unsigned int
  7. #define u32 unsigned long
  8. #define f(i) (float)(i)
  9. sbit DHT11 = P3 ^ 2;

  10. void InitUART(){    //初始化串口(12Mhz@3125bps)
  11.     TMOD = 0x20;
  12.     SCON = 0x50;
  13.     TH1 = 0xF6;
  14.     TL1 = TH1;
  15.     PCON = 0x00;
  16.     TR1 = 1;
  17. }

  18. void txd_byte(u8 c){        //串口发送1字节
  19.     SBUF = c;
  20.     while(!TI);
  21.     TI = 0;
  22. }

  23. void txd_text(u8* text) {        //串口发送字符串
  24.     for (; *text != 0; text++) {
  25.         txd_byte(*text);
  26.     }
  27. }

  28. void Delay18ms(void)        //@12MHz
  29. {
  30.         unsigned char data i, j;

  31.         _nop_();
  32.         _nop_();
  33.         i = 211;
  34.         j = 25;
  35.         do
  36.         {
  37.                 while (--j);
  38.         } while (--i);
  39. }

  40. void Delay2000ms(void)        //@12MHz
  41. {
  42.         unsigned char data i, j, k;

  43.         i = 92;
  44.         j = 50;
  45.         k = 238;
  46.         do
  47.         {
  48.                 do
  49.                 {
  50.                         while (--k);
  51.                 } while (--j);
  52.         } while (--i);
  53. }

  54. u8 dht11_us(bit signal){                //DHT11电平时间计数 超时255微秒
  55.         TL0 = 0;
  56.         TF0 = 0;
  57.         while(signal == DHT11 && !TF0);
  58.         return TF0 ? 255 : TL0;
  59. }

  60. void dht11_init(){        //初始化与DHT11有关的寄存器
  61.         AUXR &= 0x7F;                        //定时器时钟12T模式
  62.         TMOD &= 0xF0;                        //设置定时器模式
  63.         TMOD |= 0x02;                        //设置定时器模式
  64.         TH0 = 0;
  65.         TL0 = 0;
  66.         TR0 = 1;
  67. }

  68. /*
  69. DHT11读取温度与湿度 (成功返回0,失败返回非0)
  70. 参数1:温度指针(摄氏度) 参数2:湿度指针
  71. */
  72. u8 dht11(float *temperature,float *humidity){
  73.         u8 i;
  74.         u8 c[5];
  75.         *temperature = 0;
  76.         *humidity = 0;
  77.         for(i=0;i<5;i++){
  78.                 c[i] = 0;
  79.         }
  80.         DHT11 = 0;                                //主动拉低DHT11 18ms(18000us)
  81.         Delay18ms();
  82.         DHT11 = 1;                                //主动拉高
  83.         if(dht11_us(1) == 255){                //等待被拉低超时
  84.                 return 1;
  85.         }
  86.         dht11_us(0);        //被拉低83us
  87.         dht11_us(1);        //被拉高87us
  88.         for(i=0;i<40;i++){
  89.                 dht11_us(0);                //1bit开始 (被拉低54us)
  90.                         if(dht11_us(1) > 60) {        //超过60us
  91.                                 c[i >> 3] |= 1 << (7^(i&7));
  92.                         }
  93.                 }
  94.         dht11_us(0);
  95.         i = c[0] + c[1] + c[2] + c[3];
  96.         if(i != c[4]){        //校验和错误
  97.                 return 2;
  98.         }
  99.         *humidity = f(c[0]) + f(c[1])/10;                        //湿度
  100.         *temperature = f(c[2]) + f(c[3]&127)/10;                //温度
  101.         if(c[3]&128){                //零下温度
  102.                 *temperature = 0 - *temperature;
  103.         }
  104.         return 0;
  105. }

  106. u8 text[32];
  107. void main() {
  108.         float temperature;
  109.         float humidity;
  110.         u8 ecode;
  111.         dht11_init();
  112.         InitUART();
  113.         while (1) {
  114.                 Delay2000ms();
  115.                 ecode = dht11(&temperature,&humidity);
  116.                 if(ecode){
  117.                         sprintf(text,"DHT11 错误! 错误代码:0x%02X\r\n",(u16)ecode);
  118.                 } else {
  119.                         sprintf(text,"温度:%3.3f℃ 湿度:%3.3f%%\r\n",temperature,humidity);

  120.                 }
  121.                 txd_text(text);
  122.         }
  123. }
复制代码

相关帖子

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入我们

本版积分规则