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

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

QQ登錄

只需一步,快速開始

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

基于51單片機(jī)DS18B20溫度報(bào)警器代碼

[復(fù)制鏈接]
ID:302883 發(fā)表于 2021-1-18 10:49 | 顯示全部樓層 |閱讀模式
這個(gè)是我學(xué)習(xí)單片機(jī)制作的,代碼硬件參考多位作者,修修改改而成。代碼如有侵犯,請(qǐng)聯(lián)系本人,立即刪除。本作品僅供參考,學(xué)習(xí)。不喜勿噴,退出即可。

主要功能:

1.        基本工作量:電源部分、單片機(jī)最小系統(tǒng)、編程電路、溫度采集;
2.        顯示部分(顯示溫度值,保留一位小數(shù))
3.        串口通信(向上位機(jī)發(fā)送溫度值)
4.        繼電器控制(超過一定溫度值,繼電器閉合或者斷開)
5.        蜂鳴器報(bào)警(超過一定溫度值,繼電器閉合或者斷開)

單片機(jī)源程序如下:
  1. #include <reg52.h>

  2. #include "alarm.h"

  3. void main()
  4. {
  5.         do
  6.   {
  7.                 temp=Temper();
  8.   }
  9.   while(temp==850);                  //因?yàn)镈S18B20上電之后會(huì)讀出來850,但不是溫度值,所以等待讀出溫度值   
  10.         delay(1000);
  11.         H=byte_read(0x2000);
  12.         L=byte_read(0x2200);
  13.         if((H>99)||(L>99)||(L>=H))     //讀EEROM里面的數(shù)據(jù)
  14.   {
  15.                 H=35;
  16.                 L=16;                      //如果數(shù)據(jù)不對(duì),賦予初始值
  17.   }  
  18.         TMOD=0x20|0x01;
  19.         TH0=(65536-10000)/256;
  20.         TL0=(65536-10000)%256;
  21.         EA=1;
  22.         ET0=1;
  23.   TR0=1;                         //設(shè)置定時(shí)器與中斷
  24.         SerialInit();
  25.   while(1)   
  26.         {  
  27.           key();
  28.           alarm();
  29.                 Send_data();
  30.         }
  31. }
