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

📄 ds18b20.c

📁 STC89C58加18B20温度传感器构成的温度采集器程序
💻 C
字号:
#include "DS18B20.h"
#include <stdio.h>
#include <intrins.h>
#include "P8XC5X2.h"
extern unsigned char SampleHVal[8],SampleLVal[8];  //模拟量采集结果
extern unsigned char Sensor;
/****************************************************************************
函数功能:延时子程序
作    者:沈建良
时    间:2006年4月20日
入口参数:time
出口参数:
****************************************************************************/
void delay(unsigned char time)
{
	unsigned char n;
	n=0;
	while(n < time)
	{n++;}
	return;
}

/****************************************************************************
函数功能:DS18B20初始化子程序
作    者:沈建良
时    间:2006年4月20日
入口参数:
出口参数:
****************************************************************************/
void Init_DS18B20(unsigned char no)      //初始化子程序
{
	unsigned char x=0;
if(no==0)
        {
   	P1_0=1;          			//P1_先置高
  	delay(8);            		//稍延时
  	P1_0=0;             		//发送复位脉冲
  	delay(85);        	 	//延时(>480ms)
  	P1_0=1;          			//拉高数据线
  	delay(14);       		//等待(15~60ms)
  	x=P1_0;          			//用X的值来判断初始化有没有成功,18B20存在的话X=0,否则X=1
  	delay(20);
        }
if(no==1)
        {
   	P1_1=1;          			//P1_先置高
  	delay(8);            		//稍延时
  	P1_1=0;             		//发送复位脉冲
  	delay(85);        	 	//延时(>480ms)
  	P1_1=1;          			//拉高数据线
  	delay(14);       		//等待(15~60ms)
  	x=P1_1;          			//用X的值来判断初始化有没有成功,18B20存在的话X=0,否则X=1
  	delay(20);
        }
if(no==2)
        {
   	P1_2=1;          			//P1_先置高
  	delay(8);            		//稍延时
  	P1_2=0;             		//发送复位脉冲
  	delay(85);        	 	//延时(>480ms)
  	P1_2=1;          			//拉高数据线
  	delay(14);       		//等待(15~60ms)
  	x=P1_2;          			//用X的值来判断初始化有没有成功,18B20存在的话X=0,否则X=1
  	delay(20);
        }
if(no==3)
        {
   	P1_3=1;          			//P1_先置高
  	delay(8);            		//稍延时
  	P1_3=0;             		//发送复位脉冲
  	delay(85);        	 	//延时(>480ms)
  	P1_3=1;          			//拉高数据线
  	delay(14);       		//等待(15~60ms)
  	x=P1_3;          			//用X的值来判断初始化有没有成功,18B20存在的话X=0,否则X=1
  	delay(20);
        }
if(no==4)
        {
   	P1_4=1;          			//P1_先置高
  	delay(8);            		//稍延时
  	P1_4=0;             		//发送复位脉冲
  	delay(85);        	 	//延时(>480ms)
  	P1_4=1;          			//拉高数据线
  	delay(14);       		//等待(15~60ms)
  	x=P1_4;          			//用X的值来判断初始化有没有成功,18B20存在的话X=0,否则X=1
  	delay(20);
        }
if(no==5)
        {
   	P1_5=1;          			//P1_先置高
  	delay(8);            		//稍延时
  	P1_5=0;             		//发送复位脉冲
  	delay(85);        	 	//延时(>480ms)
  	P1_5=1;          			//拉高数据线
  	delay(14);       		//等待(15~60ms)
  	x=P1_5;          			//用X的值来判断初始化有没有成功,18B20存在的话X=0,否则X=1
  	delay(20);
        }
if(no==6)
        {
   	P1_6=1;          			//P1_先置高
  	delay(8);            		//稍延时
  	P1_6=0;             		//发送复位脉冲
  	delay(85);        	 	//延时(>480ms)
  	P1_6=1;          			//拉高数据线
  	delay(14);       		//等待(15~60ms)
  	x=P1_6;          			//用X的值来判断初始化有没有成功,18B20存在的话X=0,否则X=1
  	delay(20);
        }
if(no==7)
        {
   	P1_7=1;          			//P1_先置高
  	delay(8);            		//稍延时
  	P1_7=0;             		//发送复位脉冲
  	delay(85);        	 	//延时(>480ms)
  	P1_7=1;          			//拉高数据线
  	delay(14);       		//等待(15~60ms)
  	x=P1_7;          			//用X的值来判断初始化有没有成功,18B20存在的话X=0,否则X=1
  	delay(20);
        }
 
}

