標(biāo)題: 基于單片機(jī)的智能溫度監(jiān)測系統(tǒng)設(shè)計(jì)(電路圖+程序) [打印本頁]

作者: qzxz    時(shí)間: 2021-11-23 20:51
標(biāo)題: 基于單片機(jī)的智能溫度監(jiān)測系統(tǒng)設(shè)計(jì)(電路圖+程序)

本次設(shè)計(jì)的主要思路是利用51系列單片機(jī),數(shù)字溫度傳感器DS18B20和1602LCD液晶顯示,構(gòu)成實(shí)現(xiàn)溫度檢測與顯示的單片機(jī)控制系統(tǒng),即數(shù)字溫度計(jì)。通過對單片機(jī)編寫相應(yīng)的程序,達(dá)到能夠?qū)崟r(shí)檢測周圍溫度的目的。 通過對本課題的設(shè)計(jì)能夠熟悉數(shù)字溫度計(jì)的工作原理及過程,了解各功能器件(單片機(jī)、DS18B20、LCD)的基本原理與應(yīng)用,掌握各部分電路的硬件連線與程序編寫,最終完成對數(shù)字溫度計(jì)的總體設(shè)計(jì)。其具體的要求如下: 1、根據(jù)設(shè)計(jì)要求,選用AT89C51單片機(jī)為核心器件; 2、溫度檢測器件采用DS18B20數(shù)字式溫度傳感器,利用單總線式連接方式與單片機(jī)的串行接口P3.3引腳相連; 3、顯示電路采用1602LCD液晶顯示溫度值,此類液晶模塊不僅可以顯示數(shù)字、字符,還可以顯示各種圖形符號(hào)以及少量自定義符號(hào),人機(jī)界面友好,使用操作也更加靈活、方便,使其日益成為各種儀器儀表等設(shè)備的首選。

系統(tǒng)的開發(fā)過程

本設(shè)計(jì)主要介紹了用單片機(jī)和數(shù)字溫度傳感器DS18B20相結(jié)合的方法來實(shí)現(xiàn)溫度的采集,以單片機(jī)AT89C51芯片為核心,溫度傳感器DS18B20和1602LCD液晶顯示,構(gòu)成了一個(gè)多功能單片機(jī)數(shù)字溫度計(jì)。其主要研究內(nèi)容包括兩方面,一是對系統(tǒng)硬件部分的設(shè)計(jì),包括溫度采集電路和顯示電路;二是對系統(tǒng)軟件部分的設(shè)計(jì),應(yīng)用C語言實(shí)現(xiàn)溫度的采集與顯示。通過利用數(shù)字溫度傳感器DS18B20進(jìn)行設(shè)計(jì),能夠滿足實(shí)時(shí)檢測溫度的要求,同時(shí)通過1602LCD的顯示功能,可以實(shí)現(xiàn)不間斷的溫度顯示。其總體設(shè)計(jì)框圖一如下:



圖一:總體設(shè)計(jì)框圖

第一節(jié)AT89C51簡介

AT89C51是美國ATMEL公司生產(chǎn)的低功耗,高性能CMOS8位單片機(jī),片內(nèi)含4kbytes的可編程的Flash只讀程序存儲(chǔ)器,兼容標(biāo)準(zhǔn)8051指令系統(tǒng)及引腳,并集成了 Flash 程序存儲(chǔ)器,既可在線編程(ISP),也可用傳統(tǒng)方法進(jìn)行編程,因此,低價(jià)位AT89C51單片機(jī)可應(yīng)用于許多高性價(jià)比的場合,可靈活應(yīng)用于各種控制領(lǐng)域,對于簡單的測溫系統(tǒng)已經(jīng)足夠。單片機(jī)AT89C51具有低電壓供電和體積小等特點(diǎn),四個(gè)端口只需要兩個(gè)口就能滿足電路系統(tǒng)的設(shè)計(jì)需要,很適合便攜手持式產(chǎn)品的設(shè)計(jì)使用系統(tǒng)可用二節(jié)電池供電。芯片AT89C51的引腳排列如圖二所示:



圖二:AT89C51單片機(jī)引腳圖

第二節(jié)晶振電路的設(shè)計(jì)

單片機(jī)晶振電路的設(shè)計(jì)如圖三所示。XTAL1(X1)為反向振蕩放大器的輸入及內(nèi)部時(shí)鐘工作電路的輸入。按照理論上AT89C51使用的是12MHz的晶振,但實(shí)測使用11.0592MHz。所以設(shè)計(jì)者通常用的是11.0592MHz。



