電能表畢業(yè)論文---智能電能表軟件設(shè)計程序_第1頁
已閱讀1頁,還剩85頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、<p><b>  摘 要</b></p><p>  本論文對智能電能表進(jìn)行了詳細(xì)的闡述。主要講述了一種對普通電能表進(jìn)行擴(kuò)展,從而實現(xiàn)分時計價功能的智能化電能表,并給出了軟件設(shè)計及調(diào)試問題。在論文完成過程中,主要進(jìn)行了以下工作:</p><p>  (1) 對系統(tǒng)要求進(jìn)行分析,并設(shè)計系統(tǒng)的整體結(jié)構(gòu)</p><p>  (2) 把整

2、體細(xì)分化,對每個模塊進(jìn)行詳細(xì)設(shè)計</p><p>  (3) 繪制原理圖和PCB板,并制成實驗板</p><p>  (4) 按照硬件電路,編寫軟件程序</p><p>  (5) 調(diào)試階段,調(diào)試各軟、硬件模塊,編寫測試程序,驗證系統(tǒng)的可用性,最后制成系統(tǒng)樣機(jī)。 </p><p>  本論文主要對智能電能表的結(jié)構(gòu)進(jìn)行了較詳細(xì)的闡述,并簡要講述

3、了近來電能表的發(fā)展及研究動態(tài)。具體分析了軟件的兩大模塊:鍵盤模塊程序設(shè)計、LCD顯示模塊程序設(shè)計,并對主要芯片的使用做了說明。同時也對硬件總體設(shè)計做了一些簡要的闡述,并對編輯軟件所使用的函數(shù)寫了一些分析。</p><p>  另外還介紹了繪制原理圖所出現(xiàn)的一些問題,比如各個芯片之間連線及接口問題。</p><p>  關(guān)鍵詞:鍵盤模塊;LCD顯示模塊;時鐘芯片</p><

4、;p><b>  ABSTRACT</b></p><p>  This study will discuss about the intelligence electric energy meter in detail. It is an intelligent electric energy meter by expanding to the normal electric ene

5、rgy meter, carries out the divided chronometer price, gives the software design and adjusts the problem. We do the following work in the completion of the thesis.</p><p>  (1) Analyze the requirement of the

6、system, and design the whole structure of the system.</p><p>  (2) Subdivide the whole, and design each module in particular.</p><p>  (3) Protract schematic plot and PCB plot, and crank out exp

7、eriment board.</p><p>  (4) Write software procedure according to hardware circuit.</p><p>  (5) In debugging moment, debug each software and hardware module, write testing procedure, validate t

8、he usability of the system, and finally crank out the system sample.</p><p>  This study will discuss about the intelligence electric energy meter in detail, and tell of the recent development of electric en

9、ergy meter and the research statement in brief. This study analyzes materially the two parts: keyboard part program design and LCD show part program design, and does the explanation to the use of main chip. Also it expla

10、ins the hardware total design in brief, and writes some analysis about editing the function which is used of software.</p><p>  Moreover this study also introduced some problems about drawing the principle d

11、iagram. For example, the connected line each chip and interface problem.</p><p>  Keywords: keyboard part; LCD show part; clock chip</p><p><b>  目 錄</b></p><p><b>

12、;  摘 要</b></p><p><b>  Abstract</b></p><p><b>  1 概述1</b></p><p>  1.1 本課題研究背景及意義1</p><p>  1.2 國內(nèi)外研究的動態(tài)1</p><p>  1.3 本課

13、題的可行性分析2</p><p>  1.4 設(shè)計要求及預(yù)期研究成果2</p><p><b>  2 系統(tǒng)簡介4</b></p><p>  2.1 系統(tǒng)總體方案設(shè)計4</p><p>  2.2 硬件各模塊的設(shè)計5</p><p>  2.2.1 主機(jī)5</p>&l

14、t;p>  2.2.2 電腦時鐘模塊6</p><p>  2.2.3 LCD顯示模塊6</p><p>  2.2.4 光電轉(zhuǎn)換模塊6</p><p>  2.2.5 鍵盤控制模塊6</p><p>  2.2.6 看門狗模塊7</p><p><b>  3 軟件設(shè)計8</b>

15、;</p><p>  3.1 鍵盤模塊10</p><p>  3.1.1 鍵盤的中斷處理函數(shù)13</p><p>  3.1.2 實時時鐘電路MC146818A16</p><p>  4 調(diào)試中出現(xiàn)的問題22</p><p><b>  參考文獻(xiàn)24</b></p>

16、<p><b>  致 謝25</b></p><p><b>  附錄</b></p><p><b>  1 概述</b></p><p>  1.1 本課題研究背景及意義</p><p>  近年來,隨著經(jīng)濟(jì)的快速發(fā)展,電力需求的不斷增長和能源價格的不斷提升

17、,用電緊張已經(jīng)成為突出的問題擺在我們面前。而電力又不是可以儲存的特殊商品,某些時段用電多,其他時段用電少。用電高峰時電力供不應(yīng)求,用電低谷時又電力過剩。為了應(yīng)對這樣的難題,可以采用分時電價來緩解供需矛盾,提高電力利用效率。</p><p>  分時電價是指在不同時段采用不同電價,根據(jù)用電需求和電網(wǎng)負(fù)荷將每天的時間劃分為用電高峰時段(6:00~22:00)和用電低谷時間段(22:00~6:00),高峰時段執(zhí)行較高電

18、價(0.8元/度),低谷時段執(zhí)行較低電價(0.6元/度)。供電部門通過對不同時段的用電實行不同電價,用經(jīng)濟(jì)手段鼓勵用戶主動采取避峰填谷的措施,從而使電力負(fù)荷曲線變緩,以提高發(fā)電設(shè)備的利用率,同時減小由于負(fù)荷曲線變化太大而引起的不安全因素。20世紀(jì)30年代,國外就開展了電力負(fù)荷控制方面的研究,實行分時計費是一種經(jīng)濟(jì)有效地調(diào)節(jié)負(fù)荷曲線的方法。</p><p>  因此,開發(fā)一種簡單實用的分時計量電能表變得尤為重要,本

19、課題通過對一般電能表進(jìn)行擴(kuò)展,從而實現(xiàn)分時計量功能。</p><p>  1.2 國內(nèi)外研究的動態(tài)</p><p>  近幾年,隨著我國國民經(jīng)濟(jì)穩(wěn)步發(fā)展,城市居民家庭用電不斷增加,用電管理方式也隨之改革,上海、武漢等國內(nèi)大中城市逐步推出分時優(yōu)惠電價政策,分時電價方式已在國內(nèi)各大城市得到迅速推廣。分時段計費的復(fù)費率電能表用戶逐漸由工業(yè)用戶逐漸由工業(yè)用戶為主轉(zhuǎn)向居民用戶為主,單相復(fù)費率電能表的

