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

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

QQ登錄

只需一步,快速開始

搜索
查看: 3049|回復(fù): 3
打印 上一主題 下一主題
收起左側(cè)

51單片機(jī)—DS18B20簡要記錄

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
昨天自己寫了一個(gè)DS18B20的程序,能正常運(yùn)行,發(fā)到51黑論壇上分享給和我一樣的新手朋友們。

通過DS18B20采集環(huán)境溫度,并在開發(fā)板的數(shù)碼管模塊上的左三位顯示(帶1位小數(shù))。
MCU:AT89S52

源碼:

#include <reg52.h>

sbit DS=P2^2;
sbit DU=P2^6;
sbit WE=P2^7;

unsigned char table0[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};                //無小數(shù)點(diǎn)
unsigned char table1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};                //有小數(shù)點(diǎn)
unsigned int temp;

void Delay(unsigned int x)                //延時(shí)一定時(shí)間
{
  unsigned int i;
  while(x)
  {
    i=200;
    while(i>0)
    {
      i--;
    }
    x--;
  }
}

void DS18B20_init()                //DS18B20初始化
{
  unsigned int i;
  DS=0;                //MCU拉低電平最少480us,產(chǎn)生復(fù)位脈沖,然后釋放總線
  i=103;                //延時(shí)480us~960us
  while(i>0)
  {
    i--;
  }
  DS=1;                //釋放總線
  i=4;                //等待15~60us,然后DS18B20拉低電平60~240us表示應(yīng)答
  while(i>0)
  {
    i--;
  }
  while(DS);
}

bit Read_bit()                //讀取1比特的數(shù)據(jù);“讀”時(shí)序最少需要60us
{
  unsigned int i;
  bit dat;
  DS=0;
  i++;                //拉低電平最少1us,然后再釋放總線
  DS=1;
  i++;                //等待一定時(shí)間后,再讀取電平狀態(tài)
  i++;
  dat=DS;
  i=8;
  while(i>0)
  {
    i--;                //等待最少60us
  }
  return dat;
}

unsigned char Read_byte()                //讀取1字節(jié)的數(shù)據(jù)
{
  unsigned char i,j;
  unsigned char dat=0;
  for(i=1;i<=8;i++)
  {
    j=Read_bit();
    dat=(j<<7)|(dat>>1);
  }
  return dat;
}

void Write_byte(unsigned char dat)                //往DS18B20中寫入1字節(jié)的數(shù)據(jù)
{
  unsigned int i;
  unsigned char j;
  bit x;
  for(j=1;j<=8;j++)
  {
    x=dat&0x01;                //依次將dat的每一位賦值給x
    dat=dat>>1;
    if(x)                //寫入“1”
    {
      DS=0;                //拉低電平大于1us,在15us內(nèi)拉高電平
      i++;
      i++;
      DS=1;                //“寫”時(shí)序起始后的15~60us內(nèi),DS18B20處于采樣狀態(tài),在此期間,若總線為高電平,則表示“1”
      i=8;
      while(i>0)
      {
        i--;                //等待最少60us
      }
    }
    else                //寫入“0”;拉低電平60~120us,然后釋放總線
    {
      DS=0;
      i=8;
      while(i>0)                //最少60us
      {
        i--;
      }
      DS=1;
    }
  }
}

void Change(void)                //溫度轉(zhuǎn)換,即測(cè)量溫度
{
  DS18B20_init();
  Delay(1);
  Write_byte(0xcc);                //“跳過ROM”操作
  Write_byte(0x44);  //“溫度轉(zhuǎn)換”操作
}

unsigned int GET()                //獲取溫度數(shù)據(jù)
{
  float x;
  unsigned char a,b;
  DS18B20_init();
  Delay(1);
  Write_byte(0xcc);
  Write_byte(0xbe);                //讀取DS18B20內(nèi)的RAM的內(nèi)容
  a=Read_byte();                //讀取溫度值的低8位
  b=Read_byte();                //讀取溫度值的高8位
  temp=b;
  temp<<=8;
  temp=temp|a;
  x=temp*0.0625;                //DS18B20默認(rèn)設(shè)置為12位分辨率,即表示分辨率為0.0625攝氏度
  temp=x*10+0.5;
  return temp;
}

