📄 ds18b20.h
字号:
#ifndef _18b20_h_
#define _18b20_h_
#include<reg52.h>
#include <stdio.h>
//#include "iic.h"
unsigned char wd;
void delay18b20 ( unsigned int counter );
void convert( void ); // 温度转换程序
void TxReset( void ); //复位程序
void WrByte( unsigned char b );
void RdTemp( unsigned int ch); //读温度子程序
unsigned char RdByte( void );
bit RdBit( void );
#endif
unsigned char tpl,tph; // 温度值低位、高位字节
sbit DQ=P1^7; //数据通信线
code unsigned char seg[10] ={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09};
void delay18b20( unsigned int counter ) /**延时tms**/
{
unsigned int i;
while( counter-- )
{
for( i=100;i>0;i-- );
}
}
void TxReset( ) /*产生复位脉冲初始化DS18B20*/
{
unsigned int i;
DQ = 0;
for( i =300;i>0;i-- ) ; // 拉低约600us
DQ = 1; //产生上升沿
for( i=10;i>0;i-- ); //延时10us
}
void WrByte( unsigned char b ) /*写数据的一个字节,满足写1和写0的时序要求*/
{
unsigned char j,i;
bit btmp;
for( j=1;j<=8;j++ )
{
btmp=b &0x01; //b是要写的一个字节
b=b>>1; //取下一位(由低位向高位)
if( btmp )
{
//****写1
DQ=0;
i++;i++; //延时,使得15us以内拉高
DQ=1;
for( i=70;i>0;i-- ); //整个写1时序不低于60us
}
else
{
//****写0/
DQ=0;
for( i=70;i>0;i-- ); //保持低在60--120us之间
DQ=1;
i++;i++; //延时2us
}
}
}
bit RdBit( void ) /* 读取数据的一位*/
{
unsigned int t;
bit b;
DQ=0; //总线拉低
t++; //保持低至少1us
DQ=1;
t++; t++; //延时15us以上,读时隙下降沿后15us,DS18B20输出数据才有效
b=DQ; //15us内读走数据
for( t=40;t>0;t-- ); //读时序不低于60us
return( b );
}
unsigned char RdByte( void ) /*读取数据的一个字节*/
{
unsigned char i,j,dat;
dat=0;
for( i=1;i<=8;i++)
{
j=RdBit();
dat=( j<<7 )|( dat>>1 ); //读数顺序由低向高
}
return ( dat );
}
void convert( void ) /*启动温度转换*/
{
TxReset(); //产生复位脉冲,初始化DS18B20
while( DQ ); //等待DS18B20给出应答脉冲
delay18b20( 3 ); //延时1ms 等待存在低电平过,恢复高电平
WrByte( 0xcc ); //skip rom命令
WrByte( 0x44 ); //convert T命令
}
void RdTemp( ) /*读取温度值*/
{
TxReset(); //产生复位脉冲,初始化DS18B20
while( DQ ); //等待DS18B20给出应答脉冲
delay18b20( 3 ); //延时1ms
WrByte( 0xcc ); //skip rom命令
WrByte( 0xbe ); //read scratchpad命令
tpl = RdByte(); // 温度值低位字节(其中低4位为二进制的"小数"部分)
tph = RdByte(); // 高位值高位字节(其中高5位为符号位)
tpl=tpl&0xf0;
tph=tph&0x07;
wd=tpl/16+tph*16;
}
void ds18b20pro(void)
{
convert(); //转温
RdTemp(); //读温
}
void pz18b20()
{
TxReset(); //产生复位脉冲,初始化DS18B20
while( DQ ); //等待DS18B20给出应答脉冲
delay18b20( 3 );//延时1ms
WrByte( 0xcc ); //skip rom命令
WrByte( 0x4e ); //写温度寄存器
WrByte(0x63); //设定温度上限99度
WrByte(0x01); //温度下限0度
WrByte(0x1f); //精度设为9位
TxReset(); //产生复位脉冲,初始化DS18B20
while( DQ ); //等待DS18B20给出应答脉冲
delay18b20( 3 );//延时1ms
WrByte( 0xcc ); //skip rom命令
WrByte( 0x48 ); //将寄存器中的温度报警值复制到EPROM中
}
unsigned char ds18b20( )
{
pz18b20();
while(1)
{
ds18b20pro();
}
return(wd);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -