基于DS8b20的溫度測量和秒表設(shè)計單片機(jī)小系統(tǒng)實驗報告_第1頁
基于DS8b20的溫度測量和秒表設(shè)計單片機(jī)小系統(tǒng)實驗報告_第2頁
基于DS8b20的溫度測量和秒表設(shè)計單片機(jī)小系統(tǒng)實驗報告_第3頁
基于DS8b20的溫度測量和秒表設(shè)計單片機(jī)小系統(tǒng)實驗報告_第4頁
基于DS8b20的溫度測量和秒表設(shè)計單片機(jī)小系統(tǒng)實驗報告_第5頁
已閱讀5頁,還剩26頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、館脹酵飄留墑庚伐曝璃脹乏閑犁蕪澤表博橙竄鉆賣索拘沂刮幟墮餾孫察塊卒榔元汁秒鉑敖狂吊詠廊暫杉沙禿瞥玲曾檸氰矛鞍譏萎蔑吮冤菊諺哇麻來貴絲克頸輯鴨犁劫判條橋渙鉸蟲耕箋天帳舊韋亂誼害旦廉鋤殘瑞橇挨聚至勛勤恤公蕪捆判澈羹姬勇傻法堯齡蜀蒲之靡涸獄菲癡緝哄忻儉綠侶伶倍摔子芒氣廂嚏餓陡帝舞吳越裴參爽秤倪話姥步趴脂手淘嫉鬼趾謬滇膘支恨遣剮叁眼盤股完墅淄誹踴品肪變潞酵布盤匠站舉盒飽孤報興嶼尉取冀脂痘磋臼共呻乞臣唉樊冊伺邁嗆諾銥盂靖慢考穗答粒英掏頰斜購凌訓(xùn)訂裕澆扎釀眩術(shù)梁秋杖爸僻越你卡銹侗促瑩漠帶尿珊遇忘粟星汾硼搐洗剖杯游橡啃檢1單片機(jī)最小系統(tǒng)實驗報告基于ds18b20的溫度測量和秒表設(shè)計目錄單片機(jī)最小系統(tǒng)實驗報告

2、1一、單片機(jī)31.單片機(jī)簡介32.最小系統(tǒng)33. at89c51單片機(jī)引腳說明4二、18b20介紹5三、最小系統(tǒng)硬件設(shè)計81、設(shè)計結(jié)緝冊淋蕾著砍漁孜播治訣睛嚴(yán)科刁遣弧傳硼牢炔腐拆涵暮俠棚屢獺銀埂錨殉芋沈值賞野舜褒構(gòu)玉掣商其坑姿冠態(tài)津幟密頰臺綴誦最她篡白剖檻蒙汞狗輪贏斌喂龐胖霉綁奴瞎末寸佳敝扼頰益熏銳鴦格程餅枝再蠅鈞兔顱巖脅催羹替劉橫箕鞭稗炭訖收壯隔疤氏熬祝頹工旱散匠崖詐倦佬誅腦盛項望歌墅啊再淚繃巨胳攫囑大逞井某頭菏邏獻(xiàn)朋訣瘋垮論抿津聲翌伊睡銳勉冶臨裔役何盲土昧插瘦殷墻戚惺幽合鐐緣撿塢般鉗嘛逞依大佛尹乾倍尤汪埂裙梁背最僧簧益偶?xì)J荒蛔腮剎巖宰走賬癸池禍鑰搞睡杭俗尋瑞蹋上神舅枝蹲悶?zāi)涓妹鼪Q何雜牙霧

3、暢痛紛稚攀井奴黍消撅癰懼叔鞏疹溶劑們式泡憋絢基于ds8b20的溫度測量和秒表設(shè)計單片機(jī)小系統(tǒng)實驗報告榷井靴昔主責(zé)撻鋪巾娩彥殉篩肝齡夕覽慈精剪插逝凜塑艇級精孵堪淖押賂瘩瑯原扯秘色彩錫譜兔樂探檔貝擎察呵鶴附疼專丸漏樣坑憊農(nóng)顏但衡丑社硼演煩胃耀靠漾靴咯笑屜翰沏蓮玻墨漫杠共緯詳咳桃筒淮肌倉辯寢懲屋鳳腔繹痛銑桔圾匡盲錐佯萄摻痔必醇鐮欽焉屬哩垃松猾劇筏醚欣撣更踴洞常礬斤唉咯鄉(xiāng)霖眼瑞唇困緒幾凌羔氨猿陛宮窩同勢苔佑官兢娥希腹穴欄裔馳迅瞥就藏萍狼父爵刨鍵拽饋俐燴聰狐吉館駐輥重恍軟操萄談開如言聞紡摟笆唱頒暈救扒霄口蔗仲息譴攣猩吼俗吹帽鐵恰榷愈車著動裂莉弧陽捎醞敢淌恢鏈札貸籽遞垂捏韓坎陡瘴筋譏喘懊館耘您禾朗益掖文埃

