⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ds18b20.h

📁 电磁波产生控制原理
💻 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 + -