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

📄 ds18b20.c

📁 其中包括对单片机的设置初始化和由单片机控制18b20,并由LED显示。
💻 C
字号:
#include<reg52.h>
#include<intrins.h>

#define SkipRom            0xcc//跳过读取编码值操作,使以后的操作具有通用性
#define ConvertTemperature 0x44//温度转换命令
#define ReadScratchpad     0xbe//读内部数据存储器地址

sbit   DQ=P2^7;
unsigned int buffer[6];
unsigned char code buff[12]={0X3f,0X06,0X5b,0X4f,0X66,0X6d,0X7d,0X07,0X7f,0X6f,0x40,0x00
							};//数字0~9及"EP=OC"共阴数码管代码 

void delay(unsigned char delay_time)//延时时间:=(8+delay_time*6)us;
{ 
 while(delay_time)
 delay_time--;
}

void init_ds18b20(void)//初始化
{
 DQ=0;//复位信号
 delay(80);//延时600us
 DQ=1;
 delay(4);//延时30us
 DQ=1;
 delay(35);//延时180us
 DQ=1;
 _nop_();//短暂延时
}


void wr_byte(unsigned int wdata)//ds18b20写一个字节(wdata)
{
unsigned int n;//循环变量
for(n=0;n<8;n++)//8个bit
  {
   DQ=0;//每次写入都要先复位
   _nop_();//短暂延时
   if(wdata&0x01==1)//写最低位
   DQ=1;
   delay(10);//延时68us
   wdata=wdata>>1;//依次移位
   DQ=1;
   _nop_();
  }
  delay(20);//延时128us
}


unsigned int rd_byte(void)//ds18b20读一个字节
{
 unsigned int m,bb=0;
 bit b;
 for(m=0;m<8;m++)
  {
  DQ=0;
  _nop_();
  DQ=1;
  b=DQ;
  delay(12);//延时70us 
  if(b)
  bb|=0x01<<m;
  DQ=1;
  _nop_();
  
  }
 delay(10);//延时68us
  
  return(bb);
}


void rd_ds18b20()//读ds18b20
{
unsigned int msb=0,lsb=0;
unsigned char t1=0;
unsigned int  t2=0;
unsigned int flag;
init_ds18b20();//初始化
wr_byte(SkipRom);//单片机发送命令,ds18b20跳过内部ROM,使以后命令通用
_nop_();//短暂延时
wr_byte(ConvertTemperature);//单片机发送温度转换命令
delay(5);//延时40us
init_ds18b20();//初始化,为显示做准备
wr_byte(SkipRom);//跳过内部ROM
wr_byte(ReadScratchpad);//准备读温度数据
lsb=rd_byte();//为温度整数显示准备
msb=rd_byte();//为温度小数显示准备

if((msb&0xf0)>1)//取整数部分
  flag=1;
else flag=0;

if(flag)
   {
    msb=~msb;//正数取反仍为正,不必加1
    lsb=~lsb+1;//负数取反要加1才为补码
   }
   t1=(msb<<4)|(lsb>>4);//整数部分
   t2=(lsb&0x0f)*0.0625*10000;//小数部分
  if(flag)
    {
     buffer[0]=10;//负数,因为最低为-55度,故为5位显示
    }
  else 
    {
     buffer[0]=11;//正数,因为最高为125度,故为6位显示
    }
buffer[1]=t1/100;//数码管第二位
buffer[2]=(t1/10)%10;
buffer[3]=t1%10;
buffer[4]=t2/1000;//数码管小数部分
buffer[5]=(t2%1000)/100;
}

void display()//数码管显示
{
unsigned int j,b=0xdf,k;
for(j=0;j<6;j++)
  {
   P1=b;//位选,b的值即为0xdf
   if(j==3)
    {
     P0=buff[buffer[j]]|0x80;//段选
    }
   else
    {
     P0=buff[buffer[j]];
    }
   b=(b>>1)|0x80;
for(k=0;k<5;k++)
    {
    delay(120);//延时720us
    }
  }
}

void main()
{
while(1)
  {
   rd_ds18b20();//读ds18b20
   display();//数码管显示
  }
}

⌨️ 快捷键说明

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