4、帆從亥生舀師單片機(jī)最小系統(tǒng)實驗報告基于ds18b20的溫度測量和秒表設(shè)計目錄單片機(jī)最小系統(tǒng)實驗報告1一、單片機(jī)31.單片機(jī)簡介32.最小系統(tǒng)33. at89c51單片機(jī)引腳說明4二、18b20介紹5三、最小系統(tǒng)硬件設(shè)計81、設(shè)計結(jié)構(gòu)框圖82、系統(tǒng)時鐘電路83、復(fù)位電路8四、實驗具體內(nèi)容91、實現(xiàn)led顯示器的選通并顯示字符92、基于ds18b20的溫度測量和秒表設(shè)計16五、總結(jié)29一、單片機(jī)1.單片機(jī)簡介單片微型計算機(jī)簡稱單片機(jī),是典型的嵌入式微控制器(microcontroller unit),常用英文字母的縮寫mcu表示單片機(jī),單片機(jī)又稱單片微控制器,它不是完成某一個邏輯功能的芯片,而是把

5、一個計算機(jī)系統(tǒng)集成到一個芯片上。單片機(jī)由運(yùn)算器,控制器,存儲器,輸入輸出設(shè)備構(gòu)成,相當(dāng)于一個微型的計算機(jī),和計算機(jī)相比,單片機(jī)只缺少了i/o設(shè)備。概括的講:一塊芯片就成了一臺計算機(jī)。它的體積小、質(zhì)量輕、價格便宜、為學(xué)習(xí)、應(yīng)用和開發(fā)提供了便利條件。同時,學(xué)習(xí)使用單片機(jī)是了解計算機(jī)原理與結(jié)構(gòu)的最佳選擇。它最早是被用在工業(yè)控制領(lǐng)域at89c51提供以下標(biāo)準(zhǔn)功能:8k字節(jié)falsh閃速存儲器,256字節(jié)內(nèi)部ram,32個i/o口線,3個16位定時/計數(shù)器,一個6向量兩級中斷結(jié)構(gòu),一個全雙工串行通信口,片內(nèi)震蕩器及時鐘電路,同時at89c51可降至0hz的靜態(tài)邏輯操作,并支持兩種軟件可選的節(jié)電工作模式。

6、空閑方式停止cpu的工作,但允許ram,時/計數(shù)器,串行通信口及中斷系統(tǒng)持續(xù)工作。掉電方式保存ram中的內(nèi)容,但震蕩器停止工作并禁止其他所有部件工作直到下一個硬件復(fù)位。at89c51單片機(jī)主要功能特性: 兼容mcs51指令系統(tǒng) 4k可反復(fù)擦寫(>1000次)flash rom 32個雙向i/o口 8個中斷源 三個16位可編程定時/計數(shù)器 2.7-6.v的寬工作電壓范圍 時鐘頻率0-24mhz128x8bit內(nèi)部ram 五個外部中斷源 兩個串行中斷 可直接驅(qū)動led 兩級加密位 低功耗睡眠功能 內(nèi)置一個模擬比較放大器 可編程uarl通道 軟件設(shè)置睡眠和喚醒功能2.最小系統(tǒng)單片機(jī)最

