开篇先说一句废话····
本旺名字叫萨摩耶,,Please 叫我旺财,,,哈哈,招财进宝嘛!

Ds18b20

没啥好说的,这玩意就是测温度的器件。先看看长啥样:
它有三根线,一个VCC,一根GND,一根数据传输线DQ,所以最后数据传输都在这个DQ上。
说说这个玩意的特点:

  • 与单片机连接时仅需要一条口线即可实现微处理器与 DS18B20 的双向通讯
  • 可编程的分辨率为 9~12 位, 对应的可分辨温度分别为 0.5℃、0.25℃、0.125℃ 和 0.0625℃, 可实现高精度测温。(一般默认采用12)
  • 12 位分辨率时最多在 750ms 内把温度值转换为数字, 速度更快

说这些有用的因为之前传输数据都是有专门的数据线,而这玩意只有一根,那么对于传输时时间就必须严谨(要是不严谨,一阵时钟脉冲一阵数据会传输失败)

操作Ds18b20

1.修改分辨率,这个人家默认12位,想试着更改可参考数据手册修改对应位即可
2.时序图
这里就是注意时间就好,时间太短或者太长会导致传输失败

  • 初始化
    步骤
    1.将数据传输线DQ拉低
    2.延时642us(480–960us)
    3.将DQ拉高
    4.等待Ds18b20拉低(给你个反应证明自己的存在):如果等到低电平放回1(存在),等不到等一会就好不能一直等(5ms)退出放回0(不存在)

  • 写时序

注意的是它这时序图是写0或者写1,也就是每次写一位,而一个字节数据有8位,所以要循环八次哦,循环内部;
步骤
1.将数据线DQ拉低
2 将数据最低位写入DQ中(数据&0x01)(本是延时15us,太短,一次延时)
3 延时60us以上(15+15+30us)
4 拉高数据线DQ
5 数据右移一位(为下次传输准备)

  • 读时序
    同样,这里也需要循环八次读0或者读1,循环内部:
    步骤
    1 将数据线DQ拉低(给一个i++表示小延时)
    2 将数据线拉高(给两个i++(6us)让数据稳定)
    3 读出最低位(bi)
    4 将读出的最低位和返回变量进行或运算((dat>>1)|(bi<<7))
    5 延时46us以上(>1+45us)

循环8次后将返回变量返回出去(return)

基础函数写完,就要把他们调用起来了

Ds18b20典型温度读取过程

  1. 初始化(延时1ms)
  2. 发送ROM指令(0xcc)
  3. 发送温度转换命令(0x44)
  4. 初始化(延时1ms)
  5. 发送ROM指令(0xcc)
  6. 发送读取温度指令(0xbe)
  7. 读出低八位数据
  8. 读出高八位数据
  9. 将俩个八位数据或运算到一个16位变量(int)中
  10. 将16位变量返回出去 (注意返回类型)

使用Ds18b20温度传感器检测室内温度,使用数码管显示