20、市場需求量不斷增長。據(jù)全國電工儀器儀表標(biāo)準(zhǔn)化技術(shù)委員會秘書處統(tǒng)計,近一年來,辦理復(fù)費率電能表產(chǎn)品型號注冊的企業(yè)近300家,注冊頻率呈上升趨勢。</p><p>  目前電子式分時電能表已進(jìn)入非常成熟的階段。它是一種靜止式無任何機(jī)械運動部件的固態(tài)電能表,由電壓互感器、電流互感器、高精度高速A/D變換器、電能計量專用集成電路、實時時鐘、數(shù)據(jù)存儲器、大屏幕液晶驅(qū)動及顯示器、數(shù)據(jù)通信接口、開關(guān)電源等模塊構(gòu)成,精度通常在1

21、.0級至0.5級,可靠性好,易于實時記錄,大部分型號均帶有預(yù)付費功能可供選用。采用帶有預(yù)付費功能時,電量有電鑰匙、IC卡等輸入,剩余電量不足時,可根據(jù)用戶負(fù)荷性質(zhì)選擇輸出音響及告警,顯示電量不足,啟動表內(nèi)繼電器跳閘等功能。具有失壓斷流記錄、RS-232、RS-422、RS-485等標(biāo)準(zhǔn)通信接口,可遠(yuǎn)程定時抄錄計量數(shù)據(jù)、本月及上月最大需求量、峰、平、谷最大需求量、脈沖輸出,監(jiān)控通過密碼設(shè)定,方可讀出與修改數(shù)據(jù)等,時段設(shè)定通常有8個。目前常

22、用的這一系列產(chǎn)品有DSSD331、D66、DTSD341等。</p><p>  1.3 本課題的可行性分析</p><p>  電在我們的日常生活中已不足為奇,而電能與當(dāng)今社會的科學(xué)進(jìn)步、經(jīng)濟(jì)發(fā)展和人們的生活都密切相關(guān)。它廣泛應(yīng)用于農(nóng)業(yè)生產(chǎn),照明,信息通訊,交通運輸,自動控制,日常生活,科學(xué)實驗等各個方面,為現(xiàn)代社會的精神文明的發(fā)展提供物質(zhì)基礎(chǔ)。電能是繼蒸氣時代之后的又一類二次能源?;瘜W(xué)

23、燃料(煤、石油、天然氣)、核烯料、太陽能、網(wǎng)通、水能、潮汐能、地?zé)崮艿纫淮文苻D(zhuǎn)換二次能源——電能。</p><p>  同時電的對整個人類的影響意義深遠(yuǎn),它不公從根本上改變了整個工業(yè)生產(chǎn)的面貌,而且還直接改變了人類的生活方式,使人類迅速跨進(jìn)了電氣時代。由于電是一種高效的便于工作于輸送的能源。電力出現(xiàn)后,很快就被應(yīng)到煉鋼、建筑、紡織等生產(chǎn)行業(yè)以及電車、地下鐵路等城市公共交通部門,并且已成為家庭主要使用的能源之一。電

24、能的廣泛使用注定了人們需要合理、高效的使用,因此,分時計費電能表就應(yīng)時而生。</p><p>  本文介紹了一種簡單的分時計費電能表。該系統(tǒng)可以作為為外的模塊安裝到普通電能表上,從而實現(xiàn)分時計價功能。它是用TS150位移傳感器對普通電能表進(jìn)行光電采集,對脈沖進(jìn)行計數(shù)并將計數(shù)值轉(zhuǎn)化為電量,由MC146818提供相應(yīng)的時間來判斷用電的時段,并計算相應(yīng)時段的電量和電費從而實現(xiàn)分時計費的功能。</p>&l

25、t;p>  1.4 設(shè)計要求及預(yù)期研究成果</p><p>  本設(shè)計利用單片機(jī)控制普通電能表,實現(xiàn)分時計費的功能。本系統(tǒng)可以作為額外的模塊安裝到普通電能表,這樣用戶已安裝的普通電能表不需要更換為新的電能表,僅僅另外安裝了本系統(tǒng)后就可以作為一個標(biāo)準(zhǔn)的智能電能表使用。</p><p>  本系統(tǒng)實現(xiàn)以下功能:</p><p>  (1) 記錄高峰用電量</

26、p><p>  (2) 記錄低谷用電量</p><p>  (3) 記錄總用電量</p><p>  (4) 計算并記錄高峰時段用電電費</p><p>  (5) 計算并記錄低谷時段用電電費</p><p>  (6) 計算并記錄總電費</p><p>  (7) 顯示高峰用電量</p>

27、;<p>  (8) 顯示低谷用電量</p><p>  (9) 顯示總用電量</p><p>  (10) 顯示高峰時段用電電費</p><p>  (11) 顯示低谷時段用電電費</p><p>  (12) 顯示總用電電費</p><p>  (13) 清除電量記錄和電費記錄</p>

28、<p>  記錄和計算用電量、電費都由單片機(jī)編程完成,顯示功能由單片機(jī)控制LCD實現(xiàn)。相應(yīng)的顯示功能選項由鍵盤按鍵選擇。此外,斷電后所有存儲數(shù)據(jù)不丟失,電表絕對時間標(biāo)準(zhǔn)仍正常運轉(zhuǎn)。</p><p><b>  2 系統(tǒng)簡介</b></p><p>  2.1 系統(tǒng)總體方案設(shè)計</p><p>  本系統(tǒng)的設(shè)計將整個系統(tǒng)劃分為多個模塊,

29、簡化設(shè)計流程。本系統(tǒng)可以簡單的劃分為5個模塊:單片機(jī)控制模塊、電腦時鐘模塊、光電轉(zhuǎn)換模塊、LCD顯示模塊、鍵盤控制模塊。其中測試模塊是以AT89C51單片機(jī)為核心進(jìn)行設(shè)計的,這里充分利用了單片機(jī)的數(shù)據(jù)處理及實時檢測能力,利用單片機(jī)接受光電模塊送來的電脈沖,對脈沖進(jìn)行計數(shù),將計數(shù)值轉(zhuǎn)化為電量,根據(jù)由時鐘模塊中取得的小時,判斷用電的時段,計算相應(yīng)時段的電量和電費,并記入總電量和電費;接受鍵盤的中斷,根據(jù)不同的按鍵顯示不同的功能;控制LCD顯

30、示模塊,將CPU內(nèi)部的數(shù)據(jù)送到LCD上顯示,并顯示必要的提示信息。而且此系統(tǒng)可以廣泛應(yīng)用于社會,通過分時計費來控制并約束用戶的用電量,從而達(dá)到合理使用電能。</p><p>  同時本系統(tǒng)也采用了四大關(guān)鍵輔助性算法:這里要說明的幾個算法都不參與硬件的驅(qū)動,完全是純軟件的算法。雖然很短小,但是簡練的完成了其目的。在整個系統(tǒng)控制程序中的地位,不亞于其他與硬件接觸的函數(shù)。是整個系統(tǒng)中介于外部硬件數(shù)據(jù)與CPU數(shù)據(jù)之間的核

