打印

一个关于DS18B20的问题,小数点位只显示0

[复制链接]
2006|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
我是胖子|  楼主 | 2013-8-6 22:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
Init_DS18B20.c
#include<HL_1.h>
#include<intrins.h>

void delay_11us(uint n)
{
        while (n--);
}

/*
* 18B20复位函数
*/
void DS18b20_reset(void)
{
        bit flag=1;

        while (flag)
        {
                while (flag)
                 {
                        DQ = 1;
                        delay_11us(1);
                        DQ = 0;
                        delay_11us(50); // 550us
                        DQ = 1;
                        delay_11us(6);  // 66us
                        flag = DQ; //如果DQ返回信号为低,证明复位成功
                   }
                delay_11us(45);    //延时500us
                flag = ~DQ;
        }
        DQ=1;
}


/*
* 18B20写1个字节函数
* 向1-WIRE总线上写一个字节
*/
void write_byte(uchar val)
{
        uchar i;

        for (i=0; i<8; i++)
        {
                DQ = 1;
                _nop_();
                DQ = 0;
                _nop_();
                _nop_();
                _nop_();
                _nop_();//4us
                DQ = val & 0x01;      //最低位移出
                delay_11us(6);           //66us
                val >>= 1;          //右移一位
        }
        DQ = 1;
        delay_11us(1);  
}

/*
* 18B20读1个字节函数
* 从1-WIRE总线上读取一个字节
*/
uchar read_byte(void)
{
        uchar i, value=0;

        for (i=0; i<8; i++)
        {
                DQ=1;
                _nop_();
                value >>= 1;
                DQ = 0;
                _nop_();
                _nop_();
                _nop_();
                _nop_();   //4us
                DQ = 1;
                _nop_();
                _nop_();
                _nop_();
                _nop_();   //4us
                if (DQ)
                        value|=0x80;
                delay_11us(6);           //66us
        }
        DQ=1;

        return(value);
}

/*
* 启动温度转换
*/
void start_temp_sensor(void)
{
        DS18b20_reset();
        write_byte(0xCC); // 发Skip ROM命令
        write_byte(0x44); // 发转换命令
}

/*
* 读出温度
*/
float read_temp(void)
{
        uchar temp_data[2]; // 读出温度暂放
        volatile int tt;
        float temp;

        DS18b20_reset();  // 复位
        write_byte(0xCC); // 发Skip ROM命令
        write_byte(0xBE); // 发读命令
        temp_data[0]=read_byte();  //温度低8位
        temp_data[1]=read_byte();  //温度高8位

        tt = temp_data[1];//把高八位放到int的高八位上,因为最高位是一,为负
        tt <<= 8;
        tt |= temp_data[0];//再把低八位放到int的低八位上
        temp = tt*0.0625;

        return temp;
}
主函数
#include<reg52.h>
#include<HL_1.h>
#include"Init_DS18B20.h"

int tem;//温度值
uchar shi, ge, xiaoshu;
uint NUM[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uint PLACE[7] = {0xff,0xfe,0xfd,0xfb,0xf7,0xef,0xdf};

void main()
{
        while(1)
        {
                start_temp_sensor();
                delay(1);
                tem = read_temp();

                shi = (int)tem/10;
                ge = (int)tem%10;
                xiaoshu = (int)(tem*10)%10;
               
                WE = 1;
                P0 = PLACE[4];
                WE = 0;

                DU = 1;
                P0 = NUM[shi];
                DU = 0;
                delay(2);

                WE = 1;
                P0 = PLACE[5];
                WE = 0;

                DU = 1;
                P0 = NUM[ge];
                DU = 0;
                delay(2);

                WE = 1;
                P0 = PLACE[5];
                WE = 0;

                DU = 1;
                P0 = 0x80;
                DU = 0;
                delay(2);

                WE = 1;
                P0 = PLACE[6];
                WE = 0;

                DU = 1;
                P0 = NUM[xiaoshu];
                DU = 0;
                delay(2);                        
        }       
}

相关帖子

沙发
dirtwillfly| | 2013-8-6 22:40 | 只看该作者
好长的程序,难道是改错题?

使用特权

评论回复
板凳
我是胖子|  楼主 | 2013-8-7 09:00 | 只看该作者
dirtwillfly 发表于 2013-8-6 22:40
好长的程序,难道是改错题?

自己写的  版主  你就 救救我吧

使用特权

评论回复
地板
叶伤| | 2013-8-15 21:14 | 只看该作者
我自己做的时候怎么改,都只有0或5,好像第二字节低四位不是0000就是0111,即使读出计数剩余值和每度计数值进行计算(直接计算后小数*10取个位或者fprintf取小数ASCII码-48,code会多出3100字节),也只能显示7,无论多少摄氏度,郁闷,这DS18B20到底怎么回事

使用特权

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

本版积分规则

6

主题

12

帖子

0

粉丝