使用Freescale DZ60控制单个或多个DS18B20
来源:互联网 发布:mac 双重认证 编辑:程序博客网 时间:2024/06/05 19:25
学习Freescale8bits单片机DZ60控制单个和多个DS18B20的过程中遇到的一些问题,总结出来给有关读者做参考。每个DS18B20出厂时内部都会被写入一个独一无二的序列号,该序列号共计64位。仅对单个DS18B20操作则不需要读取序列号;如果对多个DS18B20操作则需要写入识别序列号的代码,类似寻址操作。
首先贴出对DS18B20进行写操作时各代码的含义:
WriteOneChar(0xCC); //跳过读序号列号的操作
WriteOneChar(0x44); // 启动温度转换
WriteOneChar(0xBE); //读取暂存存储器
WriteOneChar(0x33); // 读序列号(ROM)命令
WriteOneChar(0x55); // 发匹配ROM命令
DZ60控制单个DS18B20
控制单个DS18B20的过程中需要严格控制高低电平的持续时间,持续时间可根据官方提供的DS18B20的datasheet查询得到。读取温度阶段操作代码如下:
unsigned int ReadTemperature(void){ unsigned char a=0; unsigned int b=0; unsigned int t=0; Init_DS18B20(); // DS18B20初始化 WriteOneChar(0xCC); // 跳过读序号列号的操作 WriteOneChar(0x44); // 启动温度转换 DelayMs(10); // 稍作延时 Init_DS18B20(); WriteOneChar(0xCC); // 跳过读序号列号的操作 WriteOneChar(0xBE); // 读取温度寄存器等(共可读9个寄存器) 前两个就是温度 a=ReadOneChar(); // 低位 b=ReadOneChar(); // 高位 b<<=8; t=a+b; return(t);}
其中函数返回值t即为所采集到的温度的二进制显示,通过换算可得到当前温度的十进制显示。(以零上温度为例,零下温度需判断t的最高位)
temperature=(float)t*0.0625;
控制多个DS18B20首先需要读取其内部的序列号(ROM值),读取序列号的代码如下:
unsigned int ReadROM(void){ unsigned char t=0; Init_DS18B20(); // DS18B20初始化 WriteOneChar(0x33); // 读ROM命令 WriteOneChar(0x44); // 启动 DelayMs(10); // 稍作延时 Init_DS18B20(); WriteOneChar(0x33); // 读ROM命令 for(t=0;t<8;t++) { ROM[t]=ReadOneChar(); // 将读取的值存储在全局变量ROM[8]中 }}通过以上程序得到了三个DS18B20的序列号,分别是:
unsigned char Sensor1 = {0x28,0x06,0x09,0xe4,0x05,0x00,0x00,0x2d};unsigned char Sensor2 = {0x28,0xca,0x83,0xe4,0x05,0x00,0x00,0xb9};unsigned char Sensor3 = {0x28,0x7b,0x6c,0xe4,0x05,0x00,0x00,0x3c};
为了减少变量,我将三个DS18B20的序列号存在一个数组Sensor[3][8]中
unsigned char Sensor[3][8] =
{0x28,0x06,0x09,0xe4,0x05,0x00,0x00,0x2d,
0x28,0xca,0x83,0xe4,0x05,0x00,0x00,0xb9,
0x28,0x7b,0x6c,0xe4,0x05,0x00,0x00,0x3c};
得到多个DS18B20的序列号后通过一个IO口控制多个DS18B20的程序如下:
unsigned int ReadTemperature(void){ unsigned char a=0; unsigned int b=0; unsigned int t=0; unsigned char i=0,j=0; for(j=0;j<3;j++) { Init_DS18B20(); WriteOneChar(0xcc); // 跳过读序号列号的操作 WriteOneChar(0x44); // 启动温度转换 DelayMs(10); Init_DS18B20(); WriteOneChar(0x55); //发匹配ROM指令 for(i=0;i<8;i++) WriteOneChar(Sensor[j][i]); WriteOneChar(0xbe); a=ReadOneChar(); //低位 b=ReadOneChar(); //高位 b<<=8; t=a+b; temp[j]=t; }}
最终计算即可得到各DS18B20采集到的温度值,理论上一个IO口可以控制无数个DS18B20,但是考虑到采集时间问题,每个IO口上的DS18B20不要超过10个。
原创,转载请注明出处,谢谢!
需要源代码的可通过以下链接下载:
链接:http://pan.baidu.com/s/1kT3JKDT 密码:re7r
- 使用Freescale DZ60控制单个或多个DS18B20
- Struts2上传单个或多个文件
- android上传单个或多个文件
- java 单个或多个文件上传
- 上传单个或多个文件
- mybatis传入单个或多个参数
- Android UI SurfaceView的使用-绘制单个图型或多个图形
- jspsmartupload组件实现单个或多个文件上传(上)
- jspsmartupload组件实现单个或多个文件上传(下)
- Java给单个或多个用户发送邮件
- android gridview多个或单个选中,自定义圆型imageview
- ListView单个视图或多个视图重用问题
- ajaxfileupload实现单个或多个文件的上传
- 锁定单个或多个单元格与解锁方法
- Java中对单个或多个字段进行排序
- ant单个或多个渠道包打包参考文档
- 读取多个或单个Properties文件工具类
- EasyUI file-box+SpringMVC 单个或多个图片上传
- ssh无密码登录总是失败的问题
- PHP采集程序原理分析篇
- C++中explicit关键字的作用
- linux下使用libxml2实现对xml文件的读取及查询
- 关于Java集合类迭代变量的修改
- 使用Freescale DZ60控制单个或多个DS18B20
- 1059. Prime Factors (25)
- iBatis delete
- Qt-pro、pri、prf、prl文件学习
- Python 静态方法 类方法
- 开启博客模式
- Asp.net学习总结
- POJ 1979 Red and Black DFS搜索
- 【最短路】 HDOJ 1535 Invitation Cards