31、心。</p><p>  (1)算法NumsToArray:這個算法的功能是,將作為第一參數(shù)傳遞的int型整數(shù)的各位分離,按照由高位到地位的順序依次放入作為第二參數(shù)傳遞的數(shù)組中。方便其他函數(shù)使用數(shù)組中的數(shù)字,利用字庫得到相應(yīng)的字型碼。此算法中其實包含2個子算法。如傳遞一個整數(shù)54321到函數(shù)中,第一個子算法將54321的各位分離放入數(shù)組,但是此時得到的序列為倒序,即:數(shù)組下標(biāo)0,1,2,3,4分別存放數(shù)字1,2,

32、3,4,5。第二個子算法將數(shù)組中的元素進(jìn)行倒序運算,得到需要的順序,即:數(shù)組下標(biāo)0,1,2,3,4分別存放5,4,3,2,1。</p><p>  (2)算法:ArrayToCharacters:此算法的功能是,將作為第一參數(shù)傳遞的,存放1位數(shù)字的數(shù)組,通過查字庫,將得到的字型碼按順序放入作為第二參數(shù)傳遞的將要顯示的字符庫中。此算法運算后得到的字符庫就可以送入LCD的顯示緩存區(qū),顯示出相應(yīng)的圖形了。此算法利用Nu

33、msToArray算法得到的數(shù)組,查找字庫,產(chǎn)生字符庫。這兩個函數(shù)作為核心算法被顯示電量電費等函數(shù)使用。</p><p>  (3)算法ArrayToDigitalI:此算法的功能是將作為第一參數(shù)傳遞的存放一位數(shù)字的數(shù)組,轉(zhuǎn)化為一個整數(shù)返回。此算法一般用來將存放在鍵盤緩存區(qū)的一位數(shù)字序列轉(zhuǎn)化為一個整數(shù)。其他函數(shù)利用返回的整數(shù)設(shè)置相應(yīng)變量的值。此函數(shù)被設(shè)置高峰時段,電表轉(zhuǎn)數(shù)等函數(shù)使用作為核心算法。</p>

34、;<p>  (4)算法ArrayToDigitalF:此算法的功能是將作為第一參數(shù)傳遞的存放一位數(shù)字的小數(shù)序列數(shù)組轉(zhuǎn)換為一個浮點數(shù)返回。此算法一般用來將存放在鍵盤緩沖區(qū)的一個小數(shù)序列轉(zhuǎn)化為浮點數(shù)返回給調(diào)用函數(shù)。此算法實現(xiàn)時將序列以小數(shù)點(系統(tǒng)中為D鍵)為軸心分成兩半,每半都是一個一位整數(shù)序列,將兩個序列傳遞給ArrayToDigitalI,ArrayToDigitalI返回兩個整數(shù)。將小數(shù)點后面的整數(shù)轉(zhuǎn)換成小數(shù)加到小數(shù)點

35、前面的整數(shù)上完成到浮點數(shù)的轉(zhuǎn)換。此函數(shù)被設(shè)置電費函數(shù)調(diào)用作為核心算法。</p><p>  2.2 硬件各模塊的設(shè)計</p><p>  本系統(tǒng)的硬件部分主要由主機(jī)、LCD顯示模塊、光電轉(zhuǎn)換模塊、電腦時鐘模塊、鍵盤控制模塊、看門狗模塊六部分組成。系統(tǒng)原理框圖如圖2.1所示:</p><p><b>  2.2.1 主機(jī)</b></p>

36、;<p>  本課題通過單片機(jī)來實現(xiàn)對電脈沖的采集和計數(shù),因為單片機(jī)是按工業(yè)測控環(huán)境要求設(shè)計的,抗干擾能力強(qiáng),環(huán)境要求不高,可適應(yīng)的溫度范圍寬,靈活性好,體積輕,可以降低系統(tǒng)的成本獲得較好的性能。AT89C51是一種帶4K字節(jié)閃爍可編程可擦除只讀存儲器(FPEROM——Flash Programmable and Erasable Read Only Memory)的低電壓,主性能CMOS8位微處理器,俗稱單片機(jī)。該器件A

37、TMEL高密度非易失存儲器制造技術(shù)制造,與工業(yè)標(biāo)準(zhǔn)的MCS-51指令集和輸出管腳相兼容,而且芯片上的EEPROM允許在線(+5)電擦除、電寫入或采用通用的非易失存儲編程器對程序存儲器重復(fù)編程。由于將多功能8位CPU和閃爍存儲器組合在單個芯片中,ATMEL的At89C51是一種高效微控制器,能為很多嵌入式控制系統(tǒng)提供一種靈活性高且價廉的方案,所以我們選用AT89C51[1]。</p><p>  2.2.2 電腦時

38、鐘模塊</p><p>  實時時鐘電路是控制系統(tǒng)中常用的功能模塊。在本系統(tǒng)中我們采用了Motorola公司的MC146818可編程時鐘芯片。MC146818是專用于穩(wěn)中有降類微處理器與單片機(jī)系統(tǒng)的時鐘集成電路。它帶有50字節(jié)的低功耗靜態(tài)RAM,可進(jìn)行時、分、秒和年、月、日及星期的計數(shù),并有自動的月結(jié)束識別和閏年處理功能,具有12/24小時和AM/PM的12小時計時功能,既可與Motorola系列的單片機(jī)接口,又

39、可以與Intel的微處理器接口[2]。我們利用該芯片將計費段的時間存儲起來,在各時間段開始向單片機(jī)的INT0端口申請中斷,在不同的時段使系統(tǒng)執(zhí)行不同的計費程序。CPU在計數(shù)滿一度電的時候執(zhí)行中斷程序,此時CPU讀取外部RAM中存領(lǐng)教的鐘點,判斷不同的時段,執(zhí)行不同的任務(wù)。</p><p>  2.2.3 LCD顯示模塊</p><p>  由于液晶顯示器(LCD)具有工作電壓低、微功耗、顯

40、示信息量大和接口方便等優(yōu)點,所以本系統(tǒng)采用16*2液晶顯示器。LCD顯示模塊通過接口擴(kuò)展芯片連接到CPU,使用時只需要CPU通過芯片將顯示用的字碼存儲在LCD模塊的內(nèi)部存儲區(qū),LCD就可以顯示出相應(yīng)的字符[3]。</p><p>  2.2.4 光電轉(zhuǎn)換模塊</p><p>  光電轉(zhuǎn)換模塊用于獲取普通電能表記錄的用電量,在普通電能表的旋轉(zhuǎn)鋁盤上打一個很小的檢測孔提取光脈沖。鋁盤每旋轉(zhuǎn)一圈

