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

📄 ds1820.txt

📁 一直使用的18B20程序,大家放心使用参考阿!
💻 TXT
字号:
/*******************************************************************/
//模 块 名: DS18B20驱动
//创 建 者: 好心情
//修 改 者:
//功能描述: DS18B20驱动
//其他说明: 51上运行通过,晶振12M
//版    本: V1.0
//日    期:  2007-12-3
/*******************************************************************/
# include "lcd1602-4bit1.H" 
# include <reg51.h>
# include <intrins.h>
# define unchar unsigned char

/****************************接口定义*******************************/
sbit ds1820_dq = P1^6;

/**************************全局变量定义*****************************/
bit flag;   // 标志位

unsigned char data  temp_data[2] = {0x00,0x00} ;  // 保存读取到的数值
unsigned char data  display_date[5] =   {0x00,0x00,0x00,0x00,0x00} ;
unsigned char code  ditab[16] =    {0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,
                                                        0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09} ;
/****************************函数声明*******************************/
void delay_us(unchar delay); // 延时us级
unchar ds1820_read(void);  //读时序
void ds1820_write(unchar dat);  //写
void ds1820_init(void);   // 初始化,返回一个bit值,0表示器件
        //存在且ok,1不存在,或损坏


/********************************************************************
*DS1820初始化(通过存在脉冲可以判断DS1820是否损坏)
*函数名称:ds1820_init(void)
*说明:函数返回一个位标量(0或1)flag=0存在,反之flag=1不存在,复位脉冲最
*少480us,最大960us.总线释放后延时15-60us1820产生60-240us的应答脉冲
********************************************************************/
void ds1820_init(void)
{
    // 复位脉冲 
 ds1820_dq = 1;  //将总线拉高,准备复位 
 ds1820_dq = 0;  //复位
 delay_us(100);  //延时>480us,这里取520us
 ds1820_dq = 1;  //释放总线,进入接收状态
 // 读应答信号
 delay_us(11);  //延时100us
 flag = ds1820_dq;  
 ds1820_dq = 1;  //释放总线*/    
}

/********************************************************************
*读时序(分为读0和读1)
*函数名称:ds1820_read(void)
*说明:主机将总线拉低后,15us内就要释放总线,好让1820将数据送到总线上,完
*成一个读过程至少需要60us;
********************************************************************/
unchar ds1820_read(void)
{
  unchar dat,i ;
  for(i=8;i>0;i--)
  {       
   ds1820_dq = 0; //给脉冲
   dat>>=1;  //右移1位,如果未读到1,右移一位相当与读0,同时用该指令延时
   ds1820_dq = 1; //15us内释放总线  
   
   if(ds1820_dq) //读1
   {
    dat|=0x80; //先读出低位值,将其写入dat最高位
   }
   delay_us(10); //延时60us,完成一个读过程,至少要60us    
   }
   return dat;  //返回结果 
}

/********************************************************************
*写时序(分为写0和写1)
*函数名称:ds1820_write(unchar dat)
*说明:先写低位值,利用dat&0x01取出最低位的值,如果是1,执行写1操作,否则
*写0;写完之后将dat中的数值右移一位
********************************************************************/
void ds1820_write(unchar dat)
{
 unchar i;
 for(i=8;i>0;i--)
 {
  if(dat&0x01)     // 写1
  {
   ds1820_dq = 0;
   _nop_();     // 15us内释放总线
   ds1820_dq = 1;
   delay_us(1);    // 稍作延时,让器件读数据
  }
  else     //写0
  {
   ds1820_dq = 0;
   delay_us(60);    //延时至少60us,好让器件在15-45us时读到数据
   ds1820_dq = 1;
  }
  dat>>=1;      // 右移一位,
 }
}

/********************************************************************
*读取温度()
*函数名称:ds1820_write(unchar dat)
*说明:先写低位值,利用dat&0x01取出最低位的值,如果是1,执行写1操作,否则
*写0;写完之后将dat中的数值右移一位
********************************************************************/
void ds1820_read_temp(void)
{
 //do{
 ds1820_init();   //初始化
 //}while(!flag);

 ds1820_write(0xcc);   //跳过读序列号操作
 ds1820_write(0x44);  //启动温度转换,对于12位精度,转换需要750ms的时间
       
 do      //这里采用判断语句来确认是否转换完成
 {
 ds1820_init();   // 初始化
 }while(!flag);

 ds1820_write(0xcc);
 ds1820_write(0xbe);  //读取温度寄存器

 temp_data[0] = ds1820_read(); //温度低8位
 temp_data[1] = ds1820_read(); //高8位
}  

/********************************************************************
*转换温度()
*函数名称: void ds1820_tempchange()
*说明:通过在转换结果上+0x30将其转换为数字对应的ascii码
********************************************************************/
 void ds1820_tempchange(void)
{
 //小数部分
  display_date[4]=temp_data[0]&0x0f ;
  display_date[0]=ditab[display_date[4]]+0x30 ;     //查表得小数位的值
   //整数部分
  display_date[4]=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4) ;
  display_date[3]=display_date[4]/100+0x30 ;
  display_date[1]=display_date[4]%100 ;
  display_date[2]=display_date[1]/10+0x30 ;
  display_date[1]=display_date[1]%10+0x30 ;

    if(display_date[3]==0x30)        //高位为0,不显示
   { 
     display_date[3]=0x20 ;              
     if(display_date[2]==0x30)      //次高位为0,不显示
     display_date[2]=0x20 ;
   }

     lcd_write_char(0,1,display_date[3]);             
             //百位数显示 
     lcd_write_char(0,2,display_date[2]);          
             //十位数显示 
     lcd_write_char(0,3,display_date[1]); 
          //各位显示  
  lcd_write_char(0,4,'.'); //小数点
     lcd_write_char(0,5,display_date[0]); //小数位 
}

/********************************************************************
*延时函数,us级
*函数名称:delay_us(unchar delay)
*说明:不精确延时
********************************************************************/
void delay_us(unchar delay)
{ 
 while(--delay);
}
/******************************************************************/


/****************************************/
void main()
{ 
 lcd_init();  // lcd初始化
 
 ds1820_init();  // ds1820初始化
  if(!flag)
  { 
  ds1820_read_temp();
  ds1820_tempchange();
  delay_1ms(200);
  }else
  {
   lcd_write_string(1,0,"ds1820_NG") ;
  }
 
 
}

⌨️ 快捷键说明

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