OpenEdv-开源电子网

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

用STM8的库函数开发DS18B20弄了三天了还是没弄好,求助帮我看看代码。

[复制链接]

1

主题

5

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2015-1-31
在线时间
0 小时
发表于 2015-3-18 18:50:38 | 显示全部楼层 |阅读模式
5金钱
硬件我用51测试过了没有问题。时序也照做了,也参考了别人的代码,但还是失败。我感觉问题出在IO口的配置上,推挽输出、上拉输出、浮空输入、上拉输入都试过,还是不成功。下面是我的代码,麻烦帮我看一下。我的延时函数是用定时器计数的,一个_delay_us()有15us。

uchar DS18B20_Rst()
{
       uchar dat=1;
   
        GPIO_Init(GPIOA, GPIO_PIN_6, GPIO_MODE_OUT_PP_HIGH_SLOW);//推挽输出高电平,释放单总线 
        _delay_us(1); //稍做延时
   
        GPIO_WriteLow(GPIOA, GPIO_PIN_6); //拉低单总线至少480μs来产生复位脉冲
       _delay_us(40);     //复位脉冲 //精确延时 大于 480us 小于960u
     
       GPIO_WriteHigh(GPIOA, GPIO_PIN_6); //释放总线并进入接收模式
        _delay_us(5);//需要等待15~60us,再发出存在脉冲:拉低总线60-240us

        GPIO_Init(GPIOA, GPIO_PIN_6, GPIO_MODE_IN_FL_NO_IT); //上拉无中断输入
        if (GPIO_ReadInputPin(GPIOA, GPIO_PIN_6)== SET) 
             dat = 1;
        else
             dat = 0;
        
        _delay_us(15);      
        GPIO_Init(GPIOA, GPIO_PIN_6, GPIO_MODE_OUT_PP_HIGH_SLOW);
      
        //如果dat=0则初始化成功, dat=1则初始化失败
        return dat;
}

/*
 * 函数名 : DS18B20_ReadData
 * 描述 : 从DS18B20读一字节数据
 * 输入 : 无
 * 输出 : uchar dat   读出的数据
 * 调用 : 内部调用
*/

static uchar DS18B20_ReadData()
{
    uchar i = 0;
    uchar dat = 0;
    
    for (i=0; i<8; i++)             
    {      
        GPIO_Init(GPIOA, GPIO_PIN_6, GPIO_MODE_OUT_OD_LOW_SLOW);            //拉低总线,产生读信号 
        _delay_us(1);
        dat >>= 1;
        GPIO_WriteHigh(GPIOA, GPIO_PIN_6);                //释放总线,准备读数据
        _delay_us(1);       //延时几微秒读数据
        
        GPIO_Init(GPIOA, GPIO_PIN_6, GPIO_MODE_IN_FL_NO_IT);        
        if( GPIO_ReadInputPin(GPIOA, GPIO_PIN_6) == SET )
            dat |= 0x80;//读取数据
        
        _delay_us(4);      //延时 60us 
        
        GPIO_Init(GPIOA, GPIO_PIN_6, GPIO_MODE_OUT_PP_HIGH_SLOW)           //拉高总线,准备下一位数据的读取
        _delay_us(1);  
    }
    return dat;
}

/*
 * 函数名 : DS18B20_WriteData
 * 描述 : 写数据到DS18B20
 * 输入 : uchar dat   要写入的数据
 * 输出 : 无
 * 调用 : 内部调用
*/

static void DS18B20_WriteData(uchar dat)
{
    uchar i = 0;
    
    for (i=0; i<8; i++)             
    {
        GPIO_Init(GPIOA, GPIO_PIN_6, GPIO_MODE_OUT_PP_LOW_SLOW);            //拉低总线,产生写信号
        _delay_us(1);   
       
        if (dat&0x01)
           GPIO_WriteHigh(GPIOA, GPIO_PIN_6);
        else
           GPIO_WriteLow(GPIOA, GPIO_PIN_6);
        dat >>= 1;                 
        _delay_us(4);  //至少60μs
        GPIO_WriteHigh(GPIOA, GPIO_PIN_6); //释放总线
        _delay_us(1);
    }
}

/*
 * 函数名 : Get_Temp
 * 描述 : 读DS18B20获取温度
 * 输入 : 无
 * 输出 : uint xdata temp   温度X100
 * 调用 : 内部调用
*/

