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

📄 freescale

📁 Freescale 系列单片机常用模块与综合系统设计
💻
字号:
#include "DS18B20.h"

Uchar  TLV=0 ;                        //采集到的温度高8位
Uchar  THV=0;                         //采集到的温度低8位
Uchar  TZ=0;                           //转换后的温度值整数部分

//---------------------------------------------------------------------*
//函数名: delay                                                   *
//功  能: 延时函数:                                            *
//参  数: t;                                                 *
//        t:需延时的ms数;                                         *
//返  回: 无                                                           * 
//---------------------------------------------------------------------*
void delay(Uint t) 
{
  Uint z;
  for ( z=0; z<t; z++)
  ;
}
//循环一次大约25个cpu时钟,50个busclk,所以延时50*1/8M=6.25uS


//---------------------------------------------------------------------*
//函数名: reset                                                        *
//功  能: DS18B20复位函数:                                            *
//参  数: None;                                                        *        
//返  回: 无                                                           * 
//---------------------------------------------------------------------*
void reset(void)
{
  char presence=1;
  
  while(presence)
  { 
   // DQ_DIR=1;
    //DQ=1;
    DQ_SetDir(1);
    DQ_ClrVal() ;                                //主机拉至低电平
    delay(112);                               //延时700us
    DQ_SetDir(0);                                //释放总线等电阻拉高总线,并保持15~60us
    delay(11);                                //延时70us
    if(DQ_GetVal() ==1)                                   //没有接收到应答信号,继续复位
    {
      presence=1;  
    }
    else 
    {
      presence=0;                              //接收到应答信号
    }
    
    delay(80);                                  //延时500us
   }
}

//-----------------------------------------------
//写18b20写字节函数
void write_byte(Uchar val)
{
 Uchar i;
 Uchar temp;
 
 for(i=8;i>0;i--)
 {
   temp=val&0x01;                            //最低位移出
   DQ_SetDir(1);
   DQ_ClrVal(); 
   asm{
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
   }
                                    //从高拉至低电平,产生写时间隙
   if(temp==1) 
   DQ_SetDir(0);                      //如果写1,拉高电平
   delay(12);                      //延时63us
   DQ_SetDir(0); 
   asm{
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
   }
   val=val>>1;                               //右移一位
  }
}


//------------------------------------------------
//18b20读字节函数
Uchar read_byte(void)
{
 static byte j;
 Uchar i;
 Uchar value=0;                                //读出温度

 for(i=8;i>0;i--)
 {
   value>>=1; 
   DQ_ClrVal();
   
   asm
   {
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
   }   
                              
   DQ_SetDir(0);                               //拉至高电平
   
   asm
   {
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
   }                                 
   j=DQ_GetVal();
   if(j) value|=0x80;
   delay(12);                             //63us
  }
  return(value);
}

//-------------------------------------------------
//启动温度转换函数
Uchar get_temp(void)                 //外接5V电源情况
{ 
  int i;
  
  DQ_SetDir(0);
  reset();                                 //复位等待从机应答 
  write_byte(0XCC);                        //忽略ROM匹配 
  write_byte(0X44);                        //发送温度转化命令  
  
  for(i=50;i>0;i--)
  {
//    feedCOP();                                     //确保温度转换完成所需要的时间
  }
  
  reset();                                 //再次复位,等待从机应答 
  write_byte(0XCC);                        //忽略ROM匹配 
  write_byte(0XBE);                        //发送读温度命令 
  TLV=read_byte();                         //读出温度低8 
  THV=read_byte();                         //读出温度高8位 
  DQ_SetVal();                               //释放总线 
  TZ=(TLV>>4)|(THV<<4)&0X3f;               //温度整数部分
  
  asm
  {
    NOP
    NOP
    NOP
    NOP
  }
  return TZ;
}

⌨️ 快捷键说明

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