依旧是接着蓝桥杯的机会来学习一下DS18B20和单总线技术,平台依旧是IAP15F2K61S2单片机

DS18B20单线数字温度计以9位数字量的形式反映器件的温度值,DS18B20通过一个单线接口发送或者接受信息,因此在中央微处理器和DS18B20之间只需要一根连线。下图为其引脚功能说明:

器件框图如下所示:

从图中可以看出,DS18B20主要由三个数字部件构成,分别是64位激光ROM,温度传感器,非易失性温度报警触发器TH和TL。

DS18B20所使用的总线技术为单总线技术,目前单片机与外设之间进行数据传输的串行总线主要由SCI,I2C和SPI总线,其中SCI总线总是以异步方式进行通信(一条数据输入线,一条数据输出线),而I2C总线以同步串行二线方式进行通信(一条时钟线,一条数据线),SPI总线则以同步串行三线方式进行通信(一条数据输入线,一条数据输出线)。这些总线都需要至少两条或两条以上的信号线,而DS18B20使用的单总线技术与上述总线不同,它采用单条信号线,既可传输时钟,有可传输数据,而且数据传输是双向的,因而这种单总线技术具有线路简单,硬件开销少,成本低廉,便于总线扩展和维护等优点。单总线适用于单主机系统,能够控制一个或多个从机设备。

还是老方法,先对DS18B20进行初始化,然后对DS18B20进行读写操作。

首先我们来看看控制DS18B20的指令。

33H-----读ROM:读DS18B20温度传感器ROM中的编码。

55H-----匹配ROM。发出此命令之后,接着发出64位ROM的编码,访问单总线上与该编码相对应的DS18B20并使之做出响应,为下一步对该DS18B20的读/写做准备。

F0H-----搜索ROM。用于确定挂接在同一总线上DS18B20的个数,识别64位ROM地址,为操作各器件做好准备。

CCH-----跳过ROM。忽略64位ROM地址,直接向DS18B20发温度变换命令,适用于一个从机工作。

ECH-----告警搜索命令。执行后只有温度超过设定值上限或下限芯片才会做出反应。

以上指令是针对总线上挂接多个DS18B20的情况,但如果总线上只挂接了一个DS18B20,就不需要以上ROM指令,直接进行如下的温度转换和读取操作。

44H----温度转换。启动DS18B20进行温度转换,12位转换时长最长为750ms,9位为93.75ms,结果存入内部9字节的RAM中。

BEH----读暂存器。读内部ROM中9字节的温度数据。

4EH----写暂存器。发出向内部RAM的第二三字节写上下线温度数据的命令,紧跟该命令之后,是传送两字节的数据。

48H----复制暂存器。将RAM中第2,3字节的内容复制到EEPROM中。

B8H----重调EEPROM。将EEPROM中内容恢复到RAM中的第三四字节。

B4H----读供电方式。读DS18B20的供电模式。寄生供电时,DS18B20发送0;外接电源供电时,DS18B20发送1。

和DS18B20的任何通信都需要以初始化序列开始,初始化序列见下图:

上图含义如下:

1.先将数据线置高电平1

2.延时(时间要求不严格,但尽可能短些)

3.数据线拉到低电平0

4.延时750us(该时间范围可以在480~960us)

5.数据线拉到高电平1

6.延时等待。如果初始化成功,则在15~60us内产生一个由DS18B20返回的低电平0,据该状态可以确定它的存在,但是应注意,不能无限地等待,不然会使程序进入死循环,所以要进行超时判断。

7.若CPU读到数据线上的低电平0后,还有进行延时,其延时的时间从发出高电平算起至少要480us。

8.将数据线再次拉到高电平1后结束。

DS18B20写数据,时序如下图所示:

其含义如下:

1.数据线先置低电平0

2.延时确定的时间为15us

3.按从低位到高位的顺序发送数据(一次只发送一位)

4.延时时间为45us

5.将数据线拉到高电平1

6.重复1~5步骤,直到发送完整个字节

7.最后将数据线拉高到1

DS18B20读数据,时序图如下:

含义如下:

1.将数据线拉高到1

