找回密码
 注册
关于网站域名变更的通知
查看: 186|回复: 2
打印 上一主题 下一主题

菜鸟级的DHT11读取 单片机程序

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2022-6-17 11:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
初学C51单片机,不容易啊,一步一步走来的分享, i& v* m) z0 L, U5 Q% x
今天刚收到某宝快递来的DHT11,马上焊接,早上就一直再看规格书,网上看别人的例程,以为很顺利,结果从下午4点开始,
% h7 r3 e4 W9 v. K1 M一直弄到12点多,就是读不出数据,网上看了很多例程,就是不行。都快崩溃得想放弃了,最后还是有显示了& u5 y7 D! T/ s9 m7 A
5 M1 x+ r4 ^& ]
/*****************************************************************************
: }0 R0 t8 x' H *mcu 型号:STC15W404AS
, ]7 q! c5 k8 q3 n. {* ] *开发环境:Keil uVision5' V. Q. H+ Y; o+ q- `$ b
*晶震频率:11.0592MHZ       ! E/ m1 v# N! D. j' w3 J
*完成日期:2019-08-20# ^3 D( {4 ^# G# r
*程序功能:DHT11读取( i$ F) r: O. a: ], O: M6 x$ ^
/********************定义数据*************************/8 r, _0 T4 Z% y2 D
  • #include <STC15F2K60S2.H>
  • #include <intrins.h>
  • #define uchar unsigned char //无符号字符型类型数据
  • #define uint unsigned int //无符号整型数据
  • uchar dat_r[4];          //用于存放从DHT11读取到的数值
  • sbit DATA=P3^3;   //定义数据线,DHT11的2脚,2脚要上拉5.1K电阻
  • /*-------30US延时---11.0592MHz(Copy自STC-ISP(v6.86).exe)----------------------------*/
  • void Delay30us()
  • {
  • unsigned char i;
  • _nop_();
  • _nop_();
  • i = 80;
  • while (--i);
  • }
  • /*-------20MS延时----11.0592MHz(Copy自STC-ISP(v6.86).exe)---------------------------*/
  • void Delay20ms()
  • {
  • unsigned char i, j, k;
  • _nop_();
  • _nop_();
  • i = 1;
  • j = 216;
  • k = 35;
  • do
  • {
  •   do
  •   {
  •    while (--k);
  •   } while (--j);
  • } while (--i);
  • }
  • /*-------1S延时-----11.0592MHz(Copy自STC-ISP(v6.86).exe)--------------------------*/
  • void Delay1s()
  • {
  • unsigned char i, j, k;
  • _nop_();
  • _nop_();
  • i = 43;
  • j = 6;
  • k = 203;
  • do
  • {
  •   do
  •   {
  •    while (--k);
  •   } while (--j);
  • } while (--i);
  • }
  • /*********************************************************************************************
  • 函数名:DHT11启动函数
  • 调  用:无
  • 参  数:无
  • 返回值:无
  • 结  果:DHT11开始工作
  • 备  注:
  • **********************************************************************************************/
  • void DHT11_start()                 // 主机控制DHT11开始工作
  • {
  •    DATA=1;                         // 主线空闲状态
  •    _nop_();
  •    _nop_();
  •    DATA=0;                         // 主机发送开始工作信号
  •    Delay20ms();   //延时18ms以上
  •    DATA=1;                         // 拉高并延时等待DHT11响应
  •    Delay30us();
  • }
  • /*********************************************************************************************
  • 函数名:DHT11读数据函数
  • 调  用:? = DHT11_rec_byte();
  • 参  数:无
  • 返回值:
  • 结  果:读DHT11数据并保存到dat
  • 备  注:
  • **********************************************************************************************/
  • uchar DHT11_rec_byte()      //接收一个字节
  • {
  •    uchar i,dat=0;
  •   for(i=0;i<8;i++)         //从高到低依次接收8位数据
  •    {
  •       while(!DATA);        //等待50us低电平过去
  •       Delay30us();
  •           Delay30us();     //延时60us,如果还为高则数据为1,否则为0
  •       dat<<=1;             //左移位使正确接收8位数据,数据为0时直接移位
  •       if(DATA==1)          //数据为1时,使dat加1来接收数据1
  •          dat+=1;
  •       while(DATA);         //等待数据线拉低
  •     }
  •     return dat;
  • }
  • /*********************************************************************************************
  • 函数名:接收DHT11的40位的数据并校验
  • 调  用:? = DHT11_receive();
  • 参  数:无
  • 返回值:无
  • 结  果:结果保存到dat_r
  • 备  注:
  • **********************************************************************************************/
  • void DHT11_receive()      //接收40位的数据
  • {
  •     uchar R_H,R_L,T_H,T_L,RH,RL,TH,TL,revise;
  •     DHT11_start();                 // 主机控制DHT11开始工作
  •     if(DATA==0)
  •     {
  •         while(DATA==0);           //等待拉高
  •         Delay30us();
  •         Delay30us();
  •         Delay30us();             //拉高后延时80us
  •         R_H=DHT11_rec_byte();    //接收湿度高八位
  •         R_L=DHT11_rec_byte();    //接收湿度低八位
  •         T_H=DHT11_rec_byte();    //接收温度高八位
  •         T_L=DHT11_rec_byte();    //接收温度低八位
  •         revise=DHT11_rec_byte(); //接收校正位
  •         Delay30us();    //结束
  •         if((R_H+R_L+T_H+T_L)==revise)   //校正
  •         {
  •             RH=R_H;
  •             RL=R_L;
  •             TH=T_H;
  •             TL=T_L;
  •         }
  •         /*数据处理,方便显示*/
  •         dat_r[0]='0'+(RH/10);
  •         dat_r[1]='0'+(RH%10);
  •         dat_r[2]='0'+(TH/10);
  •         dat_r[3]='0'+(TH%10);
  •     }
  • }
  • /*========串口初始化函数=================================================*/
  • void UartInit()                                [url=]//9600bps@11.0592MHz[/url]
  • {
  • SCON = 0x50;                //8位数据,可变波特率
  • AUXR |= 0x04;
  • //AUXR |= 0x01;             //串口1选择定时器2为波特率发生器
  • T2L =0xE0;   // 65536-(11059200/4/9600);                //设定定时初值
  • T2H =0xFE;   // (65536-(11059200/4/9600))>>8;           //设定定时初值
  • AUXR |= 0x10;
  • }
  • /*===========串口发送函数(字节)=======================================*/
  • void Uartsend_1(unsigned char send)
  • {
  • SBUF=send;                                                //发送数据
  • while(!TI);                                               //等待前一帧数据发送完毕
  • TI=0;                                                     //复位标志位
  • }
  • //----------串口发送函数(字符串)-----------------------------------------
  • void PrintString(unsigned char code *puts)    //发送一串字符串
  • {
  •     for (; *puts != 0;
  •    puts++)  Uartsend_1(*puts);         //遇到停止符0结束
  • }
  • /*********************************************************************************************
  • 函数名:主函数
  • 调  用:无
  • 参  数:无
  • 返回值:无
  • 结  果:读DHT11数据并送到1602显示
  • 备  注:
  • **********************************************************************************************/
  • void main (void)
  • {
  •         UartInit();
  •         Delay20ms();
  •         while(1)
  •         {
  •                 Delay1s();            //经测试,两次连读要至少延时80ms
  •                 DHT11_receive();//接受数据
  •      //RH:XX%
  •      PrintString("RH:");
  •      Uartsend_1(dat_r[0]);
  •      Uartsend_1(dat_r[1]);
  •      PrintString("%;  ");
  •      //TMP:XXC
  •      PrintString("Tempreture:");
  •      Uartsend_1(dat_r[2]);
  •      Uartsend_1(dat_r[3]);
  •      Uartsend_1(0xdf);
  •      PrintString("C  ");
  •      Delay1s();
  •         }
  • }
    3 i# V: i& b+ E
2 L! ?& j9 ?/ l" E* U

9 `3 C6 ?- a7 D8 v# V/ `
9 b9 H* u) r/ @1 f# ~9 F

该用户从未签到

2#
发表于 2022-6-17 13:15 | 只看该作者
学一下,Thanks♪(・ω・)ノ

该用户从未签到

3#
发表于 2022-6-17 16:55 | 只看该作者
学一下,Thanks♪(・ω・)ノ
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-6-9 14:27 , Processed in 0.093750 second(s), 23 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

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