41、,模塊會檢測到一個光脈沖,經(jīng)光電耦合并加以整形放大后轉(zhuǎn)換成電脈沖,送到CPU的T1端用作計數(shù)觸發(fā)脈沖。普通電能表的銘牌上標(biāo)有每KW?h多少轉(zhuǎn),其含義為電能表轉(zhuǎn)數(shù)每達(dá)這一數(shù)值就是用了一度電(即1KW?h)[4]。將從電能表上提取轉(zhuǎn)換后的電脈沖信號送入單片機(jī)的T1端并進(jìn)行計數(shù),編程時將T1計數(shù)器的計數(shù)模值設(shè)為電能表的轉(zhuǎn)數(shù),當(dāng)計數(shù)器計數(shù)溢出時就可以判斷電能表已經(jīng)用了一度電。測試時可以使用實驗室普通的信號發(fā)生器送出脈沖信號代替電能表的轉(zhuǎn)數(shù)脈沖,

42、送入單片機(jī)的T1端。</p><p>  2.2.5 鍵盤控制模塊</p><p>  鍵盤模塊由普通的16鍵非編碼鍵盤與Intel8279可編程鍵盤/顯示接口芯片組成完整的編碼鍵盤電路。當(dāng)鍵盤上有鍵按下時Intel8279會將按鍵轉(zhuǎn)換為鍵碼存儲在一個FIFO(First In First Out,先入先出)隊列中,并向CPU申請中斷。CPU得知中斷以后,從Intel 8279的存儲區(qū)讀出

43、鍵碼,判斷相應(yīng)的按鍵,決定執(zhí)行相應(yīng)的功能[5]。</p><p>  2.2.6 看門狗模塊</p><p>  本系統(tǒng)的看門狗由一塊MAX813L芯片和一個開關(guān)組成,主要用于抗干擾和復(fù)位??撮T狗實際上是一個計數(shù)器,一般給看門狗一個大數(shù),程序開始運行后看門狗開始倒計數(shù)。如果程序運行正常,過一段時間CPU應(yīng)發(fā)出指令讓看門狗復(fù)位,重新開始倒計數(shù)。如果看門狗減到0就認(rèn)為程序沒有正常工作,強(qiáng)制整個

44、系統(tǒng)復(fù)位。此外,WatchDog[5]還可以在程序陷入死循環(huán)時讓單片機(jī)復(fù)位而不用整個系統(tǒng)斷電,從而保護(hù)你的硬件電路。</p><p>  此外,因為考慮可能遇到停電情況,此時電能表不轉(zhuǎn),無脈沖信號給出,但絕對時間標(biāo)準(zhǔn)仍須正常運轉(zhuǎn),否則整個系統(tǒng)將打亂,因此系統(tǒng)還配置了備用電源。</p><p><b>  3 軟件設(shè)計</b></p><p> 

45、 軟件設(shè)計的成功與否關(guān)系到整個系統(tǒng)能否具有使用靈活。操作簡便,可靠性強(qiáng)等優(yōu)點,而設(shè)計良好胡軟件能夠做到在較少地改變硬件電路的情況下,方便地改進(jìn)系統(tǒng)的功能,這就對軟件的設(shè)計提供了較高的要求。</p><p>  遵循“自頂向下,逐步求精“的結(jié)構(gòu)化設(shè)計原則,先將任務(wù)層次化,然后對每一層再逐步細(xì)化,每一層實現(xiàn)的功能盡量是獨立的,彼此之間互相影響應(yīng)該較少,然后按照與劃分相反的過程編寫,調(diào)試程序,待所有子程序都編寫設(shè)計通過

46、后,依它們之間的邏輯順序組合起來,構(gòu)成完整的程序軟件。采用這種方法,不僅使軟件可讀性好,維護(hù)方便且易于修改移植。如用戶有特殊要求需要改動軟件時,則只需修改或替換某子任務(wù)所對應(yīng)的子程序即可,從而加快了系統(tǒng)研制進(jìn)度,縮短了軟件開發(fā)周期[6]。</p><p>  本系統(tǒng)要完成的任務(wù)有兩大部分:鍵盤模塊任務(wù)和LCD顯示模塊任務(wù)。鍵盤模塊任務(wù)通過對不同鍵的設(shè)置,實現(xiàn)分時計費,主要負(fù)責(zé)對高峰時段電價、低谷時段電價、高峰起始

47、時間、高峰結(jié)束時間、低谷起始時間、低谷結(jié)束時間和普通電能表每度電的轉(zhuǎn)數(shù)的保存記錄,并以這些變量作電量計費的標(biāo)準(zhǔn)進(jìn)行運算,計算出不同時段的電費,每次鍵盤按鍵中斷,系統(tǒng)函數(shù)都會根據(jù)不同的鍵值調(diào)用不同的功能函數(shù)。而LCD 顯示程序則是將CPU處理過后的數(shù)據(jù)相應(yīng)的顯示在液晶屏上。</p><p>  本系統(tǒng)的軟件編程同樣是按照模塊設(shè)計的。首先解釋本系統(tǒng)軟件的部分全局變量。</p><p>  in

48、itset結(jié)構(gòu)用于保存高峰時段電價、低谷時段電價、高峰起始時間、高峰結(jié)束時間、低谷起始時間、低谷結(jié)束時間和普通電能表每度電的轉(zhuǎn)數(shù)。這些變量用作電量計費的標(biāo)準(zhǔn)。鍵盤模塊有修改這些變量的功能,以使智能電表系統(tǒng)可以適應(yīng)不同環(huán)境。initset結(jié)構(gòu)定義的全局變量為Set,Set將initset 結(jié)構(gòu)中的變量實例化。</p><p>  coulometer 結(jié)構(gòu)定義電能表在高峰時段使用的電量、低谷時段使用的電量和使用的總

49、電量。coulometer結(jié)構(gòu)定義的全局變量為Coulo。fee結(jié)構(gòu)記錄當(dāng)前使用的電費,包括高峰時段使用電量的電費,低谷時段使用電量的電費和使用的總電費。fee結(jié)構(gòu)定義的全局變量為Fee。</p><p>  在程序中由于要用到外部存儲器或者IO端口的直接地址,所以利用Keil C51中絕對定址關(guān)鍵字_at_定義了各種外部端口和IO端口的地址。其中RAM6264定義為外部RAM 中存儲的時刻的地址。Command

50、PortOf8279為鍵盤控制芯片8279的命令口地址,DataOf8279定義為8279數(shù)據(jù)口的地址。CommandPortOf89C51定義為LCD接口芯片89C51的控制口地址,APortOf89C51定義為89C51的P0口地址,CPortOf89C51定義為89C51的P2口地址,但是在程序中沒有直接使用P2口地址,而是通過89C51的命令口使P2口的各位分別置位來控制P2口的。</p><p>  全

51、局函數(shù)Init_CPU() 和Init_89C51andLCD()用來對CPU和液晶顯示模塊進(jìn)行初始化。Init_CPU()用于開放必要的中斷允許,將T1口配置為計數(shù)器,用來檢測電脈沖信號。Init_89C51andLCD()將89C51的P0、P1、P2口配置成方式0輸出模式。打開LCD顯示并清屏。</p><p>  下面是系統(tǒng)總體程序框圖,由主程序和中斷服務(wù)程序組成,如圖3.1和圖3.2。</p>