//Ds18b20.c
#include "Ds18b20.h"
#include "intrins.h"
void Delay(u16 i)     //11.0592MHz  1ms
{while(i--){unsigned char i, j;_nop_();i = 2;j = 199;do{while (--j);} while (--i);}
}
//Ds18b20初始化
u8 Ds18b20Init(){u8 i;DSPORT=0;i=70;while(i--);DSPORT=1;i=0;while(DSPORT){i++;Delay(1);if(i>5)return 0;}return 1;
}
//Ds18b20写入数据
void Ds18b20WriteByte(u8 dat){u8 i,j;for(i=0;i<8;i++){DSPORT=0;j++;DSPORT=dat&0x01;       //发送最低位j=6;while(j--);DSPORT=1;dat>>=1;}
}
//Ds18b20读出数据
u8 Ds18b20ReadByte(){u8 i,j;u8 bi,dat;for(i=0;i<8;i++){DSPORT=0;j++;DSPORT=1;j++;j++;bi=DSPORT;dat=(dat>>1)|(bi<<7);j=4;while(j--);}return dat;
}
//开启温度转换
void Ds18b20ChangeTemp(){Ds18b20Init();Delay(1);Ds18b20WriteByte(0xcc);Ds18b20WriteByte(0x44);
}
//从储存寄存器读出数据
void Ds18b20ReadCom(){Ds18b20Init();Delay(1);Ds18b20WriteByte(0xcc);Ds18b20WriteByte(0xbe);
}
//读出温度数据    16位数据
int Ds18b20ReadTemp(){u8 tmh,tml;int dat=0;Ds18b20ChangeTemp();Ds18b20ReadCom();tml=Ds18b20ReadByte();tmh=Ds18b20ReadByte();dat=tmh;dat<<=8;dat|=tml;return dat;
}
//main.c
#include "reg52.h"
#include "Ds18b20.h"//typedef unsigned int u16;
//typedef unsigned char u8;u8 smgduan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
u8 Display[8];//38译码器
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;//数据处理函数
void Datapross(int dat){float tp;if(dat<0){Display[0]=0x40;     //符号位显示负号dat=dat-1;dat=~dat;tp=dat;dat=tp*0.0625*100+0.5;}else{Display[0]=0x00;       //符号位不显示tp=dat;dat=tp*0.0625*100+0.5;}Display[1]=smgduan[dat/10000];Display[2]=smgduan[dat%10000/1000];Display[3]=smgduan[dat%1000/100]|0x80;     //个位加小数点Display[4]=smgduan[dat%100/10];Display[5]=smgduan[dat%10];
}
//数码管显示函数
void Showsmg(){      u16 i;for(i=0;i<6;i++){  switch(i){case 5: LSA=1;LSB=0;LSC=0;break;case 4: LSA=0;LSB=1;LSC=0;break;case 3: LSA=1;LSB=1;LSC=0;break;case 2: LSA=0;LSB=0;LSC=1;break;case 1: LSA=1;LSB=0;LSC=1;break;case 0: LSA=0;LSB=1;LSC=1;break;}P0=Display[i];Delay(1);P0=0x00;}
}
void main(){while(1){Datapross(Ds18b20ReadTemp());Showsmg();}
}
//Ds18b20.h
#ifndef _DS18B20_H
#define _DS18B20_H#include "reg52.h"#ifndef u8
#define u8 unsigned char
#endif#ifndef u16
#define u16 unsigned int
#endifsbit DSPORT=P3^7;void Delay(u16 i);
int Ds18b20ReadTemp();#endif

总结

  • 这个是时钟控制与数据传输在一根线上,所以要注意时序图中时间的控制,可以采用Keil仿真计算时间
  • 除了在数码管上显示也可以在LCD1602字符型液晶上显示
  • 时序图的阅读越来越重要了呀

51单片机学习篇-- --Ds18b20温度传感器芯片的总结相关推荐

  1. 51单片机学习:DS18B20温度传感器实验

    实验名称:DS18B20温度传感器实验 接线说明:     实验现象:下载程序后,插上DS18B20温度传感器,数码管显示检测的温度值 注意事项:注意温度传感器的方向,在接口处我们已经用丝印画了一个凸 ...

  2. 51单片机学习之DS18B20温度传感器

    DS18B20学习 翻了大车,貌似接反了,模块特别烫,坏了 DS18B20接线很简单,但是对时序的要求特别高. 初始化 (1).数据线拉到低电平"0". (2).延时480微妙(该 ...

  3. STM32单片机学习(11) DS18B20温度传感器实验

    STM32单片机学习(11) DS18B20温度传感器实验 本程序主要实现 DS18B20温度传感器数据获取,并利用串口通信把温度数据传至计算机 注:使用普中科技开发板测试时,需要拔掉Boot1插口, ...

  4. 【C51单片机学习笔记----DS18B20温度传感器LCD1602液晶屏直流电机调速与呼吸灯AD模数转换红外外部中断】

    文章目录 一.DS18B20温度传感器 1.DS18B20温度传感器连接原理图 2.DS18B20温度传感器单总线通信时序 3.DS18B20温度传感器代码模块 二.LCD1602液晶屏 1.LCD1 ...

  5. 51单片机学习篇-- --红外通信(PPM脉时)笔记

    开篇先说一句废话···· 本旺名字叫萨摩耶,,Please 叫我旺财,,,哈哈,招财进宝嘛! 开篇 从学完帮网友写完<倒计时数字钟–矩阵按键可调>然后在CSDN上总结完之后,学习了剩下的模 ...

  6. 51单片机基础之DS18B20温度传感器

    外型: 代码: main.c 文件#include "smg.h" #include "ds18b20.h"/************************* ...

  7. 51单片机学习篇-- --超声波测距(HC--SR04)笔记

    开篇先说一句废话···· 本旺名字叫萨摩耶,,Please 叫我旺财,,,哈哈,招财进宝嘛! 开篇 本单片机购买的时候带的超声波模块是HC-SR04,根据好多材料都说用这个的原因是便宜,,,不过没关系 ...

  8. 51单片机学习篇-- --基于51单片机的串口通信协议

    开篇先说一句废话···· 本旺名字叫萨摩耶,,Please 叫我旺财,,,哈哈,招财进宝嘛! 开篇 计算机按照下行数据通信协议,串口发送数据,地址为自己的学号(十六进制),单片机收到后(收到的是数据, ...

  9. 学习笔记之51单片机键盘篇(非编码键盘与编码键盘、非编码键盘的扫描方式、独立键盘、矩阵键盘)

    这篇博文主要记录51单片机键盘篇(非编码键盘与编码键盘.非编码键盘的扫描方式.独立键盘.矩阵键盘.键盘消抖等)包含原理图.代码等 (一)基础补充 1.键盘的任务 2.键盘的识别 3.如何消除按键的抖动 ...

  10. 51单片机学习历程——硬件准备&开发环境搭建

    系列文章目录 第一章 51单片机学习历程(1)--开发环境搭建 第二章 51单片机学习历程(2)--建立新的工程 第三章 51单片机学习历程(3)--点亮一颗LED 第四章 51单片机学习历程(4)- ...

最新文章

  1. 三包围结构的字是什么样的_手帐排版的高段位秘诀:运用艺术字丨大咖分享
  2. springboot学习笔记-01-springboot-helloworld的编写以及原理初步了解(自动装配)
  3. python三菱_三菱机器人melfarxm.ocx控件的Python使用,MelfaRxMOCX,python,用法
  4. Redmi K40系列要做旗舰“焊门员”:生死看淡 不服就焊
  5. URLConnection类
  6. OD调试器调试Delphi程序按钮事件断点方法
  7. “狼牙抓鸡”现身IT江湖
  8. 金字塔原理(Pyramid Principle)
  9. Win7系统的电脑怎么录屏
  10. WCF入门示例一:承载于托管代码中的WCF示例程序
  11. HMI车载开发:汽车与Android的关系:Android Automotive
  12. 数商云营销渠道管理系统解决方案:企业级营销系统类型、定位、管理
  13. 洛谷---三角形的分类C语言详解
  14. 微信公众平台开发(54)翻板抽奖
  15. 程序员通过google 赶快来赚美金~ hot
  16. 无符号数相减问题 C语言
  17. 瑞利信号公式(级联信道,多信道之和,多个瑞利信号之和,概率密度函数)
  18. ICRA 2021| SLAM方向论文汇总
  19. 练习系统 实验四 red and black
  20. win10可以上网,但是电脑右下角网络连接上有黄色感叹号

热门文章

  1. opencv实战 -- 车牌识别
  2. html来回交替滚动,JS实现的DIV块来回滚动效果示例
  3. Python学习_我该怎么读取文件中的数据并操作文件
  4. 猿人学16题js逆向
  5. glib 解析xml
  6. MyBatis(或Plus):找不到xml文件。No MyBatis mapper was found in ‘[com.**.**.mapper]‘ package
  7. 写两个函数,分别求两个整数的最大公约数和最小公倍数
  8. 龙飞船回来了,它着陆的方式为什么一点不「马斯克」?
  9. cesium 水位模拟_Cesium实现淹没分析
  10. 电子邮件营销内容撰写