DS1820温度测量的C51程序
2012-11-07
标签: DS18B20 C51


DS1820,单芯片温度测量,C51程序
//DS1820 C51子程序
//这里以11.0592M晶体为例,不同的晶体速度可能需要调整延时的时间
//sbit DQ =P2^1;//根据实际情况定义端口
typedef unsigned char byte;
typedef unsigned intword;
//延时
void delay(word useconds)
{
    for (; useconds > 0; useconds--);
}

//复位
byte ow_reset(void)
{
    byte presence;
    DQ = 0; //pull DQ line low
    delay(29); // leave it low for 480us
    DQ = 1; // allow line to return high
    delay(3); // wait for presence
    presence = DQ; // get presence signal
    delay(25); // wait for end of timeslot
    return (presence); // presence signal returned
}// 0=presence, 1 = no part
//从 1-wire 总线上读取一个字节
byte read_byte(void)
{
    byte i;
    byte value = 0;
    for (i = 8; i > 0; i--) {
        value >>= 1;
        DQ = 0; // pull DQ low to start timeslot
        DQ = 1; // then return high
        delay(1);//for (i=0; i<3; i++);
        if (DQ) {
            value |= 0x80;
        }
        delay(6); // wait for rest of timeslot
    }
    return (value);
}

//向 1-WIRE 总线上写一个字节
void write_byte(char val)
{
    byte i;
    for (i = 8; i > 0; i--) { // writes byte, one bit at a time
        DQ = 0; // pull DQ low to start timeslot
        DQ = val & 0x01;
        delay(5); // hold value for remainder of timeslot
        DQ = 1;
        val = val / 2;
    }
    delay(5);
}

//读取温度
char Read_Temperature(void)
{
    union {
        byte c[2];
        int x;
    } temp;
    ow_reset();
    write_byte(0xCC); // Skip ROM
    write_byte(0xBE); // Read Scratch Pad
    temp.c[1] = read_byte();
    temp.c[0] = read_byte();
    ow_reset();
    write_byte(0xCC); //Skip ROM
    write_byte(0x44); // Start Conversion
    return temp.x / 2;
}


可能会用到的工具/仪表
本站简介 | 意见建议 | 免责声明 | 版权声明 | 联系我们
CopyRight@2024-2039 嵌入式资源网
蜀ICP备2021025729号