找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

[原创]自己编的DHT11驱动程序~

查看数: 29176 | 评论数: 44 | 收藏 23
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2015-8-4 17:29

正文摘要:

本帖最后由 王朗的诱惑 于 2015-8-4 21:05 编辑 前几天在某宝上看到DHT11,感觉蓝色的外壳做的很漂亮,然后就买了1个。结果发现网上的程序都是给旧12T单片机用的,注释也没几句,用着很不顺手。所以就自己按照数 ...

回复

ID:84652 发表于 2018-9-16 11:16
把主函数里的break都改成continue
ID:84652 发表于 2019-3-1 21:22
修改一处bug:请把程序里所有的t--改成--t,否则错误值返回不了。原来的程序一次成功了,所以直到现在才发现这个bug……向大家道歉……

评分

参与人数 1黑币 +50 收起 理由
admin + 50 回帖助人的奖励!

查看全部评分

ID:987219 发表于 2021-12-13 13:30
虽然看不懂,但是还是感觉很NB
ID:84652 发表于 2021-12-13 13:05
rozzzzz 发表于 2021-12-13 11:31
感谢楼主,如果我的晶振是11.0592的要改那些地方呢

那改的还挺多,延时函数、串口初始化参数、GetData 里的 t 值。搞台示波器一会就搞定了,没有示波器或者逻辑分析仪估计要折腾好久。
ID:892505 发表于 2021-12-13 11:31
感谢楼主,如果我的晶振是11.0592的要改那些地方呢
ID:741370 发表于 2020-4-30 16:37
感谢楼主
ID:84652 发表于 2020-4-21 02:10
stc89c52rclpz 发表于 2020-4-20 23:25
用LCD显示的数据特别不准咋办。。是这东西本来就误差大,还是时间没取好导致数据有误差啊?或者算法?不能 ...

如果通过了累加校验应该不会出错啊……检查传感器附近是不是有热源,也不能有阳光直射;检查算法,手动输入数据让LCD显示看看数据有没有变;最后再拿水银温度计对照一下看看……如果都不行,试试别的传感器,比如LM75、DS18B20什么的,看看读数是不是还不正常。(如果这些都试过了还是不行,建议以后不要看天气预报)
ID:733775 发表于 2020-4-20 23:25
用LCD显示的数据特别不准咋办。。是这东西本来就误差大,还是时间没取好导致数据有误差啊?或者算法?不能直接高位/10,%10?太离谱了家里温度显示27摄氏度,天气预报也就15摄氏度
ID:84652 发表于 2020-3-22 13:13
sasafair 发表于 2020-3-21 19:56
你这个思路比较好   相当于软件示波器了       借鉴你这个思路调了408AS 的dht11   数据出来了 !!

另外 ...

文本接收时发送的数字需要进行ASCII编码,比如发送0,实际发送的字节是0x30;发送1,实际发送的字节是0x31,依次类推。
实现的方法有很多,可以自己写转换函数,转换要发送的数据的每个十进制位;也可以用sprintf函数把数据转换成字符串然后发送字符串;还可以重定向printf然后直接用printf。
你这个情况的话,推荐使用sprintf。如果为了学习ASCII编码,建议自己写个转换函数。
祝好运~
ID:246783 发表于 2020-3-21 19:56
你这个思路比较好   相当于软件示波器了       借鉴你这个思路调了408AS 的dht11   数据出来了 !!

另外问个问题  :  串口接收时      开文本接收时 数据一直是字符乱码  怎么解决 ?

                  SendString("\r\n湿度:");
                        SendData(dat_r[0]);                //湿度整数        
             
                SendString("\r\n温度:");
                SendData(dat_r[2]);                //温度整数                


/////////////////////////////////////////
我的串口函数  :  
/******************************************************************************

****************************************************************Author:Liming**/
void SendData(unsigned char dat)
{
    while (B_TX1_Busy);               //等待前面的数据发送完成
    B_TX1_Busy = 1;
    SBUF = dat;                 //写数据到UART数据寄存器
}

/*******************************************************************************
  * @brief  None
  * @param  None
  * @retval None
****************************************************************Author:Liming**/
void SendString(char *s)
{
    while (*s)                  //检测字符串结束标志
    {
        SendData(*s++);         //发送当前字符
    }
}
ID:626079 发表于 2020-3-20 16:43


谢谢大侠, 高手。已经用你的程序做出来通过……
http://www.51hei.com/bbs/dpj-182291-1.html
ID:282869 发表于 2020-3-20 13:32
值得參考學習,謝謝分享.
ID:710428 发表于 2020-3-19 20:34
谢谢分享
ID:626079 发表于 2020-3-18 23:14
感谢楼主的程序,麻烦咨询下楼主,你的STC52程序中
#define JUDGE        4                //用于判断通信的0和1,与单片机速度和晶振频率有关
这是起啥作用。 我看在程序里调用时:
if(t >JUDGE)                        //高电平持续时间较长(70us)
dat8 += 1;                        //传输值为1

能解答一下为什么t>JDGE是与70us进行比较呢?新手不太明白,谢谢了。
还有dat8 += 1;是不是就是把dat8最后一位给“1”的意思哈?
ID:84652 发表于 2020-2-7 19:30
yechuan220 发表于 2020-1-31 17:23
楼主,有没有在STC15f2k60s上测试过DHT11?
找了很多网上的代码,根本就读不出来。