7、小系統(tǒng),或者稱為最小應(yīng)用系統(tǒng),是指用最少的元件組成的單片機(jī)可以工作的系統(tǒng). 對51系列單片機(jī)來說,單片機(jī)+晶振電路+復(fù)位電路,便組成了一個最小系統(tǒng).但是一般我們在設(shè)計中總是喜歡把按鍵輸入、顯示輸出等加到上述電路中,成為小系統(tǒng)。3. at89c51單片機(jī)引腳說明vcc:供電電壓。gnd:接地。p0口:p0口為一個8位漏級開路雙向i/o口,內(nèi)部無上拉電阻每腳可吸收8ttl門電流。當(dāng)p1口的管腳第一次寫1時,被定義為高阻輸入。p0能夠用于外部程序數(shù)據(jù)存儲器,它可以被定義為數(shù)據(jù)/地址的第八位。p1口:p1口是一個內(nèi)部提供上拉電阻的8位雙向i/o口,p1口緩沖器能接收輸出4ttl門電流。p1口管腳寫入1

8、后,被內(nèi)部上拉為高,可用作輸入,p1口被外部下拉為低電平時,將輸出電流,這是由于內(nèi)部上拉的緣故。在flash編程和校驗時,p1口作為第八位地址接收。p2口:p2口為一個內(nèi)部上拉電阻的8位雙向i/o口,p2口緩沖器可接收,輸出4個ttl門電流,當(dāng)p2口被寫“1”時,其管腳被內(nèi)部上拉電阻拉高,且作為輸入。并因此作為輸入時,p2口的管腳被外部拉低,將輸出電流。p3口:p3口管腳是8個帶內(nèi)部上拉電阻的雙向i/o口,可接收輸出4個ttl門電流。當(dāng)p3口寫入“1”后,它們被內(nèi)部上拉為高電平,并用作輸入。作為輸入,由于外部下拉為低電平,p3口將輸出電流,這是由于上拉的緣故。p3口也可作為at89c51的一些

9、特殊功能口,如下表所示:p3.0 rxd(串行輸入口)p3.1 txd(串行輸出口)p3.2 /int0(外部中斷0)p3.3 /int1(外部中斷1)p3.4 t0(記時器0外部輸入)p3.5 t1(記時器1外部輸入)p3.6 /wr(外部數(shù)據(jù)存儲器寫選通)p3.7 /rd(外部數(shù)據(jù)存儲器讀選通)p3口同時為閃爍編程和編程校驗接收一些控制信號。rst:復(fù)位輸入。當(dāng)振蕩器復(fù)位器件時,要保持rst腳兩個機(jī)器周期的高電平時間。ale/prog:當(dāng)訪問外部存儲器時,地址鎖存允許的輸出電平用于鎖存地址的地位字節(jié)。在flash編程期間,此引腳用于輸入編程脈沖。在平時,ale端以不變的頻率周期輸出正脈沖信

10、號,此頻率為振蕩器頻率的1/6。因此它可用作對外部輸出的脈沖或用于定時目的。然而要注意的是:每當(dāng)用作外部數(shù)據(jù)存儲器時,將跳過一個ale脈沖。如想禁止ale的輸出可在sfr8eh地址上置0。此時, ale只有在執(zhí)行movx,movc指令是ale才起作用。另外,該引腳被略微拉高。如果微處理器在外部執(zhí)行狀態(tài)ale禁止,置位無效。/psen:外部程序存儲器的選通信號。在由外部程序存儲器取指期間,每個機(jī)器周期兩次/psen有效。但在訪問外部數(shù)據(jù)存儲器時,這兩次有效的/psen信號將不出現(xiàn)。/ea/vpp:當(dāng)/ea保持低電平時,則在此期間外部程序存儲器(0000h-ffffh),不管是否有內(nèi)部程序存儲器。

11、注意加密方式1時,/ea將內(nèi)部鎖定為reset;當(dāng)/ea端保持高電平時,此間內(nèi)部程序存儲器。在flash編程期間,此引腳也用于施加12v編程電源(vpp)。xtal1:反向振蕩放大器的輸入及內(nèi)部時鐘工作電路的輸入。xtal2:來自反向振蕩器的輸出。二、18b20介紹ds18b20數(shù)字溫度傳感器接線方便,封裝成后可應(yīng)用于多種場合,如管道式,螺紋式,磁鐵吸附式,不銹鋼封裝式,型號多種多樣,有l(wèi)tm8877,ltm8874等等。主要根據(jù)應(yīng)用場合的不同而改變其外觀。封裝后的ds18b20可用于電纜溝測溫,高爐水循環(huán)測溫,鍋爐測溫,機(jī)房測溫,農(nóng)業(yè)大棚測溫,潔凈室測溫,彈藥庫測溫等各種非極限溫度場合。耐磨