圖三:單片機(jī)晶振電路

第三節(jié)溫度采集電路的設(shè)計(jì)

DALLAS 最新單線數(shù)字溫度傳感器DS18B20是一種新型的“一線器件”,其體積更小、更適用于多種場合、且適用電壓更寬、更經(jīng)濟(jì)。DALLAS 半導(dǎo)體公司的數(shù)字化溫度傳感器DS18B20是世界上第一片支持“一線總線”接口的溫度傳感器。溫度測量范圍為-55~+125 攝氏度,可編程為9~12 位轉(zhuǎn)換精度,測溫分辨率可達(dá)0.0625攝氏度,分辨率設(shè)定參數(shù)以及用戶設(shè)定的報(bào)警溫度存儲(chǔ)在EEPROM 中,掉電后依然保存。被測溫度用符號(hào)擴(kuò)展的16位數(shù)字量方式串行輸出;其工作電源既可以在遠(yuǎn)端引入,也可以采用寄生電源方式產(chǎn)生;多個(gè)DS18B20可以并聯(lián)到3 根或2 根線上,CPU只需一根端口線就能與諸多DS18B20 通信,占用微處理器的端口較少,可節(jié)省大量的引線和邏輯電路。因此用它來組成一個(gè)測溫系統(tǒng),具有線路簡單,在一根通信線,可以掛很多這樣的數(shù)字溫度計(jì),十分方便。本設(shè)計(jì)的溫度采集電路如圖四所示。



圖四:溫度采集電路圖

第五節(jié)溫度顯示電路的設(shè)計(jì)

顯示器常用作單片機(jī)最簡單的輸出設(shè)備,用以顯示單片機(jī)的運(yùn)行結(jié)果和運(yùn)行狀態(tài)等。常用的顯示器主要有LED和LCD,它們都具有耗電少、成本低、線路簡單、壽命長等優(yōu)點(diǎn),廣泛應(yīng)用于單片機(jī)顯示數(shù)字量的場合。設(shè)計(jì)中采用LCD顯示器。液晶顯示器(LCD)具有功耗低、體積小、質(zhì)量輕、功耗小的特點(diǎn)。點(diǎn)陣字符型液晶顯示器把LCD控制器、點(diǎn)陣驅(qū)動(dòng)器、字符存儲(chǔ)器集成在一塊印刷電路板上,構(gòu)成便于應(yīng)用的液晶模塊。此類液晶模塊不僅可以顯示數(shù)字、字符,還可以顯示各種圖形符號(hào)以及少量自定義符號(hào),并且可以實(shí)現(xiàn)屏幕的上下左右滾動(dòng)、文字的閃爍等功能,人機(jī)界面友好,使用操作也更加靈活、方便,使其日益成為各種儀器儀表等設(shè)備的首選。圖五為本設(shè)計(jì)的顯示電路圖。



圖五:顯示電路圖

第六節(jié)應(yīng)用軟件介紹

本設(shè)計(jì)主要用Proteus仿真軟件和Keil編譯軟件。

本設(shè)計(jì)主要用Proteus仿真軟件和Keil編譯軟件 4.1.1 Proteus的介紹

Proteus軟件是英國Labcenter electronics公司出版的EDA工具軟件。它不僅具有其它EDA工具軟件的仿真功能,還能仿真單片機(jī)及外圍器件,它是目前最好的仿真單片機(jī)及外圍器件的工具,雖然目前國內(nèi)推廣剛起步,但已受到單片機(jī)愛好者、從事單片機(jī)教學(xué)教師、致力于單片機(jī)開發(fā)應(yīng)用的科技工作者的青睞。Proteus是世界上著名的EDA工具(仿真軟件),從原理布圖、代碼調(diào)試到單片機(jī)與外圍電路協(xié)同仿真,一鍵切換發(fā)到PCB設(shè)計(jì),真正實(shí)現(xiàn)了從 概念到產(chǎn)品的完整設(shè)計(jì)。是目前世界上唯一將電路仿真軟件、PCB設(shè)計(jì)軟件和虛擬模型仿真軟件三合一的設(shè)計(jì)平臺(tái),其處理器模型支持8051、HC11、PIC10/12/16/18/24/30/DsPIC33、AVR、ARM、8086HE MSP430等,2010年即將增加Cortex和DSP系列處理器,并持續(xù)增加其他系列處理器模型。在編譯方面,它也支持IAR、Keil和MPLAB等多種編譯器。

