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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

51單片機18b20溫度及按鍵可調上下限報警源程序

[復制鏈接]
跳轉到指定樓層
樓主
ID:221761 發表于 2017-12-7 18:09 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
基于18b20顯示2位溫度并顯示上下限,超限報警,溫度上下限均可調整,附帶閃爍燈

單片機源程序如下:
  1. #include<reg52.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. sbit ds=P2^2;               
  5. sbit key1=P3^4;
  6. sbit key2=P3^5;
  7. sbit key3=P3^6;
  8. sbit dula=P2^6;
  9. sbit wela=P2^7;
  10. sbit beep=P2^3;
  11. bit key=0;
  12. sbit led=P1^2;
  13. uint get_temp();
  14. void send(uchar);
  15. uint temp,num,p,cycle,high,low,zd,xs,TL;       
  16. uint l=19;                        //定義溫度下限
  17. uint h=25;                        //定義溫度上限
  18. uchar code table[]={0x3f,0x06,0x5b,0x4f,
  19.                                         0x66,0x6d,0x7d,0x07,
  20.                                         0x7f,0x6f,0xbf,0x86,
  21.                                     0xdb,0xcf,0xe6,0xed,
  22.                                     0xfd,0x87,0xff,0xef};
  23. void delay(uint z)  //延時函數
  24. {
  25. uint x,y;
  26. for(x=z;x>0;x--)
  27.   for(y=110;y>0;y--);
  28. }
  29. void delay1(uint ms)  
  30. {
  31.   uchar j;
  32.         while(ms--)
  33.          for(j=110;j>0;j--);
  34. }
  35. /////中斷/////////////////////
  36. void init()
  37. {          
  38.         TMOD|=0X10;
  39.         TH0=(65536-2000)/256;
  40.         TL0=(65536-2000)%256;
  41.         EA=1;                  
  42.         ET0=1;
  43.         TR0=1;
  44. }
  45. //按鍵掃描程序******************************************************
  46. void keyscan()
  47. {
  48. if(key3==0)
  49.         delay1(5);
  50.   if(key3==0)
  51.   {    while(!key3);
  52.                 key=!key;
  53.                 while(key3==0);
  54.    }
  55. if(key==0)
  56.    {
  57.   if(key1==0)
  58.    {
  59.     delay1(5);
  60.   if(key1==0)
  61. {
  62.         //while(!key1)  ;
  63.                  l++;   
  64.                 delay(50);
  65.   if(l==99)
  66.             l=0;
  67.        }
  68.    }                     
  69. if(key2==0)
  70.    {
  71.     delay1(5);
  72.   if(key2==0)
  73. {//        while(!key2);
  74.            if(l!=0)
  75.            l--;          
  76.                    delay(50);
  77.       }
  78.           }
  79.           }
  80. if(key==1)
  81. {
  82.   if(key1==0)
  83.    {
  84.     delay1(5);
  85. if(key1==0)
  86. {//        while(!key1)  ;
  87.                  h++;
  88.                 delay(50);
  89.            if(h==99)
  90.             h=0;
  91.        }
  92.    }                     
  93.       if(key2==0)
  94.    {
  95.     delay1(5);
  96. if(key2==0)
  97. {//while(!key2);
  98.           if(h!=0)
  99.            h--;       
  100.                    delay(50);                  
  101. }  
  102. }
  103. }
  104. }
  105. //溫度傳感器********************************************************
  106. void dsreset()//ds18b20復位 初始化函數
  107. {
  108.         uint i;
  109.         ds=0;
  110.         i=80;
  111.         while(i>0)i--;
  112.         ds=1;
  113.         i=4;
  114.         while(i>0)i--;
  115. }
  116. bit tempreadbit()
  117. {
  118.         uint i;
  119.         bit dat;
  120.         ds=0;i++;         //i++起延時作用
  121.         ds=1;i++;i++;
  122.         dat=ds;
  123.         i=8;while(i>0)i--;
  124.         return(dat);
  125. }
  126. uchar tempread()                                                 
  127. {
  128.                 uchar i,j,dat;
  129.                 dat=0;
  130.                 for(i=1;i<=8;i++)
  131.                 {
  132.                         j=tempreadbit();
  133.                         dat=(j<<7)|(dat>>1);                //讀出數據最低位在最前面,這樣剛好一個字節在dat里

  134.                 }          
  135.                 return(dat);
  136.                 }
  137. void tempwritebyte(uchar dat)           //向ds18b20寫一個字節數據函數                  
  138. {
  139.                 uint i;
  140.                 uchar j;
  141.         bit testb;
  142.         for(j=1;j<=8;j++)
  143.                 {
  144.                         testb=dat&0x01;
  145.                         dat=dat>>1;
  146.         if(testb)//寫一
  147.                 {
  148.                          ds=0;
  149.                         i++;i++;
  150.                         ds=1;
  151.                         i=8;
  152.                 while(i>0)i--;
  153.                 }
  154.         else
  155.                         {
  156.                                 ds=0;//寫0
  157.                                 i=8;while(i>0)i--;
  158.                                 ds=1;
  159.                                 i++;i++;

  160.                         }
  161.                 }
  162. }               
  163. void tempchange() //DS18B20開始獲取溫度并轉換
  164. {
  165.                 dsreset();
  166.                 delay(1);
  167.                 tempwritebyte(0xcc);   //寫跳過讀ROM指令
  168.                 tempwritebyte(0x44);   //寫溫度轉換指令
  169. }
  170. uint get_temp()
  171.                 {
  172.                         uchar a,b;
  173.                         dsreset();
  174.                         delay(1);
  175.                         tempwritebyte(0xcc);
  176.                         tempwritebyte(0xbe);
  177.                         a=tempread(); //讀低八位
  178.                         b=tempread();         //讀高八位
  179.                         temp=b;
  180.                         temp<<=8;//兩個字節組合為一個字
  181.                         temp=temp|a;
  182.                         temp=temp*0.0625;        //溫度在寄存器中為12位,分辨率位0.0625        度
  183.                 SBUF=temp;
  184.                         return temp;//temp是整型
  185.         }
  186. //數碼管顯示**********************************************************************
  187. void display(uchar num,uchar dat)//數據顯示程序
  188. {                                                                //num是第幾個數碼管,dat是要顯示的數字                                 
  189.         uchar i;
  190.         P0=0xff;
  191.         wela=1;                //消影               
  192.         wela=0;
  193.         P0=table[dat];//編碼賦給P0口
  194.         dula=1;
  195.         dula=0;
  196.         wela=0;
  197.         i=0xFF;                                  
  198.         i=i&(~((0x01)<<(num))) ;
  199.         P0=i;
  200.         wela=1;
  201.         wela=0;
  202.         delay(1);
  203. }                  
  204. //顯示溫度和閾值*************************************************               
  205.         void dis_temp()  //顯示溫度數值函數t傳遞的是整型溫度值
  206.                
  207.                 {                 
  208.                     // tempchange();//溫度轉換函數
  209.                         switch(xs)
  210.                         {
  211.                          case 1:
  212.                                          display(0,get_temp()%100/10);
  213.                                          break;
  214.                          case 2:
  215.                                          display(1,get_temp()%10);
  216.                                           break;
  217.                          case 3:
  218.                                          display(2,l%100/10);
  219.                                          break;
  220.                          case 4:
  221.                                          display(3,l%10);
  222.                                          break;       
  223.                          case 5:
  224.                                          display(4,h%100/10);
  225.                                          break;
  226.                          case 6:
  227.                                          display(5,h%10);
  228.                                         break;
  229.                                 
  230.                          }
  231.                          xs++;
  232.                          if(xs>6)
  233.                          {
  234.                                  xs=1;
  235.                          }
  236.                 }                       
  237. //報警**********************************************************                       
  238. void beep0()          
  239. {                               
  240.         if(temp<l)
  241.                 beep=0;
  242. ……………………

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

所有資料51hei提供下載:
18b20.rar (1.9 KB, 下載次數: 72)


評分

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

查看全部評分

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

使用道具 舉報

沙發
ID:611001 發表于 2019-10-11 19:23 | 只看該作者
你好,請問這個是按鍵按下溫度加一或減一么?
回復

使用道具 舉報

板凳
ID:390416 發表于 2019-10-12 11:42 | 只看該作者
這代碼好垃圾啊!DS18B20 復位居然死等延遲?
回復

使用道具 舉報

地板
ID:622813 發表于 2019-10-12 12:37 | 只看該作者
我是來學習的。。@
回復

使用道具 舉報

5#
ID:693144 發表于 2020-2-14 18:31 | 只看該作者
很有用,感謝。
回復

使用道具 舉報

6#
ID:693601 發表于 2021-12-30 13:18 | 只看該作者
屏幕顯示不出來
回復

使用道具 舉報

7#
ID:440028 發表于 2022-1-4 11:46 | 只看該作者
屏幕顯示不出,你是用的仿真么
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 91色视频在线观看 | 成人国产精品一级毛片视频毛片 | 欧美一级免费 | 久久欧美高清二区三区 | 四虎影院在线播放 | 久久久久久久久久久久一区二区 | 在线成人av | 国产欧美日韩精品在线观看 | 欧美乱码精品一区二区三区 | 国产成人叼嘿视频在线观看 | 国产精品欧美一区喷水 | 日韩中文在线 | 国产精品一二三区 | 精品久久久久久中文字幕 | 国产精品久久a | 免费网站国产 | 观看av| 丝袜美腿av| 一区二区日韩精品 | 欧美精品一区二区三区四区五区 | 深夜福利影院 | 福利精品 | 一区二区三区四区电影 | a免费观看| 黄色一级大片在线免费看产 | 欧美色综合 | 国产 欧美 日韩 一区 | 亚洲电影一区二区三区 | 黑人巨大精品欧美一区二区免费 | 日韩欧美亚洲 | 精品国产一区二区在线 | 一久久久| 久久精品国产一区 | 精品一区二区三区中文字幕 | h网站在线观看 | 观看av| 2018国产精品 | a级黄色片在线观看 | 成人免费视频在线观看 | 精品视频在线观看 | 国产精品高潮呻吟久久久久 |