wch946 发表于 2012-5-14 10:46:17

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


#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=temp%10;
        buffer=temp/10%10+10;
        buffer=temp/100;
}
void display()
{
        P2=0xfe;
        P0=tab];
        delay_ms(1);
        P0=0xff;
       
        P2=0xfd;
        P0=tab];
        delay_ms(1);
        P0=0xff;
       
        P2=0xfb;
        P0=tab];
        delay_ms(1);
        P0=0xff;
               
               
}
页: [1]
查看完整版本: 本人新手,ds18b20测温显示10几度,且上升非常慢