52、;<p>  電能表上電后執(zhí)行初始化,包括將各時段、時間、日期、表號、用電數(shù)據(jù)等讀入內(nèi)部數(shù)據(jù)緩沖區(qū),接著清WDT,然后檢查時段是否需要更新,若需要,則轉(zhuǎn)入中斷處理部分。執(zhí)行一系列操作后轉(zhuǎn)到LCD顯示程序,根據(jù)顯示緩沖區(qū)的內(nèi)容按要求循環(huán)顯示各種電能參數(shù),并根據(jù)相關(guān)數(shù)據(jù)處理達(dá)到從那時起計量電能的目的。當(dāng)CPU對T1端的脈沖不斷計數(shù),直至計數(shù)到滿一度電的時候,T1產(chǎn)生一個中斷。CPU執(zhí)行中斷,首先讀取MC146818的RAM的鐘

53、點值,判斷不同的時段。根據(jù)不同的時段將不同時段的用電量加1,計算出相應(yīng)時段的電費,并計算出總用電量和總電費。</p><p><b>  3.1 鍵盤模塊</b></p><p>  本系統(tǒng)的編碼鍵盤每按下一個鍵,就中斷一次。假如設(shè)置某個功能時需要按功能鍵B和輸入數(shù)字24,就需要按鍵3次,鍵盤模塊會發(fā)出3次中斷申請。這樣就帶來一個問題:由于每次中斷都是調(diào)用同一個中斷函

54、數(shù),這樣,在按下功能鍵B后,如何將接下來按下的2和4識別為一個整數(shù)24并放入相應(yīng)變量中,而不是認(rèn)為按下2鍵是顯示總電量,按下4鍵是顯示低谷時段電費?智能識別技術(shù)的原理是在B鍵別按下時系統(tǒng)將標(biāo)記一個標(biāo)志位,表明B鍵已經(jīng)被按下,然后2鍵被按下時,系統(tǒng)首先查看標(biāo)志位有沒有被設(shè)置,當(dāng)它發(fā)現(xiàn)標(biāo)志位已經(jīng)被標(biāo)記為B時,它即了解到這是一個功能設(shè)置,將2放入一個輸入緩沖區(qū),而不是顯示總電量。并等待下次按鍵。接著4鍵被按下后,系統(tǒng)發(fā)現(xiàn)標(biāo)志位被標(biāo)記為B,它將

55、4放入2后面的緩沖區(qū),等待下次按鍵。然后結(jié)束鍵(本系統(tǒng)中為E)被按下,系統(tǒng)發(fā)現(xiàn)標(biāo)志位被標(biāo)記為B,又發(fā)現(xiàn)E為結(jié)束鍵,系統(tǒng)利用算法將緩沖區(qū)中的2和4轉(zhuǎn)換為一個整數(shù)送入到相應(yīng)的變量中完成設(shè)置。然后系統(tǒng)中的標(biāo)志位被清除,以后的按鍵回歸到正常狀態(tài)。系統(tǒng)利用智能識別技術(shù),接受鍵盤輸入,對內(nèi)部的計費標(biāo)準(zhǔn),如高峰電費、電表轉(zhuǎn)數(shù)/KW?h等進(jìn)行設(shè)置[7]。鍵盤程序框圖如圖3.3所示:</p><p>  鍵盤模塊包含兩個中斷函數(shù),

56、KeyBoard和DogSniffer,KeyBoard函數(shù)用于處理鍵盤按鍵事件,每次鍵盤按鍵中斷,KeyBoad函數(shù)會檢查按鍵的鍵值,根據(jù)不同的鍵值調(diào)用不同的功能函數(shù)。</p><p>  DogSniffer函數(shù)為偵探狗技術(shù)的實現(xiàn)函數(shù),當(dāng)在鍵盤上按下功能鍵時KeyBoard函數(shù)調(diào)用WakeupDog函數(shù),喚醒偵探狗,其實質(zhì)是向T0定時器送入定時初值,并使T0開始計時。當(dāng)T0每65ms定時中斷一次。每次中斷后系

57、統(tǒng)調(diào)用中斷處理函數(shù)DogSniffer,DogSniffer函數(shù)判斷功能鍵標(biāo)志是否被標(biāo)記,如果功能鍵標(biāo)志被標(biāo)記,而且按鍵時間超過T0的100次計數(shù),即6.5S。則DogSniffer使功能鍵標(biāo)志復(fù)位。如果功能鍵標(biāo)志沒有被標(biāo)記,則DogSniffer使T0中斷計數(shù)復(fù)位。并且不在向T0送入定時初值。如果功能鍵標(biāo)志被標(biāo)記,但是T0中斷計數(shù)未達(dá)100次,則將T0中斷計數(shù)加1,并向T0送入定時初值,開始下次定時。</p><p

58、>  以下是鍵盤模塊程序中使用的函數(shù)列表,其中NumsToArray等四個輔助算法函數(shù)在第二部分,系統(tǒng)整體設(shè)計中已經(jīng)詳細(xì)描述,這里不在說明。</p><p>  void DogSniffer(void) interrupt 1 using 0;</p><p>  void KeyBoard(void) interrupt 2 using 0;</p><p&g

59、t;  void ShowHighCoulometer(void);</p><p>  void ShowLowCoulometer(void);</p><p>  void ShowAllCoulometer(void);</p><p>  void ShowHighFee(void);</p><p>  void ShowLowF

60、ee(void);</p><p>  void ShowAllFee(void);</p><p>  void Clear(void);</p><p>  void WakeupDog(void);</p><p>  void SetHighFee(uchar key);</p><p>  void SetL

61、owFee(uchar key);</p><p>  void SetHighStart(uchar key);</p><p>  void SetHighEnd(uchar key);</p><p>  void SetLowStart(uchar key);</p><p>  void SetLowEnd(uchar key);&

62、lt;/p><p>  uchar NumsToArray(int number,uchar Array[8]);</p><p>  void ArrayToCharacters(uchar message[8];</p><p>  uchar display[8][32];</p><p>  uchar length);</p>

63、;<p>  int ArrayToDigitalI(uchar Array[8],uchar length);</p><p>  float ArrayToDigitalF(uchar Array[8],uchar length);</p><p>  KeyBoard中斷處理函數(shù)首先將按鍵的鍵碼讀入一個變量中,然后判斷功能鍵標(biāo)志W(wǎng)hichFunctionKey是否被作標(biāo)