Keil C51是美國Keil Software公司出品的51系列兼容單片機(jī)C語言軟件開發(fā)系統(tǒng),與匯編相比,C語言在功能上、結(jié)構(gòu)性、可讀性、可維護(hù)性上有明顯的優(yōu)勢,因而易學(xué)易用。Keil提供了包括C編譯器、宏匯編、連接器、庫管理和一個(gè)功能強(qiáng)大的仿真調(diào)試器等在內(nèi)的完整開發(fā)方案,通過一個(gè)集成開發(fā)環(huán)境(uVision)將這些部分組合在一起。運(yùn)行Keil軟件需要WIN98、NT、WIN2000、WINXP等操作系統(tǒng)。如果你使用C語言編程,那么Keil幾乎就是你的不二之選,即使不使用C語言而僅用匯編語言編程,其方便易用的集成環(huán)境、強(qiáng)大的軟件仿真調(diào)試工具也會(huì)令你事半功倍。

系統(tǒng)測試情況

進(jìn)入測試,開關(guān)不閉合,系統(tǒng)默認(rèn)顯示1602LCD顯示當(dāng)前采集的溫度,當(dāng)溫度變化時(shí),系統(tǒng)實(shí)時(shí)采集DS18B20的溫度并顯示出來,當(dāng)采集的溫度超過系統(tǒng)所設(shè)置的上限或者下限的時(shí)候,系統(tǒng)自動(dòng)報(bào)警,開關(guān)閉合,顯示報(bào)警溫度的上限值和下限值。綜合仿真圖如圖六所示:



系統(tǒng)的優(yōu)點(diǎn)與不足

優(yōu)點(diǎn):軟件可以實(shí)時(shí)檢測溫度值,并顯示,當(dāng)溫度超出預(yù)設(shè)范圍時(shí)及時(shí)報(bào)警,并且還可以檢測并顯示零下溫度。

缺點(diǎn):只是做到了仿真程序,沒有具體的硬件實(shí)現(xiàn),系統(tǒng)運(yùn)行時(shí)預(yù)設(shè)溫度不能改動(dòng)。




