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; }