版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
課題二:基于AT89C51單片機(jī)的數(shù)顯溫度傳感器設(shè)計(jì)一、設(shè)計(jì)目的1、掌握51單片機(jī)最小系統(tǒng)的設(shè)計(jì);2、掌握溫度傳感器DS18B20的使用;3、掌握C51的編程方式。設(shè)計(jì)任務(wù)與規(guī)定基于AT89C51單片機(jī)的數(shù)顯溫度傳感器設(shè)計(jì)重要具有如下功能,具體規(guī)定如下:溫度傳感器DS18B20檢測環(huán)境溫度。用4位數(shù)碼管顯示溫度;設(shè)定一個(gè)溫度,當(dāng)檢測的溫度達(dá)成這個(gè)設(shè)定值時(shí),用蜂鳴器實(shí)現(xiàn)報(bào)警。設(shè)計(jì)環(huán)節(jié)根據(jù)課題,查閱相關(guān)資料。畫出系統(tǒng)原理框圖,擬定基本電路。(電路圖不能在Protuse里畫,在A4紙上或者用DXP畫電路圖)在Protuse里進(jìn)行仿真。(仿真結(jié)果出來后,才發(fā)放元件)按電路原理圖在板子上焊接電路。調(diào)試硬件。撰寫電子綜合設(shè)計(jì)報(bào)告:字?jǐn)?shù)約2023~3000字(不涉及程序清單),格式見附件2)。最后一個(gè)下午,制作PPT進(jìn)行答辯。題目二:基于AT89C51單片機(jī)的數(shù)顯溫度傳感器設(shè)計(jì)元件名稱型號數(shù)量單片機(jī)最小開發(fā)板STC89C521溫度傳感器DS18B201三極管88501蜂鳴器1LED紅1電阻10k、3k、2k、1k、510、330各5各2位一體數(shù)碼管共陽2AC/DC(5V/1A)電源1單排插針402雙排插針4029X15cm萬用板(3連孔)1杜邦線15附件2:單片機(jī)原理及其應(yīng)用課程設(shè)計(jì)設(shè)計(jì)報(bào)告格式成績:重慶大學(xué)城市科技學(xué)院電氣學(xué)院基于AT89C51單片機(jī)的數(shù)顯溫度傳感器設(shè)計(jì)報(bào)告一、設(shè)計(jì)目的作用本設(shè)計(jì)是一款簡樸實(shí)用的小型數(shù)字溫度計(jì),所采用的重要元件有傳感器DS18B20,單片機(jī)AT89C52,四位共陰極數(shù)碼管一個(gè),電容電阻若干。DS18B20支持“一線總線”接口,測量溫度范圍-55°℃——+125°℃。在-10℃——+85°℃范圍內(nèi),精度為±0.5°℃。18B20的精度較差,為±2°℃。現(xiàn)場溫度直接以“一線總線”的數(shù)字方式傳輸,大大提高了系統(tǒng)的抗干擾性。適合于惡劣環(huán)境的現(xiàn)場溫度測量,如:環(huán)境控制、設(shè)備或過程控制、測溫類消費(fèi)電子產(chǎn)品等。本次數(shù)字溫度計(jì)的設(shè)計(jì)共分為五部分,主控制器,LED顯示部分,傳感器部分,復(fù)位部分,按鍵設(shè)立部分,時(shí)鐘電路。主控制器即單片機(jī)部分,用于存儲程序和控制電路;LED顯示部分是指四位共陰極數(shù)碼管,用來顯示溫度;傳感器部分,即溫度傳感器,用來采集溫度,進(jìn)行溫度轉(zhuǎn)換;復(fù)位部分,即復(fù)位電路,按鍵部分用來設(shè)立上下限報(bào)警溫度。測量的總過程是,傳感器采集到外部環(huán)境的溫度,并進(jìn)行轉(zhuǎn)換后傳到單片機(jī),通過單片機(jī)解決判斷后將溫度傳遞到數(shù)碼管顯示。二、設(shè)計(jì)規(guī)定基于AT89C51單片機(jī)的數(shù)顯溫度傳感器設(shè)計(jì)重要具有如下功能,具體規(guī)定如下:(1).溫度傳感器DS18B20檢測環(huán)境溫度。(2).用兩個(gè)2位一體共陽數(shù)碼管顯示溫度;(3).通過按鍵開關(guān)設(shè)定一個(gè)上限溫度和一個(gè)下限溫度,當(dāng)檢測的溫度達(dá)成這個(gè)設(shè)定值時(shí),用蜂鳴器實(shí)現(xiàn)報(bào)警,同時(shí)LED燈閃爍。三、設(shè)計(jì)的具體實(shí)現(xiàn)1、設(shè)計(jì)原理用溫度傳感器,在單片機(jī)電路設(shè)計(jì)中,大多都是使用傳感器,所以這是非常容易想到的,所以可以采用一只溫度傳感器DS18B20,此傳感器,可以很容易直接讀取被測溫度值,進(jìn)行轉(zhuǎn)換,就可以滿足設(shè)計(jì)規(guī)定。(DS18B20數(shù)字溫度傳感器具有單總線的獨(dú)特優(yōu)點(diǎn),可以使用戶輕松地組建起傳感器網(wǎng)絡(luò),并可使多點(diǎn)溫度測量電路變得簡樸、可靠,所以在該設(shè)計(jì)中采用DS18B20數(shù)字溫度傳感器測量溫度。)實(shí)驗(yàn)名稱是“基于AT89C51單片機(jī)的數(shù)顯溫度傳感器設(shè)計(jì)”,涉及到MCS-51系列的單片機(jī),我們一方面有設(shè)計(jì)一個(gè)能使單片機(jī)工作的最小系統(tǒng),然后溫度傳感器將實(shí)時(shí)溫度值送給單片機(jī),通過對單片機(jī)進(jìn)行軟件編程實(shí)現(xiàn)數(shù)據(jù)解決,然后送給LED共陰數(shù)碼管顯示,在對單片機(jī)編程時(shí)要考慮到要使得能通過按鍵開關(guān)設(shè)立上限報(bào)警溫度及下限報(bào)警溫度,通過蜂鳴器報(bào)警,在報(bào)警的同時(shí)LED燈同步閃爍。設(shè)計(jì)任務(wù)書中已給出了元件清單,但是我們需要在軟件中對自己設(shè)計(jì)的電路進(jìn)行仿真我們還需要畫出單片機(jī)的最小系統(tǒng)電路。總體電路結(jié)構(gòu)框圖所示:共陽數(shù)碼管顯示模塊AT89C51單片機(jī)共陽數(shù)碼管顯示模塊AT89C51單片機(jī)單片機(jī)時(shí)鐘電路及復(fù)位電路單片機(jī)時(shí)鐘電路及復(fù)位電路DSDS18BB20溫度傳感器模塊蜂鳴器報(bào)警及LED顯示模塊蜂鳴器報(bào)警及LED顯示模塊按鍵控制模塊按鍵控制模塊電源電源2、系統(tǒng)設(shè)計(jì)(具體介紹各單元電路的選擇、設(shè)計(jì)及工作原理分析,并介紹有關(guān)參數(shù)的計(jì)算及元器件參數(shù)的選擇等,規(guī)定有原理圖。)(1)、硬件設(shè)計(jì)硬件電路設(shè)計(jì)通過單片機(jī)仿真軟件Proteus8.0進(jìn)行原理圖的編輯,根據(jù)實(shí)驗(yàn)規(guī)定及所給出的元件設(shè)計(jì)出如下電路原理圖,并進(jìn)行了仿真時(shí)鐘及復(fù)位模塊實(shí)驗(yàn)所給的元件中直接已給出了AT89C51的最小系統(tǒng)板,但是我們在設(shè)計(jì)電路時(shí)還是你需要畫出該部分電路,時(shí)鐘復(fù)位為能使單片機(jī)工作的最簡樸的電路,又稱最小系統(tǒng)。具體實(shí)驗(yàn)電路如下:時(shí)鐘電路有12MHz的晶振及兩個(gè)20~30PF的瓷片電容(無極性)連接在單片機(jī)的XTAL1及XTAL2連個(gè)端口;復(fù)位電路由10K的電阻,10UF電解電容(有極性)以及按鍵開關(guān)組成,接在單片機(jī)的RST口。當(dāng)系統(tǒng)出現(xiàn)故障錯(cuò)誤,我想讓系統(tǒng)恢復(fù)初始化狀態(tài)可以通過對按動(dòng)按鍵開關(guān)實(shí)現(xiàn)對電容的充放電從而實(shí)現(xiàn)系統(tǒng)的復(fù)位。蜂鳴器報(bào)警及LED顯示模塊蜂鳴器用于當(dāng)溫度傳感器的輸入的溫度數(shù)值大于認(rèn)為設(shè)定的上限溫度或者小于下限溫度時(shí),系統(tǒng)會給出相應(yīng)的信號使得蜂鳴器發(fā)出聲音同時(shí)讓LED燈閃爍顯示,從聽覺和視覺上同時(shí)提出報(bào)警信號。電路圖如下:蜂鳴器由一個(gè)PNP型的三極管驅(qū)動(dòng)接在單片機(jī)的P1.0口,當(dāng)P1.0口輸出低電平是蜂鳴器發(fā)出聲音;LED燈正極通過1K的電阻上拉接Vcc,負(fù)極接在單片機(jī)的P1.1口,當(dāng)系統(tǒng)在P1.1口輸出低電平時(shí)LED燈亮。共陽數(shù)碼管顯示顯示模塊實(shí)驗(yàn)給出的數(shù)碼管為2位一體共陽的數(shù)碼管,在實(shí)驗(yàn)顯示中我們需要四個(gè)數(shù)碼管去顯示相應(yīng)的溫度,所以采用兩個(gè)2位一體共陽數(shù)碼管并聯(lián)當(dāng)做一個(gè)4位一體的共陽數(shù)碼管。電路原理圖如下:數(shù)碼管的使用設(shè)計(jì)到了段選及位選,我們把段選接在單片機(jī)的P0口,位選接在數(shù)碼管的P2.4~P2.7口,需要注意的是此數(shù)碼管為共陽的,所以P0口輸出的低電平完全可以驅(qū)動(dòng)數(shù)碼管的段選顯示,但是位選輸出高電平局限性以驅(qū)動(dòng)數(shù)碼管顯示導(dǎo)致數(shù)碼管的亮度不夠,此時(shí)我們需要在數(shù)碼管的位選段接上相應(yīng)的1K的上拉電阻,這樣數(shù)碼管的亮度就可以明顯的得到提高。DS18BB20溫度傳感器模塊DS18B20溫度傳感器是美國DALLAS半導(dǎo)體公司最新推出的一種改善型智能溫度傳感器,與傳統(tǒng)的熱敏電阻等測溫元件相比,它能直接讀出被測溫度,并且可根據(jù)實(shí)際規(guī)定通過簡樸的編程實(shí)現(xiàn)9~12位的數(shù)字值讀數(shù)方式。電路圖如下:接在單片機(jī)的P2.3口,DS18B20的DQ端需要接一個(gè)4.7K左右的上拉電阻。按鍵控制模塊按鍵是用來設(shè)立報(bào)警的上下限溫。K1是用來進(jìn)入上下限調(diào)節(jié)模式的,當(dāng)按一下K1進(jìn)入上限調(diào)節(jié)模式,再按一下進(jìn)入下限調(diào)節(jié)模式。在正常模式下,按一下K2進(jìn)入查看上限溫度模式,顯示1s左右自動(dòng)退出;按一下K3進(jìn)入查看下限溫度模式,顯示1s左右自動(dòng)退出;按一下K4消除按鍵音,再按一下啟動(dòng)按鍵音。在調(diào)節(jié)上下限溫度模式下,K2是實(shí)現(xiàn)加1功能,K1是實(shí)現(xiàn)減1功能,K3是用來設(shè)定上下限溫度正負(fù)的。(2)、軟件設(shè)計(jì)通過單片機(jī)編程軟件Keil4進(jìn)行編程,程序部分通過一個(gè)主函數(shù)和自定義的三個(gè)#include"ds18b20.h"#include"keyscan.h"#include"display.h"頭文獻(xiàn),分別完畢溫度的采集轉(zhuǎn)化、通過鍵盤設(shè)定上下限報(bào)警溫度以及模式的切換、通過定期器0延時(shí)使數(shù)碼管動(dòng)態(tài)顯示溫度系統(tǒng)的主流程圖:系統(tǒng)實(shí)現(xiàn)(具體介紹實(shí)物連接圖及運(yùn)營程序時(shí)的每種結(jié)果,規(guī)定有圖為證,并對每張圖片進(jìn)行簡樸的說明)根據(jù)系統(tǒng)的設(shè)計(jì)框圖,查找相關(guān)資料,在Proteus8.0中畫出原理圖,在KEIL4軟件中編寫好程序,然后將這兩個(gè)軟件結(jié)合,將寫好的程序在Proteus8.0中燒錄進(jìn)單片機(jī),然后啟動(dòng)仿真開關(guān),即可顯示設(shè)計(jì)效果,通過修改硬件電路的同時(shí)結(jié)合程序,實(shí)現(xiàn)實(shí)驗(yàn)規(guī)定。然后開始焊接硬件電路,在多孔板上焊出相應(yīng)的電路,用杜邦線將各個(gè)模塊與單片機(jī)最小系統(tǒng)板連接在一起得到最終電路,用燒錄軟件將程序燒錄進(jìn)單片機(jī),最終以實(shí)際電路的形式展現(xiàn)出成果。系統(tǒng)的調(diào)試及性能分析:硬件調(diào)試,一方面檢查電感的焊接是否對的,然后可用萬用表測試或通電檢測。軟件調(diào)試可以先編寫顯示程序并進(jìn)行硬件的對的性檢查,然后分別進(jìn)行主程序、讀出溫度子程序、溫度轉(zhuǎn)換命令子程序、計(jì)算溫度子程序和現(xiàn)實(shí)數(shù)據(jù)刷新子程序等的編程及調(diào)試四、總結(jié)(對整個(gè)設(shè)計(jì)工作過程進(jìn)行歸納和綜合,對設(shè)計(jì)中所存在的問題和局限性進(jìn)行分析和總結(jié),提出解決的方法、措施、建議和對這次設(shè)計(jì)實(shí)踐的結(jié)識、收獲和提高。)通過本次課程設(shè)計(jì)使我收獲很多,從一開始對單片機(jī)仿真軟件的使用到后來漸漸的熟悉,深深感覺到了我們在設(shè)計(jì)電路的時(shí)候?yàn)榱蓑?yàn)證我們方案的可行性,我們必須借助一些仿真軟件,來模擬我們設(shè)計(jì)的電路,這樣既可以節(jié)省本也使得我們焊接實(shí)物時(shí)有了很好的依據(jù),要學(xué)會以這種方法為基礎(chǔ)再來焊接電路。通過系統(tǒng)仿真軟件Proteus和編譯軟件Keil,使我們進(jìn)一步了解了單片機(jī)的設(shè)計(jì)制作過程,其中最為困難的是軟件部分,即編程部分,我們上網(wǎng)找了好多資料,雖然通過自己的修改,但還是有很多功能不能實(shí)現(xiàn),如溫度上下限設(shè)立。由于Proteus并不是很純熟,在使用的過程中有很多原件的名稱不知道,從而花費(fèi)了大量的時(shí)間查閱資料。在應(yīng)用仿真的過程中,還出現(xiàn)了仿真軟件出現(xiàn)問題,不管如何修改程序,結(jié)果在仿真軟件上還是出現(xiàn)錯(cuò)誤,后來發(fā)現(xiàn)是我們使用的軟件是盜版的所以他也許在仿真過程中出現(xiàn)錯(cuò)誤,最終決定先將硬件焊接出來將程序?qū)戇M(jìn)去看看結(jié)果,再對軟件進(jìn)行相應(yīng)的調(diào)整,最后焊接出來將程序?qū)戇M(jìn)單片機(jī)通過簡樸的調(diào)整實(shí)現(xiàn)了實(shí)驗(yàn)規(guī)定。最后一步的焊接硬件也碰到了不少麻煩。綜上所述我們得出這樣的結(jié)論,應(yīng)當(dāng)借助軟件仿真證明我們方案的可行性,設(shè)計(jì)時(shí)實(shí)際電路和我們理論上的數(shù)值是有所差別的,我們也要學(xué)會將理論知識與實(shí)際結(jié)合起來,這樣我們才干在實(shí)際中提高自我能力,我們才干真正理解并在實(shí)際中運(yùn)用我們的知識。五、附錄附錄一:元件清單元件名稱型號數(shù)量單片機(jī)最小開發(fā)板STC89C521溫度傳感器DS18B201三極管88501蜂鳴器1LED紅1電阻10k、3k、2k、1k、510、330各5各2位一體數(shù)碼管共陽2AC/DC(5V/1A)電源1單排插針402雙排插針4029X15cm萬用板(3連孔)1杜邦線15附錄二:實(shí)物焊接圖附錄三:程序/*********************************************************************程序名;基于51單片機(jī)的溫度計(jì)*功能:實(shí)時(shí)測量溫度,超過上下限報(bào)警,報(bào)警溫度可手動(dòng)調(diào)整。K1是用來進(jìn)入上下限調(diào)節(jié)模式的,當(dāng)按一下K1進(jìn)入上限 調(diào)節(jié)模式,再按一下進(jìn)入下限調(diào)節(jié)模式。在正常模式下, 按一下K2進(jìn)入查看上限溫度模式,顯示1s左右自動(dòng)退出; 按一下K3進(jìn)入查看下限溫度模式,顯示1s左右自動(dòng)退出; 按一下K4消除按鍵音,再按一下啟動(dòng)按鍵音。在調(diào)節(jié)上 下限溫度模式下,K2是實(shí)現(xiàn)加1功能,K1是實(shí)現(xiàn)減1功能, K3是用來設(shè)定上下限溫度正負(fù)的。 *********************************************************************/#include<reg52.h> #include<intrins.h> //將intrins.h頭文獻(xiàn)包含到主程序(調(diào)用其中的_nop_()空操作函數(shù)延時(shí))#defineuintunsignedint #defineucharunsignedchar ucharmax=0x00,min=0x00; //max是上限報(bào)警溫度,min是下限報(bào)警溫度bits=0; //s是調(diào)整上下限溫度時(shí)溫度閃爍的標(biāo)志位,s=0不顯示200ms,s=1顯示1s左右bits1=0; //s1標(biāo)志位用于上下限查看時(shí)的顯示voiddisplay1(uintz); //聲明display1()函數(shù)(display.h頭文獻(xiàn)中的函數(shù),ds18b20.h要用應(yīng)先聲明)#include"ds18b20.h" #include"keyscan.h" #include"display.h" /******************************************************//* 主函數(shù) //*****************************************************/voidmain(){ beer=1; //關(guān)閉蜂鳴器 led=1; //關(guān)閉LED燈 timer1_init(0); //初始化定期器1(未啟動(dòng)定期器1) get_temperature(1); //初次啟動(dòng)DS18B20獲取溫度(DS18B20上電后自動(dòng)將EEPROM中的上下限溫度復(fù)制到TH和TL寄存器) while(1) { keyscan(); get_temperature(0); display(temp,temp_d*0.625); alarm(); }}/***********************************************************************程序名;ds18b20keyscan函數(shù)*功能:通過鍵盤設(shè)定設(shè)定上下限報(bào)警溫度**********************************************************************/#ifndef__keyscan_H__ //定義頭文獻(xiàn)#define__keyscan_H__ sbitkey1=P2^2; sbitkey2=P2^1; sbitkey3=P2^0; sbitkey4=P3^3; uchari=0; //定義全局變量i用于不同功能模式的選擇,‘0’正常模式,‘1’上限調(diào)節(jié)模式,‘2’下限調(diào)節(jié)模式uchara=0; //定義全局變量a用于不同模式下數(shù)碼管顯示的選擇bit k4=0; //K4按鍵雙功能選擇位,k4=0時(shí)K4按鍵選擇消按鍵音的功能,k4=1時(shí)K4按鍵選擇正負(fù)溫度設(shè)定功能bitv=0; //K2、K3按鍵雙功能選擇位,v=0時(shí)選擇上下限查看功能,v=1時(shí)選擇上下限溫度加減功能bitv1=0; //v1=1時(shí)定期1250ms時(shí)間到自動(dòng)關(guān)閉報(bào)警上下限查看功能bitv2=0; //消按鍵音功能調(diào)整位,為‘0’時(shí)開按鍵音,為‘1’時(shí)關(guān)按鍵音/******************************************************//* 讀鍵盤延時(shí)子函數(shù) //*****************************************************/voidkeyscan_delay(uintz) //延時(shí)1ms左右{uinti,j;for(i=z;i>0;i--) for(j=120;j>0;j--);}/******************************************************//* 溫度調(diào)節(jié)函數(shù) //*****************************************************/inttemp_change(intcount,bitf) //上下限溫度調(diào)整{if(key2==0) //判斷K2是否按下 { if(v2==0)beer=0; //v2=0開按鍵音,否則消按鍵音 keyscan_delay(10); //延時(shí)10ms if(key2==0) //再次判斷K2是否按下(實(shí)現(xiàn)按按鍵時(shí)消抖) { beer=1; //K2按下關(guān)按鍵音 if(f==0) //若溫度為正 { count++; //每按一下K2溫度上調(diào)1 if(a==1){if(count>125)count=125;}//當(dāng)溫度值大于125時(shí)不上調(diào) if(a==2){if(count>125)count=125;} } if(f!=0) //若溫度為負(fù) { count++; //每按一下K2溫度下調(diào)1 if(a==1){if(count>55)count=55;}//當(dāng)溫度值小于-55時(shí)不再下調(diào) if(a==2){if(count>55)count=55;} } } while(key2==0); //K2松開按鍵時(shí)消抖 keyscan_delay(10); } if(key3==0) { if(v2==0)beer=0; keyscan_delay(10); if(key3==0) //K3按按鍵時(shí)消抖 { beer=1; count--; //每按一下K3溫度為正時(shí)下調(diào)1,為負(fù)時(shí)上調(diào)1 if(a==1){if(count<0)count=0;}//當(dāng)溫度值達(dá)成0時(shí)不再調(diào) if(a==2){if(count<0)count=0;} } while(key3==0); keyscan_delay(10); //K3松開按鍵時(shí)消抖 } returncount;}/******************************************************//* 讀鍵盤函數(shù) //*****************************************************/voidkeyscan(){ if(key1==0) { if(v2==0)beer=0; keyscan_delay(10); if(key1==0) //K1按按鍵時(shí)消抖 { beer=1; TR1=1; //開定期器1,通過s標(biāo)志位的變化,實(shí)現(xiàn)在上下限溫度調(diào)整時(shí)溫度顯示時(shí)閃爍的功能 k4=1; //在上下溫度調(diào)節(jié)功能模式下選擇K4的調(diào)整上下限溫度正負(fù)的功能 v=1; //在上下溫度調(diào)節(jié)功能模式下選擇K2、K3的溫度加減功能 i++; //K1按一下i加1,i=‘0’進(jìn)入正常模式,i=‘1’進(jìn)入調(diào)上限模式,i=‘2’進(jìn)入調(diào)下限模式 if(i>2) //K1按下三次后退出調(diào)節(jié)模式 { i=0; //進(jìn)入正常模式 TR1=0; //關(guān)定期器1 k4=0; //在正常模式下選擇K4的消按鍵音功能 v=0; //在正常模式下選擇K2、K3的查看上下限報(bào)警溫度功能 store_t(); //存儲調(diào)整后的上下限報(bào)警溫度 } switch(i) //顯示選擇 { case0:a=0;break; //a=0選擇顯示測得的溫度 case1:a=1;break;//a=1選擇顯示上限溫度 case2:a=2;break;//a=2選擇顯示下限溫度 default:break; } } while(key1==0); //K1松按鍵時(shí)消抖 keyscan_delay(10); } if(a==1&&v==1) //a=1選擇顯示上限溫度且v=1時(shí)選擇上下限溫度加功能 {led=0;max=temp_change(max,f_max);}//顯示上限溫度 elseif(a==2&&v==1) //a=2選擇顯示下限溫度且v=1時(shí)選擇上下限溫度減功能 {led=1;min=temp_change(min,f_min);} else; if(k4==1) //k4=1時(shí)K4按鍵選擇正負(fù)溫度設(shè)定功能 { if(key4==0) { if(v2==0)beer=0; keyscan_delay(5); if(key4==0) { beer=1; if(a==1) {if(max>55)f_max=0;elsef_max=~f_max;}//當(dāng)溫度大于55度時(shí),只能設(shè)定為正溫度 if(a==2) {if(min>55)f_max=0;elsef_min=~f_min;}//當(dāng)溫度大于55度時(shí),只能設(shè)定為正溫度 } while(key4==0); keyscan_delay(10); } } if(v==0) //v=0時(shí)選擇上下限查看功能 { if(key2==0) { if(v2==0)beer=0; keyscan_delay(10); if(key2==0) { beer=1; a=1; //選擇上限顯示 TR1=1; //開定期器1開始定期一分鐘左右 s1=1; //上限顯示不閃爍,顯示一分鐘左右自動(dòng)退出 } while(key2==0); keyscan_delay(10); } if(key3==0) { if(v2==0)beer=0; keyscan_delay(10); if(key3==0) { beer=1; a=2; //選擇下限顯示 TR1=1; //開定期器1開始定期1s s1=1; //下限顯示不閃爍,顯示1s自動(dòng)退出 } while(key3==0); keyscan_delay(10); } if(v1==1) //v1=1時(shí)定期1s時(shí)間到自動(dòng)關(guān)閉報(bào)警上下限查看功能 {a=0;v1=0;TR1=0;} //a=0顯示實(shí)測溫度,v1清零,關(guān)定期器1 if(k4==0) //k4=0時(shí)K4按鍵選擇消按鍵音的功能 { if(key4==0) { if(v2==0)beer=0; keyscan_delay(10); if(key4==0) { beer=1; v2=~v2; //為‘0’時(shí)開按鍵音,為‘1’時(shí)關(guān)按鍵音 } while(key4==0); keyscan_delay(10); } } }}#endif/*********************************************************************程序名;DS18B20頭文獻(xiàn)*說明:用到的全局變量是:無符號字符型變量temp(測得的溫度整數(shù)部分),temp_d(測得的溫度小數(shù)部分),標(biāo)志位f(測量溫度的標(biāo)志位‘0’表 示“正溫度”‘1’表達(dá)“負(fù)溫度”),標(biāo)志位f_max(上限溫度的標(biāo)志位 ‘0’表達(dá)“正溫度”、‘1’表達(dá)“負(fù)溫度”),標(biāo)志位f_min(下限溫度的 標(biāo)志位‘0’表達(dá)“正溫度”、‘1’表達(dá)“負(fù)溫度”),標(biāo)志位w(報(bào)警標(biāo)志位 ‘1’啟動(dòng)報(bào)警‘0’關(guān)閉報(bào)警)。 *********************************************************************/#ifndef__ds18b20_h__ //定義頭文獻(xiàn)#define__ds18b20_h__#defineuintunsignedint #defineucharunsignedchar sbitDQ=P2^3; //DS18B20接口sbitbeer=P1^0; //用beer表達(dá)P1.0sbitled=P1^1; //用led表達(dá)P1.1uchartemp=0; //測量溫度的整數(shù)部分uchartemp_d=0; //測量溫度的小數(shù)部分bitf=0; //測量溫度的標(biāo)志位‘0’表達(dá)“正溫度”‘1’表達(dá)“負(fù)溫度”)bitf_max=0; //上限溫度的標(biāo)志位‘0’表達(dá)“正溫度”‘1’表達(dá)“負(fù)溫度”)bitf_min=0; //下限溫度的標(biāo)志位‘0’表達(dá)“正溫度”‘1’表達(dá)“負(fù)溫度”)bitw=0; //報(bào)警標(biāo)志位‘1’啟動(dòng)報(bào)警,‘0’關(guān)閉報(bào)警;/******************************************************//* 延時(shí)子函數(shù) //*****************************************************/voidds18b20_delayus(uintt)//延時(shí)幾μs{while(t--);}voidds18b20_delayms(uintt) //延時(shí)1ms左右{ uinti,j; for(i=t;i>0;i--) for(j=120;j>0;j--);}/******************************************************//* DS18B20初始化函數(shù) //*****************************************************/voidds18b20_init() { ucharc=0; DQ=1; DQ=0; //控制器向DS18B20發(fā)低電平脈沖 ds18b20_delayus(80); //延時(shí)15-80μs DQ=1; //控制器拉高總線, while(DQ); //等待DS18B20拉低總線,在60-240μs之間 ds18b20_delayus(150); //延時(shí),等待上拉電阻拉高總線 DQ=1; //拉高數(shù)據(jù)線,準(zhǔn)備數(shù)據(jù)傳輸;}/******************************************************//* DS18B20字節(jié)讀函數(shù) //*****************************************************/uchards18b20_read() { uchari; uchard=0; DQ=1; //準(zhǔn)備讀; for(i=8;i>0;i--) { d>>=1; //低位先發(fā); DQ=0; _nop_(); _nop_(); DQ=1; //必須寫1,否則讀出來的將是不預(yù)期的數(shù)據(jù); if(DQ) //在12us處讀取數(shù)據(jù); d|=0x80; ds18b20_delayus(10); } returnd; //返回讀取的值}/******************************************************//* DS18B20字節(jié)寫函數(shù) //*****************************************************/voidds18b20_write(uchard) {uchari;for(i=8;i>0;i--){ DQ=0; DQ=d&0x01; ds18b20_delayus(5); DQ=1; d>>=1;}}/******************************************************//* 獲取溫度函數(shù) //*****************************************************/voidget_temperature(bitflag) { uchara=0,b=0,c=0,d=0;uinti; ds18b20_init(); ds18b20_write(0xcc); //向DS18B20發(fā)跳過讀ROM命令 ds18b20_write(0x44); //寫啟動(dòng)DS18B20進(jìn)行溫度轉(zhuǎn)換命令,轉(zhuǎn)換結(jié)果存入內(nèi)部RAM if(flag==1) { //初次啟動(dòng)DS18B20進(jìn)行溫度轉(zhuǎn)換需要500ms,若轉(zhuǎn)換時(shí)間不夠就犯錯(cuò),讀出的是85度的錯(cuò)誤值。 display1(1); //用開機(jī)動(dòng)畫耗時(shí) } else ds18b20_delayms(1); ds18b20_init(); ds18b20_write(0xcc); ds18b20_write(0xbe); a=ds18b20_read(); //讀內(nèi)部RAM(LSB) b=ds18b20_read(); //讀內(nèi)部RAM(MSB) if(flag==1) //局部位變量f=1時(shí)讀上下線報(bào)警溫度 { max=ds18b20_read(); //讀內(nèi)部RAM(TH) min=ds18b20_read(); //讀內(nèi)部RAM(Tl) } if((max&0x80)==0x80) //若讀取的上限溫度的最高位(符號位)為‘1’表白是負(fù)溫度 {f_max=1;max=(max-0x80);}//將上限溫度符號標(biāo)志位置‘1’表達(dá)負(fù)溫度,將上限溫度裝換成無符號數(shù)。 if((min&0x80)==0x80) //若讀取的下限溫度的最高位(符號位)為‘1’表白是負(fù)溫度 {f_min=1;min=(min-0x80);}//將下限溫度符號標(biāo)志位置‘1’表達(dá)負(fù)溫度,將下限溫度裝換成無符號數(shù)。 i=b; i>>=4; if(i==0) {f=0; //i為0,正溫度,設(shè)立正溫度標(biāo)記temp=((a>>4)|(b<<4)); //整數(shù)部分 a=(a&0x0f); temp_d=a; //小數(shù)部分 } else { f=1; //i為1,負(fù)溫度,設(shè)立負(fù)溫度標(biāo)記 a=~a+1; b=~b; temp=((a>>4)|(b<<4)); //整數(shù)部分 a=(a&0x0f); //小數(shù)部分 temp_d=a; }}/******************************************************//* 存儲極限溫度函數(shù) //*****************************************************/voidstore_t(){ if(f_max==1) //若上限溫度為負(fù),將上限溫度轉(zhuǎn)換成有符號數(shù)(最高位為1是負(fù),為0是正) max=max+0x80; if(f_min==1) //若下限溫度為負(fù),將上限溫度轉(zhuǎn)換成有符號數(shù) min=min+0x80; ds18b20_init(); ds18b20_write(0xcc); ds18b20_write(0x4e); //向DS18B20發(fā)寫字節(jié)至?xí)捍嫫?和3(TH和TL)命令 ds18b20_write(max); //向暫存器TH(上限溫度暫存器)寫溫度 ds18b20_write(min); //向暫存器TL(下限溫度暫存器)寫溫度 ds18b20_write(0xff); //向配置寄存器寫命令,進(jìn)行溫度值分辨率設(shè)立 ds18b20_init(); ds18b20_write(0xcc); ds18b20_write(0x48); //向DS18B20發(fā)將RAM中2、3字節(jié)的內(nèi)容寫入EEPROM} //DS18B20上電后會自動(dòng)將EEPROM中的上下限溫度拷貝到TH、TL暫存器/******************************************************//* 溫度超限報(bào)警函數(shù) //*****************************************************/voidalarm(){ //若上限值是正值 if(f_max==0) { if(f_min==0) //若下限值是正值 { if(f==0) //若測量值是正值 { if(temp<=min||temp>=max) {w=1;TR1=1;} //當(dāng)測量值小于最小值或大于最大值時(shí)報(bào)警 if((temp<max)&&(temp>min)) {w=0;} //當(dāng)測量值大于最小值且小于最大值時(shí)不報(bào)警 } if(f==1){w=1;TR1=1;} //若測量值是負(fù)值時(shí)報(bào)警 } if(f_min==1) //若下限值是負(fù)值 { if(f==0) //若測量值是正值 { if(temp>=max)//當(dāng)測量值大于最大值時(shí)報(bào)警 {w=1;TR1=1;} if(temp<max)//當(dāng)測量值小于最大值時(shí)不報(bào)警 {w=0;} } if(f==1) //若測量值是負(fù)值 { if(temp>=min)//當(dāng)測量值大于最小值時(shí)報(bào)警 {w=1;TR1=1;} if(temp<min)//當(dāng)測量值小于最小值時(shí)不報(bào)警 {w=0;} } } } if(f_max==1) //若下限值是負(fù)值 { if(f_min==1) //若下限值是負(fù)值 { if(f==1) //若測量值是負(fù)值 { if((temp<=max)||(temp>=min)) {w=1;TR1=1;} //當(dāng)測量值小于最大值或大于最小值時(shí)報(bào)警 if((temp<min)&&(temp>max)) {w=0;} //當(dāng)測量值小于最小值且大于最大值時(shí)不報(bào)警 } if(f==0){w=1;TR1=1;} //若測量值是正值時(shí)報(bào)警 } } }#endif/***********************************************************************程序名;ds18b20數(shù)碼管動(dòng)態(tài)顯示頭文獻(xiàn)*功能:通過定期器0延時(shí)使數(shù)碼管動(dòng)態(tài)顯示**********************************************************************/#ifndef__ds18b20_display_H__ #define__ds18b20_display_H__#defineuintunsignedint //變量類型宏定義,用uint表達(dá)無符號整形(16位)#defineucharunsignedchar //變量類型宏定義,用uchar表達(dá)無符號字符型(8位)sbitwei1=P2^4; //可位尋址變量定義,用wei1表達(dá)P2.4口sbitwei2=P2^5; //用wei2表達(dá)P2.5口sbitwei3=P2^6; //用wei3表達(dá)P2.6口sbitwei4=P2^7; //用wei4表達(dá)P2.7口ucharnum=0; //定義num為全局無符號字符型變量,賦初值為‘0’ucharcodetemperature1[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //定義顯示碼表0~9ucharcodetemperature2[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10}; //帶小數(shù)點(diǎn)的0~9.ucharcodetemperature3[]={0xff,0x7f,0xbf,0x89,0xc7}; //依次是‘不顯示’‘.’‘-’‘H’‘L’/******************************************************//* 延時(shí)子函數(shù) //*****************************************************/voiddisplay_delay(uintt) //延時(shí)1ms左右{ uinti,j; for(i=t;i>0;i--) for(j=120;j>0;j--);}/******************************************************//* 定期器1初始化函數(shù) //*****************************************************/voidtimer1_init(bitt){TMOD=0x10; TH0=0x3c; TL0=0xb0; EA=1; ET1=1; TR1=t; //局部變量t為1啟動(dòng)定期器1,為0關(guān)閉定期器1}/******************************************************//* 定期器1中斷函數(shù) //*****************************************************/voidtimer1()interrupt3{TH0=0x3c; //重新賦初值,定期50msTL0=0xb0; num++; //每進(jìn)入一次定期器中斷num加1(每50ms加1一次)if(num<5) {s=1;if(w==1){beer=1;led=1;}else{beer=1;led=1;}} else //進(jìn)入4次中斷,定期200ms時(shí)若報(bào)警標(biāo)志位w為‘1’則啟動(dòng)報(bào)警,不為‘1’不啟動(dòng) //實(shí)現(xiàn)間歇性報(bào)警功能 {s=0;if(w==1){beer=0;led=0;}else{beer=1;led=1;}} if(num>20) //進(jìn)入20次中斷,定期1s{ num=0; //num歸0,重新定開始定期1s s1=0; //定期1s時(shí)間屆時(shí)自動(dòng)關(guān)閉報(bào)警上下限顯示功能 v1=1; //定期1s時(shí)間屆時(shí)自動(dòng)關(guān)閉報(bào)警上下限查看功能} }/******************************************************//* 調(diào)整報(bào)警上下限選擇函數(shù) //*****************************************************/voidselsct_1(ucharf,uchark) //消除百位的0顯示,及正負(fù)溫度的顯示選擇{if(f==0) //若為正溫度,百位為0則不顯示百位,不為0則顯示 { if(k/100==0)P0=temperature3[0]; elseP0=temperature1[k/100]; } if(f==1) //若為負(fù)溫度,若十位為0,百位不顯示,否則百位顯示‘-’ { if(k%100/10==0)P0=temperature3[0]; elseP0=temperature3[2]; }}voidselsct_2(bitf,uchark) //消除十位的0顯示,及正負(fù)溫度的顯示選擇{if(f==0) //若為正溫度,百位十位均為0則不顯示十位,否則顯示十位 { if((k/100==0)&&(k%100/10==0)) P0=temperature3[0]; elseP0=temperature1[k%100/10]; } if(f==1) //若為負(fù)溫度,若十位為0,十位不顯示,否則十位顯示‘-’ { if(k%100/10==0)P0=temperature3[2]; elseP0=temperature1[k%100/10]; } }/******************************************************//* 主函數(shù)顯示 //*****************************************************/voiddisplay(uchart,uchart_d) //用于實(shí)測溫度、上限溫度的顯示{uchari;for(i=0;i<4;i++) //依次從左至右選通數(shù)碼管顯示,實(shí)現(xiàn)動(dòng)態(tài)顯示{ switch(i) { case0: //選通第一個(gè)數(shù)碼管 wei2=0; //關(guān)第二個(gè)數(shù)碼管 wei3=0; //關(guān)第三個(gè)數(shù)碼管 wei4=0; //關(guān)第四個(gè)數(shù)碼管 wei1=1; //開第一個(gè)數(shù)碼管 if(a==0){selsct_1(f,t);}//若a=0則在第一個(gè)數(shù)碼管上顯示測量溫度的百位或‘-’ if(a==1) { P0=temperature3[3];//若a=1則在第一個(gè)數(shù)碼管上顯示‘H’ } if(a==2) { P0=temperature3[4];//若a=2則在第一個(gè)數(shù)碼管上顯示‘L’ } break; case1: //選通第二個(gè)數(shù)碼管 wei1=0; wei3=0; wei4=0; wei2=1; if(a==0){selsct_2(f,t);}//若a=0則在第二個(gè)數(shù)碼管上顯示測量溫度的十位或‘-’ if(a==1) //若a=1則在第二個(gè)數(shù)碼管上顯示上限報(bào)警溫度的百位或‘-’ { if(s==0)selsct_1(f_max,max);//若s=0則顯示第二個(gè)數(shù)碼管,否則不顯示 elseP0=temperature3[0]; //通過s標(biāo)志位的變化實(shí)現(xiàn)調(diào)節(jié)上下限報(bào)警溫度時(shí)數(shù)碼管的閃爍 if(s1==1)selsct_1(f_max,max);//若s1=1則顯示第二個(gè)數(shù)碼管(s1標(biāo)志位用于上下限查看時(shí)的顯示) } if(a==2) //若a=2則在第二個(gè)數(shù)碼管上顯示下限報(bào)警溫度的百位或‘-’ { if(s==0)selsct_1(f_min,min); elseP0=temperature3[0];
溫馨提示
- 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024家具銷售合同樣本
- 景觀工程合同的履行期限
- 工程總價(jià)固定合同格式
- 2024年購銷合同大米
- 房地產(chǎn)分銷代理合同
- 2024個(gè)人與公司合作協(xié)議書
- 工程維護(hù)居間合同格式
- 2024年婚前財(cái)產(chǎn)協(xié)議書示例
- 城市房屋拆遷流程指南
- 合作經(jīng)營協(xié)議書范本經(jīng)典案例
- TMF自智網(wǎng)絡(luò)白皮書4.0
- 電視劇《國家孩子》觀影分享會PPT三千孤兒入內(nèi)蒙一段流淌著民族大愛的共和國往事PPT課件(帶內(nèi)容)
- 所水力除焦設(shè)備介紹
- 農(nóng)村黑臭水體整治項(xiàng)目可行性研究報(bào)告
- 改革開放英語介紹-課件
- pet考試歷屆真題和答案
- 《企業(yè)員工薪酬激勵(lì)問題研究10000字(論文)》
- 大學(xué)英語三級B真題2023年06月
- GB/T 7909-2017造紙木片
- GB/T 25217.6-2019沖擊地壓測定、監(jiān)測與防治方法第6部分:鉆屑監(jiān)測方法
- 中醫(yī)學(xué)課件 治則與治法
評論
0/150
提交評論