温度传感器DS1820

1、初始化时序:

            首先,DSPORT保持低电平480到960微秒之间,然后将其拉高以产生复位脉冲,若产生复位脉冲,则表示初始化成功。
            复位脉冲:产生60~240微秒的低电平后释放总线。
            防止while语句产生死循环,设置当5毫秒后仍然没有产生低电平(复位脉冲)。则跳出while循环,初始化失败。

在这里插入图片描述

2、写时序:

            若写0时序,则DSPORT一直是低电平
            若写1时序,则DSPORT由低电平到高电平
            因此可以看出应该用“与”逻辑。
            综上,思路为先将DSPORT置为低电平,然后写入数据(采用与逻辑),而后需要释放总线(DSPORT为1)

在这里插入图片描述

3、读时序:

            根据写时序,在写入时序之前,DSPORT先低后高,所以在读数据之前,也应将其置为先底后高。
            读取数据之后,需要延时50微秒。

在这里插入图片描述

4、温度的读取过程:

           复位(初始化时序)——发出SKIP ROM(0xcc,具体见ROM指令表)——发出开始转换命令(0x44,具体见RAM指令表)
           复位(初始化时序)——发出SKIP ROM(0xcc,具体见ROM指令表)——发出开始存储命令(0xbe,具体见RAM指令表)
           连续读出两个字节的命令(即温度),先读低8位,后读高8位。

在这里插入图片描述
在这里插入图片描述

5、将温度转换成10进制数,用数码管显示出来

若温度为负数,则将其转换为补码,然后进行转换。

uint change_date(int temp)
{
 float tp;
 if(temp<0)
 {
  disp_num[0] = 0x40;//负数符号数码管的编码
  temp = temp - 1;//转化为补码
  temp = ~temp;
  tp = temp;
  temp = tp*0.0625*100+0.5;//温度扩大100倍,0.5则是提高精度,四舍五入法的应用
 }
 else
 {
  disp_num[0] = 0x00;
  tp = temp;
  temp = tp*0.0625*100+0.5;
 }
 return temp;
}

原代码:

uchar Init()
{
  uchar i;
  DSPORT = 0;
  i= 70;
  while(i--);
  DSPORT = 1;
  i = 0;
  while(DSPORT)
  {
      i++;
    delay1ms(1);
   if(i>5)
       return 0;
  }
  return 1;
}
void write_byte(uchar date)
{
  uchar i,j;
  for(i=0;i<8;i++)
  {
    DSPORT = 0;
   j++;
   DSPORT |= date&0x01;
   j= 6;
   while(j--);
   DSPORT = 1;
   date >>= 1;
  }
}
uchar read_byte()
{
 uchar i,j;
 uchar bi,byte;
 for(i=0;i<8;i++)
 {
   DSPORT = 0;//根据时序图先将总线拉低10微秒左右
   j++; //时序图为最少1微妙,但单片机的一个指令周期最少为10微秒左右
   DSPORT = 1;//释放总线
   j++; //保持数据稳定
   bi = DSPORT;
   byte = (byte>>1)|(bi<<7);
   j=4; //写入数据后,需要延时50微妙左右
   while(j--);
 }
 return byte;
}  
void ChangeTemp()
{
  Init();
  delay1ms(1);
  write_byte(0xcc);//Skip ROM,该命令允许总线64位ROM编码,而直接访问存储空间,从而节约时间,适合用于单点系统
  write_byte(0x44);  //启动温度传感器
}
void ReadTemp_command()
{
 Init();
 delay1ms(1);
 write_byte(0xcc);
 write_byte(0xbe);//读取温度传感器中的温度
}
int ReadTempture()
{
 uchar th,tl;
 uint date;
 ChangeTemp();
 ReadTemp_command();
 tl = read_byte();//选读低8位,后读高8位
 th = read_byte();
 date |= th;
 date<<=8;
 date = tl;
 return date;
}
  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一个示例代码,演示如何使用ESP8266与DS18B20温度传感器进行通信: ```cpp #include <OneWire.h> #include <DallasTemperature.h> #include <ESP8266WiFi.h> // 定义 DS18B20 数据线连接的引脚 const int oneWireBus = 2; // 创建 OneWire 对象 OneWire oneWire(oneWireBus); // 创建 DallasTemperature 对象,并将 OneWire 对象传递给它 DallasTemperature sensors(&oneWire); // 设置无线网络 SSID 和密码 const char* ssid = "你的WiFi名称"; const char* password = "你的WiFi密码"; // 创建 WiFiClient 对象 WiFiClient client; // 连接到 WiFi 网络 void connectToWiFi() { Serial.print("连接到 WiFi..."); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(1000); Serial.print("."); } Serial.println(""); Serial.println("WiFi已连接"); } // 发送温度数据到服务器 void sendTemperature(float temperature) { if (client.connect("服务器IP地址", 80)) { Serial.println("已连接到服务器"); String postData = "temperature=" + String(temperature); client.println("POST /api/temperature HTTP/1.1"); client.println("Host: 服务器IP地址"); client.println("Content-Type: application/x-www-form-urlencoded"); client.print("Content-Length: "); client.println(postData.length()); client.println(); client.println(postData); Serial.println("已发送温度数据"); client.stop(); } else { Serial.println("无法连接到服务器"); } } void setup() { Serial.begin(9600); // 连接到 WiFi connectToWiFi(); // 启动 DS18B20 温度传感器 sensors.begin(); } void loop() { delay(2000); // 请求 DS18B20 温度数据 sensors.requestTemperatures(); // 读取温度值(摄氏度) float temperature = sensors.getTempCByIndex(0); Serial.print("温度:"); Serial.print(temperature); Serial.println(" °C"); // 发送温度数据到服务器 sendTemperature(temperature); } ``` 请根据你的实际情况进行修改: 1. 将 `ssid` 和 `password` 替换为你的WiFi名称和密码。 2. 将 `服务器IP地址` 替换为你要发送温度数据的服务器的IP地址。 3. 根据你的硬件连接,可能需要修改 `oneWireBus` 的引脚号。 这段代码使用了 `OneWire` 库和 `DallasTemperature` 库来与 DS18B20 温度传感器进行通信。它会连接到WiFi网络,并周期性地读取温度数据并发送到指定的服务器。请注意,你需要在服务器端编代码来接收并处理这些数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值