DS18B20温度传感器的Arduino驱动程序



DS18B20是常用的数字温度传感器,其输出的是数字信号,具有体积小,硬件开销低,抗干扰能力强,精度高的特点。

前几天有位朋友让我帮忙写个DS18B20的Arduino驱动程序,忙了一个小时,终于成功了。

对比DS18B20与DHT11,他们的相同点是:都是数字信号,所需IO口都是1,都是温度传感器。但是DS18B20不具备DHT11所具有的湿度测量功能,DS18B20的优点是精度高(比DHT11强的没影),体积小。

好了,话不多说,上代码。

int DSPIN = D4;
void setup() {
	// put your setup code here, to run once:
	Serial.begin(115200);
}

void loop() {
	// put your main code here, to run repeatedly:
	double temp = TempRead();
	temp *= 0.0625;//转换精度为0.0625/LSB
	Serial.println(temp);
	delay(500);
}

boolean DS18B20_Init()
{
	pinMode(DSPIN, OUTPUT);
	digitalWrite(DSPIN, HIGH);
	delayMicroseconds(5);
	digitalWrite(DSPIN, LOW);
	delayMicroseconds(750);//480-960
	digitalWrite(DSPIN, HIGH);
	pinMode(DSPIN, INPUT);
	int t = 0;
	while(digitalRead(DSPIN))
	{
		t++;
		if(t > 60) return false;
		delayMicroseconds(1);
	}
	t = 480 - t;
	pinMode(DSPIN, OUTPUT);
	delayMicroseconds(t);
	digitalWrite(DSPIN, HIGH);
	return true;
}

void DS18B20_Write(byte data)
{
	pinMode(DSPIN, OUTPUT);
	for(int i=0; i<8; i++)
	{
		digitalWrite(DSPIN, LOW);
		delayMicroseconds(10);
		if(data & 1) digitalWrite(DSPIN, HIGH);
		else digitalWrite(DSPIN, LOW);
		data >>= 1;
		delayMicroseconds(50);
		digitalWrite(DSPIN, HIGH);
	}
}

byte DS18B20_Read()
{
	pinMode(DSPIN, OUTPUT);
	digitalWrite(DSPIN, HIGH);
	delayMicroseconds(2);
	byte data = 0;
	for(int i=0; i<8; i++)
	{
		digitalWrite(DSPIN, LOW);
		delayMicroseconds(1);
		digitalWrite(DSPIN, HIGH);
		pinMode(DSPIN, INPUT);
		delayMicroseconds(5);
		data >>= 1;
		if(digitalRead(DSPIN)) data |= 0x80;
		delayMicroseconds(55);
		pinMode(DSPIN, OUTPUT);
		digitalWrite(DSPIN, HIGH);
	}
	return data;
}

int TempRead()
{
	if(!DS18B20_Init()) return 0;
	DS18B20_Write(0xCC);//发跳过ROM命令
	DS18B20_Write(0x44);//发读开始转换命令
	if(!DS18B20_Init()) return 0;
	DS18B20_Write(0xCC);//发跳过ROM命令
	DS18B20_Write(0xBE);//读寄存器,共九字节,前两字节为转换值
	int temp = DS18B20_Read();//低字节
	temp |= DS18B20_Read() << 8;//高字节
	return temp;
}

猜你喜欢

转载自blog.csdn.net/zhyulo/article/details/80713272