使用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;


DZ60控制多个DS18B20
控制多个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







0 0
原创粉丝点击