OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5702|回复: 10

使用数码管显示DHT22传感器数据时无法正常读数据

[复制链接]

17

主题

181

帖子

0

精华

高级会员

Rank: 4

积分
504
金钱
504
注册时间
2017-7-24
在线时间
117 小时
发表于 2017-8-23 17:31:31 | 显示全部楼层 |阅读模式
5金钱
本帖最后由 q247341184 于 2017-8-23 20:40 编辑

基于原子哥的dht11例程修改代码,经测试没有错误和异常。移植数码管显示模块后也无异常,当在主函数读取温度模块后加入显示函数后,数据读取出现异常。无法正确读数,是指的从传感器传出来的数据是错的,用XCOM监控,用printf函数取值得到,具体如下面主函数部分。一开始推测是管脚冲突,经仔细检查后,排除管脚冲突原因。两个部分独立运行时是完好的,也排除代码异常问题。望指点一下思路, 还有什么原因可能导致这种情况的发生?
主函数的运行部分:
[mw_shl_code=c,true]        
        while(1)
        {               
    if(t%10==0)                        //每100ms读取一次
                {                          
                        DHT22_Read_Data(&temperature,&humidity); //读取温湿度值                                            
                        printf("temp=%d!",temperature);    //显示温度                              
                        printf("humidi=%d!",humidity);                   //显示湿度
        DisPlayNum(temperature);  //加入此行后数据读取异常
                }                                   
                 delay_ms(200);
                t++;
        }        [/mw_shl_code]


显示函数:
[mw_shl_code=c,true]void DisPlayNum(int n)  
{  
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);                                //使能AFIO时钟
                                                                                                                                                                                                                                                //由于PB4的功能就是GPIO,所以没有使能功能时钟
        GPIO_PinRemapConfig(GPIO_Remap_SWJ_NoJTRST,ENABLE);                                //关闭JTRST,即开启重映射
   
        for (i=0;i<4;i++)  
        {  
            GPIO_ResetBits(GPIOB,GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7|                                                        //PB4-PB7是位选口
                                                                                                                                        GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11|                                                        //PB8-PB15是段选口
                                                                                                                                        GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15 );  
                                switch (i)                                                                                                                                                                          //位选数,,分别对应左数1、2、3、4
                                {  
                                                case 0:  
                                                                                        GPIO_SetBits(GPIOB,GPIO_Pin_7);  
                                                                                        break;  
                                                case 1:  
                                                                                        GPIO_SetBits(GPIOB,GPIO_Pin_6);  
                                                                                        break;  
                                                case 2:                  
                                                                                        GPIO_SetBits(GPIOB,GPIO_Pin_5);
                                                                                        break;  
                                                case 3:  
                                                                                        GPIO_SetBits(GPIOB,GPIO_Pin_4);
                                                                                        break;  
        }
                             
            
                                switch (a%10)                        //输出示数
            {  
                case 0:  
                    GPIO_SetBits(GPIOB,GPIO_Pin_14|GPIO_Pin_15);                                                                                                                                                                                           // 0
                    break;  
                case 1:  
                    GPIO_SetBits(GPIOB,GPIO_Pin_8|GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15); // 1
                    break;  
                case 2:  
                    GPIO_SetBits(GPIOB,GPIO_Pin_10|GPIO_Pin_13|GPIO_Pin_15);                                                                                                                                          // 2
                    break;  
                case 3:  
                    GPIO_SetBits(GPIOB,GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_15);                                                                                                                                          // 3
                    break;  
                case 4:  
                    GPIO_SetBits(GPIOB,GPIO_Pin_8|GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_15);                                                                                                  // 4
                    break;  
                case 5:  
                    GPIO_SetBits(GPIOB,GPIO_Pin_9|GPIO_Pin_12|GPIO_Pin_15);                                                                                                                                                  // 5
                    break;  
                case 6:  
                    GPIO_SetBits(GPIOB,GPIO_Pin_9|GPIO_Pin_15);                                                                                                                                                                                                  // 6
                    break;  
                case 7:  
                    GPIO_SetBits(GPIOB,GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15);                                          // 7
                    break;  
                case 8:  
                    GPIO_SetBits(GPIOB,GPIO_Pin_15);                                                                                                                                                                                                                                          // 8
                    break;  
                case 9:  
                    GPIO_SetBits(GPIOB,GPIO_Pin_12|GPIO_Pin_15);                                                                                                                                                                                          // 9
                    break;  
                                                                case 10:
                                                                                GPIO_SetBits(GPIOB,GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11|                                                                                        //负号
                                                                                                                                        GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_15 );
                                                                                break;
                                                                case 11:
                                                                                GPIO_SetBits(GPIOB,GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11|                                                        //null
                                                                                                                                        GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15 );
                                                                                break;
            }     
            s = s / 10;  //此行放输出逻辑。
                                                delay_ms(1);  
        }      [/mw_shl_code]


最佳答案

