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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

DS18B20實現溫度測量和用小燈報警Proteus+單片機代碼

[復制鏈接]
跳轉到指定樓層
樓主
單片機實驗設計,用89C52和ds18b20做的溫度測量,里面有完整代碼和proteus原理圖


單片機源程序如下:
  1. #include<reg51.h>    //包含單片機寄存器的頭文件
  2. #include<intrins.h>  //包含_nop_()函數定義的頭文件
  3. #include <absacc.h>
  4. #include <math.h>
  5. unsigned char code dispcode0[]={0x3f,0x06,0x5b,0x4f,
  6.                                0x66,0x6d,0x7d,0x07,
  7.                                0x7f,0x6f};
  8. unsigned char dispcode1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,
  9.                                  0xfd,0x87,0xff,0xef};

  10.      unsigned char TL;     //儲存暫存器的溫度低位
  11.      unsigned char TH;    //儲存暫存器的溫度高位
  12.      unsigned char TN;      //儲存溫度的整數部分
  13.      unsigned int TD;       //儲存溫度的小數部分
  14.          sbit led0 = P1^0;        //控制發光二極管
  15.          sbit led1 = P1^1;
  16. void delay1ms()
  17. {
  18.    unsigned char i,j;
  19.          for(i=0;i<10;i++)
  20.           for(j=0;j<33;j++)
  21.            ;
  22. }
  23. void delaynms(int n)
  24. {
  25.    unsigned char i;
  26.         for(i=0;i<n;i++)
  27.            delay1ms();
  28. }
  29. sbit DQ=P1^0;
  30. unsigned char time_DS18B20;   //設置全局變量,專門用于嚴格延時
  31. bit Init_DS18B20(void)
  32. {
  33. bit flag_DS18B20;         //儲存DS18B20是否存在的標志,flag=0,表示存在;flag=1,表示不存在
  34. DQ = 1;           //先將數據線拉高
  35. for(time_DS18B20=0;time_DS18B20<2;time_DS18B20++) //略微延時約6微秒
  36.      ;
  37. DQ = 0;           //再將數據線從高拉低,要求保持480~960us
  38. for(time_DS18B20=0;time_DS18B20<200;time_DS18B20++)  //略微延時約600微秒
  39.      ;         //以向DS18B20發出一持續480~960us的低電平復位脈沖
  40. DQ = 1;           //釋放數據線(將數據線拉高)
  41.   for(time_DS18B20=0;time_DS18B20<10;time_DS18B20++)
  42.      ;  //延時約30us(釋放總線后需等待15~60us讓DS18B20輸出存在脈沖)
  43. flag_DS18B20=DQ;          //讓單片機檢測是否輸出了存在脈沖(DQ=0表示存在)
  44. for(time_DS18B20=0;time_DS18B20<200;time_DS18B20++)  //延時足夠長時間,等待存在脈沖輸出完畢
  45.       ;
  46. return (flag_DS18B20);    //返回檢測成功標志
  47. }
  48. unsigned char ReadOneChar(  )
  49. {
  50.                 unsigned char i=0;
  51.                 unsigned char dat;  //儲存讀出的一個字節數據
  52.                 for (i=0;i<8;i++)
  53.                  {

  54.                    DQ =1;       // 先將數據線拉高
  55.                    _nop_();            //等待一個機器周期
  56.                    DQ = 0;      //單片機從DS18B20讀書據時,將數據線從高拉低即啟動讀時序
  57.                           dat>>=1;
  58.                    _nop_();     //等待一個機器周期
  59.                    DQ = 1;     //將數據線"人為"拉高,為單片機檢測DS18B20的輸出電平作準備
  60.                    for(time_DS18B20=0;time_DS18B20<3;time_DS18B20++);      //延時約6us,使主機在15us內采樣
  61.                    if(DQ==1)
  62.                       dat|=0x80;  //如果讀到的數據是1,則將1存入dat
  63.                         else
  64.                                 dat|=0x00;//如果讀到的數據是0,則將0存入dat

  65.                      //將單片機檢測到的電平信號DQ存入r[i]
  66.                    for(time_DS18B20=0;time_DS18B20<8;time_DS18B20++)
  67.                               ;              //延時3us,兩個讀時序之間必須有大于1us的恢復期
  68.             }
  69.          return(dat);    //返回讀出的十進制數據
  70. }
  71. WriteOneChar(unsigned char dat)
  72. {
  73.         unsigned char i=0;
  74.         for (i=0; i<8; i++)
  75.                  {
  76.                   DQ =1;         // 先將數據線拉高
  77.                   _nop_();             //等待一個機器周期
  78.                   DQ=0;          //將數據線從高拉低時即啟動寫時序
  79.                   DQ=dat&0x01;   //利用與運算取出要寫的某位二進制數據,
  80.                        //并將其送到數據線上等待DS18B20采樣
  81.                  for(time_DS18B20=0;time_DS18B20<10;time_DS18B20++)
  82.                      ;//延時約30us,DS18B20在拉低后的約15~60us期間從數據線上采樣
  83.                   DQ=1;          //釋放數據線
  84.                   for(time_DS18B20=0;time_DS18B20<1;time_DS18B20++)
  85.                           ;//延時3us,兩個寫時序間至少需要1us的恢復期
  86.                   dat>>=1;       //將dat中的各二進制位數據右移1位
  87.                  }
  88.           for(time_DS18B20=0;time_DS18B20<4;time_DS18B20++)
  89.                       ; //稍作延時,給硬件一點反應時間
  90. }
  91. void display(unsigned char x,y)
  92. {
  93.         unsigned char j,k,l,m,n,o;     //j,k,l分別儲存溫度的百位、十位和個位
  94.         j=x/100;              //取百位
  95.         k=(x%100)/10;    //取十位
  96.         l=x%10;             //取個位
  97.         m=y/100;
  98.         n=(y%100)/10;
  99.         o=y/10;
  100.         if(x>=100)
  101.         {
  102.         P0=dispcode0[j];
  103.         P2=dispcode0[k];
  104.         if(o>=5)
  105.         n+=1;
  106.         else
  107.         ;
  108.         if(n>=5)
  109.         m+=1;
  110.         else
  111.         ;
  112.         if(m>=5)
  113.         l+=1;
  114.         else
  115.         ;
  116.         P3=dispcode0[l];
  117.         }
  118.         else if((x>=10)&&(x<100))
  119.         {
  120.         P0=dispcode0[k];
  121.         P2=dispcode1[l];
  122.         if(o>=5)
  123.         n+=1;
  124.         else
  125.         ;
  126.         if(n>=5)
  127.         m+=1;
  128.         else
  129.         ;
  130.         P3=dispcode0[m];
  131.                   }
  132.           else if((x>=0)&&(x<10))
  133.           {
  134.             P0=dispcode1[l];
  135.             P2=dispcode0[m];
  136.             if(o>=5)
  137.             n+=1;
  138.             else
  139.             ;
  140.             P3=dispcode0[n];
  141.            }


  142. }
  143. void displayfu(unsigned char x,y)
  144. {
  145.         unsigned char k,l,m,n,o;     //j,k,l分別儲存溫度的百位、十位和個位
  146.         P0=0x40;
  147.         k=(x%100)/10;    //取十位
  148.         l=x%10;             //取個位
  149.         m=y/100;
  150.         n=(y%100)/10;
  151.         o=y/10;
  152.         if(x>=10)
  153.         {
  154.         P2=dispcode0[k];
  155.         if(o>=5)
  156.         n+=1;
  157.         else
  158.         ;
  159.         if(n>=5)
  160.         m+=1;
  161.         else
  162.         ;
  163.         if(m>=5)
  164.         l+=1;
  165.         else
  166.         ;
  167.         P3=dispcode0[l];
  168.         }
  169.         else if(x<10)
  170.         {
  171.         P2=dispcode1[l];
  172.         if(o>=5)
  173.         n+=1;
  174.         else
  175.         ;
  176.         if(n>=5)
  177.         m+=1;
  178.         else
  179.         ;
  180.         P3=dispcode0[m];
  181.         }


  182. }





  183. void ReadyReadTemp(void)
  184. {
  185.       Init_DS18B20();     //將DS18B20初始化
  186.                 WriteOneChar(0xCC); // 跳過讀序號列號的操作
  187.                 WriteOneChar(0x44); // 啟動溫度轉換
  188.                 for(time_DS18B20=0;time_DS18B20<100;time_DS18B20++)
  189.                     ;         //溫度轉換需要一點時間
  190.                 Init_DS18B20();     //將DS18B20初始化
  191.                 WriteOneChar(0xCC); //跳過讀序號列號的操作
  192.                 WriteOneChar(0xBE); //讀取溫度寄存器,前兩個分別是溫度的低位和高位
  193. }

  194. void main(void)
  195. {


  196.    while(1)                //不斷檢測并顯示溫度
  197.          {
  198.                 ReadyReadTemp();     //讀溫度準備
  199.                 TL=ReadOneChar();    //先讀的是溫度值低位
  200.                 TH=ReadOneChar();    //接著讀的是溫度值高位
  201.                 if(TH>=8)
  202. ……………………

  203. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

所有資料51hei提供下載:
wenduceliang.zip (43.06 KB, 下載次數: 34)



評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久产久精国产品 | 国产在线一区二区三区 | 亚洲一区在线日韩在线深爱 | 日日夜夜91 | 亚洲欧美成人影院 | 毛片毛片毛片毛片 | 男人天堂999 | 777777777亚洲妇女 | 亚洲精品二三区 | 亚洲色欲色欲www | 国产精品亚洲成在人线 | 国产精品永久免费 | 99pao成人国产永久免费视频 | 国产中文视频 | h视频在线看 | 国产精品久久久久婷婷二区次 | 国产成人精品久久二区二区 | 日本三级在线视频 | 五月天综合影院 | 久久国产精品一区二区三区 | 国产三级一区二区三区 | 午夜在线观看视频 | av色在线 | 粉嫩在线 | 国产亚洲区| 成人午夜av | 国产欧美在线视频 | 国产精品久久久久久久久久久久午夜片 | 日韩三级一区 | 99久久精品国产麻豆演员表 | 久久久久久久久久影视 | 天天爽天天操 | 尤物视频在线免费观看 | 精品一区久久 | 成人免费精品视频 | 精品日韩在线 | 韩日一区 | 日韩欧美综合 | 国产乱码精品一区二区三区五月婷 | 日本免费一区二区三区 | 久久这里只有精品首页 |