没……现在我大概明白,提出这些问题的老哥们是没有示波器什么的,那就串口调试吧。DHT11这东西不是把信号全发过去才返回的,通信的过程就是反馈的过程,比如主机发一个开始信号,然后DHT11就会响应一个低电平信号,检测这个信号,就知道之前的开始信号正不正常。类似于打电话,得听到对方的声音,才知道信号没问题,对吧。
ID:259035 发表于 2020-1-31 17:23

楼主,有没有在STC15f2k60s上测试过DHT11?
找了很多网上的代码,根本就读不出来。
ID:84652 发表于 2020-1-7 22:09
梦在夏天 发表于 2019-12-15 20:16
楼主,有没有在IAP15W4K58S4测试过DHT11?
求分享~

没有……盲调主要看人品,最好想办法搞个示波器或者逻辑分析仪。
ID:666819 发表于 2019-12-17 23:32
我测试成功了,谢谢楼主的帮助
ID:627950 发表于 2019-12-15 20:16
楼主,有没有在IAP15W4K58S4测试过DHT11?
求分享~
ID:84652 发表于 2019-11-19 00:20
zeki520kiki 发表于 2019-11-12 09:11
楼主,有没有在STC15F408AD测试过DHT11?
找了很多网上的代码,根本就读不出来。

我没试过……如果实在调不出来,强烈建议用示波器或者逻辑分析仪看看波形。
ID:448233 发表于 2019-11-12 09:11

楼主,有没有在STC15F408AD测试过DHT11?
找了很多网上的代码,根本就读不出来。
ID:434090 发表于 2019-3-16 11:34
最近在研究dht11,多谢分享
ID:84652 发表于 2019-3-1 21:18
ontheroad 发表于 2019-3-1 17:29
楼主,有没有在STC89C52上测试过DHT11?
找了很多网上的代码,根本就读不出来。

这是STC89C52RC的程序,晶振频率11.0592MHz,接口还是P1.0,刚刚测试成功了。

DHT11-STC89.zip

35.33 KB, 下载次数: 80, 下载积分: 黑币 -5

11.0592MHz

ID:84652 发表于 2019-3-1 19:39
ontheroad 发表于 2019-3-1 17:29
楼主,有没有在STC89C52上测试过DHT11?
找了很多网上的代码,根本就读不出来。

没有诶,不过我手上有元件,我可以帮你试试~
ID:445069 发表于 2019-3-1 17:29
楼主,有没有在STC89C52上测试过DHT11?
找了很多网上的代码,根本就读不出来。
ID:458168 发表于 2019-1-8 23:12
谢谢楼主
ID:95072 发表于 2018-11-10 16:49
值得学习!!!
ID:326995 发表于 2018-5-10 20:55
代码很有用
ID:84652 发表于 2017-11-18 10:40
本帖最后由 王朗的诱惑 于 2017-11-18 11:03 编辑
njzyg 发表于 2017-11-18 09:55
楼主好,感谢分享。请问为什么要检测那么多次错误呢。另外  while(DATA && ++t);      ...

DHT11是单总线器件,驱动的时候时序容易出问题,但是环节太多不知道问题出在哪,调试的时候就费劲。不断检测错误就是想知道问题出在哪个环节,然后有针对性地解决。那个自加的具体时间不知道,和单片机速度有关系,先把前面调试好了,然后记录下来0和1对应的t值通过串口发上来,取平均值就可以了。
ID:215834 发表于 2017-11-18 09:55
楼主好,感谢分享。请问为什么要检测那么多次错误呢。另外 &nbsp;while(DATA && ++t);&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; 语句检测时间t自加一次需要多久时间,谢谢楼主
ID:84652 发表于 2017-8-25 11:02
cp66 发表于 2017-8-24 13:41
我在stc15上用的,仿真软件上串口输出时十六进制,怎么才能输出的是十进制呢?

写个发送字符串函数,把数据的十位和个位分开发,串口助手用文本模式接收。
ID:229113 发表于 2017-8-24 13:41
我在stc15上用的,仿真软件上串口输出时十六进制,怎么才能输出的是十进制呢?
ID:84652 发表于 2017-8-21 14:44
aiait 发表于 2017-5-26 11:06
请问大神,要用1602显示的话,还要用到串口吗?

把数据送到1602屏幕上就行了吧?只是这样的话不用串口。串口可以用来调试,看看有没有数据读出来。
ID:84652 发表于 2017-8-21 14:43
smallriver 发表于 2017-5-25 13:13
这两天一直在研究,开始初始化都失败,然后呢却却读出来数据,真是闹心,借鉴一下程序看有没有效果

单总线一般都是时序问题,最好是能有台示波器看看。
ID:202299 发表于 2017-5-26 11:06
请问大神,要用1602显示的话,还要用到串口吗?
ID:202299 发表于 2017-5-26 11:06
请问大神,有没有DHT11加1602显示的综合程序?
ID:141361 发表于 2017-5-25 13:13
这两天一直在研究,开始初始化都失败,然后呢却却读出来数据,真是闹心,借鉴一下程序看有没有效果
ID:145935 发表于 2017-5-18 10:41
感谢分享,学习了。
ID:186776 发表于 2017-5-17 21:26
学习了

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

Powered by 单片机教程网

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