查看: 4928|回复: 11

PSOC用DS18B20为何老是采集不到温度啊?请高手指点啊,下面...

[复制链接]
  • TA的每日心情

    2014-1-19 09:33
  • 签到天数: 45 天

    连续签到: 1 天

    [LV.5]常住居民I

    发表于 2013-10-22 00:41:28 | 显示全部楼层 |阅读模式
    分享到:
    #include<stdio.h>
    #include"reg51.h"
    #include "LCD_Char_1.h"
    #include <math.h>
    #include<intrins.h>
    sbit DQ=P2^3;
    unsigned int temp;
    unsigned int tempreture;
    uint8 outputStr[12];
    void delay100us(void)   //误差 0us
    {
        unsigned char a,b;
        for(b=1;b>0;b--)
            for(a=97;a>0;a--);
    }
    void delay750us(void)   //误差 0us
    {
        unsigned char a,b;
        for(b=3;b>0;b--)
            for(a=248;a>0;a--);
    }
    void delay40us(void)   //误差 0us
    {
        unsigned char a,b;
        for(b=11;b>0;b--)
            for(a=2;a>0;a--);
    }
    void delay500us(void)   //误差 0us
    {
        unsigned char a,b,c;
        for(c=1;c>0;c--)
            for(b=142;b>0;b--)
                for(a=2;a>0;a--);
    }
    void delay15us(void)   //误差 0us
    {
        unsigned char a,b;
        for(b=3;b>0;b--)
            for(a=3;a>0;a--);
    }
    void delay7us(void)   //误差 0us
    {
        unsigned char a,b,c,d;
        for(d=1;d>0;d--)
            for(c=1;c>0;c--)
                for(b=1;b>0;b--)
                    for(a=1;a>0;a--);
    }
    void delay60us(void)   //误差 0us
    {
        unsigned char a,b;
        for(b=13;b>0;b--)
            for(a=3;a>0;a--);
    }
    void init_ds18b20(void)     //DS18B20初始化send reset and initialization command
    {
    DQ = 1;                     //DQ复位,不要也可行。
    delay7us();                  //稍做延时
    DQ = 0;                    //单片机拉低总线
    delay750us();                //精确延时,维持至少480us
    DQ = 1;                    //释放总线,即拉高了总线
    delay500us();                //此处延时有足够,确保能让DS18B20发出存在脉冲。
    }
    unsigned char Read_One_Byte()       //读取一个字节的数据read a byte date                            //读数据时,数据以字节的最低有效位先从总线移出
    {
    unsigned char dat;
    unsigned char i=0;
    for(i=8;i>0;i--)
    {
       DQ=0;                  //将总线拉低,要在1us之后释放总线
                               //单片机要在此下降沿后的15us内读数据才会有效。
       _nop_();
       _nop_();                 //至少维持了1us,表示读时序开始
       dat >>= 1;               //让从总线上读到的位数据,依次从高位移动到低位。
       DQ = 1;                  //释放总线,此后DS18B20会控制总线,把数据传输到总线上
       delay7us();                 //延时7us,此处参照推荐的读时序图,尽量把控制器采样时间放到读时序后的15us内的最后部分
       if(DQ)                   //控制器进行采样
       {
        dat |= 0x80;            //若总线为1,即DQ为1,那就把dat的最高位置1;若为0,则不进行处理,保持为0
       }      
       delay60us();               //此延时不能少,确保读时序的长度60us。
    }
    return (dat);
    }
    Write_One_Byte(unsigned char dat)
    {
    unsigned char i=0;
    for(i=8;i>0;i--)
    {
       DQ = 0;                        //拉低总线
       _nop_();
       _nop_();                      //至少维持了1us,表示写时序(包括写0时序或写1时序)开始
       DQ = dat&0x01;                 //从字节的最低位开始传输
                                     //指令dat的最低位赋予给总线,必须在拉低总线后的15us内,
                                    //因为15us后DS18B20会对总线采样。
       delay60us();                      //必须让写时序持续至少60us
       DQ = 1;                        //写完后,必须释放总线,
       dat >>= 1;
       delay7us();
    }
    return (dat);
    }
    unsigned int Get_Tmp()                   //获取温度get the temperature
    {
    float tt;
    unsigned char a,b;
    init_ds18b20();                //初始化
    Write_One_Byte(0xcc);          //忽略ROM指令
    Write_One_Byte(0x44);          //温度转换指令
    init_ds18b20();                //初始化
    Write_One_Byte(0xcc);          //忽略ROM指令
    Write_One_Byte(0xbe);          //读暂存器指令
    a=Read_One_Byte();           //读取到的第一个字节为温度LSB
    b=Read_One_Byte();           //读取到的第一个字节为温度MSB
    temp=b;                      //先把高八位有效数据赋于temp
    temp<<=8;                    //把以上8位数据从temp低八位移到高八位
    temp=temp|a;                //两字节合成一个整型变量
    tt=temp*0.0625;              //得到真实十进制温度值
                                    //因为DS18B20可以精确到0.0625度
                                    //所以读回数据的最低位代表的是0.0625度
    temp=tt*10+0.5;               //放大十倍
                                    //这样做的目的将小数点后第一位也转换为可显示数字
                                    //同时进行一个四舍五入操作。
    return temp;
    }
    void main()
    {
        LCD_Char_1_Start();
        LCD_Char_1_Position(0,0);
        LCD_Char_1_PrintString("tempreture");
        LCD_Char_1_Position(1,9);
        LCD_Char_1_PrintString("C");
        while(1)
        {
        tempreture=Get_Tmp();
        sprintf(outputStr, "%4fC", tempreture);
        LCD_Char_1_Position(1,1);
        LCD_Char_1_PrintString(outputStr);
        }

    }

    回复

    使用道具 举报

    该用户从未签到

    发表于 2013-10-22 09:48:42 来自手机 | 显示全部楼层
    psoc有现成的delay和IIC或SPI的api吧,还有psoc4用sprinf经常会报错或者卡死在那,可以考虑换一下
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2014-1-19 09:33
  • 签到天数: 45 天

    连续签到: 1 天

    [LV.5]常住居民I

     楼主| 发表于 2013-10-22 10:16:03 | 显示全部楼层
    leonard 发表于 2013-10-22 09:48
    psoc有现成的delay和IIC或SPI的api吧,还有psoc4用sprinf经常会报错或者卡死在那,可以考虑换一下 ...

    我用的是PSOC3,sprinf到没出问题,运行也没问题,那个延时我使用一个软件单片机小精灵将晶振调为24MHZ自动生成的。那个I2C还有SPI倒是没用到,哥们还有啥建议?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    发表于 2013-10-22 12:06:56 来自手机 | 显示全部楼层
    本帖最后由 leonard 于 2013-10-22 12:08 编辑

    是spi通信吗,三线还是四线
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2014-1-19 09:33
  • 签到天数: 45 天

    连续签到: 1 天

    [LV.5]常住居民I

     楼主| 发表于 2013-10-22 17:40:35 | 显示全部楼层
    leonard 发表于 2013-10-22 12:06
    是spi通信吗,三线还是四线

    三线啊,可是饿没用SPI啊。。。难道是这个原因?本人菜鸟,请大声指教啊
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2018-2-1 22:06
  • 签到天数: 265 天

    连续签到: 1 天

    [LV.8]以坛为家I

    发表于 2013-10-23 09:06:03 | 显示全部楼层
    这个是美信的一线总线吧,数据走一条线,如果确认DS18B20是OK的话,基本上就是时序错了,找示波器看下吧
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2014-1-19 09:33
  • 签到天数: 45 天

    连续签到: 1 天

    [LV.5]常住居民I

     楼主| 发表于 2013-10-23 16:09:36 | 显示全部楼层
    Laspide 发表于 2013-10-23 09:06
    这个是美信的一线总线吧,数据走一条线,如果确认DS18B20是OK的话,基本上就是时序错了,找示波器看下吧 ...

    谢谢你啊,还是延时出了问题啊。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    难过
    2015-7-11 15:23
  • 签到天数: 567 天

    连续签到: 1 天

    [LV.9]以坛为家II

    发表于 2013-10-23 21:35:39 | 显示全部楼层
    有现成的IIC,直接用不行么??自己写的话数据线有没有上拉?PSoC的优势就是模块啊,你居然不用…………
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2014-1-19 09:33
  • 签到天数: 45 天

    连续签到: 1 天

    [LV.5]常住居民I

     楼主| 发表于 2013-10-25 00:31:11 | 显示全部楼层
    醉清风 发表于 2013-10-23 21:35
    有现成的IIC,直接用不行么??自己写的话数据线有没有上拉?PSoC的优势就是模块啊,你居然不用………… ...

    谢谢建议,我再试试。。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2019-7-11 11:26
  • 签到天数: 1982 天

    连续签到: 1 天

    [LV.Master]伴坛终老

    发表于 2013-10-25 08:13:11 | 显示全部楼层
    DS18B20有SPI接口吗?应该没有吧
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条



    手机版|小黑屋|与非网

    GMT+8, 2024-5-20 15:18 , Processed in 0.172998 second(s), 32 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.