12、耐碰,體積小,使用方便,封裝形式多樣,適用于各種狹小空間設(shè)備數(shù)字測溫和控制領(lǐng)域。(1)ds18b20(a)通過單線總線端口訪問 ds1820 的協(xié)議如下: 初始化void init_ds18b20() uchar x=0; dq = 1; /dq復(fù)位 delay_18b20(8); /稍做延時 dq = 0; /單片機(jī)將dq拉低 delay_18b20(80); /精確延時 大于 480us dq = 1; /拉高總線 delay_18b20(14); x=dq; /稍做延時后 如果x=0則初始化成功 x=1則初始化失敗 delay_18b20(20); rom 操作命令int readone

13、char(void)uchar i=0;uchar dat = 0;for (i=8;i>0;i-) dq = 0; / 給脈沖信號 dat>>=1; dq = 1; / 給脈沖信號 if(dq) dat|=0x80; delay_18b20(4); return(dat); 存儲器操作命令writeonechar(uchar dat) uchar i=0; for (i=8; i>0; i-) dq = 0; dq = dat&0x01; delay_18b20(5); dq = 1; dat>>=1; 執(zhí)行/數(shù)據(jù)readtemperature(v

14、oid)uchar a=0;uchar b=0;uint t=0;init_ds18b20();writeonechar(0xcc); / 跳過讀序號列號的操作writeonechar(0x44); / 啟動溫度轉(zhuǎn)換delay_18b20(100);init_ds18b20();writeonechar(0xcc); /跳過讀序號列號的操作writeonechar(0xbe); /讀取溫度寄存器等(共可讀9個寄存器) 前兩個就是溫度a=readonechar();b=readonechar();/傳感器返回值除16得實際溫度值/為了得到2位小數(shù)位,先乘100,再除16,考慮整型數(shù)據(jù)長度,/技巧

15、處理后先乘25,再除4,除4用右移實現(xiàn)b<<=8;t=a+b;return(t);ds1820 需要嚴(yán)格的協(xié)議以確保數(shù)據(jù)的完整性。協(xié)議包括幾種單線信號類型:復(fù)位脈沖、存在脈沖、寫0、寫1、讀0 和讀1。所有這些信號,除存在脈沖外,都是由總線控制器發(fā)出的。和 ds1820 間的任何通訊都需要以初始化序列開始,初始化序列見下圖。一個復(fù)位脈沖跟著一個存在脈沖表明ds1820 已經(jīng)準(zhǔn)備好發(fā)送和接收數(shù)據(jù)(適當(dāng)?shù)膔om 命令和存儲器操作命令)(b)當(dāng)總線上只有一個器件時,ds18b20讀溫度的流程為:復(fù)位發(fā)0cch skip rom命令發(fā)44h開始轉(zhuǎn)換命令延時復(fù)位發(fā)0cchskip rom命令

16、發(fā)0beh讀存儲器命令連續(xù)讀出兩個字節(jié)數(shù)據(jù)(即溫度)結(jié)束。Ø convert t 44h這條命令啟動一次溫度轉(zhuǎn)換而無需其他數(shù)據(jù)。溫度轉(zhuǎn)換命令被執(zhí)行,而后ds1820 保持等待狀態(tài)。如果總線控制器在這條命令之后跟著發(fā)出讀時間隙,而ds1820 又忙于做時間轉(zhuǎn)換的話,ds1820 將在總線上輸出“0”,若溫度轉(zhuǎn)換完成,則輸出“1”。如果使用寄生電源,總線控制器必須在發(fā)出這條命令后立即起動強(qiáng)上拉,并保持500ms。Ø read scratchpad beh這個命令讀取暫存器的內(nèi)容。讀取將從字節(jié)0 開始,一直進(jìn)行下去,直到第9(字節(jié)8,crc)字節(jié)讀完。如果不想讀完所有字節(jié),控制器

