温度采集与显示

温度采集与显示,第1张

/********************************************************

* DS18B20温度传感器 *

* C51*

* yajou 2008-06-28 无CRC*

********************************************************/

#include "reg51.h"

#include "intrins.h"厅兄余

#include "DS18B20.h"

/********************************************************

* us延时程扮滚序 *

********************************************************/

void Delayus(uchar us)

{

while(us--)//12M,一次6us,加进入退出14us(8M晶振,一次9us)

}

/********************************************************

* DS18B20初始化 *

********************************************************/

bit Ds18b20_Init(void) //存在返0,否则返1

{

bit temp = 1

uchar outtime = ReDetectTime//超时时间

while(outtime-- &&temp)

{

Delayus(10)//(250)1514us时间可以减小吗

ReleaseDQ()

Delay2us()

PullDownDQ()

Delayus(100)//614us(480-960)

ReleaseDQ()

Delayus(10)//73us(>60)

temp = dq

Delayus(70)//us

}

return temp

}

/********************************************************

* 写bit2DS18B20*

********************************************************/

void Ds18b20_WriteBit(bit bitdata)

{

if(bitdata)

{

PullDownDQ()

Delay2us() //2us(>1us)

ReleaseDQ()//(上述1-15)

Delayus(12)//尘薯86us(45- x,总时间>60)

}else

{

PullDownDQ()

Delayus(12)//86us(60-120)

}

ReleaseDQ()

Delay2us() //2us(>1us)

}

/********************************************************

* 写Byte DS18B20 *

********************************************************/

void Ds18b20_WriteByte(uchar chrdata)

{

uchar ii

for(ii = 0ii <8ii++)

{

Ds18b20_WriteBit(chrdata &0x01)

chrdata >>= 1

}

}

/********************************************************

* 写 DS18B20 *

********************************************************/

//void Ds18b20_Write(uchar *p_readdata, uchar bytes)

//{

// while(bytes--)

// {

// Ds18b20_WriteByte(*p_readdata)

// p_readdata++

// }

//}

/********************************************************

* 读bit From DS18B20 *

********************************************************/

bit Ds18b20_ReadBit(void)

{

bit bitdata

PullDownDQ()

Delay2us() //2us( >1us)

ReleaseDQ()

Delay8us() //8us( <15us)

bitdata = dq

Delayus(7)//86us(上述总时间要>60us)

return bitdata

}

/********************************************************

* 读Byte DS18B20 *

********************************************************/

uchar Ds18b20_ReadByte(void)

{

uchar ii,chardata

for(ii = 0ii <8ii++)

{

chardata >>= 1

if(Ds18b20_ReadBit()) chardata |= 0x80

}

return chardata

}

/********************************************************

* 读 DS18B20 ROM*

********************************************************/

bit Ds18b20_ReadRom(uchar *p_readdata) //成功返0,失败返1

{

uchar ii = 8

if(Ds18b20_Init()) return 1

Ds18b20_WriteByte(ReadROM)

while(ii--)

{

*p_readdata = Ds18b20_ReadByte()

p_readdata++

}

return 0

}

/********************************************************

* 读 DS18B20 EE*

********************************************************/

bit Ds18b20_ReadEE(uchar *p_readdata) //成功返0,失败返1

{

uchar ii = 2

if(Ds18b20_Init()) return 1

Ds18b20_WriteByte(SkipROM)

Ds18b20_WriteByte(ReadScr)

while(ii--)

{

*p_readdata = Ds18b20_ReadByte()

p_readdata++

}

return 0

}

/********************************************************

* 温度采集计算 *

********************************************************/

bit TempCal(float *p_wendu) //成功返0,失败返1 (温度范围-55 --- +128)

