OpenEdv-开源电子网

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

关于stm8 读取18b20的困惑

[复制链接]

20

主题

49

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
221
金钱
221
注册时间
2016-6-16
在线时间
56 小时
发表于 2019-6-11 13:55:44 | 显示全部楼层 |阅读模式
1金钱


最佳答案

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

结:在某大神的帮助下解决问题。不是程序问题,也不是延时问题,是stm8本身问题。 耗费了我2天半时间!!!!furk。谁能想到的这么火的单片机还有这问题? 贱钱无好货! 网上的程序移植过来不会有什么问题,问题出在stm8上,某些引脚就是不能用来读取18b20!!!无论怎么改!比如我原来设计的用pf4就不行。而换成pd0就可。 stm8设计漏洞。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

20

主题

49

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
221
金钱
221
注册时间
2016-6-16
在线时间
56 小时
 楼主| 发表于 2019-6-11 13:55:45 | 显示全部楼层
结:在某大神的帮助下解决问题。不是程序问题,也不是延时问题,是stm8本身问题。

耗费了我2天半时间!!!!furk。谁能想到的这么火的单片机还有这问题?

贱钱无好货!

网上的程序移植过来不会有什么问题,问题出在stm8上,某些引脚就是不能用来读取18b20!!!无论怎么改!比如我原来设计的用pf4就不行。而换成pd0就可。

stm8设计漏洞。

回复

使用道具 举报

20

主题

49

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
221
金钱
221
注册时间
2016-6-16
在线时间
56 小时
 楼主| 发表于 2019-6-11 13:57:20 | 显示全部楼层
先遇到问题是,读取的温度一直是0,之前用stm32读取,很顺利,这个stm8s103读取一直是0 程序改了n变,时序确认了n遍,就是不行。问原因。

另外,这款芯片有内部温度传感器嘛,有的话就不用18b20了。


#include "ds18b20.h"  


/*********************************************************************************
*   函 数 名: delay_us
*   功能说明: 微秒延时程序,注意此函数的运行环境为(16M时钟速度)
*   形    参:nCount要延时的微秒数,输入nCount=1微妙
*   返 回 值: 无
*********************************************************************************/
void delay_us(u16 nCount)   //16M 晶振时  延时 1个微妙
{
    nCount*=3;//等同于 nCount=nCount*3  相当于把nCount变量扩大3倍
    while(--nCount);//nCount变量数值先减一,再判断nCount的数值是否大于0,大于0循环减一,等于0退出循环。
}

/*********************************************************************************
*   函 数 名: delay_ms
*   功能说明: 毫秒延时程序,注意此函数的运行环境为(16M时钟速度)
*   形    参:nCount要延时的毫秒数,输入nCount=1毫秒
*   返 回 值: 无
*********************************************************************************/
void delay_ms(u16 nCount)  //16M 晶振时  延时 1个毫秒
{
    while(nCount--)//先判断while()循环体里的nCount数值是否大于0,大于0循环,减一执行循环体,等于0退出循环。
    {
        delay_us(1000);//调用微妙延时函数,输入1000等译演示1毫秒。
    }
}
u8 DS18B20_Read_Byte(void)
{
    u8 i=0;
    u8 TempData=0;
   
    for(i=0;i<8;i++)
    {
        TempData>>=1;
        
        DZX_O;
        DZX_L;
        delay_us(2);
        DZX_H;
//        delay_us(10);
        DZX_I;
        delay_us(2);
        
        if(DZX_V)
        {
            TempData|=0x80;
        }
        delay_us(60);
    }
   
    return TempData;
}

void DS18B20_Write_Byte(u8 dat)
{
    u8 i=0;
   
    DZX_O;
   
    for(i=0;i<8;i++)
    {
        DZX_L;
        delay_us(15);
        
        if((dat&0x01))
        {
          DZX_L;
          delay_us(2);
          DZX_H;
          delay_us(60);
        }
        else
        {
          DZX_L;
          delay_us(60);
          DZX_H;
          delay_us(2);
        }
        dat>>=1;
    }   
}

void DS18B20_Reset(void)
{
    DZX_O;
    DZX_L;
    delay_us(480);
    DZX_H;
    delay_us(480);   
}
u8 DS18B20_Check(void)           
{   
        u8 retry=0;
        DZX_I;
        while (retry<60)
        {
          retry++;
          delay_us(1);
          if(DZX_V==0)  break;
        }         
        if(retry>=60) return 1;
        else
        {
          retry=0;
          return 0;
        }
}
double DS18B20_Get_wd(void)
{
    u8 TL=0,TH=0;
    u16 temp=0;
    double wd=0;
   
    DS18B20_Reset();
//    if(DS18B20_Check()==0) delay_us(480);   
    DS18B20_Write_Byte(0xCC);
    DS18B20_Write_Byte(0x44);
    delay_ms(800);
   
    DS18B20_Reset();
    DS18B20_Write_Byte(0xCC);
    DS18B20_Write_Byte(0xBE);
   
    TL=DS18B20_Read_Byte();
    TH=DS18B20_Read_Byte();
   
    temp=TH;
    temp=(temp<<8)+TL;
   
    if((temp&0xF800)==0xF800)//负温度
    {   
        temp=~temp;
        temp=temp+1;
        wd=temp*(-0.0625);      
    }
    else
    {   
        wd=temp*0.0625;      
    }
   
    return wd;
}

int DS18B20_Demo(void)
{
    int temp=0;
   
    temp=DS18B20_Get_wd();
    return temp;
   
//    printf("当前环境温度:%d.%d ℃\r\n",(u16)temp,Get_decimal(temp,4));
}

回复

使用道具 举报

20

主题

49

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
221
金钱
221
注册时间
2016-6-16
在线时间
56 小时
 楼主| 发表于 2019-6-11 16:19:48 | 显示全部楼层
引脚用的PF4
回复

使用道具 举报

109

主题

5564

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
10569
金钱
10569
注册时间
2017-2-18
在线时间
1913 小时
发表于 2019-6-11 17:51:13 | 显示全部楼层
帮顶~~
回复

使用道具 举报

20

主题

49

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
221
金钱
221
注册时间
2016-6-16
在线时间
56 小时
 楼主| 发表于 2019-6-11 17:54:05 | 显示全部楼层
顶起来啊 大神们
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2019-6-12 01:42:22 | 显示全部楼层
1, STM8没有内部温度传感器。
2, 读不出来,检查你的时序,一般是延时不对,你可以用示波器看看波形,对比下和STM32的区别。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

20

主题

49

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
221
金钱
221
注册时间
2016-6-16
在线时间
56 小时
 楼主| 发表于 2019-6-12 10:34:03 | 显示全部楼层
正点原子 发表于 2019-6-12 01:42
1, STM8没有内部温度传感器。
2, 读不出来,检查你的时序,一般是延时不对,你可以用示波器看看波形,对 ...

示波器看了下,这个型号好像不能精确到1us 。貌似内部晶振误差较大,也就是说这个单片机stm8s103k3驱动不了ds18b20.是这样不?
回复

使用道具 举报

0

主题

70

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
206
金钱
206
注册时间
2019-12-3
在线时间
27 小时
发表于 2019-12-5 12:53:29 | 显示全部楼层
tianye907 发表于 2019-6-11 13:55
结:在某大神的帮助下解决问题。不是程序问题,也不是延时问题,是stm8本身问题。

耗费了我2天半时间! ...

能详细说一下为什么PF4不行吗?是那一款STM8不行?
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-23 20:29

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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