2.延时2us

3.将数据线拉低到0

4.延时6us

5.将数据线拉高到1

6.延时4us

7.读数据线的状态得到一个状态位,并进行数据处理

8.延时30us

9.重复1~7步骤,直到读取完一个字节

下面我们一起分析一下蓝桥杯官方给出的代码,如果鄙生有理解错的地方,还望各位大牛指点。

首先是初始化函数

bit init_ds18b20(void)
{
  bit initflag = 0;
  DQ = 1;      //首先将数据线置高
  Delay_OneWire(12);  //短暂延时
  DQ = 0;      //将数据线拉到低电平
  Delay_OneWire(80);    //延时在480~960US之间
  DQ = 1;                     //数据线拉回高电平
  Delay_OneWire(10);  // 延时等待
  initflag = DQ;     // initflag等于1初始化失败
  Delay_OneWire(5);     //最后一个延时
  return initflag;

}

其中的Delay_OneWire()函数如下所示:注意这是一段延时,但是延时t值需要根据你单片机的一个机器周期时长来确定,否则时序会出错,即无法读出温度值!!!

void Delay_OneWire(unsigned int t)
{
int i;
        while(t--)
{
      for(i=0;i<12;i++);
}
}

//向DS18B20写一个字节

void Write_DS18B20(unsigned char dat)
{
unsigned char i;
for(i=0;i<8;i++)    //重复直到发送完整个字节
{
DQ = 0;  //数据线首先拉低
DQ = dat&0x01;
Delay_OneWire(5);  //延时45us
DQ = 1;    //将数据线拉回高电平1
dat >>= 1;
}
Delay_OneWire(5);

}

//从DS18B20读取一个字节

unsigned char Read_DS18B20(void)
{
unsigned char i;
unsigned char dat; 
for(i=0;i<8;i++)    //重复接收直到读完整个字节
{
DQ = 0;   //数据线拉低
dat >>= 1;
DQ = 1;   //数据线拉高
if(DQ)
{
dat |= 0x80;
}    
Delay_OneWire(5);
}
return dat;
}

以上就是蓝桥杯官方给出的代码,下面我给出我根据单总线库写出的温度读取函数:

void Read_tem(void)
{
  unsigned char low,high;
        char temp;
  Init_DS18B20();       
  Write_DS18B20(0xCC);  //忽略64位ROM地址,直接向DS18B20发送温度变换命令,适用于一个从机工作
  Write_DS18B20(0x44);   //温度转换
  Delay_OneWire(200);

Init_DS18B20();
  Write_DS18B20(0xCC);   
  Write_DS18B20(0xBE);   //读取温度数据

low = Read_DS18B20();    //低八位
  high = Read_DS18B20();   //高八位
  
  temp = high<<4;           //整合成一个字节
  temp |= (low>>4);
  
  return temp;
}

至此,DS18B20部分就全部介绍完了,如果有错误,希望各位大牛指正。