64、記,如果已做標(biāo)記,則進(jìn)入一個switch語句,根據(jù)不同的鍵碼,調(diào)用不同設(shè)置函數(shù)。如果WhichFunctionKey未被標(biāo)記,則進(jìn)入標(biāo)準(zhǔn)狀態(tài)的按鍵處理過程,此過程通過一個switch語句決定不同的執(zhí)行方式。按下0~5鍵時,為顯示相關(guān)信息的操作,則直接調(diào)用相關(guān)函數(shù)。按下C鍵時為復(fù)位語句,直接調(diào)用Clear()函數(shù)。當(dāng)按下功能鍵6~b時,首先將功能鍵標(biāo)志W(wǎng)hichFunctionKey設(shè)置為相同的鍵碼,然后喚醒偵探狗,進(jìn)行設(shè)置超時探測。當(dāng)下

65、次按下按鍵時,由于WhichFunctionKey已被標(biāo)記,會轉(zhuǎn)到相應(yīng)的設(shè)置函數(shù)執(zhí)行。如果長時間未按下任何鍵,當(dāng)超過偵探狗的超時時間后,偵探狗會將WhichFunctionKey標(biāo)志的標(biāo)記取消。</p><p>  ShowHighCoulometer,ShowLowCoulometer,ShowAllCoulometer和ShowHighFee、ShowLowFee、ShowAllFee兩組函數(shù)用于顯示coul

66、ometer和fee結(jié)構(gòu)的變量中保存的高峰用電量、低谷用電量、總用電量和高峰電費、低谷電費、總電費的數(shù)值。這兩組函數(shù)將內(nèi)存中保存的數(shù)值轉(zhuǎn)化為一個只存放單個位數(shù)字的數(shù)組,然后通過查字庫NumCharacters,將單個數(shù)字的字型碼送到要顯示的字符緩存區(qū)里。ShowHighFee一組函數(shù)在顯示時,由于內(nèi)部變量為float型,在LCD上顯示時比較困難,而且在計算電費時按照整數(shù)結(jié)算也是比較容易接受的選擇,所以在實現(xiàn)時首先利用標(biāo)準(zhǔn)庫中的ceil(

67、)函數(shù)將float取整,然后再轉(zhuǎn)化為整型數(shù)字顯示。</p><p>  SetHighFee、SetLowFee、SetHighStart、和SetHighEnd、SetLowStart、SetLowEnd函數(shù)用于設(shè)置initset結(jié)構(gòu)定義的電價、轉(zhuǎn)數(shù)、高峰時段、低谷時段等變量。這些函數(shù)被調(diào)用時一般將按鍵信息存儲在一個輸入緩沖區(qū)里面。輸入小數(shù)點用按鍵D代替,輸入結(jié)束用按鍵E代替。當(dāng)這些函數(shù)檢測到一個輸入結(jié)束按鍵時

68、,它們將輸入緩沖區(qū)的數(shù)據(jù)傳遞給ArrayToDigitalI或者時ArrayToDigitalF,由他們完成輸入到數(shù)值的轉(zhuǎn)化。然后將轉(zhuǎn)化后的數(shù)值設(shè)為相應(yīng)變量的當(dāng)前值。做完這些工作后,這些函數(shù)將輸入緩存區(qū)、緩存位置計數(shù)和WhichFunctionKey標(biāo)志復(fù)位。以備下一次設(shè)置。</p><p>  3.1.1 鍵盤的中斷處理函數(shù)</p><p>  下面簡單介紹了鍵盤的中斷處理函數(shù),當(dāng)鍵盤接

69、到CPU的T1中斷時,根據(jù)鍵值的不同調(diào)用相應(yīng)的處理函數(shù)。</p><p>  void KeyBoard(void) interrupt 2 using 0 //從外部中斷INT1,工作寄存器0組</p><p><b>  {</b></p><p>  uchar key;//定義鍵盤函數(shù)</p><p>  Com

70、mandPortOf8279=0x40;//鍵盤控制芯片8279的命令口地址</p><p>  key=DataOf8279;//8279的數(shù)據(jù)口地址</p><p>  if(WhichFunctionKey >=0x06 && WhichFunctionKey <= 0x0b)</p><p><b>  {</b&

71、gt;</p><p>  switch(WhichFunctionKey)//選擇函數(shù)</p><p><b>  {</b></p><p>  case 0x06:</p><p>  SetHighFee(key);//設(shè)置高鋒電費</p><p><b>  break;<

72、;/b></p><p>  case 0x07:</p><p>  SetLowFee(key);//設(shè)置低谷電費</p><p><b>  break;</b></p><p>  case 0x08:</p><p>  SetHighStart(key);//設(shè)置高鋒起始<

73、/p><p><b>  break;</b></p><p>  case 0x09:</p><p>  SetHighEnd(key);設(shè)置高鋒結(jié)束</p><p><b>  break;</b></p><p>  case 0x0a:</p><p

74、>  SetLowStart(key);//設(shè)置低谷開始</p><p><b>  break;</b></p><p>  case 0x0b:</p><p>  SetLowEnd(key);設(shè)置低谷結(jié)束</p><p><b>  }</b></p><p>

75、<b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  switch(key)</p><p><b>  {</b></p><p>  case 0x00

76、:</p><p>  ShowHighCoulometer();//顯示高鋒用電量</p><p><b>  break;</b></p><p>  case 0x01:</p><p>  ShowLowCoulometer();//顯示低谷用電量</p><p><b>  b

77、reak;</b></p><p>  case 0x02:</p><p>  ShowAllCoulometer();//顯示總用電量</p><p><b>  break;</b></p><p>  case 0x03:</p><p>  ShowHighFee();//顯

78、示高鋒電費</p><p><b>  break;</b></p><p>  case 0x04:</p><p>  ShowLowFee();//顯示低谷電費</p><p><b>  break;</b></p><p>  case 0x05:</p>

79、;<p>  ShowAllFee();//顯示總電費</p><p><b>  break;</b></p><p>  case 0x0c:</p><p>  Clear();//系統(tǒng)復(fù)位</p><p><b>  break;</b></p><p>

80、;  case 0x0d:</p><p>  WhichFunctionKey=0x0d;//按鍵功能</p><p>  WakeupDog();//看門狗超時探測</p><p><b>  break;</b></p><p><b>  default:</b></p>&l

81、t;p>  ShowError();//顯示出錯</p><p><b>  break;</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><

82、p>  3.1.2 實時時鐘電路MC146818A[8]</p><p>  3.1.2.1 MC146818A的結(jié)構(gòu)</p><p>  VDD:電源線,可以為3DC~6V;</p><p>  VSS:地線。信號、電源地;</p><p>  MOT:單片機(jī)類型選擇線,當(dāng)MOT接VDD時,選擇Motorola總線時序;當(dāng)MOT接VS

83、S時,選擇Intel類型總線,如8051、8085等;</p><p>  OSC1、0SC2:時間基準(zhǔn)輸人線,可接外部信號源或晶振。在時鐘電路中,一般接32.768kHz的晶振;</p><p>  CKFS:時鐘頻率輸出選擇線,當(dāng)CKFS接VDD時,CKOUT引腳輸出頻率為晶振頻率;當(dāng)CKFS接VSS時,CKOUT引腳輸出頻率為晶振頻率的1/4;</p><p>

84、;  CKOUT:時鐘輸出線;</p><p>  SQW:方波輸出線;</p><p>  AD0~AD7:雙向地址/數(shù)據(jù)總線;</p><p>  AS/ALE:地址鎖存線;</p><p><b>  DS/:讀信號線;</b></p><p><b>  R/:寫信號線;<

85、/b></p><p><b> ?。浩x線;</b></p><p> ?。褐袛嗾埱缶€INT;</p><p><b> ?。簭?fù)位信號線;</b></p><p>  PS:電源檢測信號線,用來控制寄存器D的VRT位;</p><p> ?。旱綦姍z測線,當(dāng)此線為低時,

