找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 2|回復(fù): 1
收起左側(cè)

DS18B20 51單片機(jī)冰箱測(cè)溫程序

[復(fù)制鏈接]
ID:243354 發(fā)表于 2025-5-16 10:42 | 顯示全部樓層 |閱讀模式
編寫一個(gè)冰箱測(cè)溫程序,經(jīng)測(cè)試,可以用

#include <reg52.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char

//小板接線
// sbit lcdrs=P2^4;    //液晶接口
// sbit rw=P2^5;            //液晶接口
// sbit lcden=P2^6;  //液晶接口
sbit quanwe=P2^0;
sbit baiwe=P2^1;
sbit shiwe=P2^2;
sbit gewe=P2^3;

sbit Beep=P3^0;
sbit DS=P3^2;               //溫度傳感器接口

sbit K1=P3^6;      //16腳
sbit K2=P3^7;           //17腳
sbit K3=P3^4;    //14腳
sbit K4=P3^5;   //15腳


uchar K1num;
uchar code smgdu[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
bit flag;
uchar Thflag=1;
uchar con;
uchar Th;
uint temp;

//延遲函數(shù)
void delayus(uint t)  // 延遲10微秒函數(shù)
{
  while(t--);
}

void delayms(uint z)         //延遲1毫秒函數(shù)
{
  uint x,y;
        for(x=z;x>0;x--)
          for(y=110;y>0;y--);
}         

//DS18B20溫度函數(shù)
void DSreset(void)   //復(fù)位
{
  DS=1;                           //總線高電平
  delayus(6);     //延遲66us
  DS=0;                         //拉低總線
  delayus(65);  //保持480-960us
  DS=1;        //釋放總線
  delayus(14);        
  if(DS==0)         //檢測(cè)到從件發(fā)出應(yīng)答信號(hào)       
    flag=1;
  else
    flag=0;         //未檢測(cè)到從件發(fā)出應(yīng)答信號(hào)
  delayus(20);                 
}                  

bit DSread_bit( )        //讀位函數(shù),主機(jī)把總線由高拉低1微秒,釋放,15微秒內(nèi)檢測(cè)并讀取總線電平。
{
   bit Dat;
   DS=0;           //拉低總線
   _nop_( );  //延1微秒
   _nop_( );
   DS=1;         //釋放總線
   _nop_( );
   Dat=DS;        //讀取總線電平
   delayus(10);
   return Dat;         //返出讀取值
}

uchar DSreadByte( )           //讀取8位并組裝1字節(jié)函數(shù)
{
    uchar i, j,k;
        k=0;               //K賦初值0
    for(i=0; i<8; i++)
    {
        j=DSread_bit( );
        k=(j<<7)|(k>>1);        //j左移7位與上k,8次后組成1字節(jié)
    }
    return k;
}               

void DSwrite_byte(uchar dat)   //寫1字節(jié)函數(shù)
{
  uchar i;
  for(i=1;i<=8;i++)
  {
    DS=0;                 //拉低總線
        _nop_( );          //延1微秒
    DS=dat&0x01;  //總線電平等于需寫入dat的未位,寫1則DS=1,寫0則DS=0
        delayus(6);
        DS=1;        //釋放總線,準(zhǔn)備寫入dat的未第2位。
    dat=dat>>1;         //dat右移,未2位移至未位。
   }
   delayus(6);
}         

void tmpconvert(void)  //轉(zhuǎn)換溫度函數(shù)
{
  DSreset();
  delayms(1);
  DSwrite_byte(0xcc);   //跳過(guò)ROM指令
  DSwrite_byte(0x44);  //啟動(dòng)轉(zhuǎn)換溫度命令
  }

uint read_temperature( )   //讀傳感器溫度值函數(shù)
{
  //uint T;
  uchar LSB,MSB;
  float tp;
  DSreset( );  //復(fù)位
  DSwrite_byte(0xcc);  //跳過(guò)ROM指令
  DSwrite_byte(0xbe); //讀暫存器溫度
  LSB=DSreadByte( );  //讀低8位字節(jié),存入LSB
  MSB=DSreadByte( ); //讀高8位字節(jié),存入MSB
  temp=MSB<<8|LSB;
  if(temp<0)
  {
   temp=temp-1;
   temp=~temp;
   tp=temp;   
   temp=tp*0.0625*10+0.5;
  }
  else
  {
  tp=temp;
  temp=tp*0.0625*10+0.5;  //擴(kuò)大10倍,顯示百十個(gè)。
  }
  return temp;        //返出溫度值
}  


void displaysmg (uint temp)
{
        uchar quan,bai,shi,ge;
        if(Thflag)                   //標(biāo)志位置1,數(shù)碼管顯示測(cè)量溫度
         {
           bai=temp/100;
           shi=temp%100/10;
           ge=temp%10;

           quanwe=0;
           baiwe=0;
           shiwe=0;
           gewe=0;
           //P0=smgdu[quan];
           //quanwe=1;
           //delayms(1);
           //quanwe=0;
           P0=smgdu[bai];
           quanwe=1;
           delayms(1);
           quanwe=0;
          
           P0=smgdu[shi]|0x80;
           baiwe=1;
           delayms(1);
           baiwe=0;
       
           P0=smgdu[ge];
           shiwe=1;
           delayms(1);
           shiwe=0;
}
else                    //標(biāo)志位置0,數(shù)碼管顯示設(shè)定后溫度
{
       bai=Th/100;
       shi=Th%100/10;
       ge=Th%10;
           quanwe=0;
           baiwe=0;
           shiwe=0;
           gewe=0;

           P0=smgdu[bai];
           quanwe=1;
           delayms(1);
           quanwe=0;
          
           P0=smgdu[shi]|0x80;
           baiwe=1;
           delayms(1);
           baiwe=0;
       
           P0=smgdu[ge];
           shiwe=1;
           delayms(1);
           shiwe=0;
}
}

void keyscan( )           //鍵盤設(shè)置函數(shù)
{
if(K1==0)              //K1按下
  {
        delayms(10); //消抖
        if(K1==0)
        {
          K1num++;           //K1按下次數(shù)判斷
           while(!K1);//松手檢測(cè)
           if(K1num==1)                //第1次按下K1
               {
                     Thflag=0;           //標(biāo)志位置0,顯示設(shè)置溫度報(bào)警函數(shù)
                   }
           if(K1num==2)                  //第2次按下K1
                     {
                           K1num=0;
                           Thflag=1;  //標(biāo)志位置1,顯示測(cè)量溫度
                      }
           }
   }
if(K1num==1)           //第1次按下K1情況下
  {
      if(K2==0)          //K2按下執(zhí)行溫度累加設(shè)定
             {
                    delayms(10);
                    if(K2==0)
                     {
                           delayms(10);
                          //while(!K2)
                                   {
                                      Th++;
                                   if(Th==300)
                                      Th=180;
                               displaysmg(Th);        //顯示設(shè)定后溫度
                            }
                      }
                 }
         if(K3==0)           //K3按下執(zhí)行溫度累減設(shè)定
              {
                    delayms(10);
                    if(K3==0)
                     {
                          delayms(10);
                          //while(!K3)
                            {
                                 Th--;
                                 if(Th==100)
                                    Th=280;
                                 displaysmg(Th);  //顯示設(shè)定后溫度
                            }
                          }
                  }
           }
  }

void timerinit( )          //蜂鳴器斷續(xù)發(fā)聲定時(shí)器函數(shù)
{
  TMOD=0x01;
  TH0=(65536-50000)/256;
  TL0=(65536-50000)%256;
  ET0=1;
  EA=1;
  TR0=0;
  Th=225;
  }

void main()
{                                         
timerinit( );               //定時(shí)器初始化函數(shù)
while(1)
{
    keyscan( );             //鍵盤設(shè)置函數(shù)
        tmpconvert();        //溫度轉(zhuǎn)換函數(shù)
        displaysmg(read_temperature( ));  //溫度顯示函數(shù)
        if(temp>Th)
         {         
           TR0=1;
         }
        else
        {
         TR0=0;
         Beep=1;
         //TH0=(65536-50000)/256;
    // TL0=(65536-50000)%256;
        }
  }
}
void timet0( )interrupt 1         //定時(shí)器中斷,報(bào)警斷續(xù)聲函數(shù)
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
con++;
if(con==20)
  {
   con=0;
   Beep=!Beep;
}
}


回復(fù)

使用道具 舉報(bào)

ID:243354 發(fā)表于 2025-5-16 10:45 | 顯示全部樓層
初次寫程序,還沒(méi)有用到模塊化程序
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表