• DS18B20


    一、DS18B20初始化时序图

    (1) 先将数据线置高电平“1”。
    (2) 延时(该时间要求的不是很严格,但是尽可能的短一点)。
    (3) 数据线拉到低电平“0”。
    (4) 延时490微秒(该时间的时间范围可以从480到960微秒)。
    (5) 数据线拉到高电平“1”。
    (6) 延时等待(如果初始化成功则在15到60毫秒时间之内产生一个由DS18B20

    所返回的低电平“0”。据该状态可以来确定它的存在,但是应注意不能无限的进行

    等待,不然会使程序进入死循环,所以要进行超时控制)。
    (7) 若CPU读到了数据线上的低电平“0”后,还要做延时,其延时的时间从发出

    的高电平算起(第(5)步的时间算起)最少要480微秒。
    (8) 将数据线再次拉高到高电平“1”后结束。

    二、DS18B20写时序图

    (1) 数据线先置低电平“0”。
    (2) 延时确定的时间为2(小于15)微秒。
    (3) 按从低位到高位的顺序发送字节(一次只发送一位)。
    (4) 延时时间为62(大于60)微秒。
    (5) 将数据线拉到高电平,延时2(小于15)微秒。
    (6) 重复上(1)到(6)的操作直到所有的字节全部发送完为止。
    (7) 最后将数据线拉高。 

    三、DS18B20读时序图

    (1)将数据线拉高“1”。
    (2)延时2微秒。
    (3)将数据线拉低“0”。
    (4)延时2(小于15)微秒。
    (5)将数据线拉高“1”,同时端口应为输入状态。
    (6)延时4(小于15)微秒。
    (7)读数据线的状态得到1个状态位,并进行数据处理。
    (8)延时62(大于60)微秒。 

    四、DS18B20指令

    1、ROM操作命令
    DS18B20采用一线通信接口。因为一线通信接口,必须在先完成ROM设定,否则记忆

    和控制功能将无法使用。一旦总线检测到从属器件的存在,它便可以发出器件ROM操

    作指令,所有ROM操作指令均为8位长度,主要提供以下功能命令:
    1 )读ROM(指令码0X33H):当总线上只有一个节点(器件)时,读此节点的64位

    序列号。如果总线上存在多于一个的节点,则此指令不能使用。
    2 )ROM匹配(指令码0X55H):此命令后跟64位的ROM序列号,总线上只有与此序

    列号相同的DS18B20才会做出反应;该指令用于选中某个DS18B20,然后对该DS18B20

    进行读写操作。
    3 )搜索ROM(指令码0XF0H): 用于确定接在总线上DS18B20的个数和识别所有的

    64位ROM序列号。当系统开始工作,总线主机可能不知道总线上的器件个数或者不知

    道其64位ROM序列号,搜索命令用于识别所有连接于总线上的64位ROM序列号。
    4 )跳过ROM(指令码0XCCH): 此指令只适合于总线上只有一个节点;该命令通过

    允许总线主机不提供64位ROM序列号而直接访问RAM,以节省操作时间。
    5 )报警检查(指令码0XECH):此指令与搜索ROM指令基本相同,差别在于只有温

    度超过设定的上限或者下限值的DS18B20才会作出响应。只要DS18B20一上电,告警

    条件就保持在设置状态,直到另一次温度测量显示出非告警值,或者改变TH或TL的设

    置使得测量值再一次位于允许的范围之内。储存在EEPROM内的触发器用于告警。

    2、RAM指令
    DS18B20有六条RAM命令:
    1)温度转换(指令码0X44H):启动DS18B20进行温度转换,结果存入内部RAM。
    2)读暂存器(指令码0XBEH):读暂存器9个字节内容,此指令从RAM的第1个字节

    (字节0)开始读取,直到九个字节(字节8,CRC值)被读出为止。如果不需要读

    出所有字节的内容,那么主机可以在任何时候发出复位信号以中止读操作。
    3)写暂存器(指令码0X4EH): 将上下限温度报警值和配置数据写入到RAM的

    2、3、4字节,此命令后跟需要些入到这三个字节的数据。
    4)复制暂存器(指令码0X48H):把暂存器的2、3、4字节复制到EEPROM中,用

    以掉电保存。
    5)重新调E2RAM(指令码0XB8H):把EEROM中的温度上下限及配置字节恢复到

    RAM的2、3、4字节,用以上电后恢复以前保存的报警值及配置字节。
    6)读电源供电方式(指令码0XB4H):启动DS18B20发送电源供电方式的信号

    给主CPU。对于在此命令送至DS18B20后所发出的第一次读出数据的时间片,

    器件都会给出其电源方式的信号。“0”表示寄生电源供电。“1”表示外部电源供电。

    五、DS18B20实例程序

    1. #include "reg52.h"
    2. sbit DQ = P1^4;
    3. 单总线延时函数
    4. void Delay_OneWire(unsigned int t)
    5. {
    6. unsigned char i;
    7. while(t--){
    8. for(i=0;i<12;i++);
    9. }
    10. }
    11. //通过单总线向DS18B20写一个字节
    12. void Write_DS18B20(unsigned char dat)
    13. {
    14. unsigned char i;
    15. for(i=0;i<8;i++)
    16. {
    17. DQ = 0;
    18. DQ = dat&0x01;
    19. Delay_OneWire(5);
    20. DQ = 1;
    21. dat >>= 1;
    22. }
    23. Delay_OneWire(5);
    24. }
    25. //从DS18B20读取一个字节
    26. unsigned char Read_DS18B20(void)
    27. {
    28. unsigned char i;
    29. unsigned char dat;
    30. for(i=0;i<8;i++)
    31. {
    32. DQ = 0;
    33. dat >>= 1;
    34. DQ = 1;
    35. if(DQ)
    36. {
    37. dat |= 0x80;
    38. }
    39. Delay_OneWire(5);
    40. }
    41. return dat;
    42. }
    43. //DS18B20初始化
    44. bit init_ds18b20(void)
    45. {
    46. bit initflag = 0;
    47. DQ = 1;
    48. Delay_OneWire(12);
    49. DQ = 0;
    50. Delay_OneWire(80); // 延时大于480us
    51. DQ = 1;
    52. Delay_OneWire(10); // 60us
    53. initflag = DQ; // initflag等于1初始化失败
    54. Delay_OneWire(5);
    55. return initflag;
    56. }
    57. //DS18B20温度采集程序:整数
    58. unsigned char rd_temperature(void)
    59. {
    60. unsigned char low,high;
    61. char temp; //这是一个有符号的数
    62. init_ds18b20();
    63. Write_DS18B20(0xCC);
    64. Write_DS18B20(0x44); //启动温度转换
    65. Delay_OneWire(200);
    66. init_ds18b20();
    67. Write_DS18B20(0xCC);
    68. Write_DS18B20(0xBE); //读取寄存器
    69. low = Read_DS18B20(); //低字节
    70. high = Read_DS18B20(); //高字节
    71. temp = high<<4; //只取了整数部分和符号位
    72. temp |= (low>>4);
    73. return temp;
    74. }

  • 相关阅读:
    VR太空舱体验馆VR神舟返回舱VR虚拟现实科技科普乐园
    web3 dapp React项目引入 antd 对 balance 用户token信息组件进行样式改造
    ssm校园拼车服务系统毕业设计源码211633
    linux自动清理n天(1个月)前日志文件
    Python入门自学进阶-Web框架——42、Web框架了解-bottle、flask
    java解析与生成json数据的四种方式,比如将json字符串转为json对象或json对象转为json字符串
    如何在oracle中查询所有用户表的表名、主键名称、索引、外键等
    Celery笔记九之task运行结果查看
    第11篇:ESP32vscode_platformio_idf框架helloworld点亮LED
    【k8s资源调度-StatefulSet】
  • 原文地址:https://blog.csdn.net/qq_54278925/article/details/128069082