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

📄 ds18b20.c

📁 该程序直接实现了DS18B20的温度测量
💻 C
字号:
/*DS18B20温度测量实验 
功能:在数码管上显示当前DS18B20测到的温度 
小数部分为4位,温度为负时,最高位显示"1" 
测量范围:-55℃ ~ +125℃*/



/*************7290显示部分********************/
/*
函数:SystemInit()
功能:系统初始化
*/
#include <DS18B20.h>
#include <I2C.h>
#include <ZLG7290.h> 


uchar MSB;                                           //温度高字节 
uchar LSB;                                           //温度低字节 
uint t1=0;                                            //温度整数部分数值 
uint t2=0;                                           //温度小数部分数值 
uchar flag;                                          //负温度标志 

void delay(uint count);

void SystemInit()
{
	I2C_Init();
	delay(3600);		//等待ZLG7290复位完毕
}

/*
函数:ClearAll()
功能:清除所有显示
*/
void ClearAll()
{
	unsigned char x;
	for ( x=0; x<8; x++ )
	{
		ZLG7290_Download(x,0,0,31);
	}
}
/*******************************************************************************/



void delay(uint count)                              //延时函数 
{ 
   uint i; 
   for(i=0;i<count;i++); 
} 

void DS18B20Init()                                    //初始化DS18B20 
{ 
  DQ=0;                        //下拉500us 
  delay(60); 
  DQ=1;                        //释放总线 
  delay(6); 
  while(DQ);                   //等待应答信号 
  while(~DQ);                  //等待释放总线 
} 

uchar ReadByte()               //读一个字节 
{ 
  uchar i; 
  uchar ReadData=0; 
  for(i=0;i<8;i++)
   { 
     DQ=0; 
     ReadData>>=1; 
     DQ=1; 
     if(DQ) 
        ReadData|=0x80; 
     delay(4); 
   } 
  return ReadData; 
} 

WriteByte(uchar WriteData)      //写一个字节 
{ 
  uchar i; 
  uchar tmpData; 
  for(i=0;i<8;i++)
    { 
      tmpData=WriteData&0x01; 
      WriteData>>=1; 
      if(tmpData)
         { 
           DQ=0; 
           DQ=1; 
           delay(4); 
         }
      else
         { 
           DQ=0; 
           delay(4); 
           DQ=1; 
         } 
    } 
} 

float GetTemper()                  //温度计算程序 
{ 
    
   if((MSB&0xF0)>0)          //判断是否为负温度 
      { 
         flag=1; 
      }
   else
      { 
         flag=0; 
      } 
   if(flag)                   //如果为负温度取反加1 
      {
        MSB=~MSB; 
        LSB=~LSB+1; 
      } 
  t1=MSB<<4;                      
  t1|=(LSB>>4);                       //得到温度整数部分
  t2=(LSB&0x0F)*0.0625*10000;         //得到温度小数部分并扩大10000倍 
                                 
  if(flag)                            //如果为负温度则最高位显示“1”
     ZLG7290_Download(7,0,0,1); 
    //else                                //如果为正温度则最高位显示“0”
    // ZLG7290_Download(7,0,0,0);    
    //ZLG7290_Download(6,0,0,t1/100);   
    ZLG7290_Download(7,0,0,t1%100/10);   
    ZLG7290_Download(6,1,0,t1%10); 
    ZLG7290_Download(5,0,0,t2/1000);    
    ZLG7290_Download(4,0,0,t2%1000/100);   
   //ZLG7290_Download(1,0,0,t2%100/10);                               
   //ZLG7290_Download(0,0,0,t2%10);
   return  t1+(LSB & 0x0F) * 0.0625;                               //返回温度为0~99度,决定了该模块的工作范围
} 


 
float Get_Temp()                    // 供主程序调用的接口函数,返回给主函数温度值 
{ 
      float temp;
      //SystemInit();		//系统初始化 
      //ClearAll();          //清除所有显示   
      DS18B20Init();               //复位DS18B20 
      WriteByte(0xCC);             //跳过ROM配置 
      WriteByte(0x44);             //启动温度转换 
     
      DS18B20Init(); 
      WriteByte(0xCC); 
      WriteByte(0xBE);             //读温度寄存器 
      
      LSB=ReadByte();              //读温度数据低字节 
      MSB=ReadByte();              //读温度数据高字节 
      
      temp = GetTemper();          //计算温度并显示
      return temp;                  //返回实型的温度值 
     
}  

⌨️ 快捷键说明

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