八路溫度采集顯示系統(tǒng)設(shè)計(jì)_第1頁
八路溫度采集顯示系統(tǒng)設(shè)計(jì)_第2頁
八路溫度采集顯示系統(tǒng)設(shè)計(jì)_第3頁
八路溫度采集顯示系統(tǒng)設(shè)計(jì)_第4頁
八路溫度采集顯示系統(tǒng)設(shè)計(jì)_第5頁
已閱讀5頁,還剩61頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

摘要在實(shí)際生產(chǎn)和生活等各個領(lǐng)域中,溫度是環(huán)境因素不可或缺的一部分,對溫度進(jìn)行及時精確的控制和檢測顯得尤為重要。本次設(shè)計(jì)在控制成本的前提下,設(shè)計(jì)了一款高精度、可同時檢測八路溫度并由液晶顯示器對各路溫度值進(jìn)行顯示的溫度檢測顯示系統(tǒng)。該系統(tǒng)以AT89C51為控制核心,采用可編程單總線數(shù)字式溫度傳感器DS18B20進(jìn)行溫度采集,八路溫度值由LM041L液晶顯示器顯示。系統(tǒng)正常運(yùn)行時,其測溫范圍為-55℃~+125℃,該系統(tǒng)在現(xiàn)代電子工業(yè)飛速發(fā)展的時期有良好的應(yīng)用前景。關(guān)鍵詞:AT89C51;多路;溫度檢測;顯示AbstractTemperatureisanessentialofenvironmentalfactorsinouractualproduction,livingandmanyotherfields.It’sparticularlyimportanttocontrolanddetectthetemperaturepromptlyandexactly.Ithasdesignedahighprecisiontemperaturetestingsysteminthebaseoflostcontrol,whichcaninspecteightroutetemperatureatonetimeandshoweachrouteoftemperaturebyLCD.AT89C51isadoptedascontrolcoreinthissystem.ItssensorsfortemperatureissinglebusdigitalDS18B20,sendingtemperaturetoLM041LLCDtodisplay.Whenitoperatesnormally,it’stemperaturerangesfrom-55℃to+125℃,thesystemhasagoodapplicationprospectinthemordenperiodwhenelectronicsindustrydevelopingrapidly.Keywords:AT89C51;Manyroutes;TemperatureDetection;Display目錄TOC\o"1-2"\h\z\u摘要 DB7DB6DB5DB4DB3DB2DB1DB0清屏(并且光標(biāo)回原點(diǎn))0000000001光標(biāo)回原點(diǎn)000000001X進(jìn)入模式設(shè)定00000001I/DS顯示開關(guān)控制0000001DCB光標(biāo)或字符移位000001S/CR/LXX功能設(shè)定00001DLNFXX設(shè)置CGRAM地址00016位CGAM地址碼設(shè)置顯示地址0007位DDRAM地址碼讀忙標(biāo)志和地址計(jì)數(shù)器01BF7位當(dāng)前顯示地址碼向CGRAM/DDRAM寫數(shù)據(jù)108位數(shù)據(jù)從CGRAM/DDRAM讀數(shù)據(jù)118位數(shù)據(jù)表中X:任意二進(jìn)制數(shù)。I/D:顯示地址計(jì)數(shù)器模式選擇。I/D=1,選擇加1模式;I/D=0,選擇減1模式。D:顯示器開關(guān)控制位。D=1,顯示器ON;D=0,顯示器OFF。C:光標(biāo)開關(guān)控制位。C=1,光標(biāo)ON;C=0,光標(biāo)OFF。B:光標(biāo)閃爍開關(guān)控制位。B=1,光標(biāo)閃爍ON;B=0,光標(biāo)閃爍OFF。S/C:顯示器或光標(biāo)移位選擇。S/C=1,選擇顯示器移位;S/C=0,選擇光標(biāo)移位。R/L:移位方向選擇。R/L=1,向右移動;R/L=0,向左移動。DL:傳輸數(shù)據(jù)的有效位長度選擇。DL=1,有效位為8位;DL=0,有效位為4位。N:顯示器行數(shù)選擇位。N=1,選擇使用4行顯示器;N=0,選擇使用兩行顯示器。F:字符顯示塊的點(diǎn)陣選擇。F=1,選擇5×10點(diǎn)陣;F=0,選擇5×7點(diǎn)陣。BF:忙標(biāo)志位。BF=1,LCM處于忙狀態(tài);BF=0,LCM處于空閑狀態(tài)。CGRAM:字符發(fā)生器RAM。用戶自編成的字符或圖形存儲器。CDRAM:顯示數(shù)據(jù)RAM。4.3.2LM041L的程序流程圖及主要程序液晶顯示器在本系統(tǒng)擔(dān)任顯示的任務(wù),本系統(tǒng)采用的LM041L液晶顯示器可同時顯示八路溫度,可直觀的看到八路溫度實(shí)時的溫度情況,便于及時控制處理。LM041L為四行顯示,可分別定義每路溫度的顯示地址,每行顯示兩路。其程序流程圖如圖4.6所示。圖4.6LM041L的程序流程圖LM041L顯示程序如下。voidinit_lcd1602()//初始化LM041L{write_command(0x3f);delay(10);write_command(0x3f);delay(10);write_command(0x3f); //功能設(shè)定(8位,4行,5*7點(diǎn)陣式)delay(10);write_command(0x0c); //顯示器ON,光標(biāo)OFF,閃爍OFFdelay(10);write_command(0x06);//地址加1delay(10);write_command(0x01); //清除屏幕delay(10);}voidwrite_data(uchartempdata){ E=0; _nop_(); _nop_(); RS=1; _nop_(); RW=0; P1=tempdata; _nop_(); E=1; _nop_(); E=0; check_busy();}4.4報警模塊軟件設(shè)計(jì)雖然不同系統(tǒng)的報警電路有所差異,考慮核心是一樣的,本系統(tǒng)的報警模塊設(shè)計(jì)大致可分為三步進(jìn)行。(1)分別采樣被測八路溫度值;(2)與設(shè)定的溫度上下限值進(jìn)行比較;(3)當(dāng)有一路或幾路溫度超限時聲光報警。本系統(tǒng)分別用P3.3和P3.4端口作為報警端口,當(dāng)溫度超限時,兩端口便發(fā)出高低電平連續(xù)變換的脈沖,當(dāng)發(fā)光二極管和蜂鳴器接收到此脈沖時,發(fā)光二極管閃爍,蜂鳴器也發(fā)出聲音。用程序控制比較簡單,報警電路程序流程圖如圖4.7所示。圖4.7報警電路程序流程圖串行口與通信上位機(jī)主要程序如下。if((temp_data_h&0xf0)==0xf0) //如果溫度為負(fù) { temp_data_l=~temp_data_l; //負(fù)溫度將補(bǔ)碼轉(zhuǎn)成二進(jìn)制, if(temp_data_l==0xff) //取反再加1 { temp_data_l=temp_data_l+0x01; temp_data_h=~temp_data_h; temp_data_h=temp_data_h+0x01;} else {temp_data_l=temp_data_l+0x01; temp_data_h=~temp_data_h; }{if(temp<10) //溫度與下限(-10℃)比較,超限則報警 alarm_S=1,alarm_L=0; else alarm_S=0,alarm_L=1;}else //溫度為正{ if(temp>89) //溫度與上限值(90℃)比較,超限則報警 alarm_S=0,alarm_L=1; else alarm_S=1,alarm_L=0; }}4.5串行口上位機(jī)通信模塊軟件設(shè)計(jì)本次通訊中,測控系統(tǒng)分為上位機(jī)和下位機(jī)之間的通信,系統(tǒng)中單片機(jī)負(fù)責(zé)數(shù)據(jù)采集、處理和控制,上位機(jī)進(jìn)行現(xiàn)場可視化檢測,通信協(xié)議采用全雙工異步串行通信方式,通過RS232的RTS信號進(jìn)行收發(fā)轉(zhuǎn)換,將八路溫度值經(jīng)過轉(zhuǎn)換后送到上位機(jī)進(jìn)行通信,程序流程圖如圖4.8所示。圖4.8串行口程序流程圖串行口通信主要程序如下。voidsend_int(void)//串行口上位機(jī)通信{ TR1=1; //啟動定時器1 TMOD=0x20; //定時器1工作于8位自動重載模式,用于產(chǎn)生波特率 TH1=0xF3; //波特率2400 TL1=0xF3; SCON=0x50; //設(shè)定串行口工作方式 PCON&=0xef; } voidsend_str(charstr[]) //傳送字串{ uchari=0; send_int(); for(i=0;i<16;i++) { SBUF=str[i]; while(!TI); //等特?cái)?shù)據(jù)傳送 TI=0; } //清除數(shù)據(jù)傳送標(biāo)志 TR1=0; }5八路溫度采集顯示系統(tǒng)仿真調(diào)試及結(jié)果5.1Proteus與KeilμVision聯(lián)合仿真5.1.1Proteus與Keil4的鏈接設(shè)置KeilμVision4(簡稱Keil4)是德國Keil公司出品的51系列兼容單片機(jī)軟件開發(fā)系統(tǒng)。該系統(tǒng)支持C語言和匯編語言。Keil4界面友好,操作簡單。首先介紹Proteus與Keil4的鏈接設(shè)置[3]。(1)安裝Keil4和Proteus7.4sp3;(2)將Proteus7Professional\Models\VDM51.DLL復(fù)制到Keil4\C51\bin目錄下;(3)在Keil4\TOOLS.INI文件中的[C51]字段下添加:TDRV4=BIN\VDM5-1.DLL(“ProteusVSMSimulator”),并保存。其中TDRV4中的數(shù)字“4”可以任意;(4)在Proteus中繪制原理圖后,選取Debug|UseRemoteDebugMonitor選項(xiàng);(5)在Keil4中編輯程序完成后,選取Project|OptionsforTarget‘Target1’選項(xiàng),選擇Debug選項(xiàng)卡,選中ProteusVSMSimulator選項(xiàng)。單擊Setting按鈕,設(shè)置Host為127.0.0.1,Port為8000;(6)在Keil4中進(jìn)行Debug,同時在Proteus中查看結(jié)果。5.1.2在Keil4中編輯程序并生成“HEX”文件打開Keil4,選擇Project|NewProject命令,在彈出的CreateNewProject對話框中選擇目標(biāo)保存路徑,在“文件名”編輯框輸入工程名稱。單擊“保存”,在彈出的SelectDeviceforTarget‘Target1’對話框中雙擊Database框中的Atmel選項(xiàng),選擇AT89C51單片機(jī),按“確定”后,在隨后彈出的μVision4的對話框中選擇“是”。選擇File|New命令,新建一個文檔,然后保存。本設(shè)計(jì)采用C語言編寫程序,故輸入擴(kuò)展名為“.c”。保存文件后,Keil4會自動識別C語言程序中的關(guān)鍵字,并以不同的顏色顯示[35]。在Keil的編輯器里編寫源代碼,其源程序見附錄3。編寫程序完成后,雙擊Keil4左邊的ProjectWorkspace窗口中的Target1,然后右鍵單擊SourceGroup1文件夾,在快捷菜單中選擇AddFilestoGroup‘SourceGroup1’,在彈出的AddFilestoGroup‘SourceGroup1’對話框中選擇文件類型為CSourceFile類型,將編完的C語言程序文件添加到SourceGroup1中。在Keil4中是以工程的方式對文件進(jìn)行管理,為此需要將相關(guān)的目標(biāo)文件加入到工程之中。右鍵單擊ProjectWorkspace窗口中的Target1文件夾,在快捷菜單中選擇OptionsforTarget‘Target1’選項(xiàng)。在彈出的OptionsforTarget‘Target1’對話框中選擇Output選項(xiàng)卡,選中CreateHEXFile復(fù)選框以生成Proteus所需的十六進(jìn)制文件,如圖5.1所示,然后單擊“OK”按鈕。圖5.1OptionsforTarget對話框在Keil中選擇Project|Buildtarget命令,以產(chǎn)生目標(biāo)程序和HEX文件。如果編譯成功,則在OutputWindow子窗口中的Build選項(xiàng)頁中出現(xiàn)如圖5.2所示信息。如果編譯錯誤,則會在子窗口指示錯誤的語句。雙擊錯誤信息,光標(biāo)回自動指向錯誤的語句。圖5.2OutputWindow子窗口5.1.3在ProteusISIS中調(diào)試首先打開ProteusISIS,完成系統(tǒng)電路原理圖的繪制,電路原理圖見附錄2,圖中所用到的元器件清單見附錄1。雙擊U1即AT89C51,在彈出的EditComponent對話框ProgramFile一欄中選擇在Keil中產(chǎn)生的Ds18B20_8.Hex文件,如圖5.3所示。單擊“OK”按鈕。按Ctrl+S保存設(shè)計(jì)。圖5.3EditComponent對話框5.2Proteus與Keil聯(lián)合仿真結(jié)果在Proteus中打開已經(jīng)繪制好的電路原理圖,前面程序已經(jīng)加載成功,所以只要單擊菜單欄中的Debug|Start/RestartDebugging命令,或者按快捷鍵Ctrl+F12運(yùn)行。系統(tǒng)正常啟動后,液晶顯示器可同時將八路溫度顯示出來,當(dāng)我們調(diào)節(jié)DS18B20的溫度值時,顯示溫度隨著采集到溫度值的變化立馬變換,能夠準(zhǔn)確無誤的顯示每一路溫度值,顯示效果良好,可視性好,如圖5.4所示。圖5.4LCD顯示結(jié)果然后我們校對一下連接在單總線上的八個DS18B20溫度傳感器的溫度值是否與顯示溫度一一對應(yīng),如圖5.5所示,各路溫度值分別為:A:-15℃;B:-10℃;C:0℃;D:10℃;E:20.5℃;F:40.5℃;G:80℃;H:100.5℃。圖5.5DS18B20采集溫度值在系統(tǒng)正常運(yùn)行時,串行口上位機(jī)通信正常,可以將數(shù)據(jù)順利送至上位機(jī),且更新數(shù)據(jù)速度快,傳輸數(shù)據(jù)準(zhǔn)確無誤,如圖5.6所示。圖5.6串行口送上位機(jī)數(shù)據(jù)當(dāng)某一路溫度值超過溫度上線(90℃)或溫度下限(-10℃)時,報警電路開始工作,發(fā)光二極管閃亮,蜂鳴器發(fā)出聲音,如圖5.7所示。圖5.7報警電路工作狀態(tài)結(jié)論本系統(tǒng)設(shè)計(jì)簡單,性能穩(wěn)定,為以后能夠通過單片機(jī)編程進(jìn)行各種功能的擴(kuò)展,還增加了片外程序存儲器的擴(kuò)展。用數(shù)字式溫度傳感器DS18B20對溫度進(jìn)行采集,輸出數(shù)字量與單片機(jī)直接通訊,無需外加A/D轉(zhuǎn)換器,在降低了成本的同時簡化了系統(tǒng)的電路,提高了系統(tǒng)的集成度,使用更加方便。采用LM041L液晶顯示器對八路溫度進(jìn)行顯示,顯示效果好且連接方便,通過程序定義顯示地址,16字×4行的屏幕顯示可以將八路溫度同時顯示在屏幕上,當(dāng)有某一路或謀幾路溫度超限時,可立即觀察到是哪一路或哪幾路溫度超限,從而可以及時準(zhǔn)確的控制該路溫度回到限定范圍內(nèi)。報警電路采用紅色發(fā)光二極管閃爍報警和蜂鳴器聲響報警,由于紅色能更加引起人們的警覺,所以報警電路的應(yīng)用能更好的減少了生產(chǎn)工業(yè)方面由于溫度過高或過低而未能及時控制帶來的損失。串行口通信將數(shù)據(jù)準(zhǔn)確無誤的傳送到上位機(jī),更能適應(yīng)當(dāng)代計(jì)算機(jī)普遍應(yīng)用的時代,在通信成功的前提下配之合理的人機(jī)對話界面,使系統(tǒng)更加人性化、智能化。利用Proteus與KEIL聯(lián)合仿真對單片機(jī)八路溫度采集顯示系統(tǒng)進(jìn)行了仿真設(shè)計(jì),可以極大地簡化單片機(jī)程序在目標(biāo)硬件上的調(diào)試工作,大幅度節(jié)省制作電路板的時間,對于提高產(chǎn)品的開發(fā)效率、降低開發(fā)成本等有重要作用。從調(diào)試結(jié)果看,八路溫度都準(zhǔn)確無誤的顯示在液晶顯示屏上,當(dāng)有溫度超限時,報警電路立即工作,報警靈敏度高,當(dāng)控制溫度回到限定范圍內(nèi)時,立即停止報警。串行口通信也工作正常,傳送數(shù)據(jù)速度快,精確度高。經(jīng)調(diào)試驗(yàn)證,本系統(tǒng)已基本完成任務(wù)要求,達(dá)到了預(yù)期目的,在以后的生產(chǎn)生活中有較好的應(yīng)用前景。參考文獻(xiàn)張俊謨.單片機(jī)中級教程——原理與應(yīng)用[M].北京:北京航空航天大學(xué)出版社,2008.陳立周,陳宇.單片機(jī)原理及應(yīng)用[M].北京:機(jī)械工業(yè)出版社,2008.蔣輝平,周國雄.基于Proteus的單片機(jī)系統(tǒng)設(shè)計(jì)與仿真實(shí)例[M].北京:機(jī)械工業(yè)出版社,2009.張克弄.?dāng)?shù)字電子技術(shù)基礎(chǔ)[M].北京:高等教育出版社,2003.梁賀青.增強(qiáng)核內(nèi)存80C51教程[M].北京:電子工業(yè)出版社,2003.高峰.單片微機(jī)應(yīng)用系統(tǒng)設(shè)計(jì)及應(yīng)用技術(shù)[M].北京:機(jī)械工業(yè)出版社,2004.張迎新.單片機(jī)原理及應(yīng)用[M].北京:電子工業(yè)出版社,2004.杜樹春.單片機(jī)C語言編程MCS-51單片機(jī)原理與應(yīng)用[M].北京:北京航空航天大學(xué)出版社,2006.胡偉,季曉衡.單片機(jī)C程序設(shè)計(jì)及應(yīng)用實(shí)例[M].北京:人民郵電出版社,2003.張靖武.單片機(jī)系統(tǒng)的PROTEUS設(shè)計(jì)與仿真[M].北京:電子工業(yè)出版社,2007.范風(fēng)強(qiáng),蘭嬋麗.單片機(jī)語言C51應(yīng)用實(shí)踐集錦[M].北京:電子工業(yè)出版社,2003.林志琦,等.基于Proteus的單片機(jī)可視化軟硬件仿真[M].北京:北京航空航天大學(xué)出版社,2006.石東海.單片機(jī)數(shù)據(jù)通信技術(shù)從入門到精通[M].西安:西安電子科技大學(xué)出版社,2002.周潤景,張麗娜.基于PROTUES的電路及單片機(jī)系統(tǒng)設(shè)計(jì)與仿真[M].北京:北京航空航天大學(xué)出版社,2006.求是科技.單片機(jī)通信技術(shù)與工程實(shí)踐[M].北京:人民郵電出版社,2005.秦曉梅,陳育斌.單片機(jī)原理綜合實(shí)驗(yàn)教程[M].大連:大連理工大學(xué)出版社,2004.嚴(yán)天峰.單片機(jī)應(yīng)用系統(tǒng)設(shè)計(jì)與仿真調(diào)試[M].北京:北京航空航天大學(xué)出版社,2005.張培仁.基于C語言編程MCS-51單片機(jī)原理與應(yīng)用[M].北京:清華大學(xué)出版社,2002.趙文博,劉文濤.單片機(jī)語言C51程序設(shè)計(jì)[M].北京:人民郵電出版社,2003.DallasSemiconductorCorporation.DS2430A256-Bit1-WireEEPROM.DallasSemiconductorcorporation.李光飛,等.單片機(jī)課程設(shè)計(jì)實(shí)例指導(dǎo)[M].北京:北京航空航天大學(xué)出版社,2004.求實(shí)科技.單片機(jī)典型外圍器件及應(yīng)用實(shí)例[M].北京:人民郵電出版社,2005.沙占友,等.單片機(jī)外圍電路設(shè)計(jì)[M].北京:電子工業(yè)出版社,2006.AtmelCorporation.Two-WireSerialEEPROM-AT24C1024.AtmelCorporation.TexasInstrumentsIncorporated.TLC543-EP12-BitAnalog-to-DigitalConverterswithSerialControland11AnalogInputs.TexasInstrumentsIncorporated,2002.饒連周.MCS-51單片機(jī)系統(tǒng)中存儲器的擴(kuò)展技術(shù)[J].三明職業(yè)大學(xué)學(xué)報,1999,(S3).宋丹.多路溫度巡檢系統(tǒng)的設(shè)計(jì)與應(yīng)用[J].自動化與儀表,2008,(09).韋哲.程自峰.數(shù)字溫度傳感器DS18B20在體溫檢測中的應(yīng)用[J].醫(yī)療裝備,2005,(04).楊丙聰,許忠仁,劉曉峰.基于AT89S52單片機(jī)的智能溫度控制器的設(shè)計(jì)[J].測控技術(shù),2007(10).周功明.基于AT89C2051單片機(jī)的防盜自動報警電子密碼鎖系統(tǒng)的設(shè)計(jì)[J].安防科技,2007(09).張繼輝.基于AT89C51單片機(jī)的多路自動循環(huán)檢測報警控制器[N].電子報,2009-10.田家淑.AT89S51/52單片機(jī)簡易編程器[N].電子報,2009-02-15.晏文靖.基于DS18B20的溫度測量裝置[J].科技信息,2009,(33):98-99.程海嬰.基于DS18B20糧倉溫濕度智能控制系統(tǒng)[J].知識經(jīng)濟(jì),2010,(01):117-118.彭小峰,雷李,張里.基于Proteus和Keil的整合構(gòu)建單片機(jī)虛擬實(shí)驗(yàn)室[J].重慶工學(xué)院學(xué)報(自然科學(xué)版),2007,(04).徐紅,權(quán)斌.關(guān)于8031單片機(jī)擴(kuò)展多片外部程序存儲器地址問題的探討[J].西安工程學(xué)院學(xué)報,1998,(03).王國慶,于富強(qiáng).單片機(jī)應(yīng)用系統(tǒng)大容量外部數(shù)據(jù)存儲器的擴(kuò)展[J].河北師范大學(xué)學(xué)報,1998,(04).易麗華,黃俊.基于AT89C51單片機(jī)與DS18B20的溫度測量系統(tǒng)[J].電子與封裝2009,(05).楊世成.信號放大電路[M].北京:電子工業(yè)出版社,2002.DallasSemiconductorCorporation.DS18B20ProgrammableResolution1-WireDigitalThermometer.DallasSemiconductorCorporation.JohnG,Kassakian.PrinciplesofPowerElectronics.AddisonWesleypublishingcompany,1991.MSP430x4xxFamilyUser'sGuide-slau056c.TexasInstruments[EB/OL],2003.JeffersonC.Boyce.DigitalLogicandSwitchingCircuits:OperationandAnalysis.Prentice-Hall,1975.Viasala.InstruetionManualforHumidityProbeHMP21.V1997,5.BarryB.Brey.TheIntelMicroprocessors8086/8088,80486,PentiumandpentiunmproprocessorArchitecture,ProgrammingandIn-interfacing.NewJersey:PrenticeHall,1997.D·M·Ausla“der,MicroProces”UrsforMeasurementandControl,1979.ProteusKeilJ2005(8):21-24.毛德平,凌有濤.一種基于RS485總線的溫度、濕度測控系統(tǒng)[J].現(xiàn)代電子技術(shù),2007,(02):168-170.王志鵬.可編程邏輯器原理與程序設(shè)計(jì)[M].北京:北京航天航空出版社,2005.彭為,黃科,雷道仲.單片機(jī)典型系統(tǒng)設(shè)計(jì)實(shí)例精講[M].北京:電子工業(yè)出版社,2006:116-134.附錄1系統(tǒng)仿真所用元器件清單元件名稱所屬類所屬子類AT89C51MicroprocessorICs8051FamilyCAPCapacitorsGenericCAP-ELECCapacitorsGenericCAP-POLCapacitorsGenericCRYSTALMiscellaneous—RESResistorsGenericMAX232MicroprocessorICsPeripheralsCONN-D9FConnectorsD-TypeBUTTONSwitches&RelaysSwitchesLED-REDActive—SOUNDERSpeakers&Sounders—74HC373TTL74HCseriesFlip-Flops&Latches2764MemoryICsEPROMDS18B20DataConvertersTemperaturesSensorsLM041LOptoelectronicsAlphanumericLCDs附錄2系統(tǒng)仿真C語言程序清單#include<reg51.h>#include<intrins.h>#defineucharunsignedcharsbitRS=P3^5; //定義LCD端口sbitRW=P3^6;sbitE=P3^7;sbitDQ=P3^2; //定義DS18B20單總線端口sbitalarm_S=P3^3; //定義報警端口sbitalarm_L=P3^4;ucharLCD_3;ucharLCD_2;ucharLCD_1;ucharLCD_0;uchards18b20_romA[8]={0x8e,0x00,0x00,0x00,0xb8,0xc5,0x30,0x28};//八個DS18B20的64位ROM地址uchards18b20_romB[8]={0x52,0x00,0x00,0x00,0xb8,0xc5,0x34,0x28};uchards18b20_romC[8]={0x65,0x00,0x00,0x00,0xb8,0xc5,0x35,0x28};uchards18b20_romD[8]={0x3c,0x00,0x00,0x00,0xb8,0xc5,0x36,0x28};uchards18b20_romE[8]={0xB9,0x00,0x00,0x00,0xb8,0xc5,0x31,0x28};uchards18b20_romF[8]={0xE0,0x00,0x00,0x00,0xb8,0xc5,0x32,0x28};uchards18b20_romG[8]={0xD7,0x00,0x00,0x00,0xb8,0xc5,0x33,0x28};uchards18b20_romH[8]={0x0B,0x00,0x00,0x00,0xb8,0xc5,0x37,0x28};ucharLCDData[]="0123456789";uchardot_tab[]="0112334456678899";ucharcodestr[]="TEMPERATURE:";ucharcodestr2[]="Designedby06c";ucharcodestr3[]="ekong'sZouJie";ucharidatafirst_line[]="A:000.0B:000.0"; //LCD第一行顯示緩存數(shù)組ucharidatasecond_line[]="C:000.0D:000.0"; //LCD第二行顯示緩存數(shù)組ucharidatathird_line[]="E:000.0F:000.0"; //LCD第三行顯示緩存數(shù)組ucharidataforth_line[]="G:000.0H:000.0"; //LCD第四行顯示緩存數(shù)組//************************************//延時程序//************************************voiddelay(unsignedintN){ unsignedinti; for(i=0;i<N;i++);}//************************************ //LM041L測忙 //************************************voidcheck_busy(void){ while(1) { P1=0xff; E=0; _nop_(); RS=0; _nop_(); _nop_(); RW=1; _nop_(); _nop_(); E=1; _nop_(); _nop_(); _nop_(); _nop_(); if((P1&0x80)==0) { break; } E=0; }}//************************************//LM041L寫命令//************************************voidwrite_command(uchartempdata){ E=0; _nop_(); _nop_(); RS=0; _nop_(); _nop_(); RW=0; P1=tempdata; _nop_(); _nop_(); E=1; _nop_(); _nop_(); E=0; _nop_(); check_busy();}//************************************//LM041L寫數(shù)據(jù)//************************************voidwrite_data(uchartempdata){ E=0; _nop_(); _nop_(); RS=1; _nop_(); _nop_(); RW=0; P1=tempdata; _nop_(); _nop_(); E=1; _nop_(); _nop_(); E=0; _nop_(); check_busy();}//************************************//初始化LM041L//************************************voidinit_lcd1602(){ write_command(0x3f); delay(10); write_command(0x3f); delay(10); write_command(0x3f); //功能設(shè)定(8位,4行,5*7點(diǎn)陣式)delay(10);write_command(0x0c); //顯示器ON,光標(biāo)OFF,閃爍OFFdelay(10);write_command(0x06); //地址加1delay(10); write_command(0x01); //清除屏幕delay(10);}//************************************//初始化ds18b20 //************************************bitresetpulse(void){ DQ=0; delay(40); //延時500us DQ=1; delay(4); //延時60us return(DQ); //讀取P1.0的狀態(tài)}voidds18b20_init(void){ while(1) { if(!resetpulse()) //收到ds18b20的應(yīng)答信號 { DQ=1; delay(40); //延時240us break; } else resetpulse(); //否則再發(fā)復(fù)位信號 }}//************************************//讀ds18b20一位//************************************ucharread_bit(void){ DQ=0; _nop_(); _nop_(); DQ=1; delay(2); return(DQ);}//************************************//讀ds18b20一個字節(jié)//************************************ucharread_byte(void){ uchari,m,receive_data; m=1; receive_data=0; for(i=0;i<8;i++) { if(read_bit()) { receive_data=receive_data+(m<<i); } delay(7); } return(receive_data);}//************************************//向ds18b20寫一位//************************************voidwrite_bit(ucharbitval){ DQ=0; if(bitval==1) DQ=1; delay(5); DQ=1;}//************************************//向DS18B20寫一個字節(jié)命令//************************************voidwrite_byte(ucharval){ uchari,temp; for(i=0;i<8;i++) { temp=val>>i; temp=temp&0x01; write_bit(temp); delay(5); }}//*************************************//64位的ROM序列號匹配 //*************************************bitmatch_rom(uchar*rom){ uchari; ds18b20_init(); write_byte(0x55); for(i=8;i>0;i--) { write_byte(*(rom+i-1)); } return1;}//************************************//從ds18b20中讀出64位序列號 //************************************/*uchar*read_rom(void){ ucharrom[8],i; ds18b20_init(); write_byte(0x33); for(i=8;i>0;i--) { rom[i-1]=read_byte(); } return&rom[0];}*/ //*************************************//將64位序列號顯示在LCD上顯示出來//*************************************/*voidprint_char(uchara){ if(a>=0&&a<=9) write_data(a+0x30); elseif(a>=0x0a&&a<=0x0f) write_data(a+0x37);}*///*************************************//溫度轉(zhuǎn)換,將從ds18b20中讀出來的溫度值轉(zhuǎn)化成十進(jìn)制的溫度值//并存放顯示緩存并檢測溫度是否超限,超限則報警//*************************************voidconvert_T(uchartemp_data_h,uchartemp_data_l){ uchartemp; alarm_S=0; alarm_L=0;if((temp_data_h&0xf0)==0xf0) //如果溫度寄存器里的高位為1, { //則溫度為負(fù) temp_data_l=~temp_data_l; //負(fù)溫度將補(bǔ)碼轉(zhuǎn)成二進(jìn)制, if(temp_data_l==0xff) //取反再加1 { temp_data_l=temp_data_l+0x01; temp_data_h=~temp_data_h; temp_data_h=temp_data_h+0x01; } else { temp_data_l=temp_data_l+0x01; temp_data_h=~temp_data_h;} LCD_0=dot_tab[temp_data_l&0x0f]; //查表得小數(shù)位的值 temp=((temp_data_l&0xf0)>>4)|((temp_data_h&0x0f)<<4); LCD_3='-'; //顯示"-"號 LCD_2=LCDData[(temp%100)/10]; //查表得負(fù)溫度溫度十位 LCD_1=LCDData[(temp%100)%10]; //查表得負(fù)溫度個位 if(temp<10) //溫度與下限(-10℃)比較,超限則報警 alarm_S=0,alarm_L=0; else alarm_S=1,alarm_L=~alarm_L; }else //溫度為正{ LCD_0=dot_tab[temp_data_l&0x0f]; //查表得小數(shù)位的值 temp=((temp_data_l&0xf0)>>4)|((temp_data_h&0x0f)<<4); LCD_3=LCDData[temp/100]; //查表得溫度百位 LCD_2=LCDData[(temp%100)/10]; //查表得溫度十位 LCD_1=LCDData[(temp%100)%10]; //查表得溫度個位 if(temp>89) //溫度與上限值(90℃)比較,超限則報警 alarm_S=1,alarm_L=~alarm_L; else alarm_S=0,alarm_L=0; }}//*************************************************//顯示八路溫度//*************************************************voiddisplay(void){uchari; write_command(0x80); for(i=0;i<16;i++) { write_data(first_line[i]); } write_command(0xC0); for(i=0;i<16;i++) { write_data(second_line[i]); } write_command(0x90); for(i=0;i<16;i++) { write_data(third_line[i]); } write_command(0xD0); for(i=0;i<16;i++) { write_data(forth_line[i]); }}//*********************************************//串行口上位機(jī)通信//********************************************* voidsend_int(void){ TR1=1; //啟動定時器1 TMOD=0x20; //定時器1工作于8位自動重載模式,用于產(chǎn)生波特率 TH1=0xF3; //波特率2400 TL1=0xF3; SCON=0x50; //設(shè)定串行口工作方式 PCON&=0xef; //波特率不倍增 delay(5000); } voidsend_str(charstr[]) //傳送字串{ uchari=0; send_int(); for(i=0;i<16;i++) { SBUF=str[i]; while(!TI); //等特?cái)?shù)據(jù)傳送 TI=0; //清除數(shù)據(jù)傳送標(biāo)志 } TR1=0; delay(6000);}//***************************************************//主函數(shù)//***************************************************voidmain(void){ uchartemp_data_l,temp_data_h; /*uchar*ds18b20_rom;*/ init_lcd1602(); send_str(str2); //向串行口發(fā)送作者信息 send_str(str3); send_str("\n\r"); delay(6000); /*while(1) { uchari; ds18b20_rom=read_rom(); //讀序列號 write_command(0x80); for(i=0;i<8;i++) { ds18b20_romA[i]=*ds18b20_rom; ds18b20_rom++; } write_command(0x80); for(i=0;i<8;i++) //顯示序列號 { print_char(ds18b20_romA[i]/16); print_char(ds18b20_romA[i]%16); } }*/ while(1) { ds18b20_init(); write_byte(0xcc); write_byte(0x44); //啟動溫度轉(zhuǎn)換 delay(600); match_rom(ds18b20_romA); //匹配第一路 write_byte(0xbe); //讀溫度 temp_data_l=read_byte(); //溫度低8位 temp_data_h=read_byte(); //溫度高8位 convert_T(temp_data_h,temp_data_l); first_line[2]=LCD_3; //溫度轉(zhuǎn)換后的各位 first_line[3]=LCD_2; //分別存入顯示緩存數(shù)組中 first_line[4]=LCD_1; first_line[6]=LCD_0; match_rom(ds18b20_romB); //匹配第二路 write_byte(0xbe); //讀溫度 temp_data_l=read_byte(); //溫度低8位 temp_data_h=read_byte(); //溫度高8位 convert_T(temp_data_h,temp_data_l); first_line[10]=LCD_3; //溫度轉(zhuǎn)換后的各位 first_line[11]=LCD_2; //分別存入顯示緩存數(shù)組中 first_line[12]=LCD_1; first_line[14]=LCD_0; display(); match_rom(ds18b20_romC); //匹配第三路 write_byte(0xbe); //讀溫度 temp_data_l=read_byte(); //溫度低8位 temp_data_h=read_byte(); //溫度高8位 convert_T(temp_data_h,temp_data_l); second_line[2]=LCD_3; //溫度轉(zhuǎn)換后的各位 second_line[3]=LCD_2; //分別存入顯示緩存數(shù)組中 second_line[4]=LCD_1; second_line[6]=LCD_0; match_rom(ds18b20_romD); //匹配第四路 write_byte(0xbe); //讀溫度 temp_data_l=read_byte(); //溫度低8位 temp_data_h=read_byte(); //溫度高8位 convert_T(temp_data_h,temp_data_l); second_line[10]=LCD_3; //溫度轉(zhuǎn)換后的各位 second_line[11]=LCD_2; //分別存入顯示緩存數(shù)組中 second_line[12]=LCD_1; second_line[14]=LCD_0; display(); send_str(first_line); //往串行口發(fā)送第一行和第二行溫度 send_str(second_line); send_str("\n\r"); delay(100);match_rom(ds18b20_rom

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論