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

📄 18b20.c

📁 51单片机DS18B20数字温度
💻 C
字号:
/*--------------------------------------------------------------------------
 DS18B20,数码管显示,显示格式为:零上:100.00°C
                                 零下:-10.00°C 
若不DS18B20检测不到,蜂鸣器报警,晶振是11.0592M
----------------------------------------------------------------------------*/
#include<reg51.h>
#include<intrins.h>

#define uchar unsigned char
#define uint unsigned int

sbit DQ=P2^4;//ds18b20 IO口
sbit beep=P2^6;//
sbit aa=P2^0;  //74hc138
sbit bb=P2^1;
sbit cc=P2^2;
sbit LE1=P2^7;
uchar  flag,flag1,pre;

uchar ds18b20_reset();
uchar read_byte();
void write_byte(uchar );
void read_tempt();
void display();
uchar code table[]={ 0x3f,0x06,0x5b,0x4f,0x66,
                     0x6d,0x7d,0x07,0x7f,0x6f,0x39,0x63,0x40,0x80,0x00};
                                            //c   o    -     、    
uchar data tempt_data[2]; //温度暂存 内部RAM低128字节
uchar data ddata[6];      //显示暂存 内部RAM低128字节

void delay_50us(uint t)  //12M,延时50us
{

  while( --t );

}
  


void init()  //初始化
{
   P0=0xff;
   P2=0xff;
   flag=0;
   flag1=0;
   LE1=0;
}


void main()   //主函数
{
     init();
    while(1)
     {
      read_tempt();
      if(flag1==0) 
        {
         display();
        }
      else
        {
         P0=0x00;
        }
     }
}



uchar  ds18b20_reset() // ds18b20 复位
{
   uchar pre;
   DQ=1;        //增加稳定性
   delay_50us(1);
   DQ=0;
   delay_50us(90); //
   DQ=1;
   delay_50us(8);
   pre=DQ;
   delay_50us(100);
   DQ=1;
  return(pre);
}

uchar read_byte()   //读ds18b20一个字节
{
   uchar i;
   uchar data_t=0;
   for(i=8;i>0;i--) 
      {
       DQ=0;
       data_t>>=1; 
       _nop_();
       DQ=1;
       
       if(DQ)
         data_t|=0x80;
      delay_50us(4);
    
      }
   return(data_t);
 }

void write_byte(uchar dat)  //向ds18b20 写一个字节
{
  uchar  i;
  for(i=8;i>0;i--)
    {
     DQ=0;
     DQ=dat&0x01;
     _nop_();     //使其时隙大于1us小于15us
     delay_50us(5);
     DQ=1;
     dat>>=1;
    }

}

void read_tempt()    //读ds18b20 的温度值,把它放到内部RAM低128字节种
{
 uchar i;

 if(pre==1)  //ds18b20不响应,蜂鸣器报警
   {
   for(i=10;i>0;i--)
     {
      beep=~beep;
      delay_50us(5);
     }
   flag1=1; 
   beep=1;
   }
 else
  {
   ds18b20_reset();
   write_byte(0xcc); 
   write_byte(0x44); 
 
   ds18b20_reset();
   write_byte(0xcc); 
   write_byte(0xbe); 
  for(i=0;i<2;i++)
    {
    tempt_data[i]=read_byte();
    }
  ds18b20_reset();
  }
}


void display()       //数码管显示
{
   uchar temp,temp_1;
  temp=tempt_data[1]&0xf0;
   if(temp==0xf0)  //温度是否小于零
      {
        flag=1;
        if(tempt_data[0]==0)   //LSB是否向MSB进位,若进位,则高8位和低8位都取反加一
         {
          tempt_data[0]=~tempt_data[0]+1;
          tempt_data[1]=~tempt_data[1]+1;
         }
        else                  //没有进位,则高8位取反,低8位取反加一
         {
          tempt_data[0]=~tempt_data[0]+1;
          tempt_data[1]=~tempt_data[1];
         }
      }
   temp=((tempt_data[0]&0xf0)>>4)|((tempt_data[1]&0x0f)<<4);
   ddata[1]=temp/100;
   ddata[2]=temp%100/10;
   ddata[3]=temp%100%10;
   temp_1=tempt_data[0]&0x0f;
   ddata[0]=(temp_1*0.0625)*10000;
   ddata[4]=ddata[0]/1000;
   ddata[5]=ddata[0]%1000/100;
   if(flag==1)  //判断温度是否小于零
     {
      if(!ddata[1])    //若十位等于 零,十位显示"-",百位关闭显示
        {
         ddata[1]=0x0e;
             if(!ddata[2])  //判断十位是否为零
                ddata[2]=0x0c;
        }
     }
   else        //温度大于零时
     {
        if(!ddata[1])  //判断百位是否为零
        {
         ddata[1]=0x0e;   //百位为零,关闭百位显示
          if(!ddata[2])  //判断十位是否为零
            ddata[2]=0x0e; //十位为零,关闭十位显示
        } 
     }
//数码管显示
    LE1=1;
 delay_50us(20);
    aa=0;
    bb=0;
    cc=0;
    P0=table[ddata[1]];
    delay_50us(200);

    aa=1;
    bb=0;
    cc=0;
    P0=table[ddata[2]];  
    delay_50us(200);
   
    aa=0;
    bb=1;
    cc=0;
    P0=table[ddata[3]];  
    delay_50us(200);

    aa=0;
    bb=1;
    cc=0;
    P0=table[0x0d];  
    delay_50us(200);

    aa=1;
    bb=1;
    cc=0;
    P0=table[ddata[4]];  
    delay_50us(200);

    aa=0;
    bb=0;
    cc=1;
    P0=table[ddata[5]];  
    delay_50us(200);

    aa=1;
    bb=0;
    cc=1;
    P0=table[0x0b];  
    delay_50us(200);

    aa=0;
    bb=1;
    cc=1;
    P0=table[0x0a];  
    delay_50us(200);
    LE1=0;
    P0=0x00;
}

⌨️ 快捷键说明

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