附錄代碼


  1. #include<reg51.h>
  2. #include<intrins.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. sbit DQ=P3^3;//DS18B20數(shù)據(jù)線
  6. sbit BEEP=P3^7;//報(bào)警器
  7. sbit LCD_RS=P2^0;
  8. sbit LCD_RW=P2^1;
  9. sbit LCD_EN=P2^2;
  10. sbit K1=P1^7;
  11. uchar code Temp_Disp_Title[]={" Current Temp : "};
  12. uchar Current_Temp_Display_Buffer[]={"TEMP:            "};
  13. uchar code Alarm_Temp[]={"ALARM TEMP Hi Lo"};
  14. uchar Alarm_HI_LO_STR[]={"Hi:     Lo:      "};
  15. uchar code df_Table[]={0,1,1,2,3,3,4,4,5,6,6,7,8,8,9,9};//溫度小數(shù)位對照表
  16. char Alarm_Temp_HL[2]={100,0};
  17. uchar CurrentT=0;//當(dāng)前讀取的溫度整數(shù)部分
  18. uchar Temp_Value[]={0x00,0x00};//從DS18B20讀取的溫度值
  19. uchar Display_Digit[]={0,0,0,0};//待顯示的各溫度數(shù)位
  20. bit HI_Alarm=0,LO_Alarm=0;//高溫低溫報(bào)警標(biāo)志
  21. bit DS18B20_IS_OK=1;//傳感器正常標(biāo)志
  22. uint Time0_Count=0;//定時(shí)器延時(shí)累加
  23. //延時(shí)
  24. void DelayMS(uint x){
  25.         uchar i;
  26.         while(x--)for(i=0;i<120;i++);
  27. }
  28. //讀LCD狀態(tài)
  29. uchar Read_LCD_State(){
  30.         uchar state;
  31.         LCD_RS=0;LCD_RW=1;LCD_EN=1;DelayMS(1);state=P0;LCD_EN=0;DelayMS(1);
  32.         return state;
  33. }
  34. //忙等待
  35. void LCD_Busy_Wait(){
  36.         while((Read_LCD_State()&0x80)==0x80);
  37.         DelayMS(5);
  38. }
  39. //寫LCD指令
  40. void Write_LCD_Command(uchar cmd){
  41.         LCD_Busy_Wait();
  42.         LCD_RS=0;LCD_RW=0;LCD_EN=0;P0=cmd;LCD_EN=1;DelayMS(1);LCD_EN=0;
  43. }
  44. //向LCD寫數(shù)據(jù)
  45. void Write_LCD_Data(uchar dat){
  46.         LCD_Busy_Wait();
  47.         LCD_RS=1;LCD_RW=0;LCD_EN=0;P0=dat;LCD_EN=1;DelayMS(1);LCD_EN=0;
  48. }
  49. //延時(shí)
  50. void DelayXus(int x){
  51.         uchar i;
  52.         while(x--)for(i=0;i<200;i++);
  53. }
  54. //延時(shí)
  55. void Delay(uint num){
  56.         while(--num);
  57. }
  58. //初始化DS18B20
  59. uchar Init_DS18B20(){
  60.         uchar status;
  61.         DQ=1;Delay(8);
  62.         DQ=0;Delay(90);
  63.         DQ=1;Delay(8);
  64.         status=DQ;
  65.         Delay(100);
  66.         DQ=1;
  67.         return status;//初始化成功返回0
  68. }
  69. //讀一字節(jié)
  70. uchar ReadOneByte(){
  71.         uchar i,dat=0;
  72.         DQ=1;_nop_();
  73.         for(i=0;i<8;i++){
  74.                 DQ=0;dat>>=1;DQ=1;_nop_();_nop_();
  75.                 if(DQ)dat|=0x80;Delay(30);DQ=1;
  76.         }
  77.         return dat;
  78. }
  79. //寫一個(gè)字節(jié)
  80. void WriteOneByte(uchar dat){
  81.         uchar i;
  82.         for(i=0;i<8;i++){
  83.                 DQ=0;DQ=dat&0x01;Delay(5);DQ=1;dat>>=1;
  84.         }
  85. }
  86. //讀取溫度值
  87. void Read_Temperature(){
  88.         if(Init_DS18B20()==1)//DS18B20故障
  89.                 DS18B20_IS_OK=0;
  90.         else{
  91.                 WriteOneByte(0xcc);//跳過序列號(hào)
  92.                 WriteOneByte(0x44);//啟動(dòng)溫度轉(zhuǎn)換
  93.                 Init_DS18B20();
  94.                 WriteOneByte(0xcc);//跳過序列號(hào)
  95.                 WriteOneByte(0xbe);//讀取溫度寄存器
  96.                 Temp_Value[0]=ReadOneByte();//讀取低8位
  97.                 Temp_Value[1]=ReadOneByte();//溫度高8位
  98.                 Alarm_Temp_HL[0]=ReadOneByte();//報(bào)警TH
  99.                 Alarm_Temp_HL[1]=ReadOneByte();//報(bào)警TL
  100.                 DS18B20_IS_OK=1;
  101.         }
  102. }        
  103. //設(shè)置DS18B20溫度報(bào)警值
  104. void Set_Alarm_Temp_Value(){
  105.         Init_DS18B20();
  106.         WriteOneByte(0xcc);//跳過序列號(hào)
  107.         WriteOneByte(0x4e);//將設(shè)定的溫度報(bào)警值寫入DS18B20
  108.         WriteOneByte(Alarm_Temp_HL[0]);//寫TH
  109.         WriteOneByte(Alarm_Temp_HL[1]);//寫TL
  110.         WriteOneByte(0x7f);//12位精度
  111.         Init_DS18B20();
  112.         WriteOneByte(0xcc);//跳過序列號(hào)
  113.         WriteOneByte(0x48);//將設(shè)定的溫度報(bào)警值寫入DS18B20
  114. }
  115. //設(shè)置液晶顯示位置
  116. void Set_LCD_POS(uchar p){
  117.         Write_LCD_Command(p|0x80);
  118. }
  119. //在LCD上顯示當(dāng)前溫度
  120. void Display_Temperature(){
  121.         uchar i;
  122.         uchar t=150;//延時(shí)值
  123.         uchar ng=0;//負(fù)數(shù)標(biāo)志
  124.         char Signed_Current_Temp;//如果為負(fù)數(shù)則取反加1,并設(shè)置負(fù)數(shù)標(biāo)識(shí)
  125.         if((Temp_Value[1]&0xf8)==0xf8){
  126.                 Temp_Value[1]=~Temp_Value[1];
  127.                 Temp_Value[0]=~Temp_Value[0]+1;
  128.                 if(Temp_Value[0]==0x00)Temp_Value[1]++;
  129.                 ng=1;//設(shè)負(fù)數(shù)標(biāo)識(shí)
  130.         }
  131. //查表得到溫度小數(shù)部分
  132.         Display_Digit[0]=df_Table[Temp_Value[0]&0x0f];
  133. //獲取溫度整數(shù)部分(無符號(hào))
  134.         CurrentT=((Temp_Value[0]&0xf0)>>4)|((Temp_Value[1]&0x07)<<4);
  135. //有符號(hào)的當(dāng)前溫度值,注意此處定義為char,其值可為-128~+127
  136.         Signed_Current_Temp=ng?-CurrentT:CurrentT;
  137. //高低溫報(bào)警標(biāo)志設(shè)置(與定義為char類型的Alarm_Temp_HL比較,這樣可區(qū)分正負(fù)比較)
  138.         HI_Alarm=Signed_Current_Temp>=Alarm_Temp_HL[0]?1:0;
  139.         LO_Alarm=Signed_Current_Temp<=Alarm_Temp_HL[1]?1:0;
  140. //將整數(shù)部分分解為三位待顯示數(shù)字
  141.         Display_Digit[3]=CurrentT/100;
  142.         Display_Digit[2]=CurrentT%100/10;
  143.         Display_Digit[1]=CurrentT%10;
  144. //刷新LCD顯示緩沖
  145.         Current_Temp_Display_Buffer[11]=Display_Digit[0]+'0';
  146.         Current_Temp_Display_Buffer[10]='.';
  147.         Current_Temp_Display_Buffer[9]=Display_Digit[1]+'0';
  148.         Current_Temp_Display_Buffer[8]=Display_Digit[2]+'0';
  149.         Current_Temp_Display_Buffer[7]=Display_Digit[3]+'0';
  150. //高位為0時(shí)不顯示
  151.         if(Display_Digit[3]==0)Current_Temp_Display_Buffer[7]=' ';
  152. //高位為0且次高位為0時(shí),次高位不顯示
  153.         if(Display_Digit[2]==0&&Display_Digit[3]==0)
  154.                 Current_Temp_Display_Buffer[8]=' ';
  155.         //負(fù)數(shù)符號(hào)顯示在恰當(dāng)位置
  156.         if(ng)
  157.         {
  158.                 if(Current_Temp_Display_Buffer[8]==' ')
  159.                         Current_Temp_Display_Buffer[8]='-';
  160.                 else if(Current_Temp_Display_Buffer[7]==' ')
  161.                         Current_Temp_Display_Buffer[7]='-';
  162.                 else Current_Temp_Display_Buffer[6]='-';
  163.         }
  164.         //在第一行顯示標(biāo)題
  165.         Set_LCD_POS(0x00);
  166.         for(i=0;i<16;i++)Write_LCD_Data(Temp_Disp_Title[ i]);
  167.         //在第二行顯示當(dāng)前溫度
  168.         Set_LCD_POS(0x40);
  169.         for(i=0;i<16;i++)Write_LCD_Data(Current_Temp_Display_Buffer[ i]);
  170.         //顯示溫度符號(hào)
  171.         Set_LCD_POS(0x4d);Write_LCD_Data(0x00);
  172.         Set_LCD_POS(0x4e);Write_LCD_Data('C');
  173. }
  174. //定時(shí)器中斷,控制警報(bào)聲音
  175. void T0_INT()interrupt 1{
  176.         TH0=-1000/256;
  177.         TL0=-1000%256;
  178.         BEEP=!BEEP;
  179.         if(++Time0_Count==400){
  180.                 Time0_Count=0;
  181.                 TR0=0;
  182.         }
  183. }
  184. //顯示報(bào)警溫度
  185. void Disp_Alarm_Temperature(){
  186.         uchar i,ng;
  187.         //顯示Alarm_Temp_HL數(shù)組中的報(bào)警溫度值
  188.         //由于Alarm_Temp_HL類型為char,故可以直接進(jìn)行正負(fù)比較
  189.         //高溫報(bào)警值
  190.         ng=0;
  191.         if(Alarm_Temp_HL[0]<0)//如果為負(fù)數(shù)則取反加1
  192.         {
  193.                 Alarm_Temp_HL[0]=~Alarm_Temp_HL[0]+1;
  194.                 ng=1;
  195.         }
  196.         //分解高溫各數(shù)位到待顯示串中
  197.         Alarm_HI_LO_STR[4]=Alarm_Temp_HL[0]/100+'0';
  198.         Alarm_HI_LO_STR[5]=Alarm_Temp_HL[0]/10%10+'0';
  199.         Alarm_HI_LO_STR[6]=Alarm_Temp_HL[0]%10+'0';
  200.         //屏蔽高位不顯示
  201.         if(Alarm_HI_LO_STR[4]=='0')Alarm_HI_LO_STR[4]=' ';
  202.         if(Alarm_HI_LO_STR[4]==' '&&Alarm_HI_LO_STR[5]=='0')
  203.                 Alarm_HI_LO_STR[5]=' ';
  204.         //"-"符號(hào)顯示
  205.         if(ng){
  206.                 if(Alarm_HI_LO_STR[5]==' ')Alarm_HI_LO_STR[5]='-';
  207.                 else if(Alarm_HI_LO_STR[4]==' ')Alarm_HI_LO_STR[4]='-';
  208.                 else Alarm_HI_LO_STR[3]='-';
  209.         }
  210.         //低溫報(bào)警值
  211.         ng=0;
  212.         if(Alarm_Temp_HL[1]<0)//如果為負(fù)數(shù)則取反加1
  213.         {
  214.                 Alarm_Temp_HL[1]=~Alarm_Temp_HL[1]+1;
  215.                 ng=1;
  216.         }
  217.         //分解高溫各數(shù)位到待顯示串中
  218.         Alarm_HI_LO_STR[12]=Alarm_Temp_HL[1]/100+'0';
  219.         Alarm_HI_LO_STR[13]=Alarm_Temp_HL[1]/10%10+'0';
  220.         Alarm_HI_LO_STR[14]=Alarm_Temp_HL[1]%10+'0';
  221.         //屏蔽高位不顯示
  222.         if(Alarm_HI_LO_STR[12]=='0')Alarm_HI_LO_STR[12]=' ';
  223.         if(Alarm_HI_LO_STR[12]==' '&&Alarm_HI_LO_STR[13]=='0')
  224.                 Alarm_HI_LO_STR[13]=' ';
  225.         //"-"符號(hào)顯示
  226.         if(ng){
  227.                 if(Alarm_HI_LO_STR[13]==' ')Alarm_HI_LO_STR[13]='-';
  228.                 else if(Alarm_HI_LO_STR[12]==' ')Alarm_HI_LO_STR[12]='-';
  229.                 else Alarm_HI_LO_STR[11]='-';
  230.         }
  231.         //顯示高低溫報(bào)警溫度值
  232.         Set_LCD_POS(0x00);//顯示標(biāo)題
  233.         for(i=0;i<16;i++)Write_LCD_Data(Alarm_Temp[ i]);
  234.         Set_LCD_POS(0x40);//顯示高低溫
  235.         for(i=0;i<16;i++)Write_LCD_Data(Alarm_HI_LO_STR[ i]);
  236. }
  237. void LCD_Initialise(){
  238.         Write_LCD_Command(0x38);DelayXus(5);
  239.         Write_LCD_Command(0x01);DelayXus(5);
  240.         Write_LCD_Command(0x06);DelayXus(5);
  241.         Write_LCD_Command(0x0c);DelayXus(5);
  242. }
  243. void main(){
  244.         LCD_Initialise();
  245.         IE=0x82;
  246.         TMOD=0x01;
  247.         TH0=-1000/256;
  248.         TL0=-1000%256;
  249.         TR0=0;
  250.         K1=1;
  251.         Set_Alarm_Temp_Value();
  252.         Read_Temperature();
  253.         Delay(50000);
  254.         Delay(50000);
  255.         while(1){
  256.                 if(K1==0)
  257.                 {
  258.                         //顯示報(bào)警溫度上下限
  259.                         Read_Temperature();
  260.                         Disp_Alarm_Temperature();
  261.                         DelayXus(100);
  262.                 }else
  263.                 {
  264.                 //正常顯示當(dāng)前溫度,越界時(shí)報(bào)警
  265.                                 Read_Temperature();
  266.                                 if(DS18B20_IS_OK){
  267.                                         if(HI_Alarm==1||LO_Alarm==1)TR0=1;
  268.                                                 else TR0=0;
  269.                                         Display_Temperature();
  270.                                 }
  271.                                 DelayXus(100);
  272.                 }
  273.         }
  274. }

復(fù)制代碼




作者: liuyiyi    時(shí)間: 2022-1-11 14:50
程序有錯(cuò)誤嗎




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1