uint Get_Temper()
{
    uint temp;
    uchar TPH;           //存放温度值的高字节
    uchar TPL;             //存放温度值的低字节
    float f_temp; //存放实际温度
    
    uchar tiu;
  

    DS18B20_Rst();                  //设备复位
    DS18B20_WriteData(0xCC);        //跳过ROM命令
    DS18B20_WriteData(0x44);        //开始转换命令

    GPIO_Init(GPIOA, GPIO_PIN_6, GPIO_MODE_IN_FL_NO_IT);
    if( GPIO_ReadInputPin(GPIOA, GPIO_PIN_6) == SET )
        tiu = 1;
    else 
        tiu = 0;
    
    while (!tiu);                    //等待转换完成
      
    DS18B20_Rst();                  //设备复位
    DS18B20_WriteData(0xCC);        //跳过ROM命令
    DS18B20_WriteData(0xBE);        //读暂存存储器命令
    TPL = DS18B20_ReadData();       //读温度低字节
    TPH = DS18B20_ReadData();       //读温度高字节

temp = TPH; //将高字节和低字节合成一个十六位数
temp <<= 8;
temp |= TPL;

f_temp = temp * 0.0625; //计算实际温度
temp = f_temp * 10 + 0.5; //将浮点数转成整数,保留一位小数,四舍五入

return temp;
}

最佳答案

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

这是一个关于STM8奇葩bug的帖子,参考下: http://www.openedv.com/posts/list/0/37203.htm       如楼下所言,可能是delay的问题,用逻辑分析仪测下。  
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

102

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
281
金钱
281
注册时间
2014-12-21
在线时间
0 小时
发表于 2015-3-18 18:50:39 | 显示全部楼层
这是一个关于STM8奇葩bug的帖子,参考下:
http://www.openedv.com/posts/list/0/37203.htm      

如楼下所言,可能是delay的问题,用逻辑分析仪测下。  

回复

使用道具 举报

558

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
164867
金钱
164867
注册时间
2010-12-1
在线时间
2099 小时
发表于 2015-3-18 21:50:14 | 显示全部楼层
帮顶.....
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手上路

积分
27
金钱
27
注册时间
2015-3-19
在线时间
1 小时
发表于 2015-3-19 14:06:15 | 显示全部楼层
我也正在搞这个DS18B20,应该是延时函数有问题,你是怎么延时的
回复

使用道具 举报

1

主题

5

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2015-1-31
在线时间
0 小时
 楼主| 发表于 2015-5-6 17:51:15 | 显示全部楼层
回复【4楼】qian327:
---------------------------------
没看回复呵,搞好了,确实是延时有问题,端口模式设置也有影响。你解决了吗,需要帮忙说一声
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
21
金钱
21
注册时间
2015-6-18
在线时间
0 小时
发表于 2015-6-18 17:01:54 | 显示全部楼层
肯定是时序的问题,我也出现过同样的问题,好好看看时序吧
回复

使用道具 举报

15

主题

57

帖子

0

精华

初级会员

Rank: 2

积分
154
金钱
154
注册时间
2014-11-1
在线时间
2 小时
发表于 2015-6-19 09:24:49 | 显示全部楼层
回复【5楼】平衡小车新手:
---------------------------------
可以把源代码分享下不?
回复

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
13
金钱
13
注册时间
2020-5-2
在线时间
2 小时
发表于 2020-11-8 20:54:38 | 显示全部楼层
平衡小车新手 发表于 2015-5-6 17:51
回复【4楼】qian327:
---------------------------------
没看回复呵,搞好了,确实是延时有问题,端口模式 ...

我想问一下STM8+DS18B20的问题,我最近也遇到的同样的问题,始终无法解决
回复

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
13
金钱
13
注册时间
2020-5-2
在线时间
2 小时
发表于 2020-11-8 21:06:53 | 显示全部楼层
平衡小车新手 发表于 2015-5-6 17:51
回复【4楼】qian327:
---------------------------------
没看回复呵,搞好了,确实是延时有问题,端口模式 ...

需要帮忙
回复

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
13
金钱
13
注册时间
2020-5-2
在线时间
2 小时
发表于 2020-11-8 21:07:20 | 显示全部楼层
平衡小车新手 发表于 2015-5-6 17:51
回复【4楼】qian327:
---------------------------------
没看回复呵,搞好了,确实是延时有问题,端口模式 ...

需要帮忙
回复

使用道具 举报

0

主题

4

帖子

0

精华

新手上路

积分
21
金钱
21
注册时间
2017-9-16
在线时间
3 小时
发表于 2020-11-13 09:43:17 | 显示全部楼层
移植原子哥STM32里DS18b20的驱动,我试过完全可以用
回复

使用道具 举报

0

主题

4

帖子

0

精华

新手入门

积分
5
金钱
5
注册时间
2021-2-23
在线时间
0 小时
发表于 2021-2-23 17:16:47 来自手机 | 显示全部楼层
谢谢分享
回复

使用道具 举报

0

主题

5

帖子

0

精华

新手上路

积分
27
金钱
27
注册时间
2020-12-1
在线时间
5 小时
发表于 2022-9-20 18:42:50 | 显示全部楼层
IAR 优化等级
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-5-14 17:10

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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