多点温度测量

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

//头文件包含

#include

#include

#include "DS18B20.H"

//引脚定义

sbit DQ = P2^7; //数据线端口

/*

//DS18B20序列号,通过调用GetROMSequence()函数在P1口读出(读8次)

const unsigned char code ROMData1[8] = {0x28, 0x33, 0xC5, 0xB8, 0x00, 0x00, 0x01, 0xD7};

//U1

const unsigned char code ROMData2[8] = {0x28, 0x30, 0xC5, 0xB8, 0x00, 0x00, 0x00, 0x8E};

//U2

const unsigned char code ROMData3[8] = {0x28, 0x31, 0xC5, 0xB8, 0x00, 0x00, 0x00, 0xB9};

//U3

const unsigned char code ROMData4[8] = {0x28, 0x32, 0xC5, 0xB8, 0x00, 0x00, 0x00, 0xE0};

//U4

const unsigned char code ROMData5[8] = {0x28, 0x34, 0xC5, 0xB8, 0x00, 0x00, 0x00, 0x52};

//U5

const unsigned char code ROMData6[8] = {0x28, 0x35, 0xC5, 0xB8, 0x00, 0x00, 0x00, 0x65};

//U6

const unsigned char code ROMData7[8] = {0x28, 0x36, 0xC5, 0xB8, 0x00, 0x00, 0x00, 0x3C};

//U7

const unsigned char code ROMData8[8] = {0x28, 0x37, 0xC5, 0xB8, 0x00, 0x00, 0x00, 0x0B};

//U8

//开始8位(28H)是产品类型标号,接着的48位是该DS18B20自身的序列号,最后8位是前面56位的循环冗余校验码(CRC=X^8+X^5+X^4+1)。

*/

//延时16us子函数

void Delay16us()

{

unsigned char a;

for (a = 0; a < 4; a++);

}

//延时60us子函数

void Delay60us()

{

unsigned char a;

for (a = 0; a < 18; a++);

}

//延时480us子函数

void Delay480us()

{

unsigned char a;

for (a = 0; a < 158; a++);

}

//延时240us子函数

void Delay240us()

{

unsigned char a;

for (a = 0; a < 78; a++);

}

//延时500ms子函数

void Delay500ms()

{

unsigned char a, b, c;

for (a = 0; a < 250; a++)

for (b = 0; b < 3; b++)

for (c = 0; c < 220; c++);

}

//芯片初始化

void Initialization()

{

while(1)

{

DQ = 0;

Delay480us(); //延时480us

DQ = 1;

Delay60us(); //延时60us

if(!DQ) //收到ds18b20的应答信号

{

DQ = 1;

Delay240us(); //延时240us

break;

}

}

}

//写一个字节(从低位开始写)

void WriteByte(unsigned char btData)

{

unsigned char i, btBuffer;

for (i = 0; i < 8; i++)

{

btBuffer = btData >> i;

if (btBuffer & 1)

{

DQ = 0;

_nop_();

_nop_();

DQ = 1;

Delay60us();

}

else

{

DQ = 0;

Delay60us();

DQ = 1;

}

}

}

//读一个字节(从低位开始读)

unsigned char ReadByte()

{

unsigned char i, btDest;

for (i = 0; i < 8; i++)

{

btDest >>= 1;

DQ = 0;

_nop_();

_nop_();

DQ = 1;

Delay16us();

if (DQ) btDest |= 0x80;

Delay60us();

}

return btDest;

}

//序列号匹配

void MatchROM(const unsigned char *pMatchData)

{

unsigned char i;

Initialization();

WriteByte(MATCH_ROM);

for (i = 0; i < 8; i++) WriteByte(*(pMatchData + i));

}

//得到64位ROM序列(在P1口显示,必须与Proteus联调且在单步调试下才能得到) void GetROMSequence()

{

unsigned char i;

Initialization();

WriteByte(READ_ROM);

for (i = 0; i < 8; i++)

P1 = ReadByte();

}

相关文档
最新文档