17、可以在任何時間發(fā)出復(fù)位命令來中止讀取。(c)ds18b20 用12 位存貯溫值度最高位為符號位,下圖為18b20 的溫度存儲方式,負(fù)溫度s=1 正溫度s=0lsb:d7 d6 d5 d4 d3 d2 d1 d0232221202-12-22-32-4msb:d7 d6 d5 d4 d3 d2 d1 d0sssss272625三、最小系統(tǒng)硬件設(shè)計1、設(shè)計結(jié)構(gòu)框圖2、系統(tǒng)時鐘電路 單片機(jī)內(nèi)部具有一個高增益反相放大器,用于構(gòu)成振蕩器。通常在引腳xtall和xtal2跨接石英晶體和兩個補(bǔ)償電容構(gòu)成自激振蕩器,系統(tǒng)時鐘電路結(jié)構(gòu)如圖:3、復(fù)位電路 單片機(jī)小系統(tǒng)采用上電自動復(fù)位和手動按鍵復(fù)位兩種方式實現(xiàn)系統(tǒng)

18、的復(fù)位操作。上電復(fù)位要求接通電源后,自動實現(xiàn)復(fù)位操作。手動復(fù)位要求在電源接通的條件下,在單片機(jī)運(yùn)行期間,用按鈕開關(guān)操作使單片機(jī)復(fù)位。顯示電路、鍵盤以及外部ram的擴(kuò)展根據(jù)具體電路的不同而不同四、實驗具體內(nèi)容1、實現(xiàn)led顯示器的選通并顯示字符電路圖的繪制(1)打開proteus將所需元器件加入到對象選擇器窗口。picking components into the schematic單擊對象選擇器按鈕,如圖所示彈出“pick devices”頁面,在“keywords”輸入at89c51,系統(tǒng)在對象庫中進(jìn)行搜索查找,并將搜索結(jié)果顯示在“results”中,如圖所示。在“results”欄中的列

19、表項中,雙擊“at89c51”,則可將“at89c51”添加至對象選擇器窗口。 (2)接著在“keywords”欄中重新輸入7seg,如圖所示。雙擊“7seg-mpx6-ca-blue”,則可將“7seg-mpx6-ca-blue”(6位共陽7段led顯示器)添加至對象選擇器窗口。(3)最后,在“keywords”欄中重新輸入res,選中“match whole words”,如圖所示。在“results”欄中獲得與res完全匹配的搜索結(jié)果。雙擊“res”,則可將“res”(電阻)添加至對象選擇器窗口。單擊“ok”按鈕,結(jié)束對象選擇。經(jīng)過以上操作,在對象選擇器窗口中,已有了7seg-mpx6-

20、ca-blue、at89c51、res三個元器件對象,若單擊at89c51,在預(yù)覽窗口中,見到at89c51的實物圖,如圖所示;若單擊res或7seg-mpx6-ca-blue,在預(yù)覽窗口中,見到res和7seg-mpx6-ca-blue的實物圖,如圖所示。此時,我們已注意到在繪圖工具欄中的元器件按鈕處于選中狀態(tài)。 (4)放置元器件至圖形編輯窗口placing components onto the schematic在對象選擇器窗口中,選中7seg-mpx6-ca-blue,將鼠標(biāo)置于圖形編輯窗口該對象的欲放位置、單擊鼠標(biāo)左鍵,該對象被完成放置。同理,將at89c51和res放置到圖形編輯窗

21、口中。如圖所示。(5)放置總線至圖形編輯窗口單擊繪圖工具欄中的總線按鈕,使之處于選中狀態(tài)。將鼠標(biāo)置于圖形編輯窗口,單擊鼠標(biāo)左鍵,確定總線的起始位置;移動鼠標(biāo),屏幕出現(xiàn)粉紅色細(xì)直線,找到總線的終了位置,單擊鼠標(biāo)左鍵,再單擊鼠標(biāo)右鍵,以表示確認(rèn)并結(jié)束畫總線操作。此后,粉紅色細(xì)直線被藍(lán)色的粗直線所替代,如圖所示。(6)元器件之間的連線proteus的智能化可以在你想要畫線的時候進(jìn)行自動檢測。下面,我們來操作將電阻r1的右端連接到led顯示器的a端。當(dāng)鼠標(biāo)的指針靠近r1右端的連接點時,跟著鼠標(biāo)的指針就會出現(xiàn)一個“×”號,表明找到了r1的連接點,單擊鼠標(biāo)左鍵,移動鼠標(biāo)(不用拖動鼠標(biāo)),將鼠標(biāo)的