/****************************************************************************
函数功能:向DS18B20读一字节数据
作    者:沈建良
时    间:2006年4月20日
入口参数:
出口参数:dat
****************************************************************************/
unsigned char ReadOneChar(unsigned char no)     //读一字节数据 			//主机数据线先从高拉至低电平1ms以上,再使数据线升为高电平,从而产生读信号
{
	unsigned char i=0; 		//每个读周期最短的持续时间为60ms,各个读周期之间必须有1ms以上的高电平恢复期
	unsigned char dat=0;
if(no==0)
    {
              for (i=8;i>0;i--)  			//一个字节有8位
		{
		P1_0=1;
    		delay(1);
    		P1_0=0;
    		dat>>=1;
   		P1_0=1;
    		if(P1_0)
   		dat|=0x80;
    		delay(4);
		}
     }
if(no==1)
    {
              for (i=8;i>0;i--)  			//一个字节有8位
		{
		P1_1=1;
    		delay(1);
    		P1_1=0;
    		dat>>=1;
   		P1_1=1;
    		if(P1_1)
   		dat|=0x80;
    		delay(4);
		}
     }
if(no==2)
    {
              for (i=8;i>0;i--)  			//一个字节有8位
		{
		P1_2=1;
    		delay(1);
    		P1_2=0;
    		dat>>=1;
   		P1_2=1;
    		if(P1_2)
   		dat|=0x80;
    		delay(4);
		}
     }
if(no==3)
    {
              for (i=8;i>0;i--)  			//一个字节有8位
		{
		P1_3=1;
    		delay(1);
    		P1_3=0;
    		dat>>=1;
   		P1_3=1;
    		if(P1_3)
   		dat|=0x80;
    		delay(4);
		}
     }
if(no==4)
    {
              for (i=8;i>0;i--)  			//一个字节有8位
		{
		P1_4=1;
    		delay(1);
    		P1_4=0;
    		dat>>=1;
   		P1_4=1;
    		if(P1_4)
   		dat|=0x80;
    		delay(4);
		}
     }
if(no==5)
    {
              for (i=8;i>0;i--)  			//一个字节有8位
		{
		P1_5=1;
    		delay(1);
    		P1_5=0;
    		dat>>=1;
   		P1_5=1;
    		if(P1_5)
   		dat|=0x80;
    		delay(4);
		}
     }
if(no==6)
    {
              for (i=8;i>0;i--)  			//一个字节有8位
		{
		P1_6=1;
    		delay(1);
    		P1_6=0;
    		dat>>=1;
   		P1_6=1;
    		if(P1_6)
   		dat|=0x80;
    		delay(4);
		}
     }
if(no==7)
    {
              for (i=8;i>0;i--)  			//一个字节有8位
		{
		P1_7=1;
    		delay(1);
    		P1_7=0;
    		dat>>=1;
   		P1_7=1;
    		if(P1_7)
   		dat|=0x80;
    		delay(4);
		}
     }
                
    	return(dat);
}

