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

📄 ds18b20.c

📁 18b20检测温度 及7219显示 按键检测程序 等实际应用程序
💻 C
字号:
//#ifdef _DS18B20_H_
/*************************************
***	DS18B20处理函数
**************************************/
#include <reg52.h>
#include <Intrins.h>
#include <absacc.h>
//#include "Uarts1.h"
#include "main.h"

//2ROM操作品令
#define DS18B20_ROM_READ 	 0x33
#define DS18B20_ROM_MATCH  	 0x55
#define DS18B20_ROM_SKIP	 0xCC
#define DS18B20_ROM_SERCH  	 0xF0
#define DS18B20_ALARM_SERCH  0xEC
//3存储器操作命令
#define DS18B20_WRITE_MEM 	 0x4E   //Write Scratchpad(写暂存存储器) [4EH]
#define DS18B20_READ_MEM 	 0xBE	//Read Scratchpad(读暂存存储器) [BEH]
#define DS18B20_COPY_MEM 	 0x48   //Copy Scratchpad(复制暂存存储器) [48H]
#define DS18B20_CONVERT_TEMP 0x44   //Convert Temperature(温度变换) [44H]
#define DS18B20_RECALL_EPROM 0xB8   //Recall EPROM(重新调出) [B8H]
#define DS18B20_READ_PWR	 0xB4   //Read Power supply(读电源) [B4H]

////////////////////////////////////////////////////////////////////////////////
//全局变量
//ds18b20端口
sbit DQ_18b20 =P0^3;//根据实际情况定义端口

//unsigned int Delay_Ds18b20;  //以1MS定时器,应该为1200. 1.2S
////////////////////////////////////////////////////////////////////////////////
//底层函数
//总线延时函数(DelayUs.A51)
void DS18B20_Delay(unsigned char k);

//DS18B20复位函数
unsigned char DS18B20_Reset(void)
{	 
  bit k;
  unsigned char flag,i;
  for(i=0;i<10;i++)
//  while(1)
  {
//KK:
	  DQ_18b20 = 0; 
	  DS18B20_Delay(70); //400us-600us
	  DQ_18b20 = 1; 
	  DS18B20_Delay(8);  //60us 
	  k = DQ_18b20; 
	  if(k==0)
	  {	
		flag=0x00;
		i=10;
	  }
	  else
	  	flag=0xff;
  }
//测试
//  UartSendChar(flag);
  if(flag==0xff)
  	return flag;
  k = DQ_18b20;
  if(k==0)
  {
  	DS18B20_Delay(10);  //80us
  	k = DQ_18b20;
  	if(k==0)
		flag=0xff;
  }
//测试
//  UartSendChar(flag);
  if(flag==0xff)
  	return flag;
//  	goto   KK;
  DS18B20_Delay(25);
  return flag; 
}  


//读一个字节
unsigned char DS18B20_ReadByte(void)
{
  unsigned char i;
//  bit k;
  unsigned int value = 0;

  for (i=0;i<8;i++)	 //从低位读到高位
  {
  	value=value>>1;
   	DQ_18b20 = 0;
   	_nop_();_nop_();_nop_();_nop_();
   	DQ_18b20 = 1;
	_nop_();_nop_();  //此两句可以不要
	if(DQ_18b20)
    	value|=0x80;
	DS18B20_Delay(6); 	  //延时46US 
	DQ_18b20 = 1;
	
  }
  return(value);
}


//写一个字节
void DS18B20_WriteByte(unsigned char val)
{
  unsigned char i;
  for (i=0; i<8; i++) 	   //从低位写到高位
  {
		DQ_18b20 = 0; 
  		_nop_();_nop_();_nop_();_nop_();_nop_();
	   	DQ_18b20 =(val&0x01);
		val=val>>1;
		DS18B20_Delay(7); 	  //延时56uS
		DQ_18b20 = 1; 
  }

}
////////////////////////////////////////////////////////////////////////////////
//上层函数
//发送开始转换命令
void DS18B20_StartConvert()
{
	unsigned char f;
	EA=0;
  	f=DS18B20_Reset();
  	if(f==0)
  	{
  		DS18B20_WriteByte(DS18B20_ROM_SKIP);   	//0xCC 
  		DS18B20_WriteByte(DS18B20_CONVERT_TEMP);	//write_unsigned char(0x44); 
	}	
	EA=1;
}

//读取温度(暂时不考虑负数的情况)
//送出温度值*10倍
unsigned int DS18B20_ReadTemp(void)
{  
//  unsigned char i,j,k;
  //unsigned int tmpH,tmpL;
  unsigned char f,tmpH,tmpL;
  char sign;
  unsigned int tempZ;
  EA=0;

  f=DS18B20_Reset();
  if(f==0)
  {
  	DS18B20_WriteByte(DS18B20_ROM_SKIP);   //0xCC
  	DS18B20_WriteByte(DS18B20_READ_MEM);   //0xBE
  	tmpL=DS18B20_ReadByte();
  	tmpH=DS18B20_ReadByte();
  }
  EA=1;
  if(f!=0)
  {
//  	Led_Run=~Led_Run;
	return 0xfedc;
  }
/* 检查读取的两个温度数字
	UartSendChar(tmpL);
	UartSendChar(tmpH);
*/
 //符号暂时不考虑

  if((tmpH&0xf8)==0)
  	sign=1;  //+
  else
  	sign=-1; //-
  tempZ=((tmpH&0x07)<<4)+((tmpL&0x0f0)>>4);
  tmpL=(tmpL&0x0f)*0.625;  // 1/16:0.0625 *10
  return ((tempZ*10)+tmpL);
}
//#endif
//end of file.

 

⌨️ 快捷键说明

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