找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2889|回复: 8
收起左侧

这是ds18b20部分的代码,lcd显示总是几千的数值,请有心人指正!!!谢谢!!!

[复制链接]
ID:503877 发表于 2019-4-5 10:42 | 显示全部楼层 |阅读模式
本帖最后由 不好不坏 于 2019-4-5 11:10 编辑

void init_ds18b20()
{
        u8 i;
        bit flag;
        do
        {
        dq=1;
        _nop_();
        dq=0;
        i=103;
        while(i>0)i--;//延时
        dq=1;
        flag=dq;
        i=4;
        while(i>0)i--;
        }while(flag);
}
bit read_onebit()
{
                u8 i;
                u8 onebit;
                dq=0;
                i++;
                dq=1;
                i++;
                onebit=dq;
                i=8;while(i>0)i--;//延时
        return onebit;
}
u8 read_onebyte()
{
        u8 dat=0,a,k;
        for(a=0;a<8;a++)
        {
        k=read_onebit();
        dat=(k<<7)|(dat>>1);//循环把读到的低位放在低位
        }
        return dat;
}
void write_onebyte(u8 dat)
{
        u8 d=0,i;        
        bit testbit;
        for(d=8;d>0;d--)
        {
                dq=dat&0x01;                //从dat最低位开始传送
                dat>>=1;                                //移除已经传送的最低位
                if(testbit==1)                //写1
                {
                        dq=0;
                        _nop_();        
                        _nop_();
                        dq=1;
                        i=8;while(i>0)i--;//延时
                }
                else                        //写0
                {
                        dq=1;
                        i=8;while(i>0)i--;
                        dq=0;
                        i++;i++;
                }
        }
}
float get_temp()
{
        u8 a,b;
        u16 temp;float tmp;
        init_ds18b20();                //初始化
        write_onebyte(0xcc);        //忽略ROM指令
        write_onebyte(0x64);
        delay_ms(10);

        init_ds18b20();                        //再度初始化
        write_onebyte(0xcc);        //忽略ROM指令
        write_onebyte(0x00);
        delay_ms(10);

        init_ds18b20();                //初始化
        write_onebyte(0xcc);        //忽略ROM指令
        write_onebyte(0x44);        //温度转换指令+
        delay_ms(800);

        init_ds18b20();                //初始化
        write_onebyte(0xcc);        //忽略ROM指令
        write_onebyte(0xbe);        //读暂存器指令


        a=read_onebyte();                //第一个字节是LSB,低八位
        b=read_onebyte();                //第二个字节是MSB,高八位
        temp=b;                                        //先把高八位b装进temp,一定是进入到temp低八位
        temp<<=8;                                //左移8次;让B回到原位
        temp|=a;                                        //再和A相加,
        tmp=(float)(temp*0.0625);
        return tmp;
}


psb.jpg
回复

使用道具 举报

ID:213173 发表于 2019-4-5 13:22 | 显示全部楼层
对比一下就知道问题在哪里 ds18b20温度LCD显示.zip (159.01 KB, 下载次数: 34)
回复

使用道具 举报

ID:164602 发表于 2019-4-5 13:37 | 显示全部楼层
18B20是12位精度的话:
正数这样转换:temp=tp*0.0625*100+0.5;//tp是有符号实数型变量,就是读到的温度值,这个计算保留两位小数

负数这样转换:tp=tp-1;
                      tp=~tp;
                      temp=tp*0.0625*100+0.5;
回复

使用道具 举报

ID:503877 发表于 2019-4-5 18:17 | 显示全部楼层
wulin 发表于 2019-4-5 13:22
对比一下就知道问题在哪里

完全套用你的程序,显示出负的温度,而且整数位还在跳动,不知缘故
回复

使用道具 举报

ID:503877 发表于 2019-4-5 18:18 | 显示全部楼层
HC6800-ES-V2.0 发表于 2019-4-5 13:37
18B20是12位精度的话:
正数这样转换:temp=tp*0.0625*100+0.5;//tp是有符号实数型变量,就是读到的温度值 ...

试过了,还是不正常
回复

使用道具 举报

ID:503877 发表于 2019-4-5 18:28
wulin 发表于 2019-4-5 13:22
对比一下就知道问题在哪里

http://javascript:void(0)只是按照你的代码实验的结果,

ID:213173 发表于 2019-4-6 07:03 | 显示全部楼层
不好不坏 发表于 2019-4-5 18:17
完全套用你的程序,显示出负的温度,而且整数位还在跳动,不知缘故

软件是建立在硬件基础上的,硬件条件不同不要直接套用,否则会出错。
回复

使用道具 举报

ID:917252 发表于 2021-5-26 09:57 | 显示全部楼层
大佬们看看我的那个温度显示,负数部分异常怎么改呢
回复

使用道具 举报

ID:824490 发表于 2021-5-26 10:08 | 显示全部楼层
其实这类问题,你能在线跟踪一下代码,很容易发现问题的。
1、读写时序对不对?
2、数值转换对不对?
3、显示传参对不对?
18B20的代码还是很友善的,不行的话就多下载一些人家现成的代码来改。
回复

使用道具 举报

ID:824490 发表于 2021-5-26 10:15 | 显示全部楼层
bit read_onebit()
{
                u8 i;
                u8 onebit;
                dq=0;
                i++;
                dq=1;
                i++;
                onebit=dq; ///????
                i=8;while(i>0)i--;//延时
        return onebit;////onebit永远是1,
}
也就是说你读出的数值都是1 ,12位刚好是4096,与你显示的一致?
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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