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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

51單片機實現電子溫度計

[復制鏈接]
跳轉到指定樓層
樓主
ID:574956 發表于 2019-6-30 12:08 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
功能:用單片機實現電子溫度計,測溫范圍:-55~125  并提供低溫高溫報警,報警溫度可設定

元器件:89s52單片機,DS18B20,12M晶振,10us電容,四聯共陰數碼管各一個.9015三極管兩個,紅綠發光二極管各一個,30p電容兩個,

按鈕四個.電阻若干(見原理圖)

供電:5V.(可采用7805實現更高電壓供電)

按鈕說明:按鈕一(與p1.0相連),按一次進入報警設定,第二次推出設定

按鈕二(與p1.1相連),設定是菜單切換

按鈕三(與p1.2相連),減設定

按鈕四(與p1.3相連),加設定

功用:經適當改裝,可用于各種需要控制溫度的場合,比如空調的溫度控制,鍋爐的控制等...
---------------------

單片機源程序如下:
  1. #include "reg52.h"
  2. #include "absacc.h"

  3. unsigned char code tab[]={0X3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F,0X40};           //共陰 (cc)


  4. sbit DQ=0xb7;        //c51與DS18B20通信口
  5. sbit P07=0x87;        //小數點
  6. sbit RED=0x97;          //高溫報警燈
  7. sbit GREEN=0x96;  //低溫報警燈
  8. sbit SET=0x90;          //以下按鈕設置
  9. sbit NEXT=0x91;
  10. sbit REDUCE=0x92;
  11. sbit ADD=0x93;

  12. unsigned char tempL=0;        //溫度低八位
  13. unsigned char tempH=0;         //溫度高八位
  14. float temperature;         //顯示溫度值
  15. float temperatureH=35,temperatureL=0;  //報警溫度
  16. int tH=1,tL=1;//報警狀態,1為關閉
  17. int m,k=1,l,keyon,keytype,out=0;//設置報警溫度時使用的中間變量

  18. void delay(unsigned int time)
  19. {
  20.   unsigned int n;
  21.   n=0;
  22.   while(n<time) n++;
  23.   return;
  24. }

  25. void display(float k)         //顯示溫度
  26. {
  27.   if(k>=0)                //正溫度顯示
  28.   {
  29.     P2=0xf7;
  30.     P0=tab[(int)(k/100)];
  31.     delay(260);
  32.     P0=0x00;
  33.   }
  34.   else                        //負溫度顯示負號
  35.   {
  36.     k=-k;
  37.         P2=0xf7;
  38.         P0=0x40;
  39.         delay(260);
  40.         P0=0x00;
  41.   }

  42.   P2=0xfb;                  //溫度十位顯示  有錯誤 少了個%100
  43.   P0=tab[(((int)k)%100)/10];
  44.   delay(260);
  45.   P0=0x00;

  46.   P2=0xfd;                 //溫度個位顯示
  47.   P0=tab[((int)k)%10];
  48.   P07=1;
  49.   delay(260);
  50.   P0=0x00;

  51.   P2=0xfe;                   //溫度一位小數顯示
  52.   P0=tab[((int)(k*10))%10];
  53.   delay(260);
  54.   P0=0x00;

  55. }

  56. Init_DS18B20(void)
  57. {
  58.   unsigned char x=0;
  59.   DQ=1;
  60.   delay(8);
  61.   DQ=0;
  62.   delay(85);
  63.   DQ=1;
  64.   delay(14);
  65.   x=DQ;

  66.   delay(20);
  67. }

  68. ReadOneChar(void)
  69. {
  70.   unsigned char i=0;
  71.   unsigned  char dat=0;
  72.   for (i=8;i>0;i--)
  73.   {
  74.     DQ=1;
  75.         delay(1);
  76.         DQ=0;
  77.         dat>>=1;
  78.         DQ=1;
  79.         if(DQ) dat|=0x80;
  80.         delay(4);
  81.   }
  82.   return(dat);
  83. }

  84. WriteOneChar(unsigned char dat)
  85. {
  86.   unsigned char i=0;
  87.   for (i=8;i>0;i--)
  88.   {                                                               
  89.     DQ=0;
  90.         DQ=dat&0x01;
  91.         delay(5);
  92.         DQ=1;
  93.         dat>>=1;
  94.   }
  95.   delay(4);
  96. }
  97. ConversionTemperature()
  98. {
  99.   Init_DS18B20();
  100.   WriteOneChar(0xcc);
  101.   WriteOneChar(0x44);
  102.   delay(20);
  103. }

  104. ReadTemperature(void)
  105. {
  106.   char ctempL,ctempH;

  107.   Init_DS18B20();
  108.   WriteOneChar(0xcc);
  109.   WriteOneChar(0xbe);

  110.   tempL=ReadOneChar();                    
  111.   tempH=ReadOneChar();

  112.   if(tempH<0xf8) //溫度是否小于零
  113.     temperature=((tempH*256)+tempL)* 0.0625;//大于零
  114.   else          
  115.     {
  116.           ctempL=tempL;
  117.       ctempH=tempH;          
  118.           temperature=(((~ctempH)*256)+(~ctempL)+1)* 0.0625;
  119.           temperature=-temperature;
  120.         }

  121.   //delay(200);
  122.   //return(temperature);
  123. }

  124. ///////////////////////////報警設置顯示/////////////////////////

  125. void Display2()
  126. { ///////////////////高溫報警顯示////////////////////
  127.   if(m==0||m==1)
  128.    {
  129.      P2=0xf7;
  130.      P0=0x76;
  131.      delay(70);
  132.      P0=0x00;
  133.             if(m==0&&k==-1) delay(70);
  134.      else
  135.            {
  136.               if(tH==1)
  137.                     {
  138.                            P2=0xfb;                  
  139.                P0=0x71;
  140.                delay(70);
  141.                P0=0x00;
  142.                         }
  143.                   else
  144.                     {
  145.                        P2=0xfb;                 
  146.                P0=0x3f;
  147.                delay(70);
  148.                P0=0x00;
  149.                     }
  150.            }
  151.          if(m==1&&k==-1) delay(100);
  152.      else
  153.            {
  154.               if(temperatureH>=0)
  155.                     {
  156.                            P2=0xfd;                  
  157.                P0=tab[(int)(temperatureH/10)];
  158.                delay(70);
  159.                P0=0x00;
  160.                            P2=0xfe;                  
  161.                P0=tab[(int)(temperatureH)%10];
  162.                delay(70);
  163.                P0=0x00;
  164.                          }
  165.                   else
  166.                     {
  167.                        P2=0xfd;                  
  168.                P0=0x40;                        //////顯示負號
  169.                delay(70);
  170.                P0=0x00;
  171.                            P2=0xfe;                  
  172.                P0=tab[(int)(-temperatureH)%10];
  173.                delay(70);
  174.                P0=0x00;
  175.                     }

  176.            }
  177.     }
  178.   //////////////////////////////////////////////////
  179.   ///////////////////低溫報警顯示//////////////////
  180.   else if(m==2||m==3)
  181.    {
  182.      P2=0xf7;
  183.      P0=0x38;
  184.      delay(70);
  185.      P0=0x00;
  186.             if(m==2&&k==-1) delay(70);
  187.      else
  188.            {
  189.               if(tL==1)
  190.                     {
  191.                            P2=0xfb;                  
  192.                P0=0x71;
  193.                delay(70);
  194.                P0=0x00;
  195.                         }
  196.                   else
  197.                     {
  198.                        P2=0xfb;                 
  199.                P0=0x3f;
  200.                delay(70);
  201.                P0=0x00;
  202.                     }
  203.            }
  204.          if(m==3&&k==-1) delay(100);
  205.      else
  206.            {
  207.               if(temperatureL>=0)
  208.                     {
  209.                            P2=0xfd;                  
  210.                P0=tab[(int)(temperatureL/10)];
  211.                delay(70);
  212.                P0=0x00;       
  213.                            P2=0xfe;                  
  214.                P0=tab[(int)(temperatureL)%10];
  215.                delay(70);
  216.                P0=0x00;
  217.                          }
  218.                   else
  219.                     {
  220.                        P2=0xfd;                  
  221.                P0=0x40;                         ////顯示負號
  222.                delay(70);
  223.                P0=0x00;
  224.                            P2=0xfe;                  
  225.                P0=tab[(int)(-temperatureL)%10];
  226.                delay(70);
  227.                P0=0x00;
  228.                     }
  229.                   
  230.            }
  231.    }
  232.   ///////////////////////////////////////////////////////
  233.   if(l==200){k=-k;l=0;}
  234.   l++;
  235. }
  236. /////////////////////////////報警設置顯示結束///////////////////////////////////


  237. ////////////////////////////////報警設置/////////////////////////////////////////
  238. void seting()
  239. {
  240.    if(SET==1&&NEXT==1&&REDUCE==1&&ADD==1);          //無鍵盤按下
  241.    else                                                 /////有鍵盤按下時
  242.     {
  243.           keyon=1;
  244.           if(SET==0)keytype=0;
  245.           if(NEXT==0)keytype=1;
  246.           if(REDUCE==0)keytype=2;
  247.           if(ADD==0)keytype=3;
  248.         }
  249.    if(keyon==1&&SET==1&&NEXT==1&&REDUCE==1&&ADD==1)                 //鍵盤松開后判斷鍵盤狀態
  250.     {
  251.           if(keytype==1)////////////////菜單下翻
  252.             {
  253.                   if(m>=3)m=0;
  254.               else m++;
  255.                  }
  256.           if(keytype==2)        ////////////////加操作
  257.             {
  258.                   if(m==0)tH=-tH;
  259.                   if(m==1)
  260.                     {
  261.                           if(temperatureH>(temperatureL+1)) temperatureH--;
  262.                           else temperatureH=99;
  263.                         }
  264.                   if(m==2)tL=-tL;
  265.                   if(m==3)
  266.                     {
  267.                           if(temperatureL>-9) temperatureL--;
  268.                           else temperatureL=(temperatureH-1);
  269.                         }
  270.                 }
  271.           if(keytype==3)                 ////////////////減操作
  272.             {
  273.                   if(m==0)tH=-tH;
  274.                   if(m==1)
  275.                     {
  276.                           if(temperatureH<99) temperatureH++;
  277.                           else temperatureH=(temperatureL+1);
  278.                         }
  279.                   if(m==2)tL=-tL;
  280.                   if(m==3)
  281.                     {
  282.                           if(temperatureL<(temperatureH-1)) temperatureL++;
  283.                           else temperatureL=-9;
  284.                         }
  285.                 }
  286.           if(keytype==0)                          ///////////跳出溫度設置
  287.             {
  288.               keyon=0;
  289.               keytype=4;
  290.                   out=1;               
  291.                 }
  292.           keyon=0;
  293.           keytype=4;
  294.         }
  295. }
  296. /////////////////////////////報警設置結束/////////////////////////////////////////
  297. void main()                                       
  298. {
  299.   P1=0XFF;
  300.   while(1)
  301.   {
  302.     ConversionTemperature();//溫度轉換
  303.           display(temperature);//顯示溫度
  304.         if(SET==0)        /////////////////////////進入報警溫度設定
  305.           {
  306.             out=0;
  307.             delay(300);
  308.                 while(SET==0);
  309.                 m=0;
  310.                 l=0;
  311.                 keyon=0;
  312.                 keytype=4;
  313.                 while(1)
  314.                   {
  315.                     Display2();
  316.                         seting();
  317.                         if (out==1)break;
  318.                   }
  319.                 delay(200);
  320.                 while(SET==0);
  321.           }
  322.         if(tH==1)RED=1;
  323.         else if(tH==-1&&temperature>=temperatureH) RED=0;  //////滿足條件是開啟高溫報警
  324.         else if(temperature<(temperatureH-0.2))RED=1;
  325.         if(tL==1)GREEN=1;
  326.         if(tL==-1&&temperature<=temperatureL) GREEN=0;//////滿足條件時開啟低溫報警
  327.         else if(temperature>(temperatureL+0.2)) GREEN=1;
  328.         ReadTemperature();//讀取溫度
  329.         display(temperature);//顯示溫度
  330.   }
  331. }
