打印
[STM8]

基于stm8单片机用DHT22测量温度

[复制链接]
2725|22
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
MCU丁丁|  楼主 | 2017-10-31 17:42 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
  本人测量温湿度用stm8S系列单片机跑DHT22温湿度传感器是成功的,但是换成stm8l系列单片机就不成功了。为什么呢?
程序是这样子的;运行到while(!DAT)的时候直接跳出不读取数据.....

谁能解答。引脚配置没问题


void RH()            //接收温度湿度加校验
{         
DAT_OUT;                //端口设置为输出模式
DAT_L;                     //主机拉低
delay_ms(3);
DAT_H;            
delay_us(10);
DAT_IN;                    //主机设为输入 判断从机响应信号          
if(DAT) FLAG=1;         //判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行
while(!(DAT))                 
{
   FLAG=2;         
   while((!(DAT))&&FLAG++);//判断从机是否发出 80us 的低电平响应信号是否结束
   if(FLAG==1)break;
   FLAG=2;         
   while((DAT)&&FLAG++); //判断从机是否发出 80us 的高电平,如发出则进入数据接收状态
   if(FLAG==1)break;                 
   COM();                   //数据接收状态
   if(FLAG==1)break;
   RH_H=comdata;               //湿度的高8位数据
   COM();
   if(FLAG==1)break;
   RH_L=comdata;                //湿度的低8位数据
   COM();
   if(FLAG==1)break;
   T_H=comdata;                   //温度的高8位数据
   COM();
   if(FLAG==1)break;
   T_L=comdata;                   //温度的低8位数据
   COM();
   if(FLAG==1)break;
   check=comdata;               //校验字节数据
   break;
}  
DAT_H;                    //数据校验          
check_number=(T_H+T_L+RH_H+RH_L);
if(check_number==check)        //若校验通过
{       
   temp  = ((T_H*256+T_L)/100)*10+(T_H*256+T_L)/10%10;            //合成并暂存16位温度数据  包括小数点后一位
   humid = ((RH_H*256+RH_L)/100)*10+(RH_H*256+RH_L)/10%10;        //合成并暂存16位湿度数据  
}          
DAT_H;
}//读取模块周期不能小于2s




沙发
zhuotuzi| | 2017-10-31 20:43 | 只看该作者
你是不是直接从51上移植过来的?

使用特权

评论回复
板凳
zhuotuzi| | 2017-10-31 20:45 | 只看该作者
https://wenku.baidu.com/view/d7f326ff6c85ec3a86c2c5b0.html
你看看这个,你可能延时不够吧,另外你这么写不给力。

使用特权

评论回复
地板
dingbo95| | 2017-10-31 21:35 | 只看该作者
会51其它的都差不多。

使用特权

评论回复
5
yiyigirl2014| | 2017-10-31 23:03 | 只看该作者
dingbo95 发表于 2017-10-31 21:35
会51其它的都差不多。

那不一定啊,51的IO操作容易啊,其他的操作要好几个指令

使用特权

评论回复
6
caijie001| | 2017-11-1 08:53 | 只看该作者
应该是时序问题,不同单片机速度不一样的

使用特权

评论回复
7
NJTECH1302| | 2017-11-1 21:38 | 只看该作者
我记得这个跟delay有很大的关系,你试试改变delay的大小

使用特权

评论回复
8
MCU丁丁|  楼主 | 2017-11-2 07:58 | 只看该作者
zhuotuzi 发表于 2017-10-31 20:43
你是不是直接从51上移植过来的?

恩,移植过来改了IO管脚关键的运行步骤没改

使用特权

评论回复
9
MCU丁丁|  楼主 | 2017-11-2 08:00 | 只看该作者
zhuotuzi 发表于 2017-10-31 20:45
https://wenku.baidu.com/view/d7f326ff6c85ec3a86c2c5b0.html
你看看这个,你可能延时不够吧,另外你这么 ...

我试试,延时我用示波器量着写的

使用特权

评论回复
10
MCU丁丁|  楼主 | 2017-11-2 08:00 | 只看该作者
caijie001 发表于 2017-11-1 08:53
应该是时序问题,不同单片机速度不一样的

我用示波器测了下,延时没什么问题,就是从机没应答

使用特权

评论回复
11
MCU丁丁|  楼主 | 2017-11-2 08:01 | 只看该作者
NJTECH1302 发表于 2017-11-1 21:38
我记得这个跟delay有很大的关系,你试试改变delay的大小

好的我试试

使用特权

评论回复
12
caijie001| | 2017-11-2 08:13 | 只看该作者
MCU丁丁 发表于 2017-11-2 08:00
我用示波器测了下,延时没什么问题,就是从机没应答

换个传感器试试

使用特权

评论回复
13
jansionchang| | 2017-11-2 09:20 | 只看该作者
搞定了吗,楼主?

使用特权

评论回复
14
MCU丁丁|  楼主 | 2017-11-2 12:43 | 只看该作者

没有,就一直发00,真想不到能怎么调了

使用特权

评论回复
15
MCU丁丁|  楼主 | 2017-11-2 13:00 | 只看该作者
这是stm8s和stm8l151的对比一个有数据一个没有,两个的内部晶振都是16m的延时我也用示波器看过了

~3D@D0VLJ$ZZR%]M8ZL93[8.png (21.09 KB )

~3D@D0VLJ$ZZR%]M8ZL93[8.png

ZGILHH3K_%2QH5(KXC%$E]1.png (22.69 KB )

ZGILHH3K_%2QH5(KXC%$E]1.png

使用特权

评论回复
16
jansionchang| | 2017-11-2 13:59 | 只看该作者
会不会是i软件设置的问题,就是SSCOM3.2自身设置,你试试呢,别着急。

使用特权

评论回复
17
MCU丁丁|  楼主 | 2017-11-2 14:17 | 只看该作者
jansionchang 发表于 2017-11-2 13:59
会不会是i软件设置的问题,就是SSCOM3.2自身设置,你试试呢,别着急。

不会

使用特权

评论回复
18
MCU丁丁|  楼主 | 2017-11-2 14:18 | 只看该作者
jansionchang 发表于 2017-11-2 13:59
会不会是i软件设置的问题,就是SSCOM3.2自身设置,你试试呢,别着急。

因为串口是一样的

使用特权

评论回复
19
MCU丁丁|  楼主 | 2017-11-2 17:47 | 只看该作者
caijie001 发表于 2017-11-1 08:53
应该是时序问题,不同单片机速度不一样的

大家都是16m内部rc振荡,关键现在好像是经常超时

使用特权

评论回复
20
MCU丁丁|  楼主 | 2017-11-3 12:32 | 只看该作者
终于解决了,原来是我自己坑自己,设计板子的时候不知为什么把电源的电容画到信号脚上了,焊上去后把我的信号都滤掉了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

16

主题

43

帖子

0

粉丝