復(fù)制代碼
  1. #include "alarm.h"
  2. uchar datas[4]={0,0,0,0};
  3. uchar ms;                 //定時(shí)器0計(jì)數(shù)
  4. char H,L;          //用于設(shè)置上下限度  上下限度與要比較的數(shù)據(jù)類型最好相同
  5. uchar flag;        //狀態(tài)
  6. int temp;        //存儲(chǔ)讀出來的溫度,與H,L上下限度數(shù)據(jù)類型相同
  7. uchar rtemp,sflag;

  8. void delay(uint T)
  9. {
  10.   while(T--);
  11. }

  12. void display()
  13. {           
  14.   if(flag==0&&temp>=0)          //溫度為正數(shù)時(shí)執(zhí)行
  15.         {
  16.                 if(temp>999) Nixietube(ss[temp/1000%10],ss[temp/100%10],ss1[temp/10%10],ss[temp%10]);
  17.                 if(temp>99)  Nixietube(0xff,ss[temp/100%10],ss1[temp/10%10],ss[temp%10]);
  18.                 if(temp<99&&temp/100%10<=0)  Nixietube(0xff,0xff,ss1[temp/10%10],ss[temp%10]);
  19.   }
  20.   if(flag==0&&temp<0)          //溫度為負(fù)數(shù)時(shí)
  21.         {
  22.                 if(temp*-1/100%10<=0) Nixietube(0xff,ss1[12],ss1[temp*-1/10%10],ss[temp*-1%10]);
  23.                 if(temp*-1/100%10>0)  Nixietube(ss1[12],ss[temp*-1/100%10],ss1[temp*-1/10%10],ss[temp*-1%10]);
  24.         }
  25.   if(flag==1)                 //flag==0顯示溫度  =1 顯示上限   =2 顯示下限
  26.         {
  27.                 if(H>99)          Nixietube(ss1[11],ss[H/100],ss[H%100/10],ss[H%10]);   //溫度范圍是125~-55 ,當(dāng)上限值大于99時(shí)執(zhí)行  
  28.                 if(H>=10&&H<=99)  Nixietube(ss1[11],0xff,ss[H/10],ss[H%10]);            //當(dāng)上限值大于12小于99時(shí)執(zhí)行  不顯示最高位
  29.                 if(H<10&&H>=0)    Nixietube(ss1[11],0xff,0xff,ss[H%10]);                //不顯示百位 十位
  30.                 if(H<0&&H>=-9)    Nixietube(ss1[11],0xff,ss1[12],ss[H*-1%10]);          //設(shè)置的為負(fù)數(shù)且介于0~-9之間時(shí)執(zhí)行  不顯示十位
  31.     if(H<0&&H<-9)     Nixietube(ss1[11],ss1[12],ss[H*-1%100/10],ss[H*-1%10]);         //最低可以到55                   
  32.   }               
  33.         if(flag==2)            //同上                                                
  34.         {
  35.                 if(L>99)          Nixietube(ss1[10],ss[L/100],ss[L%100/10],ss[L%10]);
  36.                 if(L>=10&&L<=99)  Nixietube(ss1[10],0xff,ss[L/10],ss[L%10]);
  37.                 if(L<10&&L>=0)    Nixietube(ss1[10],0xff,0xff,ss[L%10]);
  38.                 if(L<0&&L>=-9)  Nixietube(ss1[10],0xff,ss1[12],ss[L*-1%10]);
  39.     if(L<0&&L<-9)  Nixietube(ss1[10],ss1[12],ss[L*-1%100/10],ss[L*-1%10]);                          
  40.   }
  41. }

  42. void key()                              //按鍵處理
  43. {
  44.        
  45. if(!key1)                               //設(shè)置上限
  46. {
  47.    delay(500);
  48.    if(!key1)
  49.         {
  50.       while(!key1);
  51.           if(flag==1)
  52.                   {
  53.          if(H<125)H++;
  54.                  SectorErase(0x2000);          //每修改一次上下限數(shù)據(jù)就寫進(jìn)EEROM
  55.                  byte_write(0x2000,H);
  56.         }
  57.           else if        (flag==2)
  58.                 {
  59.           if(L<H-1) L++;                //原則是下限不超過上限
  60.                   SectorErase(0x2200);
  61.                   byte_write(0x2200,L);
  62.         }       
  63.     }       
  64. }

  65. if(!key2)                            //設(shè)置下限
  66. {
  67.    delay(500);
  68.          if(!key2)
  69.          {
  70.       while(!key2);
  71.             if(flag==1)
  72.                   {
  73.                   if(H>L+1)  H--;             //原則上限不低于下限
  74.                   SectorErase(0x2000);        //每修改一次上下限數(shù)據(jù)就寫進(jìn)EEROM
  75.                   byte_write(0x2000,H);
  76.         }
  77.                         else if        (flag==2)
  78.                         {
  79.                                 if(L>-55)L--;
  80.                                 SectorErase(0x2200);
  81.                                 byte_write(0x2200,L);
  82.                         }       
  83.    }
  84. }
  85. if(!key3)                         //設(shè)置上限下限切換按鍵
  86.         {
  87.          delay(1000);
  88.          if(!key3)
  89.        {
  90.                 while(!key3);
  91.         flag=(flag+1)%3;                       
  92.        }
  93.   }
  94. }
  95. void alarm()                          //報(bào)警
  96. {
  97.         if(temp/10>=H||temp/10<=L)         //超過上下限蜂鳴器報(bào)警 ,正常的LED燈關(guān)閉
  98.   {
  99.                 beep_1=0;
  100.   }
  101.         else
  102.         {
  103.           beep_1=1;
  104.   }                               //正常情況下,蜂鳴器關(guān)閉  
  105.         if(temp/10>=H)                    //上限,當(dāng)測(cè)得的值,大于等于設(shè)定值得時(shí)候,
  106.         {
  107.           led_0=0;        
  108.         }
  109.         else
  110.   {
  111.     led_0=1;
  112.   }
  113.                
  114.         if(temp/10<=L)                        //下限 當(dāng)實(shí)際值小于等于下限值時(shí)
  115.   {
  116.                 led_2=0;     
  117.   }
  118.         else
  119.   {
  120.                 led_2=1;
  121.   }       
  122. }
  123. //*************************************************
  124. void TIMER_1() interrupt 1
  125. {
  126.         TH0=(65536-10000)/256;
  127.         TL0=(65536-10000)%256;             //一次定時(shí)10MS   十進(jìn)制65536-50000=15536   折合十六進(jìn)制3cb0  高位3c低位b0   
  128.         ms++;
  129.         display();                                                    // 完全消影可以開啟這個(gè),屏蔽主函數(shù)大循環(huán)里的顯示函數(shù)
  130.   if(ms>100)                            //數(shù)據(jù)一秒刷新一次
  131.         {
  132.           ms=0;
  133.           temp=Temper();                   //讀溫度
  134.         }         
  135.   if(ms%5==0)                  
  136.         {
  137.                 if(beep_1==0)                      //蜂鳴器設(shè)置
  138.           {
  139.                         beep=!beep;
  140.           }
  141.           else
  142.     {
  143.                         beep=1;
  144.           }
  145.   }  
  146.         if(ms%7==0)                  
  147.         {
  148.                 if(beep_1==0)                      //蜂鳴器設(shè)置
  149.           {
  150.                         relay=!relay;
  151.           }
  152.           else
  153.     {
  154.                         relay = 1;
  155.           }
  156.   }
  157. }

  158. void SerialInit()
  159. {
  160.         TMOD=0x20|0x01;  //工作模式2
  161.         TH1=0xfd;
  162.         TL1=0xfd;
  163.         TR1=1;      //啟動(dòng)定時(shí)器1
  164.         SM0=0;
  165.         SM1=1;
  166.         REN=1;      //允許接收
  167.         PCON=0x00;  //關(guān)閉倍頻
  168.         ES=1;       //開串口中斷
  169.         EA=1;       //開總中斷
  170. }

  171. void SerialService() interrupt 4
  172. {

  173.         if(RI==1)
  174.         {
  175.                 RI = 0;       
  176.                 sflag = 1;
  177.         }
  178. }
  179. void Send_data()
  180. {
  181.         datas[0] = temp%10000/1000;
  182.         datas[1] = temp%1000/100;
  183.         datas[2] = temp%100/10;
  184.         datas[3] = temp%10;

  185.         if(sflag==1)
  186.         {
  187.                 ES = 0; //發(fā)送期間關(guān)閉串口中斷
  188.                 sflag = 0;
  189.                 if(temp<0)
  190.                 {
  191.                         SBUF = '-';
  192.                         while(!TI);
  193.                   TI = 0;       
  194.                 }
  195.                 else
  196.                 {
  197.                         SBUF = '+';
  198.                         while(!TI);
  199.                         TI = 0;       
  200.                 }

  201.                 SBUF = '0'+datas[0];
  202.                 while(!TI);
  203.                 TI = 0;
  204.                 SBUF = '0'+datas[1];
  205.                 while(!TI);
  206.                 TI = 0;               
  207.                 SBUF = '0'+datas[2];
  208.                 while(!TI);
  209.                 TI = 0;               
  210.                 SBUF = '.';
  211.                 while(!TI);
  212.                 TI = 0;
  213.                 SBUF = '0'+datas[3];
  214.                 while(!TI);
  215.                 TI = 0;       
  216.                 ES = 1;
  217.         }
  218. }
