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

下載本文檔

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

文檔簡(jiǎn)介

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

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

3、了近來(lái)電能表的發(fā)展及研究動(dòng)態(tài)。具體分析了軟件的兩大模塊:鍵盤(pán)模塊程序設(shè)計(jì)、LCD顯示模塊程序設(shè)計(jì),并對(duì)主要芯片的使用做了說(shuō)明。同時(shí)也對(duì)硬件總體設(shè)計(jì)做了一些簡(jiǎn)要的闡述,并對(duì)編輯軟件所使用的函數(shù)寫(xiě)了一些分析。</p><p>  另外還介紹了繪制原理圖所出現(xiàn)的一些問(wèn)題,比如各個(gè)芯片之間連線及接口問(wèn)題。</p><p>  關(guān)鍵詞:鍵盤(pán)模塊;LCD顯示模塊;時(shí)鐘芯片</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 國(guó)內(nèi)外研究的動(dòng)態(tài)1</p><p>  1.3 本課

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

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

15、;</p><p>  3.1 鍵盤(pán)模塊10</p><p>  3.1.1 鍵盤(pán)的中斷處理函數(shù)13</p><p>  3.1.2 實(shí)時(shí)時(shí)鐘電路MC146818A16</p><p>  4 調(diào)試中出現(xiàn)的問(wè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>  近年來(lái),隨著經(jīng)濟(jì)的快速發(fā)展,電力需求的不斷增長(zhǎng)和能源價(jià)格的不斷提升

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

54、數(shù),這樣,在按下功能鍵B后,如何將接下來(lái)按下的2和4識(shí)別為一個(gè)整數(shù)24并放入相應(yīng)變量中,而不是認(rèn)為按下2鍵是顯示總電量,按下4鍵是顯示低谷時(shí)段電費(fèi)?智能識(shí)別技術(shù)的原理是在B鍵別按下時(shí)系統(tǒng)將標(biāo)記一個(gè)標(biāo)志位,表明B鍵已經(jīng)被按下,然后2鍵被按下時(shí),系統(tǒng)首先查看標(biāo)志位有沒(méi)有被設(shè)置,當(dāng)它發(fā)現(xiàn)標(biāo)志位已經(jīng)被標(biāo)記為B時(shí),它即了解到這是一個(gè)功能設(shè)置,將2放入一個(gè)輸入緩沖區(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)換為一個(gè)整數(shù)送入到相應(yīng)的變量中完成設(shè)置。然后系統(tǒng)中的標(biāo)志位被清除,以后的按鍵回歸到正常狀態(tài)。系統(tǒng)利用智能識(shí)別技術(shù),接受鍵盤(pán)輸入,對(duì)內(nèi)部的計(jì)費(fèi)標(biāo)準(zhǔn),如高峰電費(fèi)、電表轉(zhuǎn)數(shù)/KW?h等進(jìn)行設(shè)置[7]。鍵盤(pán)程序框圖如圖3.3所示:</p><p>  鍵盤(pán)模塊包含兩個(gè)中斷函數(shù),

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

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

58、>  以下是鍵盤(pán)模塊程序中使用的函數(shù)列表,其中NumsToArray等四個(gè)輔助算法函數(shù)在第二部分,系統(tǒng)整體設(shè)計(jì)中已經(jīng)詳細(xì)描述,這里不在說(shuō)明。</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ù)首先將按鍵的鍵碼讀入一個(gè)變量中,然后判斷功能鍵標(biāo)志W(wǎng)hichFunctionKey是否被作標(biāo)

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

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

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

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

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

