基于.51單片機(jī)課程設(shè)計(jì)報(bào)告報(bào)告_第1頁
基于.51單片機(jī)課程設(shè)計(jì)報(bào)告報(bào)告_第2頁
基于.51單片機(jī)課程設(shè)計(jì)報(bào)告報(bào)告_第3頁
基于.51單片機(jī)課程設(shè)計(jì)報(bào)告報(bào)告_第4頁
基于.51單片機(jī)課程設(shè)計(jì)報(bào)告報(bào)告_第5頁
已閱讀5頁,還剩19頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

./單片機(jī)課程設(shè)計(jì)單片機(jī)課程設(shè)計(jì)課題:基于51單片機(jī)的交通燈設(shè)計(jì)專業(yè):機(jī)械設(shè)計(jì)制造及其自動(dòng)化學(xué)號(hào):指導(dǎo)教師:邵添設(shè)計(jì)日期:2017/12/18成績(jī):XX大學(xué)城市科技學(xué)院電氣學(xué)院基于51單片機(jī)數(shù)字溫度計(jì)設(shè)計(jì)報(bào)告一、設(shè)計(jì)目的作用本設(shè)計(jì)是一款簡(jiǎn)單實(shí)用的小型數(shù)字溫度計(jì),所采用的主要元件有傳感器DS18B20,單片機(jī)AT89C52,,四位共陰極數(shù)碼管一個(gè),電容電阻若干。DS18B20支持"一線總線"接口,測(cè)量溫度范圍-55°C~+125°C。在-10~+85°C范圍內(nèi),精度為±0.5°C本次數(shù)字溫度計(jì)的設(shè)計(jì)共分為五部分,主控制器,LED顯示部分,傳感器部分,復(fù)位部分,按鍵設(shè)置部分,時(shí)鐘電路。主控制器即單片機(jī)部分,用于存儲(chǔ)程序和控制電路;LED顯示部分是指四位共陰極數(shù)碼管,用來顯示溫度;傳感器部分,即溫度傳感器,用來采集溫度,進(jìn)行溫度轉(zhuǎn)換;復(fù)位部分,即復(fù)位電路,按鍵部分用來設(shè)置上下限報(bào)警溫度。測(cè)量的總過程是,傳感器采集到外部環(huán)境的溫度,并進(jìn)行轉(zhuǎn)換后傳到單片機(jī),經(jīng)過單片機(jī)處理判斷后將溫度傳遞到數(shù)碼管顯示。二、設(shè)計(jì)要求〔1.利用DS18B20傳感器實(shí)時(shí)檢測(cè)溫度并顯示?!?.利用數(shù)碼管實(shí)時(shí)顯示溫度。〔3.當(dāng)溫度超過或者低于設(shè)定值時(shí)蜂鳴器報(bào)警,LED閃爍指示。〔4.能夠手動(dòng)設(shè)置上限和下限報(bào)警溫度。三、設(shè)計(jì)的具體實(shí)現(xiàn)1、系統(tǒng)概述方案一:由于本設(shè)計(jì)是測(cè)溫電路,可以使用熱敏電阻之類的器件利用其感溫效應(yīng),在將隨被測(cè)溫度變化的電壓或電流采集過來,進(jìn)行A/D轉(zhuǎn)換后,就可以用單片機(jī)進(jìn)行數(shù)據(jù)的處理,在顯示電路上,就可以將被測(cè)溫度顯示出來,這種設(shè)計(jì)需要用到A/D轉(zhuǎn)換電路,感溫電路比較麻煩。方案設(shè)計(jì)框圖如下:數(shù)碼管顯示電路熱敏電阻組成的感溫電路數(shù)碼管顯示電路熱敏電阻組成的感溫電路AD轉(zhuǎn)換方案二:考慮到用溫度傳感器,在單片機(jī)電路設(shè)計(jì)中,大多都是使用傳感器,所以這是非常容易想到的,所以可以采用一只溫度傳感器DS18B20,此傳感器,可以很容易直接讀取被測(cè)溫度值,進(jìn)行轉(zhuǎn)換,就可以滿足設(shè)計(jì)要求。從以上兩種方案,很容易看出,采用方案二,電路比較簡(jiǎn)單,軟件設(shè)計(jì)也比較簡(jiǎn)單,故采用了方案二。2、單元電路設(shè)計(jì)與分析1、硬件設(shè)計(jì)按照系統(tǒng)設(shè)計(jì)功能的要求,確定系統(tǒng)由3個(gè)模塊組成:主控制器、測(cè)溫電路和顯示電路。數(shù)字溫度計(jì)總體電路結(jié)構(gòu)框圖所示:蜂鳴器報(bào)警模塊AT89C51單片機(jī)DB18B20溫度傳感器按鍵設(shè)置模塊電源數(shù)碼管顯示LED閃爍報(bào)警模塊蜂鳴器報(bào)警模塊AT89C51單片機(jī)DB18B20溫度傳感器按鍵設(shè)置模塊電源數(shù)碼管顯示LED閃爍報(bào)警模塊單片機(jī)的選擇單片機(jī)AT89S52具有低電壓供電和體積小等特點(diǎn),四個(gè)端口只需要兩個(gè)口就能滿足電路系統(tǒng)的設(shè)計(jì)需要,很適合便攜手持式產(chǎn)品的設(shè)計(jì)使用系統(tǒng)可用二節(jié)電池供電。由于器件問題,我們使用了通用的手機(jī)5V充電器接口。復(fù)位電路模塊單片機(jī)系統(tǒng)的復(fù)位電路在這里使用的是上電+按鈕的復(fù)位電路模式,其中電阻R采用的是10KΩ的阻值,電容采用電容值為10uF的電解電容,電路圖如下:溫度顯示模塊四位共陰極數(shù)碼管,能夠顯示小數(shù)。列掃描用P2.4~P2.7口來實(shí)現(xiàn),列驅(qū)動(dòng)直接51接單片機(jī)驅(qū)動(dòng)。電路圖如下:溫度傳感器模塊DS18B20溫度傳感器是美國(guó)DALLAS半導(dǎo)體公司最新推出的一種改進(jìn)型智能溫度傳感器,與傳統(tǒng)的熱敏電阻等測(cè)溫元件相比,它能直接讀出被測(cè)溫度,并且可根據(jù)實(shí)際要求通過簡(jiǎn)單的編程實(shí)現(xiàn)9~12位的數(shù)字值讀數(shù)方式。電路圖如下:按鍵模塊按鍵是用來設(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ì)主要包括主程序、讀出溫度子程序、溫度轉(zhuǎn)換命令子程序、計(jì)算溫度子程序和現(xiàn)實(shí)數(shù)據(jù)刷新子程序等。主程序主程序的主要功能是負(fù)責(zé)溫度的實(shí)時(shí)顯示、讀出并處理DS18B20的測(cè)量溫度值。溫度測(cè)量每1S進(jìn)行一次。主流程圖如下:讀出溫度子程序讀出溫度子程序的主要功能是讀出RAM中的9字節(jié)。在讀出時(shí)須進(jìn)行CRC校驗(yàn),校驗(yàn)有錯(cuò)時(shí)不進(jìn)行溫度數(shù)據(jù)的改寫。流程圖如下:溫度轉(zhuǎn)換命令子程序溫度轉(zhuǎn)換命令子程序主要是發(fā)溫度轉(zhuǎn)換開始命令。當(dāng)采用12位分辨率時(shí),轉(zhuǎn)換時(shí)間約為750ms。在本程序設(shè)計(jì)中,采用1s顯示程序延時(shí)法等待轉(zhuǎn)換的完成。流程圖如下:顯示數(shù)據(jù)刷新子程序顯示數(shù)據(jù)刷新子程序主要是對(duì)顯示緩沖器中的顯示數(shù)據(jù)進(jìn)行刷新操作,當(dāng)最高數(shù)據(jù)顯示位為0時(shí),將符號(hào)顯示位移入下一位。系統(tǒng)的調(diào)試及性能分析:硬件調(diào)試,首先檢查電感的焊接是否正確,然后可用萬用表測(cè)試或通電檢測(cè)。軟件調(diào)試可以先編寫顯示程序并進(jìn)行硬件的正確性檢驗(yàn),然后分別進(jìn)行主程序、讀出溫度子程序、溫度轉(zhuǎn)換命令子程序、計(jì)算溫度子程序和現(xiàn)實(shí)數(shù)據(jù)刷新子程序等的編程及調(diào)試由于DS18B20與單片機(jī)采用串行數(shù)據(jù)傳送,因此,對(duì)DS18B20進(jìn)行讀/寫編程時(shí)必須嚴(yán)格地保證讀/寫時(shí)序;否則將無法讀取測(cè)量結(jié)果。本程序采用單片機(jī)匯編或C語言編寫用KeilC51編譯器編程調(diào)試。軟件調(diào)試到能顯示溫度值,并且在有溫度變化時(shí)顯示溫度能改變,就基本完成。性能測(cè)試可用制作的溫度計(jì)和已有的成品溫度計(jì)同時(shí)進(jìn)行測(cè)量比較。由于DS18B20的精度很高,所以誤差指標(biāo)可以限制在0.5℃以內(nèi)。另外,-55~+125四、總結(jié)本次的課程設(shè)計(jì)使我們進(jìn)一步鞏固了書本上的知識(shí),做到了學(xué)以致用。這是我們第二次自己動(dòng)手設(shè)計(jì)的電路,通過系統(tǒng)仿真軟件Proteus和編譯軟件Keil,使我們進(jìn)一步了解了單片機(jī)的設(shè)計(jì)制作過程,其中最為困難的是軟件部分,即編程部分,我們上網(wǎng)找了好多資料,雖然經(jīng)過自己的修改,但還是有很多功能不能實(shí)現(xiàn),如溫度上下限設(shè)置。由于Proteus并不是很熟練,在使用的過程中有很多原件的名稱不知道,從而花費(fèi)了大量的時(shí)間在網(wǎng)上查找,今后應(yīng)該在這方面多多努力。最后一步的焊接硬件也遇到了不少麻煩??偨Y(jié)經(jīng)驗(yàn)的時(shí)候我們得出這樣的結(jié)論,學(xué)習(xí)應(yīng)該學(xué)以致用,有目的的去學(xué)習(xí),如果學(xué)了不用等于沒學(xué)。其次,要學(xué)以致用,理論聯(lián)系實(shí)際,這樣才會(huì)取得事半功倍的效果。五、附錄附錄一:元件清單元件名稱數(shù)量AT89C51單片機(jī)112MHZ晶振133pF電容222uF電解電容1按鍵開關(guān)5IC插座40Pin1DS18B20溫度傳感器1蜂鳴器1LED?5紅1四位一體共陰數(shù)碼管1470,1K,4.7K電阻8,2,1三極管85501導(dǎo)線若干排針若干附錄二:完整電路原理圖附錄三:焊接實(shí)物圖附錄四:源程序/*********************************************************************程序名;基于51單片機(jī)的溫度計(jì)*功能:實(shí)時(shí)測(cè)量溫度,超過上下限報(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ù)的。*編程者:彭明闖*編程時(shí)間:2014/05/30 *********************************************************************/#include<reg52.h> #include<intrins.h> //將intrins.h頭文件包含到主程序〔調(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頭文件中的函數(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>; //初始化定時(shí)器1〔未啟動(dòng)定時(shí)器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<>; }}/*********************************************************************程序名;DS18B20頭文件*編程者:彭明闖*編程時(shí)間:2014/5/30*說明:用到的全局變量是:無符號(hào)字符型變量temp<測(cè)得的溫度整數(shù)部分>,temp_d*<測(cè)得的溫度小數(shù)部分>,標(biāo)志位f〔測(cè)量溫度的標(biāo)志位‘0’表示"正溫度"‘1’表*示"負(fù)溫度",標(biāo)志位f_max〔上限溫度的標(biāo)志位‘0’表示"正溫度"、‘1’表*示"負(fù)溫度",標(biāo)志位f_min〔下限溫度的標(biāo)志位‘0’表示"正溫度"、‘1’表*示"負(fù)溫度",標(biāo)志位w<報(bào)警標(biāo)志位‘1’啟動(dòng)報(bào)警‘0’關(guān)閉報(bào)警>。 *********************************************************************/#ifndef__ds18b20_h__ //定義頭文件#define__ds18b20_h__#defineuintunsignedint #defineucharunsignedchar sbitDQ=P2^3; //DS18B20接口sbitbeer=P1^0; //用beer表示P1.0sbitled=P1^1; //用led表示P1.1uchartemp=0; //測(cè)量溫度的整數(shù)部分uchartemp_d=0; //測(cè)量溫度的小數(shù)部分bitf=0; //測(cè)量溫度的標(biāo)志位,0’表示"正溫度"‘1’表示"負(fù)溫度"bitf_max=0; //上限溫度的標(biāo)志位‘0’表示"正溫度"‘1’表示"負(fù)溫度"bitf_min=0; //下限溫度的標(biāo)志位‘0’表示"正溫度"、‘1’表示"負(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> //若讀取的上限溫度的最高位〔符號(hào)位為‘1’表明是負(fù)溫度 {f_max=1;max=<max-0x80>;}//將上限溫度符號(hào)標(biāo)志位置‘1’表示負(fù)溫度,將上限溫度裝換成無符號(hào)數(shù)。 if<<min&0x80>==0x80> //若讀取的下限溫度的最高位〔符號(hào)位為‘1’表明是負(fù)溫度 {f_min=1;min=<min-0x80>;}//將下限溫度符號(hào)標(biāo)志位置‘1’表示負(fù)溫度,將下限溫度裝換成無符號(hào)數(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; }}/******************************************************//* 存儲(chǔ)極限溫度函數(shù) //*****************************************************/voidstore_t<>{ if<f_max==1> //若上限溫度為負(fù),將上限溫度轉(zhuǎn)換成有符號(hào)數(shù)〔最高位為1是負(fù),為0是正 max=max+0x80; if<f_min==1> //若下限溫度為負(fù),將上限溫度轉(zhuǎn)換成有符號(hào)數(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上電后會(huì)自動(dòng)將EEPROM中的上下限溫度拷貝到TH、TL暫存器/******************************************************//* 溫度超限報(bào)警函數(shù) //*****************************************************/voidalarm<>{ //若上限值是正值 if<f_max==0> { if<f_min==0> //若下限值是正值 { if<f==0> //若測(cè)量值是正值 { if<temp<=min||temp>=max> {w=1;TR1=1;} //當(dāng)測(cè)量值小于最小值或大于最大值時(shí)報(bào)警 if<<temp<max>&&<temp>min>> {w=0;} //當(dāng)測(cè)量值大于最小值且小于最大值時(shí)不報(bào)警 } if<f==1>{w=1;TR1=1;} //若測(cè)量值是負(fù)值時(shí)報(bào)警 } if<f_min==1> //若下限值是負(fù)值 { if<f==0> //若測(cè)量值是正值 { if<temp>=max>//當(dāng)測(cè)量值大于最大值時(shí)報(bào)警 {w=1;TR1=1;} if<temp<max>//當(dāng)測(cè)量值小于最大值時(shí)不報(bào)警 {w=0;} } if<f==1> //若測(cè)量值是負(fù)值 { if<temp>=min>//當(dāng)測(cè)量值大于最小值時(shí)報(bào)警 {w=1;TR1=1;} if<temp<min>//當(dāng)測(cè)量值小于最小值時(shí)不報(bào)警 {w=0;} } } } if<f_max==1> //若下限值是負(fù)值 { if<f_min==1> //若下限值是負(fù)值 { if<f==1> //若測(cè)量值是負(fù)值 { if<<temp<=max>||<temp>=min>> {w=1;TR1=1;} //當(dāng)測(cè)量值小于最大值或大于最小值時(shí)報(bào)警 if<<temp<min>&&<temp>max>> {w=0;} //當(dāng)測(cè)量值小于最小值且大于最大值時(shí)不報(bào)警 } if<f==0>{w=1;TR1=1;} //若測(cè)量值是正值時(shí)報(bào)警 } } }#endif/***********************************************************************程序名;ds18b20keyscan函數(shù)*功能:通過鍵盤設(shè)定設(shè)定上下限報(bào)警溫度*編程者:彭明闖*編程時(shí)間:2014/5/30**********************************************************************/#ifndef__keyscan_H__ //定義頭文件#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í)定時(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; //開定時(shí)器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)定時(shí)器1 k4=0; //在正常模式下選擇K4的消按鍵音功能 v=0; //在正常模式下選擇K2、K3的查看上下限報(bào)警溫度功能 store_t<>; //存儲(chǔ)調(diào)整后的上下限報(bào)警溫度 } switch<i> //顯示選擇 { case0:a=0;break; //a=0選擇顯示測(cè)得的溫度 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; //開定時(shí)器1開始定時(shí)一分鐘左右 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; //開定時(shí)器1開始定時(shí)1s s1=1; //下限顯示不閃爍,顯示1s自動(dòng)退出 } while<key3==0>; keyscan_delay<10>; } if<v1==1> //v1=1時(shí)定時(shí)1s時(shí)間到自動(dòng)關(guān)閉報(bào)警上下限查看功能 {a=0;v1=0;TR1=0;} //a=0顯示實(shí)測(cè)溫度,v1清零,關(guān)定時(shí)器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數(shù)碼管動(dòng)態(tài)顯示頭文件*功能:通過定時(shí)器0延時(shí)是數(shù)碼管動(dòng)態(tài)顯示*編程者:彭明闖*編程時(shí)間:2014/5/30**********************************************************************/#ifndef__ds18b20_display_H__ #define__ds18b20_display_H__#defineuintunsignedint //變量類型宏定義,用uint表示無符號(hào)整形〔16位#defineucharunsignedchar //變量類型宏定義,用uchar表示無符號(hào)字符型〔8位sbitwei1=P2^4; //可位尋址變量定義,用wei1表示P2.4口sbitwei2=P2^5; //用wei2表示P2.5口sbitwei3=P2^6; //用wei3表示P2.6口sbitwei4=P2^7; //用wei4表示P2.7口ucharnum=0; //定義num為全局無符號(hào)字符型變量,賦初值為‘0’ucharcodetemperature1[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //定義顯示碼表0~9ucharcodetemperature2[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef}; //帶小數(shù)點(diǎn)的0~9.ucharcodetemperature3[]={0x00,0x80,0x40,0x76,0x38}; //依次是‘不顯示’‘.’‘-’‘H’‘L’/******************************************************//* 延時(shí)子函數(shù) //*****************************************************/voiddisplay_delay<uintt> //延時(shí)1ms左右{ uinti,j; for<i=t;i>0;i--> for<j=120;j>0;j-->;}/******************************************************//* 定時(shí)器1初始化函數(shù) //*****************************************************/voidtimer1_init<bitt>{TMOD=0x10; TH0=0x3c; TL0=0xb0; EA=1; ET1=1; TR1=t; //局部變量t為1啟動(dòng)定時(shí)器1,為0關(guān)閉定時(shí)器1}/******************************************************//* 定時(shí)器1中斷函數(shù) //*****************************************************/voidtimer1<>interrupt3{TH0=0x3c; //重新賦初值,定時(shí)50msTL0=0xb0; num++; //每進(jìn)入一次定時(shí)器中斷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次中斷,定時(shí)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次中斷,定時(shí)1s{ num=0; //num歸0,重新定開始定時(shí)1s s1=0; //定時(shí)1s時(shí)間到時(shí)自動(dòng)關(guān)閉報(bào)警上下限顯示功能 v1=1; //定時(shí)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í)測(cè)溫度、上限溫度的顯示{uchari;for<i=0;i<4;i++> //依次從左至右選通數(shù)碼管顯示,實(shí)現(xiàn)動(dòng)態(tài)顯示{ switch<i> { case0: //選通第一個(gè)數(shù)碼管 wei2=1; //關(guān)第二個(gè)數(shù)碼管 wei3=1; //關(guān)第三個(gè)數(shù)碼管 wei4=1; //關(guān)第四個(gè)數(shù)碼管 wei1=0; //開第一個(gè)數(shù)碼管 if<a==0>{selsct_1<f,t>;}//若a=0則在第一個(gè)數(shù)碼管上顯示測(cè)量溫度的百位或‘-’ 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=1; wei3=1; wei4=1; wei2=0; if<a==0>{selsct_2<f,t>;}//若a=0則在第二個(gè)數(shù)碼管上顯示測(cè)量溫度的十位或‘-’ 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]; if<s1==1>selsct_1<f_min,min>; } break; case2: //選通第三個(gè)數(shù)碼管 wei1=1; wei2=1; wei4=1; wei3=0; if<a==0>{P0=temperature2[t%10];}//若a=0則在第三個(gè)數(shù)碼管上顯示測(cè)量溫度的個(gè)位 if<a==1>

溫馨提示

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

評(píng)論

0/150

提交評(píng)論