復(fù)制代碼

所有資料51hei提供下載:
DS18B20.rar (70.83 KB, 下載次數(shù): 50)
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 99这里只有精品视频 | 国产精品美女久久久久久免费 | 日韩av在线免费 | 免费av在线 | 浮生影院免费观看中文版 | 久久综合av | 欧美成人一区二区三区 | 影音先锋中文字幕在线观看 | 99久久夜色精品国产亚洲96 | 欧美成人一区二区三区 | 久久久久久中文字幕 | 亚洲精品三级 | 天堂在线中文字幕 | 日韩中文字幕在线视频 | 国产精品视频久久 | 四虎永久免费黄色影片 | 无码一区二区三区视频 | 欧美精品久久久久 | 99精品在线 | 欧美激情精品久久久久久 | 一区二区三区中文字幕 | 日韩精品 电影一区 亚洲 | 午夜精品一区二区三区在线 | 亚洲一区二区三区在线 | 欧美一区二区三区在线免费观看 | 国产精品三级 | 精品中文字幕在线 | 成人福利电影 | 亚洲自拍一区在线观看 | 国产十日韩十欧美 | 天天操夜夜看 | 精产国产伦理一二三区 | 97操操 | 久久久九九九九 | 黑人一级黄色大片 | 精品久久久久久久久久 | 国产成视频在线观看 | 久久久久成人精品 | 亚洲国产一 | 国产高清一区二区三区 | 欧美日韩国产精品一区二区 |