69、到CPU的T1中斷時(shí),根據(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;//定義鍵盤(pán)函數(shù)</p><p>  Com

70、mandPortOf8279=0x40;//鍵盤(pán)控制芯片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è)置高鋒電費(fèi)</p><p><b>  break;<

72、;/b></p><p>  case 0x07:</p><p>  SetLowFee(key);//設(shè)置低谷電費(fèi)</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è)置低谷開(kāi)始</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、示高鋒電費(fèi)</p><p><b>  break;</b></p><p>  case 0x04:</p><p>  ShowLowFee();//顯示低谷電費(fèi)</p><p><b>  break;</b></p><p>  case 0x05:</p>

79、;<p>  ShowAllFee();//顯示總電費(fèi)</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();//看門(mén)狗超時(shí)探測(cè)</p><p><b>  break;</b></p><p><b>  default:</b></p>&l

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

82、p>  3.1.2 實(shí)時(shí)時(shí)鐘電路MC146818A[8]</p><p>  3.1.2.1 MC146818A的結(jié)構(gòu)</p><p>  VDD:電源線,可以為3DC~6V;</p><p>  VSS:地線。信號(hào)、電源地;</p><p>  MOT:?jiǎn)纹瑱C(jī)類(lèi)型選擇線,當(dāng)MOT接VDD時(shí),選擇Motorola總線時(shí)序;當(dāng)MOT接VS

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

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

85、/b></p><p><b>  :片選線;</b></p><p> ?。褐袛嗾?qǐng)求線INT;</p><p><b>  :復(fù)位信號(hào)線;</b></p><p>  PS:電源檢測(cè)信號(hào)線,用來(lái)控制寄存器D的VRT位;</p><p>  :掉電檢測(cè)線,當(dāng)此線為低時(shí),

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

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

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

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

90、 D5 D4 D3 D2 D1 D0 </p><p>  各位定義為:D7-SET為“0”表示允許周期更新,“1”停止周期更新,以便對(duì)時(shí)間和日歷進(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ù)碼格式選擇?!?”選擇二進(jìn)制碼,“0”選擇十進(jìn)制碼;&l

92、t;/p><p>  D1-12/24:小時(shí)選擇,“1”表示時(shí)間單元為24小時(shí)計(jì)時(shí),“0”表示時(shí)間單元為12小時(shí)計(jì)時(shí),這樣,地址單元4與5的最高位“0”為AM,“1”為PM;</p><p>  D0-DSE:夏令時(shí)允許位,“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:中斷請(qǐng)求標(biāo)

94、志,為“1”時(shí)引腳輸出低電平。</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時(shí),才會(huì)觸發(fā)PF,AF,VF三個(gè)位中斷,并使IRQF置位。</p><p&g

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

96、定PA入口,查表以在顯示管上正確顯示,并將段選碼設(shè)為下一入口,并通過(guò)延時(shí)保證單個(gè)管亮的有效時(shí)間,滿(mǎn)足時(shí)序。如此循環(huán),完成八位顯示。程序框圖如圖3.4所示:</p><p>  LCD模塊部分包含下列幾個(gè)函數(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)啟動(dòng)時(shí)清屏,不用作其他用途,其他任何函數(shù)都不應(yīng)該調(diào)用。</p><p>  LCD模塊的設(shè)計(jì)思想是盡力提供一個(gè)較為容易使用的、與硬件隔離的接口給其他調(diào)用函數(shù)。</p><p>  LCD部分的實(shí)現(xiàn)與此模型相對(duì)應(yīng)、SendCommandToLCD、Display_Left和Display_Right 函數(shù)位于此模型中的“LCD驅(qū)動(dòng)層”中,這3個(gè)函數(shù)直接接觸硬件,所有有關(guān)顯示的調(diào)用都

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

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

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

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

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

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

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

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

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

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

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

111、ne函數(shù)顯示一個(gè)字符串。main中的調(diào)用可以正常工作,將字符串顯示在LCD上,但是KeyBoard函數(shù)中則只能顯示字符串的上半行,下半行的字總是顯示在LCD的最左邊,從而造成一些亂碼。這個(gè)問(wèn)題對(duì)我們?cè)斐闪讼喈?dāng)?shù)睦_,因?yàn)閙ain和KeyBoard調(diào)用的是同一個(gè)函數(shù)。開(kāi)始時(shí)以為是在傳遞參數(shù)時(shí)指針出錯(cuò),后來(lái)使用斷點(diǎn)調(diào)試時(shí)才發(fā)現(xiàn),DisplayALine在顯示下半行調(diào)用DisplaySelected函數(shù)時(shí),列Column的實(shí)際值都為0,所以所

溫馨提示

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

評(píng)論

0/150

提交評(píng)論