找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

51单片机,使用DHT11模块,程序卡死的问题

查看数: 7378 | 评论数: 6 | 收藏 1
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2019-11-13 23:02

正文摘要:

楼主大四,在做一个基于 51 的智能晾衣架,其中分别使用了 DS18B20、DHT11 检测温、湿度,温度检测正常,在 dht11 的程序里,通过调试发现程序卡死了,在主函数里读不出数据,也无法执行后面的程序,单片机型号是 ST ...

回复

ID:647620 发表于 2019-11-23 18:57
楼主数据线设的P3^6 可是 没有把端口设置成开漏,可以设置一下试试 。我今天把sda换到P0口  程序不至于卡死了。。虽然取值还不对 。感觉之前卡死是因为从机没法置低导致开在while判断上了
ID:647620 发表于 2019-11-23 02:21
对了还有个现象 卡住以后 湿度高位不知道为什么变成了255.。。
ID:647620 发表于 2019-11-23 02:16
想知道楼主解决了吗?
。。。表示碰到了一样的问题 。。把dht11拔了 别的都正常,插上dht11就卡住了  感觉上好像是卡在某个while里面了。。。。。。。作为一个初学者毫无头绪
ID:123289 发表于 2019-11-16 09:17
关键点:
1、不要用DEALY做延时。
2、等待硬件信号时,要做限时动作,等不到就返回,并标记异常通知主程序。

评分

参与人数 1黑币 +5 收起 理由
Eli_ + 5 赞一个!

查看全部评分

ID:245004 发表于 2019-11-15 22:47
84行到88行的代码不合适吧?对照数据手册看看。单片机时钟必须跟延时函数一致;延时函数尽量放在当前c文件里,不要放在其它文件里;以下代码仅供参考:
io_DHT11 = 0;                 //主机拉低 >18ms
        Delay25ms();
        io_DHT11 = 1;                //20~40us后从机应答拉低电平
        Delay60us();                 //延时大于(20~40us)
        if(io_DHT11 == 0)         //判断从机是否响应
        {
                if (DHT11_WaitLevelChange(0) == isNo) return isNo;        //规定时间内电平0是否改变?如果未改变返回isNo
                if (DHT11_WaitLevelChange(1) == isNo) return isNo;        //规定时间内电平1是否改变?如果未改变返回isNo

                i = 0;
                ucArrTemp[i++] = DHT11_ReadByte();
                ucArrTemp[i++] = DHT11_ReadByte();
                ucArrTemp[i++] = DHT11_ReadByte();
                ucArrTemp[i++] = DHT11_ReadByte();
                ucArrTemp[i]   = DHT11_ReadByte();


评分

参与人数 1黑币 +5 收起 理由
Eli_ + 5 赞一个!

查看全部评分

ID:639532 发表于 2019-11-15 17:55
程序我就不看了,给你个思路,一般会你这现象的原因有:1,单片机的中断标志没清,导致程序一直跑中断,不运行主函数;2,中断的等级没处理好,有些函数被更高级别的中断阻塞了;3,用了一些空指针,程序跑飞了;4,内存占满了;5,某些寄存器会在某些行为(比如触发中断)后自动清0,导致你的配置被清了;6,你所使用的单片机这一方面性能不稳定(这个可能非常小这么多年就见过一次,原厂fae都解决不了)

评分

参与人数 1黑币 +5 收起 理由
Eli_ + 5 赞一个!

查看全部评分

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

Powered by 单片机教程网

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