86、禁止訪問芯片,這有利于電池供電。</p><p>  由于MC146818采用高速CMOS工藝,對于32.768kHZ晶振頻率,當(dāng)VDD為5V時,消耗電流為50uA,因此可以采用后備電池方式,以確保主電源掉電后,時鐘仍正常工作。</p><p>  3.1.2.2 MC146818A的軟件編程</p><p>  MC146818A時鐘電路的內(nèi)部地址空間如表3-1所

87、列。</p><p>  對MC146818A的編程,主要是通過它的寄存器A、B、C、D設(shè)置工作狀態(tài)實現(xiàn)的。下面著重分析這四個寄存器。</p><p>  (1) 寄存器A:用來確定基準(zhǔn)頻率和分頻計數(shù)器的輸出頻率,它的格式為</p><p>  D7 D6 D5 D4 D3

88、 D2 D1 D0 </p><p><b>  各位定義為:</b></p><p>  D7-U1P,只讀位。”1”表示正在更新,”0”表示可讀時間、鬧鐘和日歷值。</p><p>  D6D5D4- DV2 DV1 DV0,可讀寫,不受影響,用于選擇基準(zhǔn)頻率,對于32.768kHz

89、晶振,D6D4應(yīng)清零,D5置1。</p><p>  D3D2D1D0 - RS3RS2RS1RS0,可讀寫,不受影響,通過SQW引腳輸出方波及中斷周期。選擇分頻輸出頻率。</p><p>  (2) 寄存器B:用來確定更新周期、各種中斷的許可、數(shù)據(jù)格式、計時方式和輸出方波的許可??勺x寫。它的格式為:</p><p>  D7 D6

90、 D5 D4 D3 D2 D1 D0 </p><p>  各位定義為:D7-SET為“0”表示允許周期更新,“1”停止周期更新,以便對時間和日歷進(jìn)行初始化;</p><p>  D6-P1E:“1”表示允許周期中斷,激活;“0”表示禁止周期中斷;</p>&l

91、t;p>  D5-A1E:“1”表示允許鬧鐘中斷,“0”表示禁止;</p><p>  D4-U1E:“1”表示允許周期更新,結(jié)束位激活 ,“0”表示禁止;</p><p>  D3-SQWE:“1”表示允許方波由SQW引腳輸出,“0”表示禁止,并使SQW始終為低電平;</p><p>  D2-DM:數(shù)碼格式選擇。“1”選擇二進(jìn)制碼,“0”選擇十進(jìn)制碼;&l

92、t;/p><p>  D1-12/24:小時選擇,“1”表示時間單元為24小時計時,“0”表示時間單元為12小時計時,這樣,地址單元4與5的最高位“0”為AM,“1”為PM;</p><p>  D0-DSE:夏令時允許位,“0”為禁止。</p><p>  表3-1 MC146818A的內(nèi)部地址空間分布</p><p>  (3) 寄存器C:只

93、讀、中斷標(biāo)志位。</p><p><b>  它的格式為:</b></p><p>  D7 D6 D5 D4 D3 D2 D1 D0 </p><p>  各位定義為:D7-IRQF:中斷請求標(biāo)

94、志,為“1”時引腳輸出低電平。</p><p>  D6-PF:周期中斷標(biāo)志位;</p><p>  D5-AF:鬧鐘中斷標(biāo)志位;</p><p>  D4-UF:周期更新完成標(biāo)志位。</p><p>  只有當(dāng)寄存器B的P1E,A1E,U1E為1時,才會觸發(fā)PF,AF,VF三個位中斷,并使IRQF置位。</p><p&g

95、t;  (4) 寄存器D:只讀,表示RAM和時間是否有效,只考慮D7位VRT,其余均不考慮。當(dāng)引腳PS為高電平時,VRT為“1”,表示RAM與時鐘信息為可讀,若PS引腳為低電平,則VRT=0,此時信息不可讀[2]。</p><p>  3.2 LCD顯示模塊程序設(shè)計:</p><p>  LCD顯示模塊,將CPU內(nèi)部的數(shù)據(jù)送到LCD上顯示,并顯示必要的提示信息。一開始對程序進(jìn)行初始化,并選

96、定PA入口,查表以在顯示管上正確顯示,并將段選碼設(shè)為下一入口,并通過延時保證單個管亮的有效時間,滿足時序。如此循環(huán),完成八位顯示。程序框圖如圖3.4所示:</p><p>  LCD模塊部分包含下列幾個函數(shù):</p><p>  void SendCommandToLCD(uchar command);</p><p>  void Display_Left(uch

97、ar mdata);</p><p>  void Display_Right(uchar mdata);</p><p>  void Display_All(uchar mdata);</p><p>  void DisplaySelected(uchar pagenum,</p><p>  uchar column,</p&g

98、t;<p>  uchar mdata[16]);</p><p>  void DisplayAtRow(uchar row,uchar column,uchar mdata[32]);</p><p>  void DisplayALine(uchar line,uchar mdata[8][32]);</p><p>  Display_All函

99、數(shù)用于系統(tǒng)啟動時清屏,不用作其他用途,其他任何函數(shù)都不應(yīng)該調(diào)用。</p><p>  LCD模塊的設(shè)計思想是盡力提供一個較為容易使用的、與硬件隔離的接口給其他調(diào)用函數(shù)。</p><p>  LCD部分的實現(xiàn)與此模型相對應(yīng)、SendCommandToLCD、Display_Left和Display_Right 函數(shù)位于此模型中的“LCD驅(qū)動層”中,這3個函數(shù)直接接觸硬件,所有有關(guān)顯示的調(diào)用都

100、是基于這3個函數(shù)之上。SendCommandToLCD函數(shù)的功能是向LCD的驅(qū)動芯片發(fā)送命令字。其參數(shù)為要發(fā)送的命令字。Display_Left函數(shù)的功能是向LCD的第一塊驅(qū)動芯片內(nèi)寫入一個字節(jié)的顯示數(shù)據(jù),其直接表現(xiàn)為在LCD的左半部分上顯示字符。Display_Right函數(shù)能向LCD的第二塊驅(qū)動芯片內(nèi)寫入一個字節(jié)的顯示數(shù)據(jù),表現(xiàn)為在LCD的右半部分顯示字符。這3個函數(shù)都是利用作為全局變量定義的CommandPortOf89C51和A

