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

📄 ds18b20.c

📁 用pic单片机做的一个温度计 实现实时时钟显示和存储
💻 C
字号:
#include<p18f452.h>
#include"delays.h"

#define   DSDQ     PORTAbits.RA0          //define ds18b20 信号端口
#define   TRISDQ   TRISAbits.TRISA0      //define ds18b20 端口I/O  

#define   DQ_HIGH()  TRISDQ=1             //设置数据口味输入
#define   DQ_LOW()   DSDQ=0 ; TRISDQ=0    //设置数据口为输出(低电平)
 
char tempflag;

/*****************************************************************************
 ******函 数 名 称 :  reset()
 ******函 数 功 能 :  启动ds18b20
 ******输       入 :  无
 ******输       出 :  无
 ******备注        : 等待ds18b20 应答
 ******************************************************************************/ 
void reset(void)
{ 

  
  char presence=1;                 
  while(presence)
      {        
         DQ_LOW() ;   
         delays(17,50);   
         DQ_HIGH() ;  
         delays(2,73); 
         if(DSDQ==1) presence=1;                       // 没有接受到应答信号
         else       presence=0;                       // 接受到应答信号
         delays(17,30);   
       }
 
 }
/*****************************************************************************
 ******函 数 名 称 :  writecmd()
 ******函 数 功 能 :  为DS18B20写入八位命令
 ******输       入 :  cmd
 ******输       出 :  无
 ******备注        : 
 ******************************************************************************/ 
void writecmd(char cmd)
{   
    int i;
    char temp;
    TRISDQ=0;                                                   //置为输出
    for(i=8;i>0;i--)                                            //写入八位数据
   {
     temp=cmd&0x01;                                           
     DQ_LOW() ;
     delays(2,2); 
     if(temp==1) 
          {DQ_HIGH();
           delays(2,80); 
          }
     else 
          {
            delays(2,80); 
            DQ_HIGH();
          }
   
    cmd=cmd>>1;   
   }

}

/*****************************************************************************
 ******函 数 名 称 :   readdate()
 ******函 数 功 能 :  从DS18B20读出八位命令
 ******输       入 :  无
 ******输       出 :  value
 ******备注        : 
 ******************************************************************************/ 
char readdate(void)
{    
     char value=0;
   
     char tmp=0x01;
     while (tmp)
    { 

      DQ_LOW() ;                                            //置低输出低电平
      delays(2,2);                                   //延迟>15us
      DQ_HIGH();
      if(DSDQ)    value|=tmp;
      tmp=tmp<<1;
      delays(2,80);
     }
     return value;
}


/*****************************************************************************
 ******函 数 名 称 :  get_ds18b20_temp()
 ******函 数 功 能 :  读取温度
 ******输       入 :  无
 ******输       出 :  float  t
 ******备注        :  
 ******************************************************************************/ 
float get_ds18b20_temp(void)
{  
   int i;
   float t ;

   union {
       char c[2];
       int x ;
        }temp1;

  temp1.x=0;

  DQ_HIGH(); 

  reset();
  writecmd(0xCC);                                  // 跳过ROM
  writecmd(0X44);                                //开始转换

  for(i=10;i>0;i--)                                   //延迟750us
     {
        delays(101,270); 
     };

  reset();
  writecmd(0xCC);                                  // 跳过ROM
  writecmd(0XBE);                                  //开始转换
  


  temp1.c[0]=readdate();
  temp1.c[1]=readdate();
  if(temp1.c[1]>=0x80) tempflag=1;
  else tempflag=0;
  if(tempflag) temp1.x=~temp1.x+1;
  t=((float)temp1.x)/16.0; 
                        
  return (t);

}

















⌨️ 快捷键说明

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