/****************************************************************************
函数功能:向DS18B20写一字节数据
作    者:沈建良
时    间:2006年4月20日
入口参数:dat
出口参数:
****************************************************************************/
void WriteOneChar(unsigned char dat,unsigned char no)  //向DS18S20写一字节数据
{
	unsigned char i=0; 		//数据线从高电平拉至低电平,产生写起始信号。15ms之内将所需写的位送到数据线上,
if(no==0)
     {
	for(i=8;i>0;i--)  		//在15~60ms之间对数据线进行采样,如果是高电平就写1,低写0发生。
         	{
		P1_0=0;    		//在开始另一个写周期前必须有1ms以上的高电平恢复期。
		P1_0=dat&0x01;
		delay(5);
		P1_0=1;
		dat>>=1;
        	}
        delay(4);
     }
if(no==1)
     {
	for(i=8;i>0;i--)  		//在15~60ms之间对数据线进行采样,如果是高电平就写1,低写0发生。
         	{
		P1_1=0;    		//在开始另一个写周期前必须有1ms以上的高电平恢复期。
		P1_1=dat&0x01;
		delay(5);
		P1_1=1;
		dat>>=1;
        	}
        delay(4);
     }
if(no==2)
     {
	for(i=8;i>0;i--)  		//在15~60ms之间对数据线进行采样,如果是高电平就写1,低写0发生。
         	{
		P1_2=0;    		//在开始另一个写周期前必须有1ms以上的高电平恢复期。
		P1_2=dat&0x01;
		delay(5);
		P1_2=1;
		dat>>=1;
        	}
        delay(4);
     }
if(no==3)
     {
	for(i=8;i>0;i--)  		//在15~60ms之间对数据线进行采样,如果是高电平就写1,低写0发生。
         	{
		P1_3=0;    		//在开始另一个写周期前必须有1ms以上的高电平恢复期。
		P1_3=dat&0x01;
		delay(5);
		P1_3=1;
		dat>>=1;
        	}
        delay(4);
     }
if(no==4)
     {
	for(i=8;i>0;i--)  		//在15~60ms之间对数据线进行采样,如果是高电平就写1,低写0发生。
         	{
		P1_4=0;    		//在开始另一个写周期前必须有1ms以上的高电平恢复期。
		P1_4=dat&0x01;
		delay(5);
		P1_4=1;
		dat>>=1;
        	}
        delay(4);
     }
if(no==5)
     {
	for(i=8;i>0;i--)  		//在15~60ms之间对数据线进行采样,如果是高电平就写1,低写0发生。
         	{
		P1_5=0;    		//在开始另一个写周期前必须有1ms以上的高电平恢复期。
		P1_5=dat&0x01;
		delay(5);
		P1_5=1;
		dat>>=1;
        	}
        delay(4);
     }
if(no==6)
     {
	for(i=8;i>0;i--)  		//在15~60ms之间对数据线进行采样,如果是高电平就写1,低写0发生。
         	{
		P1_6=0;    		//在开始另一个写周期前必须有1ms以上的高电平恢复期。
		P1_6=dat&0x01;
		delay(5);
		P1_6=1;
		dat>>=1;
        	}
        delay(4);
     }

}


/****************************************************************************
函数功能:向DS18B20读温度值
作    者:沈建良
时    间:2006年4月20日
入口参数:
出口参数:temperature
****************************************************************************/
void GetTempValue(unsigned char no)
{
	 Init_DS18B20(no);        		//初始化
	 WriteOneChar(0xcc,no);      	//跳过读序列号
	 WriteOneChar(0x44,no);      	//启动温度转换
	 delay(200);
	 delay(200);
	 delay(200);
	 delay(200);
	 delay(200);
	 Init_DS18B20(no);
	 WriteOneChar(0xcc,no);      
	 WriteOneChar(0xbe,no);       	//读温度寄存器
	 SampleLVal[no]=ReadOneChar(no);//读出温度低位      
	 SampleHVal[no]=ReadOneChar(no);//读出温度高位
	 if((SampleHVal[no]==0xff))
	 {
		Sensor&=~(0x01<<no);
		SampleLVal[no]=0;
		SampleHVal[no]=0;
	 }
	 else
	 {
		Sensor|=0x01<<no;
	 }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -