單片機(jī)課程設(shè)計(jì)(論文)-數(shù)字溫度計(jì)設(shè)計(jì) (2).doc_第1頁(yè)
單片機(jī)課程設(shè)計(jì)(論文)-數(shù)字溫度計(jì)設(shè)計(jì) (2).doc_第2頁(yè)
單片機(jī)課程設(shè)計(jì)(論文)-數(shù)字溫度計(jì)設(shè)計(jì) (2).doc_第3頁(yè)
單片機(jī)課程設(shè)計(jì)(論文)-數(shù)字溫度計(jì)設(shè)計(jì) (2).doc_第4頁(yè)
單片機(jī)課程設(shè)計(jì)(論文)-數(shù)字溫度計(jì)設(shè)計(jì) (2).doc_第5頁(yè)
已閱讀5頁(yè),還剩34頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

單片機(jī)原理及應(yīng)用實(shí)習(xí)數(shù)字溫度計(jì)設(shè)計(jì)目 錄一 引言1二 硬件設(shè)計(jì) 2三 軟件設(shè)計(jì) 9四 調(diào)試過(guò)程及問(wèn)題分析 12五 結(jié)論 13六 參考文獻(xiàn) 14附件1 15附件2 29一、引言隨著時(shí)代的進(jìn)步和發(fā)展,單片機(jī)技術(shù)已經(jīng)普及到我們生活,工作,科研,各個(gè)領(lǐng)域,已經(jīng)成為一種比較成熟的技術(shù),當(dāng)然,學(xué)習(xí)單片機(jī)的原理及應(yīng)用已經(jīng)成為我們電子類專業(yè)大學(xué)生所必須的課程。而本文所介紹的是一種基于單片機(jī)控制的數(shù)字溫度計(jì)。所采用的元器件db18b20與傳統(tǒng)的溫度計(jì)相比,具有讀數(shù)方便,測(cè)溫范圍廣,測(cè)溫精確,數(shù)字顯示,適用范圍寬等特點(diǎn)。更加增強(qiáng)了其實(shí)用性和操作性。lcd12864液晶顯示模塊是12864 點(diǎn)陣的漢字圖形型液晶顯示模塊,可顯示漢字及圖形,具有多種功能:光標(biāo)顯示、畫面移位、睡眠模式等。數(shù)字溫度計(jì)選用stc89c52rc型單片機(jī)作為作為其主控器件,dsl8b20作為測(cè)溫傳感器通過(guò)液晶顯示器lcd12864調(diào)用數(shù)據(jù),實(shí)現(xiàn)溫度顯示。通過(guò)dsl8b20直接讀取被測(cè)溫度值,進(jìn)行數(shù)據(jù)轉(zhuǎn)換,該器件的物理化學(xué)性能穩(wěn)定,線性度較好,能夠快速精確的顯示數(shù)據(jù)。該器件可直接向單片機(jī)傳輸數(shù)字信號(hào),便于單片機(jī)處理及控制。另外,該溫度計(jì)還能直接采用測(cè)溫器件測(cè)量溫度,從而簡(jiǎn)化數(shù)據(jù)傳輸與處理過(guò)程。最終由lcd12864液晶顯示顯示出db18b20所測(cè)溫度。結(jié)果精確可調(diào)為0.5,分辨率為0.0625。二、硬件設(shè)計(jì)(一)、系統(tǒng)硬件設(shè)計(jì)方案根據(jù)系統(tǒng)功能要求,構(gòu)造如下圖所示的系統(tǒng)原理結(jié)構(gòu)框圖。ds18b20溫度數(shù)據(jù)采集stc89cs52rc初始化lcd12864驅(qū)動(dòng)顯示溫度圖1 系統(tǒng)原理結(jié)構(gòu)框圖1、 單片機(jī)的選擇stc89c52rc是新一代超強(qiáng)抗干擾/高速/低功耗的單片機(jī),指令代碼完全兼容傳統(tǒng)8051單片機(jī),12時(shí)鐘/機(jī)械周期和6時(shí)鐘/機(jī)械周期可以任意選擇,其內(nèi)核與at51系列單片機(jī)一樣,但是其造價(jià)較之更低,功能更強(qiáng)。at51單片機(jī)小系統(tǒng)的電路圖如下所示。單片機(jī)小系統(tǒng)電路1)、引腳說(shuō)明stc89c52的內(nèi)核和at51系列單片機(jī)一樣,故引腳也相同:18:i/op1口(p1.0p1.7);9: 復(fù)位腳(rst/vpd);1017:i/op3口(p3.0=rxd,p3.1=txd,p3.2=-int0,p3.3=-int1,p3.4=t0,p3.5=t1,p3.6=-wr,p3.7=-rd);18、19:晶振(18=xtal2,19=xtal1);20: 地(vss);2128:i/op2口(p2.0p2.7); 29:-psen;30:ale/-prog;31:-ea/vpp3239:i/op0口(p0.7p0.0);40:+5v電源。注:引腳功能前加“-”,說(shuō)明其是低電平有效。如p3.2=-int0。2)、內(nèi)部功能1. i/o 口:輸入/ 輸出口經(jīng)過(guò)特殊處理,很多干擾是從i/o 進(jìn)去的,每個(gè)i/o 均有對(duì)vcc/ 對(duì)gnd二級(jí)管箝位保護(hù)。2. 電源:?jiǎn)纹瑱C(jī)內(nèi)部的電源供電系統(tǒng)經(jīng)過(guò)特殊處理,很多干擾是從電源進(jìn)去的3. 時(shí)鐘單片機(jī)內(nèi)部的時(shí)鐘電路經(jīng)過(guò)特殊處理,很多干擾是從時(shí)鐘部分進(jìn)去的4 . 空閑模式:典型功耗 2ma5.正常工作模式:典型功耗 4ma - 7ma單片機(jī)內(nèi)部的時(shí)鐘電路經(jīng)過(guò)特殊處理,很多干擾是從時(shí)鐘部分進(jìn)去的6. 復(fù)位電路單片機(jī)內(nèi)部的復(fù)位電路經(jīng)過(guò)特殊處理,很多干擾是從復(fù)位電路部分進(jìn)去的,stc89c51rc/rd+系列單片機(jī)為高電平復(fù)位。推薦外置復(fù)位電路為max810/stc810,stc6344,stc6345,813l,706p;也可用r/c 復(fù)位,10uf 電容/10k 電阻,22uf/8.2k 等。6.寬電壓,不怕電源抖動(dòng)5v: 6v - 3.4v 3v: 4v - 1.9v2、溫度傳感器介紹ds18b20溫度傳感器是美國(guó)dallas半導(dǎo)體公司最新推出的一種改進(jìn)型智能溫度傳感器,與傳統(tǒng)的熱敏電阻等測(cè)溫元件相比,它能直接讀出被測(cè)溫度,并且可根據(jù)實(shí)際要求通過(guò)簡(jiǎn)單的編程實(shí)現(xiàn)位的數(shù)字值讀數(shù)方式。ds18b20內(nèi)部結(jié)構(gòu)主要由四部分組成:64位光刻rom、溫度傳感器、非揮發(fā)的溫度報(bào)警觸發(fā)器th和tl、配置寄存器。ds18b20可以程序設(shè)定912位的分辨率,精度為0.5c??蛇x更小的封裝方式,更寬的電壓適用范圍。分辨率設(shè)定存儲(chǔ)在eprom中,掉電后依然保存。而在此,我們?cè)O(shè)定12為分辨率,即溫度分辨率0.0625。ds18b20的性能特點(diǎn)如下:獨(dú)特的單線接口僅需要一個(gè)端口引腳進(jìn)行通信;多個(gè)ds18b20可以并聯(lián)在惟一的三線上,實(shí)現(xiàn)多點(diǎn)組網(wǎng)功能;無(wú)須外部器件;可通過(guò)數(shù)據(jù)線供電,電壓范圍為3.05.5;零待機(jī)功耗;溫度以或位數(shù)字;用戶可定義報(bào)警設(shè)置;報(bào)警搜索命令識(shí)別并標(biāo)志超過(guò)程序限定溫度(溫度報(bào)警條件)的器件;負(fù)電壓特性,電源極性接反時(shí),溫度計(jì)不會(huì)因發(fā)熱而燒毀,但不能正常工作; ds18b20采用腳pr35封裝或腳soic封裝,其內(nèi)部結(jié)構(gòu)框圖如下圖所示。c64 位rom和單線接口高速緩存存儲(chǔ)器與控制邏輯溫度傳感器高溫觸發(fā)器th低溫觸發(fā)器tl配置寄存器8位crc發(fā)生器vddds18b20內(nèi)部結(jié)構(gòu)根據(jù)ds18b20的通訊協(xié)議,主機(jī)控制ds18b20完成溫度轉(zhuǎn)換必須經(jīng)過(guò)三個(gè)步驟:(1).初始化(2) 執(zhí)行某個(gè)rom指令(3) 執(zhí)行ram內(nèi)存指令(4) 數(shù)據(jù)傳輸復(fù)位要求主cpu將數(shù)據(jù)線下拉480微秒,然后釋放,ds18b20收到信號(hào)后等待1660微秒左右,后發(fā)出60240微秒的存在低脈沖,主cpu收到此信號(hào)表示復(fù)位成功。ds18b20與單片機(jī)的接口電路3、液晶顯示lcd12864液晶顯示模塊是12864 點(diǎn)陣的漢字圖形型液晶顯示模塊,可顯示漢字及圖形,內(nèi)置國(guó)標(biāo)gb2312 碼簡(jiǎn)體中文字庫(kù)(16x16 點(diǎn)陣)、128 個(gè)字符(8x16 點(diǎn)陣)及64x256 點(diǎn)陣顯示ram(gdram)??膳ccpu 直接接口,提供兩種界面來(lái)連接微處理機(jī):8-位并行及串行兩種連接方式。具有多種功能:光標(biāo)顯示、畫面移位、睡眠模式等。硬件原理圖:1)、引腳說(shuō)明管腳號(hào)管腳名稱lever管腳功能描述1vss0電源地2vdd+5.0v電源電壓3v0-液晶顯示器驅(qū)動(dòng)電壓4d/i(rs)h/ld/i=“h”,表示db7db0為顯示數(shù)據(jù)d/i=“l(fā)”,表示db7db0為顯示指令數(shù)據(jù)5r/wh/lr/w=“h”,e=“h”數(shù)據(jù)被讀到db7db0r/w=“l(fā)”,e=“hl”數(shù)據(jù)被寫到ir或dr6eh/lr/w=“l(fā)”,e信號(hào)下降沿鎖存db7db0r/w=“h”,e=“h”ddram數(shù)據(jù)讀到db7db07db0h/l數(shù)據(jù)線8db1h/l數(shù)據(jù)線9db2h/l數(shù)據(jù)線10db3h/l數(shù)據(jù)線11db4h/l數(shù)據(jù)線12db5h/l數(shù)據(jù)線13db6h/l數(shù)據(jù)線14db7h/l數(shù)據(jù)線15cs1h/lh:選擇芯片(右半屏)信號(hào)16cs2h/lh:選擇芯片(左半屏)信號(hào)17reth/l復(fù)位信號(hào),低電平復(fù)位18vout-10vlcd驅(qū)動(dòng)負(fù)電壓19led+-led背光板電源20led-led背光板電源2)、 內(nèi)部功能器件及相關(guān)功能1. 指令寄存器(ir) ir是用于寄存指令碼,與數(shù)據(jù)寄存器數(shù)據(jù)相對(duì)應(yīng)。當(dāng)d/i=0時(shí),在e信號(hào)下降沿的作用下,指令碼寫入ir。2數(shù)據(jù)寄存器(dr) dr是用于寄存數(shù)據(jù)的,與指令寄存器寄存指令相對(duì)應(yīng)。當(dāng)d/i=1時(shí),在下降沿作用下,圖形顯示數(shù)據(jù)寫入dr,或在e信號(hào)高電平作用下由dr讀到db7db0數(shù)據(jù)總線。dr和ddram之間的數(shù)據(jù)傳輸是模塊內(nèi)部自動(dòng)執(zhí)行的。3忙標(biāo)志:bf bf標(biāo)志提供內(nèi)部工作情況。bf=1表示模塊在內(nèi)部操作,此時(shí)模塊不接受外部指令和數(shù)據(jù)。bf=0時(shí),模塊為準(zhǔn)備狀態(tài),隨時(shí)可接受外部指令和數(shù)據(jù)。 利用status read指令,可以將bf讀到db7總線,從檢驗(yàn)?zāi)K之工作狀態(tài)。4顯示控制觸發(fā)器dff 此觸發(fā)器是用于模塊屏幕顯示開和關(guān)的控制。dff=1為開顯示(display off),ddram的內(nèi)容就顯示在屏幕上,dff=0為關(guān)顯示(display off)。 ddf的狀態(tài)是指令display on/off和rst信號(hào)控制的。5xy地址計(jì)數(shù)器 xy地址計(jì)數(shù)器是一個(gè)9位計(jì)數(shù)器。高3位是x地址計(jì)數(shù)器,低6位為y地址計(jì)數(shù)器,xy地址計(jì)數(shù)器實(shí)際上是作為ddram的地址指針,x地址計(jì)數(shù)器為ddram的頁(yè)指針,y地址計(jì)數(shù)器為ddram的y地址指針。 x地址計(jì)數(shù)器是沒(méi)有記數(shù)功能的,只能用指令設(shè)置。 y地址計(jì)數(shù)器具有循環(huán)記數(shù)功能,各顯示數(shù)據(jù)寫入后,y地址自動(dòng)加1,y地址指針從0到63。6顯示數(shù)據(jù)ram(ddram) ddram是存儲(chǔ)圖形顯示數(shù)據(jù)的。數(shù)據(jù)為1表示顯示選擇,數(shù)據(jù)為0表示顯示非選擇。ddram與地址和顯示位置的關(guān)系見(jiàn)ddram地址表。7z地址計(jì)數(shù)器 z地址計(jì)數(shù)器是一個(gè)6位計(jì)數(shù)器,此計(jì)數(shù)器具備循環(huán)記數(shù)功能,它是用于顯示行掃描同步。當(dāng)一行掃描完成,此地址計(jì)數(shù)器自動(dòng)加1,指向下一行掃描數(shù)據(jù),rst復(fù)位后z地址計(jì)數(shù)器為0。 z地址計(jì)數(shù)器可以用指令display start line預(yù)置。因此,顯示屏幕的起始行就由此指令控制,即ddram的數(shù)據(jù)從哪一行開始顯示在屏幕的第一行。此模塊的ddram共64行,屏幕可以循環(huán)滾動(dòng)顯示64行。三、軟件設(shè)計(jì)(一)、設(shè)計(jì)題目及要求:1、基本要求設(shè)計(jì)指標(biāo):a. 測(cè)溫范圍:0100;b. 溫度分辨力:0.0625;c. 測(cè)量速率:2次/秒自動(dòng)連續(xù)測(cè)量;d. 結(jié)果顯示方式:用圖形液晶lcd12864顯示當(dāng)前溫度及與上一次溫度測(cè)量值差值。2、擴(kuò)展要求用圖形液晶顯示溫度曲線。3、誤差測(cè)試調(diào)試無(wú)誤后,可用水銀溫度計(jì)與其進(jìn)行比對(duì),記錄測(cè)量結(jié)果,進(jìn)行誤差分析。(二)、整體思路根據(jù)要求,我們將整個(gè)程序分為三大部分。主要包括主程序,溫度傳感程序,lcd12864液晶顯示程序。(二)、程序流圖1、 ds18b20溫度計(jì)程序ds18b20溫度計(jì)程序包括讀出溫度子程序,溫度轉(zhuǎn)換命令子程序,計(jì)算溫度子程序。主程序的主要功能是負(fù)責(zé)溫度的實(shí)時(shí)顯示、讀出并處理ds18b20的測(cè)量溫度值,溫度測(cè)量每0.5s進(jìn)行一次。讀出溫度子程序的主要功能是讀出ram中的字節(jié)。溫度轉(zhuǎn)換命令子程序主要是發(fā)溫度轉(zhuǎn)換開始命令,采用12位分辯率為0.065,在本程序設(shè)計(jì)中采用0.5s顯示程序延時(shí)法等待轉(zhuǎn)換的完成。 ds18b20溫度計(jì)程序流程圖如下:開始ds18b20的初始化啟動(dòng)溫度轉(zhuǎn)換讀取溫度寄存器ds18b20的初始化復(fù)位(二)、lcd12864液晶顯示程序流程圖如下:(三)、主程序流圖開始初始化顯示開機(jī)畫面(b3組數(shù)字溫度計(jì))循環(huán)溫度上電轉(zhuǎn)化一次(讀取溫度)溫度上電轉(zhuǎn)化一次(讀取溫度)溫度處理溫度處理調(diào)用液晶顯示程序顯示溫度(當(dāng)前溫度)儲(chǔ)存此刻溫度b儲(chǔ)存此刻溫度a調(diào)用液晶顯示程序顯示溫度(之前溫度)if(ab)yn 溫度差d=b-a溫度差d=a-b處理溫度差顯示溫度差四、調(diào)試過(guò)程及問(wèn)題分析我所設(shè)計(jì)的模塊為lcd12864液晶顯示模塊,由于之前所接觸的顯示器件都是數(shù)碼管顯示,對(duì)液晶顯示還是很陌生,所以在此次設(shè)計(jì)中,我翻閱和產(chǎn)尋了很多資料,對(duì)其內(nèi)部結(jié)構(gòu)進(jìn)行了解,對(duì)其功能不斷滲透,而老師在設(shè)計(jì)前也給了我們?cè)S多關(guān)于lcd12864的顯示源程序及調(diào)試程序,這對(duì)我們的設(shè)計(jì)起了很大幫助。但是在寫源程序的時(shí)候還是出了很多的問(wèn)題。根據(jù)老師所給的綜合程序,我們進(jìn)行了綜合分析,而我們的設(shè)計(jì)在液晶顯示上重點(diǎn)是要輸出漢字和相應(yīng)的溫度數(shù)值,綜合程序中有漢字輸出,我開始根據(jù)程序從取模程序中輸出所需漢字的字模,但是從液晶屏上卻總顯示的是亂碼,試了很多次,最后請(qǐng)教老師才知道,所給字碼的像素是不一樣的,所給綜合程序的discode是8*16像素的,而我從取模程序中取的字模是16*16像素的,后來(lái),老師和我們分析了液晶屏顯示字碼的基本原理,每一格通過(guò)為代碼顯示字模信息,后來(lái),我又仔細(xì)分析和對(duì)比了綜合程序的字模和我的字模,找到了兩個(gè)解決方案,改代碼或者改像素。結(jié)果都如我愿,操作顯示正確。后來(lái)我在弄完時(shí)閑來(lái)無(wú)事又發(fā)現(xiàn)了一種方法可以用16*16的像素用8*16的discode顯示,我發(fā)現(xiàn),只要我所需要的字碼在相應(yīng)的小格里顯示輸出字碼即可,于是我把一個(gè)字分左、右兩部分分別顯示,輸出字碼結(jié)合,結(jié)果也正確,而在此次設(shè)計(jì)中,我們采取漢字的輸出方法也均用此方法。液晶顯示模塊的代碼在我們的整體設(shè)計(jì)中可以說(shuō)是一塊比較簡(jiǎn)單的部分,而重點(diǎn)就是db18b20的溫度模塊,這個(gè)模塊是我們組花比較多的時(shí)間完成的,db18b20對(duì)溫度的測(cè)量是在延時(shí)過(guò)程中進(jìn)行的,在溫度的轉(zhuǎn)化中設(shè)定0.5s的測(cè)溫速度,以12位的分辨率進(jìn)行,這12位轉(zhuǎn)化后得到的12位數(shù)據(jù),存儲(chǔ)在18b20的兩個(gè)8比特的ram中,只要將測(cè)到的數(shù)值乘于0.0625即可得到實(shí)際溫度;如果溫度小于0,這5位為1,測(cè)到的數(shù)值需要取反加1再乘于0.0625即可得到實(shí)際溫度。溫度主函數(shù)輸出溫度。而整體的主函數(shù)調(diào)用溫度顯示溫度是我們整個(gè)設(shè)計(jì)的一個(gè)大問(wèn)題,試了許多次,總是達(dá)不到所期待的結(jié)果,最后,老師告訴我們,在軟件中仿真,一點(diǎn)點(diǎn)的找根源,進(jìn)入程序內(nèi)部,分析,一點(diǎn)點(diǎn)的排除。最終,我們發(fā)現(xiàn)了問(wèn)題所在,原來(lái)是溫度轉(zhuǎn)換出了問(wèn)題,在溫度輸出的16位字節(jié)的高八位 和低八位的輸出轉(zhuǎn)換有誤,修改后輸出正確。五、結(jié)論在這一學(xué)期的單片機(jī)課程中,文老師給我們講了許多單片機(jī)的內(nèi)部結(jié)構(gòu),編譯語(yǔ)言,一直在朦朦朧朧的學(xué)習(xí),模模糊糊的接受,即使到了考試的時(shí)候,我甚至感覺(jué)自己對(duì)單片機(jī)還是那么陌生。兩周的課程實(shí)習(xí),不長(zhǎng)不短,但是又不可或缺,它似乎是對(duì)一學(xué)期的課程的潤(rùn)色,把抽象變?yōu)樾蜗?,讓我們突然跳出理論,開始實(shí)踐,當(dāng)然是理論結(jié)合實(shí)踐,真正在做得時(shí)候,才發(fā)現(xiàn)之前學(xué)的那么少,進(jìn)行課程實(shí)習(xí)的時(shí)候,我看了很多關(guān)于單片機(jī),溫度傳感器,液晶顯示器的資料和相應(yīng)的程序代碼,越看越不懂,但是越看就越想看,就感覺(jué)看到一個(gè)不懂的,去找答案,于是就剎不住車了,一個(gè)套著一個(gè),但是雖然模糊,但是卻越想看,又一次,我看的最晚的一次是從下午一直到晚上3點(diǎn)多,一直沒(méi)有看表也沒(méi)有注意時(shí)間,那次我才發(fā)現(xiàn)知識(shí)那么可貴,不能說(shuō)自己看懂,但是那種被知識(shí)灌輸?shù)母杏X(jué)讓我很舒服。對(duì)于此次的課程實(shí)習(xí),我也總結(jié)了很多我認(rèn)為適合我們,起碼適合我自己的一些方法。一、 要對(duì)硬件功能了解,要熟悉相應(yīng)程序代碼和功能實(shí)現(xiàn),二、 設(shè)計(jì)程序要有思路,根據(jù)思路才能有效進(jìn)行三、 編寫程序要有所根據(jù),出現(xiàn)錯(cuò)誤很正常,要一步步的排查錯(cuò)誤,一定要細(xì)心耐心四、 要懂得聽取正確意見(jiàn),多和人交流,集思廣益,合作的力量是無(wú)窮大的。五、 向別人講解程序時(shí),流程圖是最好的展示。而我們小組正是在不斷的合作中在兩次的課題中都順利完成。當(dāng)然在此感謝各位指導(dǎo)老師這幾周里對(duì)我們的幫助和指導(dǎo)。參考文獻(xiàn)1楊恢先,黃輝先.單片機(jī)原理及應(yīng)用(第一版) m.北京:人民郵電出版社,2006:214-221.2馬忠梅.單片機(jī)c語(yǔ)言程序設(shè)計(jì) m.北京:北航出版社,2007:36-48.3 田立,田清,代方震. 51單片機(jī)c語(yǔ)言程序設(shè)計(jì)快速入門(第一版) m.北京:人民郵電出版社,2007:35-40.附件1:源程序代碼/=/ lcd12864 液晶顯示/=#include #include #define uchar unsigned char#define uint unsigned int#define ulong unsigned long/=引腳定義=sbit lck = p35;/鎖存信號(hào)sbit dq =p14;/18b20數(shù)據(jù)線引腳/=常用命令及參數(shù)定義=#define dispon 0x3f#define dispoff 0x3e#define dispfirst 0xc0#define setx 0x40#define sety 0xb8#define lcdbuzy 0x80#define l 0x00#define r 0x40#define limit 0x80#define line 16 / 設(shè)置最多一行可以顯示多少字符(116)/=全局變量=code uchar pixel8=0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80;uchar tempdisdata=0x00,0x00,0x00;uchar cbyte;uint i,j,temp;uchar data statu;uchar dispbuf8; /顯示緩沖區(qū) uchar temper2;/存放溫度的數(shù)組 bit xy; / the position variableuchar charnum=1; /this named charnum variable recorded the char position,the whole screen can write 56 characters/one line can be written 14 characters /=漢字序列定義#define hz_zhi +1#define hz_dang +3#define hz_qian +5#define hz_wen +7#define hz_du +9#define hz_b +11#define hz_c +12#define hz_cha +14#define hz_bb +16#define hz_3 +17#define hz_zu +18#define hz_shu +20#define hz_zi+22#define hz_ji +24#define hz_kongge +26/=函數(shù)聲明=void wrl(uchar x);void wrr(uchar x);void lcmcls(void);void delay1s(void);void lcminit (void);void putpicture(uchar flag);void delay(unsigned int time);void vtoh8x16change(uchar *hzbuf);void puthalf(uchar *strch,uchar row,uchar col);void wrdata(uchar x,uchar row,uchar col);void locatexy(uchar row,uchar col);void vwrite8x16character(uchar *ch,uchar row,uchar col,bit flag);void vwrite8x16string(uchar *str,uchar col, uchar row, bit flag);extern uchar code char_table9516;/=/ usage: print the character in format/=void printc(uint chr) uchar lie,hang; hang=(charnum-1)/line; hang=hang*2; lie=(charnum-1)%line; lie=8*lie; vwrite8x16character(char_tablechr- ,hang,lie,0); charnum+; /=/ name : prints(uchar *str)/ usage: print a stream in format /=void prints(uchar *str) while(*(str)!=0 ) / 一些格式的處理 if(*(str)=n ) /回車處理 charnum=(charnum+15)/16; charnum=charnum*16+1; str+; if(*(str)=0 ) return; if(*(str)=r ) /跳到所在行的行頭 charnum=(charnum+15)/16; charnum=(charnum)*16-15; str+; if(*(str)=0 ) return; printc(*(str); str+; /=/ name : format(uchar *str)/ usage: this function is printing some format/ 格式化顯示字符串 /=void format(uchar *str ) if(*(str)=n ) /回車處理 charnum=(charnum+15)/16; charnum=charnum*16+1; return; if(*(str)=r ) /回到本行頭 charnum=(charnum+15)/16; charnum=charnum*16-15; return; if(*(str)=p ) /回到上一行頭 charnum=(charnum+15)/16; charnum=charnum*16-31; return; if(*(str)=b ) /退格,并刪除 charnum-; prints( ); charnum-; return; /*延時(shí)函數(shù)*/void delay (unsigned int us) while(us-);void reset(void) /復(fù)位 uchar x=0; dq = 1; delay(8); /稍做延時(shí) dq = 0; delay(80); /精確延時(shí) 大于 480us dq = 1; /拉高總線 delay(14); x=dq; delay(20);void wr_temp(uchar dat)/寫1個(gè)字節(jié)bit testb;for(j=8;j0;j-)testb=dat&0x01;dat=dat1;if(testb)/寫1dq=0;/拉低總線,產(chǎn)生寫時(shí)間隙i+;/延時(shí)大于1usdq=1;/拉高總線i=8;while(i0)i-;/延時(shí)至少60us,供ds18b20采樣else /寫0dq=0;/拉低總線,產(chǎn)生寫時(shí)間隙i=8;while(i0)i-;/保持至少60us,供ds18b20采樣dq=1;/拉高總線i+;i+;uchar rd_temp()/讀1個(gè)字節(jié)bit b;/定義存放接收到的1個(gè)字節(jié)uchar i_b;uchar rdbyte;for(j=8;j0;j-)dq=0;/拉低總線,產(chǎn)生讀時(shí)隙i+;/延時(shí)大于1usdq=1;/釋放總線i+;i+;/給一定時(shí)間讓總線釋放b=dq;/讀取數(shù)據(jù)i=8;while(i0)i-;/延時(shí)至少60usi_b=b;rdbyte=(i_b1);/將讀取到得一位值左移7位,存放讀取的數(shù)據(jù)變量rdbyte右移1位return rdbyte;/*cpu讀取溫度值*/void readtemp(void) /讀取溫度 float backbit; uchar a=0,b=0; reset();wr_temp(0xcc);/跳過(guò)romwr_temp(0x44);/開始溫度轉(zhuǎn)換reset();wr_temp(0xcc);/跳過(guò)romwr_temp(0xbe);/讀暫存器 a= rd_temp(); /低位 b= rd_temp(); /高位 temp=b;tempb) d=c-b;else d=b-c;tempdisdata0=d/100;tempdisdata1=d%100/10;/顯示數(shù)據(jù):個(gè)位tempdisdata2=d%10; /顯示數(shù)據(jù):十分位 printc(tempdisdata0+0 ); printc(tempdisdata1+0 ); printc(hz_b ); /輸出一個(gè)漢字需要兩個(gè)字節(jié) printc(tempdisdata2+0 ); printc(hz_c ); /輸出一個(gè)漢字需要兩個(gè)字節(jié) printc(hz_c+1 ); delay1s(); delay1s(); delay1s();/*約1s延時(shí)*/void delay1s(void) delay(50000); delay(50000);/*初始化lcd*/void lcminit (void) cbyte=dispoff; wrl(cbyte); wrr(cbyte); cbyte=dispon; wrl(cbyte); wrr(cbyte); cbyte=dispfirst; wrl(cbyte); wrr(cbyte); lcmcls(); locatexy(0,0);/*lcd清屏*/void lcmcls(void) uchar i,j; for(i=0;i8;i+) delay(6); for(j=0;jlimit;j+) delay(6); wrdata(0x0,i,j); /*寫左區(qū)*/void wrl(uchar x) p0=0xff;/p0口送ff,準(zhǔn)備讀 lck = 0; p1 = 0x2a;/elcd=1/w=1(讀),csb=1,csa=0 lck = 1; while(p0 & lcdbuzy);/最高位為1,表示忙,則循環(huán) lck = 0; p1 = 0x00;/elcd=0,r/w=0(讀),csb=0,csa=0 lck = 1; p0 = x; /數(shù)據(jù)送到p0口 lck = 0; p1 = 0x22;/elcd=1,rw = 0(寫),csb=1,csa=0 lck = 1; lck = 0; p1 = 0x00;/elcd=0,rw = 0(寫),csb=0,csa=0 lck = 1;/*寫右區(qū)*/void wrr(uchar data x) p0=0xff;/p0口送ff,準(zhǔn)備讀 lck = 0; p1 = 0x29;/elcd=1,r/w=1(讀),csb=0,csa=1 lck = 1; while(p0 & lcdbuzy);/最高位為1,表示忙,則循環(huán) lck = 0; p1 = 0x00;/elcd=0,r/w=0(讀),csb=0,csa=1 lck = 1; p0=x; /數(shù)據(jù)送到p0口 lck = 0; p1 = 0x21;/elcd=1,rw = 0(寫),csb=0,csa=1 lck = 1; lck = 0; p1 = 0x00;/elcd=0,rw = 0(寫),csb=0,csa=0 lck = 1; /*定位*/void locatexy(uchar row,uchar col) uchar x, y, right; switch(col&0xc0) case 0: p0=0xff;/p0口送ff,準(zhǔn)備讀 lck = 0; p1 = 0x29;/elcd=1,r/w=1(讀),csb=0,csa=1 lck = 1; while(p0 & lcdbuzy);/最高位為1,表示忙,則循環(huán) lck = 0; p1 = 0x00; lck = 1; right = 1;break;/置右半屏標(biāo)志 case 0x40: p0=0xff;/p0口送ff,準(zhǔn)備讀 lck = 0; p1 = 0x2a;/elcd=1,r/w=1(讀),csb=1,csa=0 lck = 1; while(p0 & lcdbuzy);/最高位為1,表示忙,則循環(huán) lck = 0; p1 = 0x00;/elcd=0,r/w=0(讀)csb=0,csa=0 lck = 1; right =

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 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)論