查看完整内容[请看2#楼]

此贴终结,出现错误是因为管脚设置冲突,与方法没有关系,只是单纯的与管脚设置有关系。 最后,感谢原子哥指点,才查出这个错误。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

17

主题

181

帖子

0

精华

高级会员

Rank: 4

积分
504
金钱
504
注册时间
2017-7-24
在线时间
117 小时
 楼主| 发表于 2017-8-23 17:31:32 | 显示全部楼层
此贴终结,出现错误是因为管脚设置冲突,与方法没有关系,只是单纯的与管脚设置有关系。  
最后,感谢原子哥指点,才查出这个错误。
回复

使用道具 举报

17

主题

181

帖子

0

精华

高级会员

Rank: 4

积分
504
金钱
504
注册时间
2017-7-24
在线时间
117 小时
 楼主| 发表于 2017-8-23 20:41:11 | 显示全部楼层
自顶一下
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2017-8-24 00:36:21 | 显示全部楼层
仿真,看时序,分析问题
回复

使用道具 举报

17

主题

181

帖子

0

精华

高级会员

Rank: 4

积分
504
金钱
504
注册时间
2017-7-24
在线时间
117 小时
 楼主| 发表于 2017-8-24 10:34:00 | 显示全部楼层
本帖最后由 q247341184 于 2017-8-24 10:36 编辑
正点原子 发表于 2017-8-24 00:36
仿真,看时序,分析问题

原子哥,我想分为三点继续这个问题;
1、我曾经试过仿真,没有得到该有的现象,正常的现象应该是主机发送一段1·10ms的低电平后拉高,然后传感器发出相应拉低80us再拉高以示即将传输数据。可是现实情况是主机周期性拉低至少18ms再拉高都没有响应。我个人分析出现这种现象应该是没有问题的,因为我认为软件仿真本身就无法连接传感器,所以周期性拉低电平再拉高是我目前认为的正常现象。

2、因为之前的时候我也认为有可能是时序问题,所以我做过一个可能不太靠谱的测试,就是将主函数代码中的Display函数替换成一个for循环的空循环,循环200000次,软件仿真时设置晶振是8MHz,折合时间约0.025秒,我认为足够长到干扰时序逻辑了。用for循环替换Display函数的现象是可以正常读数,没有问题。但是切换回Display函数就无法正确读数。

以上是我对这个问题做过的尝试和自己的理解,如果哪里有错误是我没有注意到的或者我理解错的等等,还请批评指正,指点思路。非常感谢。
以下是仿真测试的图:

DHT22的管脚设置图

DHT22的管脚设置图

主机下拉电平的时间

主机下拉电平的时间

选取的管脚,3为传感器设置脚,其余为数码管位选脚

选取的管脚,3为传感器设置脚,其余为数码管位选脚

数码管管脚设置

数码管管脚设置

点击运行到断点处,但是7秒多都没停止,运行时间在右下角

点击运行到断点处,但是7秒多都没停止,运行时间在右下角
回复

使用道具 举报

0

主题

12

帖子

0

精华

新手上路

积分
45
金钱
45
注册时间
2017-10-22
在线时间
8 小时
发表于 2017-10-22 23:28:35 | 显示全部楼层
源代码可以借鉴一下吗
回复

使用道具 举报

17

主题

181

帖子

0

精华

高级会员

Rank: 4

积分
504
金钱
504
注册时间
2017-7-24
在线时间
117 小时
 楼主| 发表于 2017-11-12 08:46:26 | 显示全部楼层
追晨沐阳0311 发表于 2017-10-22 23:28
源代码可以借鉴一下吗

可以的,私信我留一下邮箱或者留下一个联系方式吧。
回复

使用道具 举报

17

主题

181

帖子

0

精华

高级会员

Rank: 4

积分
504
金钱
504
注册时间
2017-7-24
在线时间
117 小时
 楼主| 发表于 2017-11-12 08:47:38 | 显示全部楼层
追晨沐阳0311 发表于 2017-10-22 23:28
源代码可以借鉴一下吗

抱歉哈,近期很忙,所以很久没有逛这个论坛了。
回复

使用道具 举报

1

主题

4

帖子

0

精华

新手入门

积分
18
金钱
18
注册时间
2018-6-30
在线时间
2 小时
发表于 2018-6-30 17:56:01 | 显示全部楼层
请问有数码管显示温湿度传感器的完整程序吗,我对编写这个程序的思路不是很清晰,想参考参考
回复

使用道具 举报

17

主题

181

帖子

0

精华

高级会员

Rank: 4

积分
504
金钱
504
注册时间
2017-7-24
在线时间
117 小时
 楼主| 发表于 2018-7-17 14:19:26 | 显示全部楼层
18859670786 发表于 2018-6-30 17:56
请问有数码管显示温湿度传感器的完整程序吗,我对编写这个程序的思路不是很清晰,想参考参考

抱歉才看到,你可以留下你的联系方式
回复

使用道具 举报

0

主题

2

帖子

0

精华

初级会员

Rank: 2

积分
82
金钱
82
注册时间
2018-11-19
在线时间
28 小时
发表于 2019-1-14 17:23:36 | 显示全部楼层
本帖最后由 liuYang1230 于 2021-8-23 15:20 编辑

666666
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-23 03:12

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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