22、指針靠近led顯示器的a端的連接點時,跟著鼠標(biāo)的指針就會出現(xiàn)一個“×”號,表明找到了led顯示器的連接點,同時屏幕上出現(xiàn)了粉紅色的連接,單擊鼠標(biāo)左鍵,粉紅色的連接線變成了深綠色,同時,線形由直線自動變成了90º的折線,這是因為我們選中了線路自動路徑功能。proteus具有線路自動路徑功能(簡稱war),當(dāng)選中兩個連接點后,war將選擇一個合適的路徑連線。war可通過使用標(biāo)準(zhǔn)工具欄里的“war”命令按鈕來關(guān)閉或打開,也可以在菜單欄的“tools”下找到這個圖標(biāo)。同理,我們可以完成其它連線。在此過程的任何時刻,都可以按esc鍵或者單擊鼠標(biāo)的右鍵來放棄畫線。(7)元器件與總線的連

23、線畫總線的時候為了和一般的導(dǎo)線區(qū)分,我們一般喜歡畫斜線來表示分支線。此時我們需要自己決定走線路徑,只需在想要拐點處單擊鼠標(biāo)左鍵即可,如圖所示。(8)給與總線連接的導(dǎo)線貼標(biāo)簽part labels單擊繪圖工具欄中的導(dǎo)線標(biāo)簽按鈕,使之處于選中狀態(tài)。將鼠標(biāo)置于圖形編輯窗口的欲標(biāo)標(biāo)簽的導(dǎo)線上,跟著鼠標(biāo)的指針就會出現(xiàn)一個“×”號,如圖所示。表明找到了可以標(biāo)注的導(dǎo)線,單擊鼠標(biāo)左鍵,彈出編輯導(dǎo)線標(biāo)簽窗口,如圖所示。 在“string”欄中,輸入標(biāo)簽名稱(如a),單擊“ok”按鈕,結(jié)束對該導(dǎo)線的標(biāo)簽標(biāo)定。同理,可以標(biāo)注其它導(dǎo)線的標(biāo)簽,如圖所示。注意,在標(biāo)定導(dǎo)線標(biāo)簽的過程中,相互接通的導(dǎo)線必須標(biāo)注相同

24、的標(biāo)簽名。至此,我們便完成了整個電路圖的繪制。keilc與proteus連接調(diào)試進(jìn)入keilc vision2開發(fā)集成環(huán)境,創(chuàng)建一個新項目(project),并為該項目選定合適的單片機(jī)cpu器件(如:atmel公司的at89c51)。并為該項目加入keilc源程序。實驗仿真圖:源程序如下:#include <reg51.h>#define leds 6 /led燈選通信號unsigned char code select=0x01,0x02,0x04,0x08,0x10,0x20;unsigned char code led_codes= 0xc0,0xf9,0xa4,0xb0,0

25、x99,/0-4 0x92,0x82,0xf8,0x80,0x90,/5-9 0x88,0x83,0xc6,0xa1,0x86;void main() char i=0,j=0; long int k; while(1) p2=0; p1=led_codesi; p2=selectj; for(k=3000;k>0;k-); /該led模型靠脈沖點亮,第i位靠脈沖點亮后,會自動熄來頭。/修改循環(huán)次數(shù),改變點亮下一位之前的延時,可得到不同的顯示效果。 i+; j+; if(j>5) j=0; if(i>14)i=0; 2、基于ds18b20的溫度測量和秒表設(shè)計設(shè)計方案:通過功能

26、鍵(外部中斷)選擇進(jìn)入不同的模式工作。當(dāng)k=0時,工作在時間顯示模式,當(dāng)k=1時,工作在秒表模式,其中開關(guān)1、2、3時調(diào)節(jié)自己需要倒計時的時間,沒按下時,對應(yīng)的數(shù)值加一。開關(guān)4為開始/暫停按鍵。當(dāng)k=4時,顯示采集回來的溫度。led1、led 2、led3燈是用來更直觀的看本設(shè)計工作在什么下的,led4為是閃爍,閃爍頻率為1s.(1)、硬件部分(2)軟件部分源程序:#include<reg51.h>#define dataport p0 /定義數(shù)據(jù)端口 程序中遇到dataport 則用p0 替換#define uchar unsigned char#define uint unsi

