Arduino与Proteus仿真实例-DS18B20温度传感器驱动仿真
DS18B20温度传感器驱动仿真
DS18B20 是一种温度传感器,它提供 9 位到 12 位的温度读数。 … 该传感器的通信可以通过单线总线协议完成,该协议使用一条数据线与内部微处理器进行通信。
在前面的实例中,对DS18B20做了详细的介绍,请参考:
1、仿真电路原理图

2、仿真代码实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95
| // Interfacing Arduino with DS18B20 temperature sensor
#include <LiquidCrystal.h> // include LCD library code
#define DS18B20\_PIN 2
int raw_temp; float temp; char txt[] = " C ";
void setup(void) { // start serial port Serial.begin(9600);
}
void loop(void) { if(ds18b20\_read(&raw_temp)) { Serial.print("Temperature = "); temp = (float)raw_temp / 16; // Convert temperature raw value into degree Celsius (temp in °C = raw/16) Serial.print(temp); // Print temperature value in degree Celsius Serial.println("\*C"); // Print '°C' } else { Serial.println("Communication Error!"); } delay(1000); }
bool ds18b20\_start(){ bool ret = 0; digitalWrite(DS18B20_PIN, LOW); // Send reset pulse to the DS18B20 sensor pinMode(DS18B20_PIN, OUTPUT); delayMicroseconds(500); // Wait 500 us pinMode(DS18B20_PIN, INPUT); delayMicroseconds(100); //wait to read the DS18B20 sensor response if (!digitalRead(DS18B20_PIN)) { ret = 1; // DS18B20 sensor is present delayMicroseconds(400); // Wait 400 us } return(ret); }
void ds18b20\_write\_bit(bool value){ digitalWrite(DS18B20_PIN, LOW); pinMode(DS18B20_PIN, OUTPUT); delayMicroseconds(2); digitalWrite(DS18B20_PIN, value); delayMicroseconds(80); pinMode(DS18B20_PIN, INPUT); delayMicroseconds(2); }
void ds18b20\_write\_byte(byte value){ byte i; for(i = 0; i < 8; i++) ds18b20\_write\_bit(bitRead(value, i)); }
bool ds18b20\_read\_bit(void) { bool value; digitalWrite(DS18B20_PIN, LOW); pinMode(DS18B20_PIN, OUTPUT); delayMicroseconds(2); pinMode(DS18B20_PIN, INPUT); delayMicroseconds(5); value = digitalRead(DS18B20_PIN); delayMicroseconds(100); return value; }
byte ds18b20\_read\_byte(void) { byte i, value; for(i = 0; i <8; i++) bitWrite(value, i, ds18b20\_read\_bit()); return value; }
bool ds18b20\_read(int \*raw_temp_value) { if (!ds18b20\_start()) // Send start pulse return(0); // Return 0 if error ds18b20\_write\_byte(0xCC); // Send skip ROM command ds18b20\_write\_byte(0x44); // Send start conversion command while(ds18b20\_read\_byte() == 0); // Wait for conversion complete if (!ds18b20\_start()) // Send start pulse return(0); // Return 0 if error ds18b20\_write\_byte(0xCC); // Send skip ROM command ds18b20\_write\_byte(0xBE); // Send read command \*raw_temp_value = ds18b20\_read\_byte(); // Read temperature LSB byte and store it on raw\_temp\_value LSB byte \*raw_temp_value |= (unsigned int)(ds18b20\_read\_byte() << 8); // Read temperature MSB byte and store it on raw\_temp\_value MSB byte return(1); // OK --> return 1 }
|
3、仿真结果

文章来源: https://iotsmart.blog.csdn.net/article/details/121450779
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!