ds18b20.c

来自「这是单片机实验板比较齐全的程序」· C语言 代码 · 共 71 行

C
71
字号
//DS1820 C51 子程序 
//这里以11.0592M晶体为例,不同的晶体速度可能需要调整延时的时间 
sfr P3=0xB0;
sbit DQ =P3^5;
//根据实际情况定义端口
typedef unsigned char byte; 
typedef unsigned int word;
//延时 
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>>4; 
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?