DS18B20 (by 51单片机)相关推荐

  1. 51单片机15单片机 温度传感器DS18B20

    目录 1 温度传感器DS18B20的工作原理 2 一线通信接口的使用(单总线) 2.1 单总线系统 2.2 执行序列 2.3 单总线信号 3 DS18B20寄存器的配置 4 根据传感器使用说明书时序图 ...

  2. 【51单片机快速入门指南】6.3:DS18B20 单总线数字温度计的多路读取

    目录 硬知识 DS18B20介绍 时序 初始化时序 写时序 读时序 命令 ROM 操作命令 ROM 搜索举例 存贮器操作命令 示例程序 DS18B20.c DS18B20.h 测试程序 定时器中断服务 ...

  3. matlab ds18b20 单片机,基于51单片机ds18b20温度检测————设计报告.doc

    基于51单片机ds18b20温度检测----设计报告 课程名称: 微机原理课程设计 题 目: 温度检测课程设计 摘要 随着时代的进步和发展,单片机技术已经普及到我们生活,工作,科研,各个领域,已经成为 ...

  4. 51单片机温度传感器DS18B20

    51单片机温度传感器DS18B20 实现功能 插上DS18B20温度传感器,数码管显示检测的温度值 单片机型号:STC89C52 DS18B20介绍 1.DS18B20简介 DS18B20 是由 DA ...

  5. 51单片机+DS18B20+数码管显示+串口通讯+Proteus仿真

    51单片机+DS18B20+数码管显示+串口通讯+Proteus仿真 本实验通过51单片机读取DS18B20温度传感器的温度,然后通过数码管显示,并通过串口,将读取到的温度数据发送出去. 本案例需要使 ...

  6. 基于51单片机ds1302时钟、ds18b20、lcd12864的恒温器

    目录 项目:基于51单片机ds1302时钟.ds18b20的恒温器 功能说明: 运行流程: 效果展示: 供电方式: 用途: 提高: 附: ​                              ...

  7. 51单片机+oled+ds18b20检测并显示温度第三篇:配置温度检测ds18b20

    51单片机+oled+ds18b20检测并显示温度第一篇:配置温度检测ds18b20 前提: DS18B20是一线总线(单总线)"接口的温度传感器.其引脚只有三个vcc,gnd和dq vcc ...

  8. 【001】基于51单片机的DS18B20温度检测与报警装置的proteus仿真设计

    一.设计资料内容(私信获取) 1. 包含proteus仿真一份: 2. keil源代码一份: 3. 包含基于51单片机的DS18B20温度监测与报警的proteus仿真设计课程报告一份: 4. 包含基 ...

  9. 51单片机驱动DS18B20温度传感器测量温度

    51单片机驱动DS18B20温度传感器测量温度 1.DS18B20温度传感器介绍: 2.51单片机驱动DS18B20测量温度 1.DS18B20温度传感器介绍: ①引脚定义 引脚 符号 说明 1 GN ...

  10. 智慧农场,51单片机上实现DS18B20与YL69土壤湿度传感器,并将两个获取的数据在LCD上显示出来

    上一篇我说了我们做的是两个模块,但是介于DS18B20的资料太多,我就不再阐述,直接给最终的代码. 该代码是将温度传感器与YL69湿度传感器获取的数据在51单片机LCD上显示出来 #include & ...

最新文章

  1. 使用pip将Python包安装到不同的目录中?
  2. 7.泡妞与设计模式(八)模板模式
  3. 040、JVM实战总结:案例实战:每日百亿数据量的实时分析引擎,为啥频繁发生Full GC ?
  4. java中主函数_(基础)java中的主函数
  5. js datagrid 移动去重
  6. android gps 室内定位方法,Android GPS室内定位问题的解决方法(location为null)
  7. 以太坊实战之《如何正确处理nonce》
  8. Unity动态换装之Spine换装
  9. 原生JS实现记忆翻牌小游戏
  10. Elasticsearch Query DSL 整理总结(查询)
  11. uni-app登陆成功跳转到首页后禁止回退到登陆页面
  12. Frenetic Python实验(三)
  13. 常见的树形结构(一)
  14. 【python】简单使用selenium编写无界面谷歌浏览器的网页登录和签到功能
  15. 一般3d模型代做多少钱_3D打印模型一般需要多少钱?
  16. 防火墙添加ip白名单_防火墙白名单设置方法firewalld
  17. 【补充】膜拜大神——吴恩达(转自Wikipedia)
  18. 初中七年级计算机课教学总结怎么写,初中计算机教学工作总结范文
  19. JS逆向——一个新的视频爬虫
  20. idea的下载、安装和破解

热门文章

  1. 阿里巴巴《Java开发手册(泰山版)》
  2. 关于微信公账号H5 API 调用的坑 BUG
  3. 10g gtx 光纤通信测试_S03-H01 利用IBERT进行GTX信号眼图测试
  4. 自学考试英语二(第二讲)
  5. 浅谈财务人员的终身学习
  6. Windows 10免费升级服务终成历史 说说我们和它的恩怨
  7. 外夹式超声波艾默生流量计安装步骤
  8. MySQL获取表行数
  9. iPhone手机屏幕尺寸与倍图计算公式
  10. 20220219寒假学校周赛