搜索
bottom↓
回复: 0

本人新手,ds18b20测温显示10几度,且上升非常慢

[复制链接]

出0入0汤圆

发表于 2012-5-14 10:46:17 | 显示全部楼层 |阅读模式

#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit DQ=P1^6;
uchar tab[]={
        0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,//0 1 2 3 4 5 6 7 8 9
        0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10 //0. 1. 2. 3. 4. 5. 6. 7. 8. 9.
        };
uchar temp;
uchar buffer[]={0,0,0,0};
void delay(uint x);
void delay_ms(uint x);
void inti_ds18b20();
void write_byte(uchar dat);
uchar read_byte();
uchar read_t();
void display();
void buffer_data();
void main()
{
//        inti_ds18b20();
        while(1)
        {
                temp=read_t();
                buffer_data();
                display();
        }               
}
void delay(uint x)
{
       
        while(x--);
}
void delay_ms(uint x)
{
        uchar i;
        while(x--)
        {
                for(i=0;i<112;i++);
        }
}
void inti_ds18b20()
{
       
        DQ=1;
        delay(8);
        DQ=0;
        delay(200);       
        DQ=1;
        delay(100);
       
}
void write_byte(uchar dat)
{
        uchar i;
        for(i=0;i<8;i++)
        {
                DQ=0;
                DQ=dat&0x01;        //从字节的最低位开始传输
                delay(10);
                DQ=1;
                dat>>=1;       
        }
        delay(4);
}
uchar read_byte()
{
        uchar i,value;
        for(i=0;i<8;i++)
        {
                DQ=0;
                value>>=1; //让从总线上读到的位数据,依次从高位移动到低位
                DQ=1;
                if(DQ)
                value|=0x80;       
                                                        //若总线为1,即DQ为1,那就把dat的最高位置1;若为0,则不进行处理,保持为0
                delay(10);
        }
        return value;
}
uchar read_t()
{
        uchar a,b;
        inti_ds18b20();
        write_byte(0xcc);        //跳过Rom
        write_byte(0x44);        //启动温度测量
        delay(300);

        inti_ds18b20();
        write_byte(0xcc);
        write_byte(0xbe);
        a=read_byte();         //读取到的第一个字节为温度LSB
        b=read_byte();        //读取到的第一个字节为温度MSB
                  
                   
        temp= b;                      //先把高八位有效数据赋于temp
        temp<<= 8;                    //把以上8位数据从temp低八位移到高八位
        temp|=a;                        //两字节合成一个整型变量
        temp*=0.625;  //得到真实十进制温度值 放大十倍
                                
        //temp = tt*10+0.5;               //放大十倍
                                //这样做的目的将小数点后第一位也转换为可显示数字
                                //同时进行一个四舍五入操作。
        return temp;
}
void buffer_data()
{
        buffer[0]=temp%10;
        buffer[1]=temp/10%10+10;
        buffer[2]=temp/100;
}
void display()
{
        P2=0xfe;
        P0=tab[buffer[0]];
        delay_ms(1);
        P0=0xff;
       
        P2=0xfd;
        P0=tab[buffer[1]];
        delay_ms(1);
        P0=0xff;
       
        P2=0xfb;
        P0=tab[buffer[2]];
        delay_ms(1);
        P0=0xff;
               
               
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-24 02:16

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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