{

uchar temp[9],ii

uint tmp

float tmpwendu

TR1 = 0

TR0 = 0

//读暂存器和CRC值-----------------------

if(Ds18b20_ReadEE(temp))

{

TR1 = 1

TR0 = 1

return 1

}

//-------------------------------------

//CRC校验------------------------------

//

//此处应加入CRC校验等

//

//

//-------------------------------------

//使温度值写入相应的wendu[i]数组中-----

for(ii = iii >0ii--)

{

p_wendu++

}

i++

if(i >4) i = 0

//-------------------------------------

//温度正负数处理-----------------------

//

//-------------------------------------

//温度计算-----------------------------

tmp = temp[1] //

tmp <<= 8 //

tmp |= temp[0] //组成温度的两字节合并

tmpwendu = tmp

*p_wendu = tmpwendu / 16

//-------------------------------------

//开始温度转换-------------------------

if(Ds18b20_Init())

{

TR1 = 1

TR0 = 1

return 1

}

Ds18b20_WriteByte(SkipROM)

Ds18b20_WriteByte(Convert)

ReleaseDQ()//寄生电源时要拉高DQ

//------------------------------------

TR1 = 1

TR0 = 1

return 0

}

//////////DS18B20.h/////////////////////////

/********************************************************

* I/O口定义*

********************************************************/

sbit dq = P1^3

sbit dv = P1^4//DS18B20强上拉电源

/********************************************************

* 命令字定义 *

********************************************************/

#define uchar unsigned char

#define uint unsigned int

#define ReleaseDQ() dq = 1 //上拉/释放总线

#define PullDownDQ() dq = 0 //下拉总线

#define Delay2us() _nop_()_nop_()//延时2us,每nop 1us

#define Delay8us() _nop_()_nop_()_nop_()_nop_()_nop_()_nop_()_nop_()_nop_()

//设置重复检测次次数,超出次数则超时

#define ReDetectTime20

//ds18b20命令

#define SkipROM 0xCC

#define MatchROM 0x55

#define ReadROM 0x33

#define SearchROM0xF0

#define AlarmSearch 0xEC

#define Convert 0x44

#define WriteScr 0x4E

#define ReadScr 0xBE

#define CopyScr 0x48

#define RecallEE 0xB8

#define ReadPower0xB4

/********************************************************

* 函数*

********************************************************/

void Delayus(uchar us)

//void Dog(void)

bit Ds18b20_Init(void)//DS18B20初始化,存在返0,否则返1

void Ds18b20_WriteBit(bit bitdata) //写bit2DS18B20

void Ds18b20_WriteByte(uchar chrdata)//写Byte DS18B20

void Ds18b20_Write(uchar *p_readdata, uchar bytes)//写 DS18B20

bit Ds18b20_ReadBit(void) //读bit From DS18B20

uchar Ds18b20_ReadByte(void)//读Byte DS18B20

bit Ds18b20_ReadRom(uchar *p_readdata)//读 DS18B20 ROM:成功返0,失败返1

bit Ds18b20_ReadEE(uchar *p_readdata)//读 DS18B20 EE :成功返0,失败返1

bit TempCal(float *p_wendu)//成功返0,失败返1 (温度范围-55 --- +128)

#include "REG51.H"

#include "INTRINS.H"

typedef unsigned char BYTE

sbit DQ = P3^3//DS18B20的数据口位P3.3

BYTE TPH //存放温橡睁度值的高字节

BYTE TPL //存放温森信度值的低字节

void DelayXus(BYTE n)

void DS18B20_Reset()

void DS18B20_WriteByte(BYTE dat)

BYTE DS18B20_ReadByte()

void main()

{

DS18B20_Reset() //设备复位

DS18B20_WriteByte(0xCC) //跳过ROM命令

DS18B20_WriteByte(0x44) //开始转换命令

while (!DQ) //等待转换完成

DS18B20_Reset() //设备复位

DS18B20_WriteByte(0xCC) //跳过ROM命令

DS18B20_WriteByte(0xBE) //读暂梁春岁存存储器命令

TPL = DS18B20_ReadByte() //读温度低字节

TPH = DS18B20_ReadByte() //读温度高字节

while (1)

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12552454.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-26
下一篇 2023-05-26

发表评论

登录后才能评论

评论列表(0条)

保存