void OUTPUT(unsigned int temp)                //數(shù)碼管顯示
{
  unsigned char x0,x1,y,x2;
  x0=temp/100;
  y=temp%100;
  x1=y/10;
  x2=y%10;
  DU=0;
  P0=table0[x0];                //顯示溫度值的十位
  DU=1;
  DU=0;
  WE=0;
  P0=0xfe;
  WE=1;
  WE=0;
  Delay(1);
  DU=0;
  P0=table1[x1];                //顯示溫度值的個(gè)位
  DU=1;
  DU=0;
  WE=0;
  P0=0xfd;
  WE=1;
  WE=0;
  Delay(1);
  P0=table0[x2];                //顯示溫度值的十分位
  DU=1;
  DU=0;
  P0=0xfb;
  WE=1;
  WE=0;
  Delay(1);
}

void main()
{
  while(1)
  {
    Change();
    OUTPUT(GET());
  }
}


DS18B20.png (30.11 KB, 下載次數(shù): 135)

DS18B20.png

數(shù)碼管模塊.png (130.5 KB, 下載次數(shù): 99)

數(shù)碼管模塊.png

MCU.png (125.88 KB, 下載次數(shù): 90)

MCU.png

評(píng)分

參與人數(shù) 1黑幣 +70 收起 理由
admin + 70 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

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

使用道具 舉報(bào)

沙發(fā)
ID:143767 發(fā)表于 2021-7-17 11:40 | 只看該作者
請(qǐng)問樓主,能顯示負(fù)溫度嗎?
回復(fù)

使用道具 舉報(bào)

板凳
ID:825513 發(fā)表于 2021-7-18 00:02 | 只看該作者
dj3365191 發(fā)表于 2021-7-17 11:40
請(qǐng)問樓主,能顯示負(fù)溫度嗎?

DS18B20元器件能獲取負(fù)溫度的數(shù)據(jù),不過我只做了正溫度的顯示,因?yàn)閷?shí)際上負(fù)溫度比較難營造(總不能放冰箱里吧),所以加上數(shù)碼管顯示負(fù)溫度的功能的話就比較難完整地驗(yàn)證程序的正確性
回復(fù)

使用道具 舉報(bào)

地板
ID:146733 發(fā)表于 2021-7-18 15:02 | 只看該作者
請(qǐng)問樓主,這個(gè)要不要做個(gè)濾波?
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 亚洲精品一区中文字幕乱码 | 亚洲精品久久久久中文字幕欢迎你 | 国产成人免费在线观看 | 激情av在线 | 精品91 | 中文字幕在线观看一区 | 国产精品久久久久aaaa九色 | 日韩成人在线电影 | 中文字幕欧美一区二区 | 一级毛片免费完整视频 | 在线观看涩涩视频 | 在线观看成人免费视频 | 亚洲激情在线视频 | 中文字幕亚洲精品在线观看 | www.国产精 | 久久99精品久久久久蜜桃tv | www.伊人.com| 一级毛片免费视频观看 | 另类一区 | 精品一区二区三区在线观看国产 | 女人av | 久久久久成人精品 | www.日韩| 999久久久国产精品 欧美成人h版在线观看 | 欧美成人综合 | 日韩精品成人网 | 国产日韩视频在线 | 欧美爱爱视频网站 | 久久亚洲一区 | 九色在线观看 | 亚洲精品99999 | 最新国产在线 | 欧美黄色性生活视频 | 狠狠躁18三区二区一区 | 午夜精品91 | 久久久久亚洲国产| 亚洲高清视频在线 | 麻豆一区一区三区四区 | 亚洲国产精品久久久久秋霞不卡 | 天天澡天天操 | 精品一区二区三区中文字幕 |