復制代碼

所有資料51hei提供下載:
ab2989ca9f6b9ceb6de043c63cd7cc5320100307060217.rar (2.05 KB, 下載次數: 39)
5a6b387e6eb881d2978f9b1febb2d45020100307060022.rar (54.36 KB, 下載次數: 34)

作者:weixin_34194087
來源:CSDN
原文:https://blog.csdn.net/weixin_34194087/article/details/87296694
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 成人免费视频 | 蜜桃视频成人 | 在线免费观看黄网 | 国产欧美一区二区三区日本久久久 | 久草新视频 | 91在线看片| 91一区二区 | 婷婷开心激情综合五月天 | 国产91丝袜| 2019精品手机国产品在线 | 亚洲国产中文字幕 | 毛片免费观看 | 国产欧美一区二区三区日本久久久 | 第一区在线观看免费国语入口 | 国产精品亚洲二区 | 久久久噜噜噜久久中文字幕色伊伊 | 99re视频在线观看 | www.日韩在线| 国产免费一区二区三区 | 先锋资源站 | 亚洲欧美一区二区三区国产精品 | 国产精品久久久久久久久久久免费看 | 国产综合久久久久久鬼色 | www.日本精品 | 超碰在线97国产 | 亚洲精品一区中文字幕乱码 | 国产羞羞视频在线观看 | 精品一区二区三区在线观看 | 午夜欧美| 国产区在线 | 欧美激情久久久 | 超碰电影 | 久久久久久国产 | 97起碰| 久久专区 | 欧美日韩亚洲系列 | 久久午夜剧场 | 久久99精品久久久久久国产越南 | 精品一区久久 | 亚洲视频一区二区三区四区 | 国产欧美精品 |