久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 586|回復: 2
打印 上一主題 下一主題
收起左側

DS18B20 51單片機冰箱測溫程序

[復制鏈接]
跳轉到指定樓層
樓主
ID:243354 發表于 2025-5-16 10:42 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
編寫一個冰箱測溫程序,經測試,可以用

#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;

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

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

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

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

uchar DSreadByte( )           //讀取8位并組裝1字節函數
{
    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字節
    }
    return k;
}               

void DSwrite_byte(uchar dat)   //寫1字節函數
{
  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;        //釋放總線,準備寫入dat的未第2位。
    dat=dat>>1;         //dat右移,未2位移至未位。
   }
   delayus(6);
}         

void tmpconvert(void)  //轉換溫度函數
{
  DSreset();
  delayms(1);
  DSwrite_byte(0xcc);   //跳過ROM指令
  DSwrite_byte(0x44);  //啟動轉換溫度命令
  }

uint read_temperature( )   //讀傳感器溫度值函數
{
  //uint T;
  uchar LSB,MSB;
  float tp;
  DSreset( );  //復位
  DSwrite_byte(0xcc);  //跳過ROM指令
  DSwrite_byte(0xbe); //讀暫存器溫度
  LSB=DSreadByte( );  //讀低8位字節,存入LSB
  MSB=DSreadByte( ); //讀高8位字節,存入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;  //擴大10倍,顯示百十個。
  }
  return temp;        //返出溫度值
}  


void displaysmg (uint temp)
{
        uchar quan,bai,shi,ge;
        if(Thflag)                   //標志位置1,數碼管顯示測量溫度
         {
           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                    //標志位置0,數碼管顯示設定后溫度
{
       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( )           //鍵盤設置函數
{
if(K1==0)              //K1按下
  {
        delayms(10); //消抖
        if(K1==0)
        {
          K1num++;           //K1按下次數判斷
           while(!K1);//松手檢測
           if(K1num==1)                //第1次按下K1
               {
                     Thflag=0;           //標志位置0,顯示設置溫度報警函數
                   }
           if(K1num==2)                  //第2次按下K1
                     {
                           K1num=0;
                           Thflag=1;  //標志位置1,顯示測量溫度
                      }
           }
   }
if(K1num==1)           //第1次按下K1情況下
  {
      if(K2==0)          //K2按下執行溫度累加設定
             {
                    delayms(10);
                    if(K2==0)
                     {
                           delayms(10);
                          //while(!K2)
                                   {
                                      Th++;
                                   if(Th==300)
                                      Th=180;
                               displaysmg(Th);        //顯示設定后溫度
                            }
                      }
                 }
         if(K3==0)           //K3按下執行溫度累減設定
              {
                    delayms(10);
                    if(K3==0)
                     {
                          delayms(10);
                          //while(!K3)
                            {
                                 Th--;
                                 if(Th==100)
                                    Th=280;
                                 displaysmg(Th);  //顯示設定后溫度
                            }
                          }
                  }
           }
  }

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

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


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:243354 發表于 2025-5-16 10:45 | 只看該作者
初次寫程序,還沒有用到模塊化程序
回復

使用道具 舉報

板凳
ID:468878 發表于 2025-5-28 18:41 | 只看該作者
wqf304 發表于 2025-5-16 10:45
初次寫程序,還沒有用到模塊化程序

這么小規模的,沒必要模塊化,能用就好。
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲视频在线看 | 国产高清视频一区 | 久久免费视频1 | 国产婷婷 | 自拍偷拍亚洲欧美 | 黄色一级电影免费观看 | 成人黄页在线观看 | 亚洲高清在线观看 | 超碰人人在线 | 久久九九影视 | 国产亚洲高清视频 | 日韩一区二区三区在线 | 国产 91 视频 | 欧美一区不卡 | 精品国产一区二区国模嫣然 | 精品1区 | 色偷偷888欧美精品久久久 | 亚洲免费视频网站 | 国产精品久久久久久久白浊 | 日韩中文字幕在线观看 | 91视频在线| www日本在线观看 | 亚洲播放 | 羞视频在线观看 | 亚洲一区二区三区高清 | 日韩欧美中文 | 狠狠爱一区二区三区 | 久久狼人天堂 | 天堂免费 | 久久国产精品99久久久大便 | 大香网伊人 | 国产福利视频在线观看 | 精品免费国产一区二区三区四区介绍 | 精品视频一二区 | 中文字幕在线播放第一页 | 伊人春色在线 | 成年人网站免费视频 | 亚洲福利在线观看 | 人人鲁人人莫人人爱精品 | 999久久久国产精品 欧美成人h版在线观看 | 国产一区二区影院 |