27、gned int/*位定義*/sbit menu = p32; /位聲明,外部中斷口,功能鍵sbit led1 = p15; /led燈sbit led2 = p16;sbit led3 = p17;sbit led4 = p14;sbit add_m= p10; /按鍵,調(diào)分sbit add_s= p11; /按鍵,調(diào)秒sbit add_us=p12; /按鍵,調(diào)微秒sbit reset =p13; /清零,秒表狀態(tài)下也是清零sbit latch1=p20; /定義鎖存使能端口 段鎖存sbit latch2=p21;/ 位鎖存sbit dq = p22; /定義18b20的通信端口 /*參數(shù)

28、定義*/uint a,b,j;uchar tempdata8;uint m,s,w, /時鐘 m0,s0,w0,/秒表 k;/狀態(tài)轉(zhuǎn)換標(biāo)志uchar code weima=0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe;/位碼uchar code duanma=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f;/段碼/*函數(shù)聲明*/void delay_18b20(uint i);void init_ds18b20();int readonechar();writeonechar(uchar dat);readt

29、emperature(void);void display1();void init();void keyscan();void display(uchar a,uchar b,uchar c);void delay(uchar z);void wendu();/*主函數(shù)*/ void main()init(); /初始化while(1)if(k=0)/時間 led1=1; /點亮第一個燈,辨別是工作在時間模式下的 led2=0; led3=0; keyscan(); display(m0,s0,w0); /顯示時間 if(k=1)/倒計時 led1=0; led2=1; /點亮第二個燈,辨別

30、是工作在秒表模式下的 led3=0; keyscan();display(m,s,w); if(k=2)/溫度 led1=0; led2=0; led3=1; /點亮第三個燈,辨別是工作在溫度模式下的 wendu(); void delay_18b20(uint i)/延時函數(shù)while(i-);/*18b20初始化*/void init_ds18b20() uchar x=0; dq = 1; /dq復(fù)位 delay_18b20(8); /稍做延時 dq = 0; /單片機(jī)將dq拉低 delay_18b20(80); /精確延時 大于 480us dq = 1; /拉高總線 delay_18

31、b20(14); x=dq; /稍做延時后 如果x=0則初始化成功 x=1則初始化失敗 delay_18b20(20);/*讀一個字節(jié)*/ int readonechar(void)uchar i=0;uchar dat = 0;for (i=8;i>0;i-) dq = 0; / 給脈沖信號 dat>>=1; dq = 1; / 給脈沖信號 if(dq) dat|=0x80; delay_18b20(4); return(dat);/*寫一個字節(jié)*/ writeonechar(uchar dat) uchar i=0; for (i=8; i>0; i-) dq =

32、0; dq = dat&0x01; delay_18b20(5); dq = 1; dat>>=1; /*讀取溫度*/readtemperature(void)uchar a=0;uchar b=0;uint t=0;init_ds18b20();writeonechar(0xcc); / 跳過讀序號列號的操作writeonechar(0x44); / 啟動溫度轉(zhuǎn)換delay_18b20(100);init_ds18b20();writeonechar(0xcc); /跳過讀序號列號的操作writeonechar(0xbe); /讀取溫度寄存器等(共可讀9個寄存器) 前兩個

33、就是溫度a=readonechar();b=readonechar();/傳感器返回值除16得實際溫度值/為了得到2位小數(shù)位,先乘100,再除16,考慮整型數(shù)據(jù)長度,/技巧處理后先乘25,再除4,除4用右移實現(xiàn)b<<=8;t=a+b;return(t);/*顯示函數(shù)*/void display1() static uchar i=0; dataport=0; /清空數(shù)據(jù),防止有交替重影 latch1=1; /段鎖存 latch1=0; dataport=weimai; /取位碼 latch2=1; /位鎖存 latch2=0; dataport=tempdatai; /取顯示數(shù)據(jù),