101、PortOf89C51,命令或者數(shù)據(jù)端口直接讀寫的。</p><p>  本系統(tǒng)的LCD顯示時一個字符占用16×16個象素的顯示單元,即其一個字符的顯示數(shù)據(jù)為32個字節(jié)。DisplaySelected函數(shù)和DisplayAtRow函數(shù)位于此編程模型之“編程抽象層”,是對SendCommandToLCD、Display_Left、Display_Right函數(shù)的低層封裝。它們使用低層的SendComman

102、dToLCD等3個函數(shù)完成顯示數(shù)據(jù)的功能。DisplaySelected函數(shù)在指定的頁和列開始送入16個字節(jié)的顯示數(shù)據(jù),即半個字符。LCD顯示屏共32行,分為4頁,每頁8行,由于一個字高為16個像素,所以這個性質(zhì)限制了DisplaySelected函數(shù)只能顯示半個字。此函數(shù)隱藏了一個列實現(xiàn)的細(xì)節(jié),LCD由兩塊顯示芯片控制,每一塊控制61列,即0~60列為第一塊芯片控制,要用Display_Left函數(shù)顯示,第二塊控制61~121列,要用

103、Display_Right函數(shù)顯示,而此函數(shù)可以接受的列為0~0x7F。在函數(shù)中會對輸入的列參數(shù)進(jìn)行判斷,小于0x40的列,函數(shù)會調(diào)用Display_Left函數(shù)顯示,大于或者等于0x40的列,函數(shù)會調(diào)用Display_Righ</p><p>  DisplayAtRow函數(shù)是對DisplaySelected函數(shù)的進(jìn)一步封裝,此函數(shù)的意圖是掩蓋頁的跨越,使之能夠以一個函數(shù)在LCD上顯示一個完整的、共32字節(jié)數(shù)據(jù)

104、表示的字符。由于DisplaySelected函數(shù)已經(jīng)掩蓋了列的跨越,所以DisplayAtRow的列參數(shù)就直接傳遞給了DisplaySelected函數(shù)。DisplayAtRow函數(shù)將整個LCD分成了兩個顯示行,每個顯示行包含2個頁,16個像素行,可以顯示一個完整的字符。其實現(xiàn)原理是對于位于第0顯示行的字符,調(diào)用2次DisplaySelected函數(shù),將字符的上半數(shù)據(jù)送到第0頁顯示,將字符的下半數(shù)據(jù)送到第1頁顯示,這樣就完成了整個字符

105、的顯示。對于位于第1顯示行的字符,將字符的上半數(shù)據(jù)調(diào)用DisplaySelected函數(shù)送到第2頁顯示,將字符的下半數(shù)據(jù)調(diào)用DisplaySelected函數(shù)送到第3頁顯示。這樣就完成了頁跨越的掩蓋。</p><p>  位于LCD顯示驅(qū)動最高層,即“顯示服務(wù)提供層”的函數(shù)只有一個,即DisplayALine,此函數(shù)是基于DisplayAtRow函數(shù)的封裝。由于DisplayAtRow函數(shù)可以在指定位置顯示一個字

106、符,基于這種能力派生的DisplayALine函數(shù)的功能就是將一行字符顯示在某一個顯示行上。由于LCD最多可以顯示8個16×16的字符。所以DisplayALine函數(shù)顯示字符串的最大字符限制也為8個字符。DisplayALine函數(shù)用來向其他需要顯示的函數(shù)提供服務(wù)。一個需要進(jìn)行顯示的函數(shù)將它要進(jìn)行顯示的數(shù)據(jù)通過查表或者其他途徑轉(zhuǎn)換為LCD顯示的顯示碼,然后將顯示碼保存在一個8×32的數(shù)組中傳遞給DisplayALi

107、ne函數(shù),然后DisplayALine函數(shù)將數(shù)組中的數(shù)據(jù)全部送入某行進(jìn)行顯示。</p><p>  兩個提示函數(shù)ShowDefault和ShowError用于顯示必要的提示信息。ShowDefault函數(shù)設(shè)計成一個死循環(huán),用于顯示系統(tǒng)的待機(jī)畫面。此待機(jī)畫面用于向用戶提示鍵盤上各個按鍵的功能。ShowError函數(shù)在用戶操作出錯時向用戶顯示一個出錯提示,以便防止用戶誤操作。</p><p>

108、  4 調(diào)試中出現(xiàn)的問題</p><p>  軟件的調(diào)試在仿真器SUPER ICE51S上調(diào)試,仿真器提供的單步,斷點,跟蹤等功能的支持下對各子程序分別進(jìn)行調(diào)試,將調(diào)試完的子程序連接起來再調(diào)試,逐步擴(kuò)大調(diào)試范圍.調(diào)試的過程一般是:</p><p>  (1) 測試程序輸入條件或設(shè)定程序輸入條件</p><p>  (2) 以單步,斷點或跟蹤方式運行程序;</p

109、><p>  (3) 檢查程序運行結(jié)果;</p><p>  (4) 運行結(jié)果不正確時查找原因,修改程序,重復(fù)上述過程.</p><p>  由于是初次用Keil C51,因此碰到的麻煩還真是多,以下是我在調(diào)試過程中出現(xiàn)的問題:</p><p>  (1) 首先是硬件問題,一開始焊好系統(tǒng)版,發(fā)現(xiàn)LCD液晶顯示屏不亮,用萬能表測試各個線路之間有沒短

110、路,弄得一頭大,最后發(fā)現(xiàn)是電路中一個電阻出錯。阻值偏大而導(dǎo)致LCD沒有足夠的電壓進(jìn)行顯示。</p><p>  (2) 中斷函數(shù)寄存器組使用不當(dāng):程序中有3個中斷函數(shù),在最初每個中斷函數(shù)使用的寄存器組都不相同,本意是為了提高寄存器的利用效率。定義偵探狗中斷T0使用寄存器組1,鍵盤中斷使用寄存器組2,電量中斷使用寄存器組3。但是在調(diào)試中發(fā)生了一個錯誤。main函數(shù)和KeyBoard函數(shù)中都調(diào)用了DisplayALi

111、ne函數(shù)顯示一個字符串。main中的調(diào)用可以正常工作,將字符串顯示在LCD上,但是KeyBoard函數(shù)中則只能顯示字符串的上半行,下半行的字總是顯示在LCD的最左邊,從而造成一些亂碼。這個問題對我們造成了相當(dāng)?shù)睦_,因為main和KeyBoard調(diào)用的是同一個函數(shù)。開始時以為是在傳遞參數(shù)時指針出錯,后來使用斷點調(diào)試時才發(fā)現(xiàn),DisplayALine在顯示下半行調(diào)用DisplaySelected函數(shù)時,列Column的實際值都為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. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(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

提交評論