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

QQ登錄

只需一步,快速開始

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

51單片機(jī)+1602+DS18B20的溫度報(bào)警程序+實(shí)物設(shè)計(jì)(按鍵可調(diào)溫度閾值)

  [復(fù)制鏈接]
ID:393699 發(fā)表于 2018-12-18 18:37 | 顯示全部樓層 |閱讀模式
新人報(bào)道,發(fā)個(gè)帖報(bào)道一波
51單片機(jī)做的溫度顯示,溫度顯示在LCD1602液晶屏上。
然后按鍵可以調(diào)整溫度閾值,溫度高于或低于所設(shè)溫度,蜂鳴器就會(huì)響……
第一次做的成品,就發(fā)出來(lái)紀(jì)念一下吧,代碼寫得有點(diǎn)菜,有需要的拿去……


圖片3.jpg



圖片2.jpg



圖片1.jpg

單片機(jī)源程序如下:
  1. /**************************************************************************************

  2. *                              基于單片機(jī)的實(shí)時(shí)溫度報(bào)警系統(tǒng)設(shè)計(jì)                                                                                                  *

  3.     (1)DS18b20采集到的溫度可以實(shí)時(shí)地在數(shù)碼管或者在液晶上顯示出來(lái);
  4.     (2)用三個(gè)獨(dú)立鍵盤設(shè)置閥值,包括設(shè)置鍵,加鍵,減鍵和確認(rèn)鍵;
  5.     (3)按下設(shè)置鍵時(shí),數(shù)碼管或者液晶上顯示2S“H”字,隨后溫度閃爍顯示,進(jìn)入設(shè)置閥值最大值狀態(tài);
  6.          再次按下設(shè)置鍵,數(shù)碼管或者液晶上顯示2S“L”字,隨后溫度閃爍顯示,進(jìn)入設(shè)置閥值最小值狀態(tài),
  7.          第三次按下設(shè)置鍵(此時(shí)相當(dāng)于確認(rèn)鍵),系統(tǒng)保存設(shè)置好的閥值并進(jìn)入正常的溫度顯示狀態(tài);
  8.                     (此程序功能與第三點(diǎn)有出入)
  9.     (4)當(dāng)采集到的溫度大于閥值最大值或者小于閥值最小值時(shí)蜂鳴器發(fā)出聲音報(bào)警。
  10.          
  11.          注釋:k1:溫度加   k2:溫度減   k3:低溫度閾值設(shè)置   k4:高溫度閾值設(shè)置

  12.         適用單片機(jī):STC89C52RC      適用開發(fā)板:普中科技  CH—6800ES V2.0    晶振:12MHZ
  13.                                                                                                                                                                   
  14. ***************************************************************************************/

  15. #include "reg52.h"                         //此文件中定義了單片機(jī)的一些特殊功能寄存器
  16. #include "lcd.h"
  17. #include "temp.h"
  18. #include "intrins.h"
  19. #include "key.h"

  20. typedef unsigned int u16;          //對(duì)數(shù)據(jù)類型進(jìn)行聲明定義
  21. typedef unsigned char u8;

  22. u8 Disp[]=  "Temp:           ";
  23. u8 Disp2[]= "Xiaoliyu Design ";

  24. extern unsigned int LTemp;        //低閾值溫度
  25. extern unsigned int LLTemp;
  26. unsigned int DTemp;               //高閾值溫度
  27. unsigned int DLTemp;

  28. u16 NowTemp=35;                   //當(dāng)前溫度
  29. u16 IntFlag1=0;                   //外部中斷1標(biāo)志位
  30. u16 IntFlag0=0;                   //外部中斷0標(biāo)志位

  31. sbit Beep=P1^5;                   //設(shè)置蜂鳴器引腳
  32. sbit LA=P2^2;
  33. sbit LB=P2^3;
  34. sbit LC=P2^4;

  35. void delay10us(void);
  36. void delay100us(void);
  37. void delay10ms(void);
  38. void delay1s(void);
  39. void Int1Init();
  40. void Int0Init();
  41. void Timer0Init();

  42. /*******************************************************************************
  43. * 函 數(shù) 名         : main
  44. * 函數(shù)功能                     : 主函數(shù)
  45. * 輸    入         : 無(wú)
  46. * 輸    出         : 無(wú)
  47. *******************************************************************************/
  48. void main(void)
  49. {
  50.          u8 i;
  51.          Int1Init();                   //外部中斷1初始化
  52.          Int0Init();                   //外部中斷0初始化
  53.          LcdInit();                    //LCD1602初始化
  54.    Timer0Init();                       //定時(shí)器0初始化
  55.         
  56.          LA =1;
  57.          LB =0;
  58.          LC =0;
  59.         
  60. ////////////////////////////////////////////////////////////////////////////////
  61.         
  62.            for(i=0;i<16;i++)           //初始化LCD屏(第一行)
  63.            {
  64.                    LcdWriteData(Disp[i]);        
  65.            }
  66.                  
  67.             delay100us();
  68.             LcdWriteCom(0xC0);                //初始化LCD屏(第二行)
  69.                  
  70.             for(i=0;i<16;i++)
  71.            {
  72.                    LcdWriteData(Disp2[i]);        
  73.            }

  74.     /////////////////////////////////////////////////////////////////////
  75.                  
  76.                 while(1)
  77.           {

  78.                           LcdWriteCom(0x85);
  79.                     datapros(Ds18b20ReadTemp());                    //獲取DS18B20溫度
  80.                      for(i=0;i<11;i++)                        //溫度信息寫入1602
  81.                {
  82.                         LcdWriteData(DisplayData[i]);        
  83.                }        

  84.                
  85.         if(IntFlag1==1)                           //若外部中斷1標(biāo)志位為1,則進(jìn)入高溫度閾值設(shè)置界面
  86.              {                 
  87.                 LcdMenu();
  88.                             if(IntFlag1==0)                         //若外部中斷1標(biāo)志位為0,則退出高溫度閾值設(shè)置界面
  89.                             {                                       //重載溫度顯示頁(yè)面參數(shù)
  90.                                     LcdInit();        
  91.                   for(i=0;i<16;i++)                    
  92.                    {
  93.                           LcdWriteData(Disp[i]);        
  94.                    }
  95.                    delay100us();
  96.                  
  97.                   LcdWriteCom(0xC0);
  98.                   for(i=0;i<16;i++)
  99.                    {
  100.                           LcdWriteData(Disp2[i]);        
  101.                    }
  102.                                                 
  103.                              }                                
  104.          delay10ms();                 
  105.                         
  106.               }
  107.                  
  108.                  
  109.                     if(IntFlag0==1)                           //若外部中斷0標(biāo)志位為1,則進(jìn)入低溫度閾值設(shè)置界面
  110.               {
  111.                         
  112.                  LcdMenuL();
  113.                              if(IntFlag0==0)                        //若外部中斷0標(biāo)志位為0,則退出低溫度閾值設(shè)置界面
  114.                              {                                      //重載溫度顯示頁(yè)面參數(shù)
  115.                                      LcdInit();        
  116.                    for(i=0;i<16;i++)
  117.                    {
  118.                           LcdWriteData(Disp[i]);        
  119.                    }
  120.                    delay100us();
  121.                  
  122.                    LcdWriteCom(0xC0);
  123.                    for(i=0;i<16;i++)
  124.                    {
  125.                          LcdWriteData(Disp2[i]);        
  126.                    }
  127.                                                 
  128.                              }
  129.            delay10ms();                                          
  130.               }
  131.                  
  132.                  
  133.                      NowTemp=dataReturn(Ds18b20ReadTemp());     //獲取當(dāng)前溫度
  134.                      DTemp=(LTemp/100);                         //獲取高溫度閾值
  135.                      DLTemp=(LLTemp/100);                       //獲取低溫度閾值
  136.                                 
  137.                      if((NowTemp>=DTemp)|(NowTemp<=DLTemp))    //如果當(dāng)前溫度大于高溫度閾值或小于低溫度閾值,則打開定時(shí)器0啟動(dòng)蜂鳴器
  138.                      {
  139.                              ET0=1;                                  //打開定時(shí)器0中斷允許
  140.                              led=~led;                        
  141.            delay10us();                        
  142.                       }
  143.                      else
  144.                      {
  145.                              ET0=0;                                  //關(guān)閉定時(shí)器0中斷允許
  146.                              delay10us();
  147.                      }

  148.            }
  149.                
  150. ////////////////////////////////////////////////////////////////////////////////
  151.                
  152. }        

  153. /*******************************************************************************
  154. * 函 數(shù) 名         : delay10ms
  155. * 函數(shù)功能                     : 延時(shí)函數(shù)10ms
  156. * 輸    入         : 無(wú)
  157. * 輸    出         : 無(wú)
  158. *******************************************************************************/

  159. void delay10ms(void)   
  160. {
  161.     unsigned char a,b,c;
  162.     for(c=1;c>0;c--)
  163.         for(b=38;b>0;b--)
  164.             for(a=130;a>0;a--);
  165. }

  166. /*******************************************************************************
  167. * 函 數(shù) 名         : delay100us
  168. * 函數(shù)功能                     : 延時(shí)函數(shù)100us
  169. * 輸    入         : 無(wú)
  170. * 輸    出         : 無(wú)
  171. *******************************************************************************/

  172. void delay100us(void)   
  173. {
  174.     unsigned char a,b;
  175. for(b=1;b>0;b--)
  176.         for(a=47;a>0;a--);
  177. }

  178. /*******************************************************************************
  179. * 函 數(shù) 名         : delay10us
  180. * 函數(shù)功能                     : 延時(shí)函數(shù)10us
  181. * 輸    入         : 無(wú)
  182. * 輸    出         : 無(wú)
  183. *******************************************************************************/

  184. void delay10us(void)   
  185. {
  186.     unsigned char a,b;
  187.     for(b=1;b>0;b--)
  188.         for(a=2;a>0;a--);
  189. }

  190. /*******************************************************************************
  191. * 函 數(shù) 名         : Int1Init
  192. * 函數(shù)功能                     : 延時(shí)函數(shù)10us
  193. * 輸    入         : 無(wú)
  194. * 輸    出         : 無(wú)
  195. *******************************************************************************/

  196. void Int1Init()
  197. {
  198.         //設(shè)置INT1
  199.         IT1=1;//跳變沿出發(fā)方式(下降沿)
  200.         EX1=1;//打開INT1的中斷允許。        
  201.         EA=1;//打開總中斷        
  202. }

  203. /*******************************************************************************
  204. * 函 數(shù) 名         : Int0Init
  205. * 函數(shù)功能                     : 延時(shí)函數(shù)10us
  206. * 輸    入         : 無(wú)
  207. * 輸    出         : 無(wú)
  208. *******************************************************************************/

  209. void Int0Init()
  210. {
  211.          //設(shè)置INT1
  212.         IT0=1;      //跳變沿出發(fā)方式(下降沿)
  213.         EX0=1;      //打開INT0的中斷允許。        
  214.         EA=1;       //打開總中斷        
  215. }

  216. /*******************************************************************************
  217. * 函 數(shù) 名         : Timer0Init
  218. * 函數(shù)功能                     : 定時(shí)器0初始化
  219. * 輸    入         : 無(wú)
  220. * 輸    出         : 無(wú)
  221. *******************************************************************************/
  222. void Timer0Init()
  223. {
  224.         TMOD|=0X01;   //選擇為定時(shí)器0模式,工作方式1,僅用TR0打開啟動(dòng)。

  225.         TH0=0XFA;            //給定時(shí)器賦初值,定時(shí)1ms
  226.         TL0=0X24;        
  227.         ET0=1;        //打開定時(shí)器0中斷允許
  228.         EA=1;         //打開總中斷
  229.         TR0=1;        //打開定時(shí)器                        
  230. }

  231. /*******************************************************************************
  232. * 函 數(shù) 名         : Int0
  233. * 函數(shù)功能                     : 外部中斷0
  234. * 輸    入         : 無(wú)
  235. * 輸    出         : 無(wú)
  236. *******************************************************************************/

  237. void Int0()        interrupt 0               
  238. {
  239.         delay10ms();                          //延時(shí)消抖
  240.         if(k3==0)                       //K3按下時(shí)設(shè)置外部中斷0標(biāo)志位為1,再按一次設(shè)置為0   
  241.         {
  242.                
  243.                 if(IntFlag0==0)
  244.                 IntFlag0=1;
  245.                 else
  246.                 IntFlag0=0;               
  247.                 led=~led;
  248.                                 
  249.         }
  250.         
  251. }

  252. /*******************************************************************************
  253. * 函 數(shù) 名         : Int1
  254. ……………………

  255. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼

所有資料51hei提供下載:
51+1602+DS18B20.zip (78.87 KB, 下載次數(shù): 435)


評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

無(wú)效樓層,該帖已經(jīng)被刪除
ID:538674 發(fā)表于 2019-5-17 08:09 | 顯示全部樓層
連線怎么連
回復(fù)

使用道具 舉報(bào)

ID:502682 發(fā)表于 2019-5-17 19:04 | 顯示全部樓層
。。。
我發(fā)表了幾千行的代碼都能顯示出來(lái)
回復(fù)

使用道具 舉報(bào)

5#
無(wú)效樓層,該帖已經(jīng)被刪除
ID:565086 發(fā)表于 2019-6-18 16:31 | 顯示全部樓層
用Keil4編譯不行 Keil5可以

Digital Class Design.7z

31.6 KB, 下載次數(shù): 9, 下載積分: 黑幣 -5

回復(fù)

使用道具 舉報(bào)

ID:759739 發(fā)表于 2020-5-24 12:18 | 顯示全部樓層
編譯不成功呀,求解
回復(fù)

使用道具 舉報(bào)

ID:826935 發(fā)表于 2020-10-16 16:20 | 顯示全部樓層
這個(gè)工程要用Keil5才能編譯成功
回復(fù)

使用道具 舉報(bào)

ID:826935 發(fā)表于 2020-10-16 16:21 | 顯示全部樓層
什么地方有問(wèn)題嘞
回復(fù)

使用道具 舉報(bào)

ID:825648 發(fā)表于 2020-12-4 12:43 | 顯示全部樓層
編譯失敗的話去output 把空格刪除換成下劃線就好了,但是仿真我還是用不了,虧了五個(gè)幣虧死我了
回復(fù)

使用道具 舉報(bào)

11#
無(wú)效樓層,該帖已經(jīng)被刪除
ID:876099 發(fā)表于 2021-7-28 18:02 | 顯示全部樓層
我向請(qǐng)問(wèn)一下作者我按照這個(gè)普中這塊板子焊接的,但是最后焊接出來(lái)板子可以顯示,我焊接的板子就不顯示是什么原因呢求解答
回復(fù)

使用道具 舉報(bào)

ID:876099 發(fā)表于 2021-8-17 18:12 | 顯示全部樓層
我想問(wèn)一下作者,這個(gè)帶溫度補(bǔ)償嗎
回復(fù)

使用道具 舉報(bào)

ID:961013 發(fā)表于 2021-8-22 18:27 | 顯示全部樓層

我的總是編譯失敗啊,難受死了。用不了呀
回復(fù)

使用道具 舉報(bào)

15#
無(wú)效樓層,該帖已經(jīng)被刪除
16#
無(wú)效樓層,該帖已經(jīng)被刪除
ID:1151428 發(fā)表于 2025-5-23 19:49 | 顯示全部樓層
怎么搞
回復(fù)

使用道具 舉報(bào)

ID:1154326 發(fā)表于 2025-6-17 14:36 | 顯示全部樓層

我向請(qǐng)問(wèn)一下作者我按照這個(gè)普中這塊板子焊接的,但是最后焊接出來(lái)板子可以顯示,我焊接的板子就不顯示是什么原因呢求解答
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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