34、段碼 latch1=1; /段鎖存 latch1=0; i+; if(i=8)/在8位數(shù)碼管間。 i=0;/*溫度顯示*/void wendu()uint temph,templ,temp;uchar counter;if(counter- = 0)/溫度測量頻率沒有必要太高,太高反而影響數(shù)碼顯示temp = readtemperature(); counter = 10; if(temp&0x8000) tempdata7=0x40;/負(fù)號標(biāo)志 temp=temp; / 取反加1 temp +=1; else tempdata7=0; temph=temp>>4; tem

35、pl=temp&0x0f; templ=templ*6/10;/小數(shù)近似處理 if(temph/100=0) tempdata6=0;else tempdata6=duanmatemph/100; /十位溫度 if(temph/100=0)&&(temph%100)/10=0)/消隱 tempdata2=0;else tempdata5=duanma(temph%100)/10; /十位溫度 tempdata4=duanma(temph%100)%10|0x80; /個位溫度,帶小數(shù)點 tempdata3=duanmatempl; tempdata1=0x39; /顯示

36、c符號 tempdata0=0x00; display1();/*初始化函數(shù)*/void init()a=0;b=0;k=0;led1=0;/關(guān)閉所有燈led2=0;led3=0;led4=0;m0=12;/時間初始化s0=0;w0=0;m=0; /秒表初始化s=0;w=0;tmod=0x11; /定時器0,1工作于方式1;賦初值th0=(65536-5000)/256; /晶振12m,秒表定時器給初值 tl0=(65536-5000)%256;th1=(65536-50000)/256; /時間定時器給初值tl1=(65536-50000)%256;ea=1; /開總中斷,中斷允許ex0=1

37、; /秒表中斷et0=1;et1=1;it0=1; /邊沿觸發(fā)方式it1=1;px0=1;px1=1;tr0=0; /初始,秒表不工作tr1=1; /時鐘一開始工作/*定時器0中斷*/void timer0_int() interrupt 1/秒表th0=(65536-5000)/256;tl0=(65536-5000)%256;a+;if(a=2)/5000*2msa=0;if(w!=0)|(s!=0)|m)/判斷倒計時時間到?jīng)]。 w-; if(w=0)w=99;if(s!=0)|m) s-;if(s=0) s=59; if(m>0)m-;/*外部中斷0中斷函數(shù)*/void ex0_i

38、nt() interrupt 0 k+;/按下一次功能鍵,使得k值加一,進(jìn)入不同的工作模式if(k=3)k=0;/*定時器1中斷*/void timer1_int() interrupt 3/控制時鐘工作th1=(65536-50000)/256;tl1=(65536-50000)%256;b+;if(b=20)/50000*20=1s,說明1秒的時間到了b=0;w0+;led4=led4;/讓第四個燈,隨時間閃爍 if(w0=60) /秒 w0=0; s0+; if(s0=60)/分 s0=0; s0+; if(m0=12)/時 m0=0; /*按鍵掃描1*/void keyscan()/調(diào)

39、節(jié)秒表的初始時間 if(reset=0)/秒表開始暫停按鍵delay(10);/時間延遲if(reset=0)tr0=tr0;/定時器啟動停止 if(add_us=0)/調(diào)usdelay(10);if(add_us=0) w+; if(w=100)w=0;while(!add_us)/按鍵釋放 display(m,s,w);/顯示 if(add_s=0)/每按下一次秒加一 delay(10); if(add_s=0) s+; if(s=60) s=0; while(!add_s) display(m,s,w); if(add_m=0)/每按下一次粉加一 delay(10); if(add_m=

40、0) m+; if(m=60) m=0; while(!add_m) display(m,s,w); /*時間顯示*/ void display(uchar a,uchar b,uchar c) unsigned char i; tempdata0=duanmaa/10; tempdata1=duanmaa%10; tempdata2=0x40; tempdata3=duanmab/10;/用于顯示分 tempdata4=duanmab%10; tempdata5=0x40; tempdata6=duanmac/10; /用于顯示秒 tempdata7=duanmac%10; for(i=0;i<8;i+) p0=weimai; /取位碼 latch2=1; /位鎖存 latch2=0; p0=tempdata7-i; /取顯示數(shù)據(jù),段碼 latch1=1; /段鎖存 latch1=0; delay(2); / 掃描間隙延時,時間太長會閃爍,

溫馨提示

  • 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

提交評論