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

QQ登錄

只需一步,快速開始

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

DS18b20溫度計(jì)

[復(fù)制鏈接]
ID:129825 發(fā)表于 2017-4-13 19:06 | 顯示全部樓層 |閱讀模式
基于ds18b20的溫度計(jì):
【實(shí)驗(yàn)57】溫度計(jì)DS18B20.zip (20.04 KB, 下載次數(shù): 12)

  1. /*********************************************************************************
  2. * 【編寫時(shí)間】: 2014年3月5日
  3. * 【作    者】: 清翔電子:03
  4. * 【版    本】: 1.0
  5. * 【實(shí)驗(yàn)平臺(tái)】: QX-MCS51 單片機(jī)開發(fā)板
  6. * 【外部晶振】: 11.0592mhz       
  7. * 【主控芯片】: STC89C52
  8. * 【編譯環(huán)境】: Keil μVisio3       
  9. * 【程序功能】: 實(shí)時(shí)采集當(dāng)前環(huán)境溫度值,并顯示于數(shù)碼管上                                                                                           
  10. * 【使用說明】:
  11. *  說明:免費(fèi)開源,不提供源代碼分析.
  12. **********************************************************************************/

  13. #include <reg52.h>
  14. #define uchar unsigned char
  15. #define uint unsigned int
  16. sbit DS=P2^2;           //define interface
  17. uint temp;             // variable of temperature
  18. uchar flag1;            // sign of the result positive or negative
  19. sbit dula=P2^6;
  20. sbit wela=P2^7;
  21. unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
  22.                         0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
  23. unsigned char code table1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,
  24.                         0x87,0xff,0xef};

  25. void delay(uint count)      //delay
  26. {
  27.   uint i;
  28.   while(count)
  29.   {
  30.     i=200;
  31.     while(i>0)
  32.     i--;
  33.     count--;
  34.   }
  35. }
  36. void dsreset(void)       //send reset and initialization command
  37. {
  38.   uint i;
  39.   DS=0;
  40.   i=103;
  41.   while(i>0)i--;
  42.   DS=1;
  43.   i=4;
  44.   while(i>0)i--;
  45. }

  46. bit tmpreadbit(void)       //read a bit
  47. {
  48.    uint i;
  49.    bit dat;
  50.    DS=0;i++;          //i++ for delay
  51.    DS=1;i++;i++;
  52.    dat=DS;
  53.    i=8;while(i>0)i--;
  54.    return (dat);
  55. }

  56. uchar tmpread(void)   //read a byte date
  57. {
  58.   uchar i,j,dat;
  59.   dat=0;
  60.   for(i=1;i<=8;i++)
  61.   {
  62.     j=tmpreadbit();
  63.     dat=(j<<7)|(dat>>1);   //讀出的數(shù)據(jù)最低位在最前面,這樣剛好一個(gè)字節(jié)在DAT里
  64.   }
  65.   return(dat);
  66. }

  67. void tmpwritebyte(uchar dat)   //write a byte to ds18b20
  68. {
  69.   uint i;
  70.   uchar j;
  71.   bit testb;
  72.   for(j=1;j<=8;j++)
  73.   {
  74.     testb=dat&0x01;
  75.     dat=dat>>1;
  76.     if(testb)     //write 1
  77.     {
  78.       DS=0;
  79.       i++;i++;
  80.       DS=1;
  81.       i=8;while(i>0)i--;
  82.     }
  83.     else
  84.     {
  85.       DS=0;       //write 0
  86.       i=8;while(i>0)i--;
  87.       DS=1;
  88.       i++;i++;
  89.     }

  90.   }
  91. }

  92. void tmpchange(void)  //DS18B20 begin change
  93. {
  94.   dsreset();
  95.   delay(1);
  96.   tmpwritebyte(0xcc);  // address all drivers on bus
  97.   tmpwritebyte(0x44);  //  initiates a single temperature conversion
  98. }

  99. uint tmp()               //get the temperature
  100. {
  101.   float tt;
  102.   uchar a,b;
  103.   dsreset();
  104.   delay(1);
  105.   tmpwritebyte(0xcc);
  106.   tmpwritebyte(0xbe);
  107.   a=tmpread();
  108.   b=tmpread();
  109.   temp=b;
  110.   temp<<=8;             //two byte  compose a int variable
  111.   temp=temp|a;
  112.   tt=temp*0.0625;
  113.   temp=tt*10+0.5;
  114.   return temp;
  115. }

  116. void display(uint temp)                        //顯示程序
  117. {
  118.    uchar A1,A2,A2t,A3;
  119.    A1=temp/100;
  120.    A2t=temp%100;
  121.    A2=A2t/10;
  122.    A3=A2t%10;
  123.    dula=0;
  124.    P0=table[A1];                //顯示百位
  125.    dula=1;
  126.    dula=0;

  127.    wela=0;
  128.    P0=0xfe;
  129.    wela=1;
  130.    wela=0;
  131.    delay(1);

  132.    dula=0;
  133.    P0=table1[A2];                //顯示十位
  134.    dula=1;
  135.    dula=0;

  136.    wela=0;
  137.    P0=0xfd;
  138.    wela=1;
  139.    wela=0;
  140.    delay(1);

  141.    dula=0;
  142.    P0=table[A3];                //顯示個(gè)位
  143.    dula=1;
  144.    dula=0;

  145.    wela=0;
  146.    P0=0xfb;
  147.    wela=1;
  148.    wela=0;
  149.    delay(1);
  150. }


  151. void main()
  152. {
  153. uchar a;
  154.   do
  155.   {
  156.     tmpchange();
  157.         for(a=10;a>0;a--)
  158.           {   
  159.                   display(tmp());
  160.           }
  161.   } while(1);
  162. }
復(fù)制代碼


回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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