利用單片機分時電價系統(tǒng)設計_第1頁
利用單片機分時電價系統(tǒng)設計_第2頁
利用單片機分時電價系統(tǒng)設計_第3頁
利用單片機分時電價系統(tǒng)設計_第4頁
利用單片機分時電價系統(tǒng)設計_第5頁
已閱讀5頁,還剩24頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、一、課題說明隨著經(jīng)濟的快速發(fā)展,電力需求的不斷增長和能源價格的不斷提升。用電緊張已經(jīng)成為突出的問題擺在我們面前。而電力又不是可以儲存的特殊商品,某些時段用電多,其他時段用電少。用電高峰時電力供不應求,用電低谷時又電力過剩。為了應對這樣的難題,可以采用分時電價來緩解供需矛盾,提高電力利用效率。分時電價是指在不同時段采用不同電價,根據(jù)用電需求和電網(wǎng)負荷將每天的時間劃分為用電高峰時段(6:0022:00)和用電低谷時間段(22:006:00),高峰時段執(zhí)行較高電價(0.8元/度),低谷時段執(zhí)行較低電價(0.6元/度)。通過價格杠桿調節(jié)電力資源。從而提高電力利用效率。本設計利用單片機控制普通電能表,實

2、現(xiàn)分時計費的功能。本系統(tǒng)可以作為額外的模塊安裝到普通電能表,這樣用戶已安裝的普通電能表不需要更換為新的電能表,僅僅另外安裝了本系統(tǒng)后就可以作為一個標準的智能電能表使用。本系統(tǒng)實現(xiàn)以下功能:1、 記錄高峰用電量2、 記錄低谷用電量3、 記錄總用電量4、 計算并記錄高峰時段用電電費5、 計算并記錄低谷時段用電電費6、 計算并記錄總電費7、 顯示高峰用電量8、 顯示低谷用電量9、 顯示總用電量10、 顯示高峰時段用電電費11、 顯示低谷時段用電電費12、 顯示總用電電費13、 清除電量記錄和電費記錄記錄和計算用電量、電費都由單片機編程完成,顯示功能由單片機控制lcd實現(xiàn)。相應的顯示功能選項由鍵盤按鍵

3、選擇。二、系統(tǒng)整體設計本系統(tǒng)的設計時將整個系統(tǒng)劃分為多個模塊,簡化設計流程。同時便于團隊協(xié)作,將多個任務分配給多人完成。本系統(tǒng)可以簡單的劃分為5個模塊:1、光電轉換模塊,用于將普通電能表的轉數(shù)通過光電器件轉換為電脈沖,送入cpu的t1端口。2、鍵盤模塊,用于將按鍵轉換為按鍵編碼,并用中斷的方式通知cpu有鍵被按下。3、lcd顯示模塊,用于顯示必要的提示信息和電量、電費的數(shù)值。4、時鐘模塊,為cpu模塊提供精確的時刻計數(shù)5、核心控制模塊,由sst公司的89c58單片機和必要的外圍芯片構成,用于接受光電模塊送來的電脈沖,對脈沖進行計數(shù),將計數(shù)值轉化為電量,根據(jù)由時鐘模塊中取得的小時,判斷用電的時段

4、,計算相應時段的電量和電費,并記入總電量和電費;接受鍵盤的中斷,根據(jù)不同的按鍵顯示不同的功能;控制lcd顯示模塊,將cpu內部的數(shù)據(jù)送到lcd上顯示,并顯示必要的提示信息。各個模塊的原理框圖下圖所示。三、各個分系統(tǒng)的設計原理(共7點)1、 光電轉換模塊用于獲取普通電能表記錄的用電量,在普通電能表的旋轉鋁盤上打一個很小的檢測孔提取光脈沖。鋁盤每旋轉一圈,模塊會檢測到一個光脈沖,經(jīng)光電耦合并加以整形放大后轉換成電脈沖,送到cpu的t1端用作計數(shù)觸發(fā)脈沖。普通電能表的銘牌上標有每kwh多少轉,其含義為電能表轉數(shù)每達這一數(shù)值就是用了一度電(即1kwh)。將從電能表上提取轉換后的的脈沖信號送入單片機的t

5、1端并進行計數(shù),編程時將t1計數(shù)器的計數(shù)模值設為電能表的轉數(shù),當計數(shù)器計數(shù)溢出時就可以判斷電能表已經(jīng)用了一度電。測試時可以使用實驗室普通的信號發(fā)生器送出脈沖信號代替電能表的轉數(shù)脈沖,送入單片機的t1端。2、 鍵盤模塊由普通的16鍵非編碼鍵盤與intel 8279可編程鍵盤/顯示接口芯片組成完整的編碼鍵盤電路。當鍵盤上有鍵按下時intel 8279會將按鍵轉換為鍵碼存儲在一個fifo(first in first out,先入先出)隊列中,并向cpu申請中斷。cpu得知中斷以后,從intel 8279的存儲區(qū)讀出鍵碼,判斷相應的按鍵,決定執(zhí)行相應的功能。3、lcd顯示模塊通過8255外圍接口擴展

6、芯片連接到cpu。lcd顯示模塊規(guī)格為12232像素,在顯示時分為上下兩行。每行占12216個像素,設計顯示8個1616的字符。嚴格的說要顯示8個1616的字符,至少要12816個像素,設計時第四個字符和的8個字符各少3個像素列,雖然少了3個像素列,但是由于像素大小極其微小,人的肉眼是很難分辨出來的。這樣的設計簡化了編程需要考慮的問題。上行一般顯示標題、提示、出錯信息等,下行一般顯示數(shù)值。使用時只需要cpu通過8255芯片將顯示用的字碼存儲在lcd模塊的內部存儲區(qū),lcd就可以顯示出相應的字符。4、 在本系統(tǒng)中要記錄不同時段的用電量,并計算出不同時段的電費。這就需要一個比較精確的時間標準,通常

7、可以使用motorola公司的mc146818可編程時鐘芯片,將計費段的時間存儲起來,在各時間段開始向單片機的int0端口申請中斷,在不同的時段使系統(tǒng)執(zhí)行不同的計費程序。在本系統(tǒng)中采用課題1的電腦時鐘代替,將課題1的電腦時鐘附加額外功能,在整點向外部ram區(qū)的一個存儲單元寫入當前的鐘點。cpu在計數(shù)滿一度電的時候執(zhí)行中斷程序,此時cpu讀取外部ram中存儲的鐘點,判斷不同的時段。執(zhí)行不同的任務。5、 功能設置智能識辨技術:本系統(tǒng)的編碼鍵盤每按下一個鍵,就中斷一次。假如設置某個功能時需要按功能鍵b和輸入數(shù)字24,就需要按鍵3次,鍵盤模塊會發(fā)出3次中斷申請。這樣就帶來一個問題:由于每次中斷都是調用

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

9、為一個整數(shù)送入到相應的變量中完成設置。然后系統(tǒng)中的標志位被清除,以后的按鍵回歸到正常狀態(tài)。系統(tǒng)利用智能識別技術,接受鍵盤輸入,對內部的計費標準,如高峰電費、電表轉數(shù)/kwh等進行設置。6、 功能設置超時自動復位技術:(偵探狗技術)此項技術解決一個實際應用中遇到的問題。設某人a按了鍵盤上的自定義設置功能鍵,此時系統(tǒng)功能鍵標志將被做上標記,系統(tǒng)處于等待設置數(shù)值狀態(tài)。但此時a恰好有事離開,某人b,在不知情的情況下,按照系統(tǒng)的說明書按了09的數(shù)字鍵,以為是顯示或者是相應的其他功能。但是系統(tǒng)認為此時輸入的數(shù)值是對內部數(shù)據(jù)的設置。這樣會產(chǎn)生兩個問題:一方面,b因為按了某鍵而系統(tǒng)沒有執(zhí)行相應功能而莫明其妙;

10、另一方面,b可能在不知情的情況下修改了內部計費、時段等標準,導致系統(tǒng)工作出錯。偵探狗技術能夠使功能設置在6.5s后超時,然后清除系統(tǒng)內部的功能設置標志,使系統(tǒng)恢復到正常狀態(tài)。7、 四大關鍵輔助性算法:這里要說明的幾個算法都不參與硬件的驅動,完全是純軟件的算法。雖然很短小,但是簡練的完成了其目的。在整個系統(tǒng)控制程序中的地位,不亞于其他與硬件接觸的函數(shù)。是整個系統(tǒng)中介于外部硬件數(shù)據(jù)與cpu數(shù)據(jù)之間的核心。1) 算法numstoarray:這個算法的功能是,將作為第一參數(shù)傳遞的int型整數(shù)的各位分離,按照由高位到地位的順序依次放入作為第二參數(shù)傳遞的數(shù)組中。方便其他函數(shù)使用數(shù)組中的數(shù)字,利用字庫得到相

11、應的字型碼。此算法中其實包含2個子算法。如傳遞一個整數(shù)54321到函數(shù)中,第一個子算法將54321的各位分離放入數(shù)組,但是此時得到的序列為倒序,即:數(shù)組下標0,1,2,3,4分別存放數(shù)字1,2,3,4,5。第二個子算法將數(shù)組中的元素進行倒序運算,得到需要的順序,即:數(shù)組下標0,1,2,3,4分別存放5,4,3,2,1。2) 算法:arraytocharacters:此算法的功能是,將作為第一參數(shù)傳遞的,存放1位數(shù)字的數(shù)組,通過查字庫,將得到的字型碼按順序放入作為第二參數(shù)傳遞的將要顯示的字符庫中。此算法運算后得到的字符庫就可以送入lcd的顯示緩存區(qū),顯示出相應的圖形了。此算法利用numstoar

12、ray算法得到的數(shù)組,查找字庫,產(chǎn)生字符庫。這兩個函數(shù)作為核心算法被顯示電量電費等函數(shù)使用。3) 算法arraytodigitali:此算法的功能是將作為第一參數(shù)傳遞的存放一位數(shù)字的數(shù)組,轉化為一個整數(shù)返回。此算法一般用來將存放在鍵盤緩存區(qū)的一位數(shù)字序列轉化為一個整數(shù)。其他函數(shù)利用返回的整數(shù)設置相應變量的值。此函數(shù)被設置高峰時段,電表轉數(shù)等函數(shù)使用作為核心算法。4) 算法arraytodigitalf:此算法的功能是將作為第一參數(shù)傳遞的存放一位數(shù)字的小數(shù)序列數(shù)組轉換為一個浮點數(shù)返回。此算法一般用來將存放在鍵盤緩沖區(qū)的一個小數(shù)序列轉化為浮點數(shù)返回給調用函數(shù)。此算法實現(xiàn)時將序列以小數(shù)點(系統(tǒng)中為d

13、鍵)為軸心分成兩半,每半都是一個一位整數(shù)序列,將兩個序列傳遞給arraytodigitali,arraytodigitali返回兩個整數(shù)。將小數(shù)點后面的整數(shù)轉換成小數(shù)加到小數(shù)點前面的整數(shù)上完成到浮點數(shù)的轉換。此函數(shù)被設置電費函數(shù)調用作為核心算法。整個系統(tǒng)的電路圖五、系統(tǒng)軟件設計本系統(tǒng)的軟件編程同樣是按照模塊設計的。首先解釋本系統(tǒng)軟件的部分全局變量。軟件的代碼請參見ls圖片或者pdf。initset結構用于保存高峰時段電價、低谷時段電價、高峰起始時間、高峰結束時間、低谷起始時間、低谷結束時間和普通電能表每度電的轉數(shù)。這些變量用作電量計費的標準。鍵盤模塊有修改這些變量的功能,以使智能電表系統(tǒng)可以適

14、應不同環(huán)境。initset結構定義的全局變量為set,set將initset 結構中的變量實例化。coulometer 結構定義電能表在高峰時段使用的電量、低谷時段使用的電量和使用的總電量。coulometer結構定義的全局變量為coulo。fee結構記錄當前使用的電費,包括高峰時段使用電量的電費,低谷時段使用電量的電費和使用的總電費。fee結構定義的全局變量為fee。在程序中由于要用到外部存儲器或者io端口的直接地址,所以利用keil c51中絕對定址關鍵字_at_定義了各種外部端口和io端口的地址。其中ram6264定義為外部ram 中存儲的時刻的地址。commandportof8279為

15、鍵盤控制芯片8279的命令口地址,dataof8279定義為8279數(shù)據(jù)口的地址。commandportof8255定義為lcd接口芯片8255的控制口地址,aportof8255定義為8255的a口地址,cportof8255定義為8255的c口地址,但是在程序中沒有直接使用c口地址,而是通過8255的命令口使c口的各位分別置位來控制c口的。全局函數(shù)init_cpu() 和init_8255andlcd()用來對cpu和液晶顯示模塊進行初始化。init_cpu()用于開放必要的中斷允許,將t1口配置為計數(shù)器,用來檢測電脈沖信號。init_8255andlcd()將8255的a、b、c口配置成

16、方式0輸出模式。打開lcd顯示并清屏。1、鍵盤模塊程序的設計:鍵盤模塊包含兩個中斷函數(shù),keyboard和dogsniffer,keyboard函數(shù)用于處理鍵盤按鍵事件,每次鍵盤按鍵中斷,keyboad函數(shù)會檢查按鍵的鍵值,根據(jù)不同的鍵值調用不同的功能函數(shù)。dogsniffer函數(shù)為偵探狗技術的實現(xiàn)函數(shù),當在鍵盤上按下功能鍵時keyboard函數(shù)調用wakeupdog函數(shù),喚醒偵探狗,其實質是向t0定時器送入定時初值,并使t0開始計時。當t0每65ms定時中斷一次。每次中斷后系統(tǒng)調用中斷處理函數(shù)dogsniffer,dogsniffer函數(shù)判斷功能鍵標志是否被標記,如果功能鍵標志被標記,而且按

17、鍵時間超過t0的100次計數(shù),即6.5s。則dogsniffer使功能鍵標志復位。如果功能鍵標志沒有被標記,則dogsniffer使t0中斷計數(shù)復位。并且不在向t0送入定時初值。如果功能鍵標志被標記,但是t0中斷計數(shù)未達100次,則將t0中斷計數(shù)加1,并向t0送入定時初值,開始下次定時。以下是鍵盤模塊程序中使用的函數(shù)列表,其中numstoarray等四個輔助算法函數(shù)在第二部分,系統(tǒng)整體設計中已經(jīng)詳細描述,這里不在說明。鍵盤模塊各函數(shù)間的調用關系圖如圖所示。void dogsniffer(void) interrupt 1 using 0;void keyboard(void) interrup

18、t 2 using 0;void showhighcoulometer(void);void showlowcoulometer(void);void showallcoulometer(void);void showhighfee(void);void showlowfee(void);void showallfee(void);void clear(void);void wakeupdog(void);void sethighfee(uchar key);void setlowfee(uchar key);void setrotatespeed(uchar key);void sethig

19、hstart(uchar key);void sethighend(uchar key);void setlowstart(uchar key);void setlowend(uchar key);uchar numstoarray(int number,uchar array8) ;void arraytocharacters(uchar message8,uchar display832,uchar length);int arraytodigitali(uchar array8,uchar length);float arraytodigitalf(uchar array8,uchar

20、length);keyboard中斷處理函數(shù)首先將按鍵的鍵碼讀入一個變量中,然后判斷功能鍵標志whichfunctionkey是否被作標記,如果已做標記,則進入一個switch語句,根據(jù)不同的鍵碼,調用不同設置函數(shù)。如果whichfunctionkey未被標記,則進入標準狀態(tài)的按鍵處理過程,此過程通過一個switch語句決定不同的執(zhí)行方式。按下05鍵時,為顯示相關信息的操作,則直接調用相關函數(shù)。按下c鍵時為復位語句,直接調用clear()函數(shù)。當按下功能鍵6d時,首先將功能鍵標志whichfunctionkey設置為相同的鍵碼,然后喚醒偵探狗,進行設置超時探測。當下次按下按鍵時,由于which

21、functionkey已被標記,會轉到相應的設置函數(shù)執(zhí)行。如果長時間未按下任何鍵,當超過偵探狗的超時時間后,偵探狗會將whichfunctionkey標志的標記取消。showhighcoulometer,showlowcoulometer,showallcoulometer和showhighfee、showlowfee、showallfee兩組函數(shù)用于顯示coulometer和fee結構的變量中保存的高峰用電量、低谷用電量、總用電量和高峰電費、低谷電費、總電費的數(shù)值。這兩組函數(shù)將內存中保存的數(shù)值轉化為一個只存放單個位數(shù)字的數(shù)組,然后通過查字庫numcharacters,將單個數(shù)字的字型碼送到要

22、顯示的字符緩存區(qū)里。showhighfee一組函數(shù)在顯示時,由于內部變量為float型,在lcd上顯示時比較困難,而且在計算電費時按照整數(shù)結算也是比較容易接受的選擇,所以在實現(xiàn)時首先利用標準庫中的ceil()函數(shù)將float取整,然后再轉化為整型數(shù)字顯示sethighfee、setlowfee、setrotatespeed、sethighstart、和sethighend、setlowstart、setlowend函數(shù)用于設置initset結構定義的電價、轉數(shù)、高峰時段、低谷時段等變量。這些函數(shù)被調用時一般將按鍵信息存儲在一個輸入緩沖區(qū)里面。輸入小數(shù)點用按鍵d代替,輸入結束用按鍵e代替。當這些

23、函數(shù)檢測到一個輸入結束按鍵時,它們將輸入緩沖區(qū)的數(shù)據(jù)傳遞給arraytodigitali或者時arraytodigitalf,由他們完成輸入到數(shù)值的轉化。然后將轉化后的數(shù)值設為相應變量的當前值。做完這些工作后,這些函數(shù)將輸入緩存區(qū)、緩存位置計數(shù)和whichfunctionkey標志復位。以備下一次設置。2、lcd顯示模塊程序設計:lcd模塊部分包含下列幾個函數(shù):void sendcommandtolcd(uchar command);void display_left(uchar mdata);void display_right(uchar mdata);void display_all(u

24、char mdata);void displayselected(uchar pagenum,uchar column,uchar mdata16);void displayatrow(uchar row,uchar column,uchar mdata32);void displayaline(uchar line,uchar mdata832);display_all函數(shù)用于系統(tǒng)啟動時清屏,不用作其他用途,其他任何函數(shù)都不應該調用。lcd模塊的設計思想是盡力提供一個較為容易使用的、與硬件隔離的接口給其他調用函數(shù)。這一部分的編程模型如下圖所示:lcd部分的實現(xiàn)與此模型相對應、sendcomm

25、andtolcd、display_left和display_right 函數(shù)位于此模型中的“l(fā)cd驅動層”中,這3個函數(shù)直接接觸硬件,所有有關顯示的調用都是基于這3個函數(shù)之上。sendcommandtolcd函數(shù)的功能是向lcd的驅動芯片發(fā)送命令字。其參數(shù)為要發(fā)送的命令字。display_left函數(shù)的功能是向lcd的第一塊驅動芯片內寫入一個字節(jié)的顯示數(shù)據(jù),其直接表現(xiàn)為在lcd的左半部分上顯示字符。display_right函數(shù)能向lcd的第二塊驅動芯片內寫入一個字節(jié)的顯示數(shù)據(jù),表現(xiàn)為在lcd的右半部分顯示字符。這3個函數(shù)都是利用作為全局變量定義的commandportof8255和aport

26、of8255,命令或者數(shù)據(jù)端口直接讀寫的。本系統(tǒng)的lcd顯示時一個字符占用1616個象素的顯示單元,即其一個字符的顯示數(shù)據(jù)為32個字節(jié)。displayselected函數(shù)和displayatrow函數(shù)位于此編程模型之“編程抽象層”,是對sendcommandtolcd、display_left、display_right函數(shù)的低層封裝。它們使用低層的sendcommandtolcd等3個函數(shù)完成顯示數(shù)據(jù)的功能。displayselected函數(shù)在指定的頁和列開始送入16個字節(jié)的顯示數(shù)據(jù),即半個字符。lcd顯示屏共32行,分為4頁,每頁8行,由于一個字高為16個像素,所以這個性質限制了displ

27、ayselected函數(shù)只能顯示半個字。此函數(shù)隱藏了一個列實現(xiàn)的細節(jié),lcd由兩塊顯示芯片控制,每一塊控制61列,即060列為第一塊芯片控制,要用display_left函數(shù)顯示,第二塊控制61121列,要用display_right函數(shù)顯示,而此函數(shù)可以接受的列為00x7f。在函數(shù)中會對輸入的列參數(shù)進行判斷,小于0x40的列,函數(shù)會調用display_left函數(shù)顯示,大于或者等于0x40的列,函數(shù)會調用display_right函數(shù)顯示。這樣就完成了列的平滑顯示。displayatrow函數(shù)是對displayselected函數(shù)的進一步封裝,此函數(shù)的意圖是掩蓋頁的跨越,使之能夠以一個函數(shù)在

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

29、用displayselected函數(shù)送到第3頁顯示。這樣就完成了頁跨越的掩蓋。位于lcd顯示驅動最高層,即“顯示服務提供層”的函數(shù)只有一個,即displayaline,此函數(shù)是基于displayatrow函數(shù)的封裝。由于displayatrow函數(shù)可以在指定位置顯示一個字符,基于這種能力派生的displayaline函數(shù)的功能就是將一行字符顯示在某一個顯示行上。由于lcd最多可以顯示8個1616的字符。所以displayaline函數(shù)顯示字符串的最大字符限制也為8個字符。displayaline函數(shù)用來向其他需要顯示的函數(shù)提供服務。一個需要進行顯示的函數(shù)將它要進行顯示的數(shù)據(jù)通過查表或者其他途徑

30、轉換為lcd顯示的顯示碼,然后將顯示碼保存在一個832的數(shù)組中傳遞給displayaline函數(shù),然后displayaline函數(shù)將數(shù)組中的數(shù)據(jù)全部送入某行進行顯示。兩個提示函數(shù)showdefault和showerror用于顯示必要的提示信息。showdefault函數(shù)設計成一個死循環(huán),用于顯示系統(tǒng)的待機畫面。此待機畫面用于向用戶提示鍵盤上各個按鍵的功能。showerror函數(shù)在用戶操作出錯時向用戶顯示一個出錯提示,以便防止用戶誤操作。六、總結這個系統(tǒng)是我所設計過的最為復雜的一個系統(tǒng),雖然硬件部分比較簡單,但是這個系統(tǒng)的軟件完全是在我已經(jīng)純熟的c語言編程技巧的基礎上開發(fā)的,除了為了了解某些硬件

31、的命令字查看過示例程序外,其他的程序完全是自己開發(fā)的,沒有參考、抄襲其他任何論文、報告。通過這個系統(tǒng)的設計,我對keil c51的語法,開發(fā)方法有了較深的認識,可以肯定的說,如果有第二次機會開發(fā)這樣的系統(tǒng),那么,在系統(tǒng)控制程序上所犯的錯誤,將會大大減少。在設計本系統(tǒng)之前,為單片機編寫的程序都是較小的程序,一直用匯編語言寫。本系統(tǒng)的復雜性使匯編語言程序不利于編寫和閱讀,所以采用c語言編寫。由于我以前都是為intel 80586以上,安裝windows操作系統(tǒng)的pc寫c語言的應用程序。所以雖然程序完全符合標準c語言的要求,但是由于硬件平臺的不同,還是出現(xiàn)了很多問題?,F(xiàn)將各種問題一一描述:1、 中斷

32、函數(shù)寄存器組使用不當:程序中有3個中斷函數(shù),在最初每個中斷函數(shù)使用的寄存器組都不相同,本意是為了提高寄存器的利用效率。定義偵探狗中斷t0使用寄存器組1,鍵盤中斷使用寄存器組2,電量中斷使用寄存器組3。但是在調試中發(fā)生了一個錯誤。main函數(shù)和keyboard函數(shù)中都調用了displayaline函數(shù)顯示一個字符串。main中的調用可以正常工作,將字符串顯示在lcd上,但是keyboard函數(shù)中則只能顯示字符串的上半行,下半行的字總是顯示在lcd的最左邊,從而造成這樣一些亂碼。這個問題對我們造成了相當?shù)睦_,因為main和keyboard調用的是同一個函數(shù)。開始時以為是在傳遞參數(shù)時指針出錯,后來

33、使用斷點調試時才發(fā)現(xiàn),displayaline在顯示下半行調用displayselected函數(shù)時,列column的實際值都為0,所以所有的字符的下半行都送到第一個字符下面去顯示。其后分析認為,產(chǎn)生的錯誤中,最大的不同是調用displayaline函數(shù)的位置不同,即一個在mian中,另一個在keyboard中,它們兩個函數(shù)使用了不同的寄存器組。main使用的寄存器組為第0組,keyboard使用第2組。由于displayaline函數(shù)的參數(shù)是通過寄存器組來傳遞的,所以推斷使用其他的寄存器組會導致顯示錯誤。將keyboard函數(shù)使用的寄存器組改為0組,錯誤消失。2、 數(shù)據(jù)段溢出錯誤:在最初的程序

34、中,除了字庫外,全局變量、靜態(tài)變量都按照標準c語言方式默認定義,沒有考慮到存儲位置的問題。但是鏈接時發(fā)生錯誤,提示data段溢出。最初不明所以,其后查看c51的幫助文檔時看到,如果不顯式說明變量的存儲位置,則變量會根據(jù)系統(tǒng)模式的設置存放到默認的數(shù)據(jù)區(qū)。本系統(tǒng)中使用的是89c58最小系統(tǒng)方式,默認情況下變量會存放到系統(tǒng)的data段,由于data段只有128個字節(jié),而且還有寄存器組和位尋址區(qū),難以容納所有的變量。了解到這些以后,將所有的全局變量和靜態(tài)變量都顯式聲明到idata段,idata段為256字節(jié),足以容納這些變量,問題得意解決。3、 編譯器匯編語言與c語言交叉編譯不完善:在本系統(tǒng)程序設計中

35、,在某些位置需要用到匯編中的一條nop指令,由于c語言中并無與此功能相近的語句,所以我們求助于c51中的c語言與匯編語言的交叉編譯。即在相應位置加入#pragma asm nop #pragma endasm匯編指令,執(zhí)行空指令。在編譯器中設置好相關選項并進行編譯。在我的電腦上安裝有keil c51 8.02試用版,利用此版本進行編譯、鏈接通過,但是使用版有代碼大小限制,無法生成執(zhí)行文件。實驗室安裝的為keil c51 6.0版,在鏈接時無法通過,提示大堆的符號未定義。由于編譯器版本老舊的問題,為了生成執(zhí)行文件,只能將相應位置的匯編指令去除或者用與之近似的c語句代替。4、 編譯器對預編譯指令未

36、正確解釋:本系統(tǒng)程序設計時,由于字庫比較大,所以最初是將字庫定義在一個頭文件characterlib.h中,與主程序隔離。這樣的話,修改和閱讀都比較方便。但是鏈接時產(chǎn)生錯誤,連接器抱怨說字庫公開變量被多次定義。推斷應該是頭文件被多個模塊包含產(chǎn)生了錯誤。然后修改了代碼,將characterlib.h文件中所有的變量定義都包含在預處理指令#ifndef characterlib_h #define characterlib_h #endif中,但是在keil c51 6.0版本中仍然會產(chǎn)生錯誤。如果換用keil c51 8.0版本,則在頭文件中不加預編譯指令也不會報錯。因為實際上只有main.c包

37、含了characterlib.h。最后,只能將字庫定義全部從characterlib.h中移到main.c中,問題解決。我可以容忍設計中出任何問題,但是不能容忍實驗室的儀器出一點點問題。這是第一次課程設計時留下的痛苦回憶,設計的完全正確,但是結果完全錯誤。最后發(fā)現(xiàn)儀器裝作可以正常工作的樣子欺騙我們,那時真想撲上去咬它。這次使用的是湖北眾友的單片機開發(fā)實驗箱,總算是正常工作(并不是每個人的都正常工作,汗)。但是問題并不是沒有。由于設計的系統(tǒng)中要用到一個lcd顯示模塊,而這個模塊是國產(chǎn)的模塊,除了廠家外,并沒有標準使用說明書。只能參考實驗箱的使用手冊。在這個手冊上提供了3個關于lcd的信息,一個是

38、protel畫的實驗箱的lcd部分電路圖,一個是手冊上的lcd連線示例圖,還有一個是lcd模塊引腳說明表。但是,這3個資料中,任意兩個對lcd引腳連線方法的說明都不同。 真是很無語,幸好這個問題只影響pcb電路圖的繪制,對于編程沒有影響,暫時將其忽略了。眾友開發(fā)箱附帶的使用手冊也令人很無語,居然只有薄薄的58頁,還沒有我的設計報告長,國產(chǎn)產(chǎn)品的通病。幸好上面的電路圖和隨機附帶的程序源碼都還實用,不然的話。關于這個開發(fā)板的硬件呢,cpu是sst的89c58,256b可用內存(喜歡),32kb的flashrom(喜歡),時鐘為33mhz。此單片機帶的32kb的flashrom幫了大忙,我的設計中程

39、序共2000多行,1000行為字庫,一半存放于外部ram,一半存放于rom中。1000行為程序代碼。這樣加起來,代碼大小為15kb,要不是他的rom足夠大,還真的放不下。lcd為fm12232a 液晶顯示模塊,共12232個像素。以1616的像素顯示一個字的話,這個模塊可以勉強顯示2行,每行8個字。但是比較郁悶的是,如果要完全以1616像素顯示8個字,那么至少12816個像素,這個模塊一行只有122個像素,哭。既然要顯示漢字,為什么不用12832的啊,用122顯8個漢字就會少6個像素,無語。只能將第四個字和第8個字各少3個像素。雖然肉眼不仔細看的話是看不出來的,總覺得不爽之至。還用到一個鍵盤,

40、由intel 8279和16鍵的鍵盤組成。這個8279,intel官方出的使用手冊共16頁,贊,看人家的資料就是詳細。自認為英文閱讀還不錯的我,(平時編程都是直接查msdn的英文文檔練出來的,全英文的芯片手冊也看過不少),看到intel的這個手冊后呆了,好多詞認識,好多詞不認識。結果16頁的手冊沒有幾句話是我能看懂的。是我太低了,還是intel太高了?這個設計的題目其實很普通,但是據(jù)可靠消息,以前很少有人做這個題目,不幸做了這個課題的中途又改做其他的了。由于我班人積極得拼搶自認為簡單的設計課題,結果我們這種沉穩(wěn)的、看是不夠積極的人就落下了這個看似很難的設計課題。本來如果以課程設計的觀點來看,這

41、個題目也不是很難。但是恰恰遇到了我這樣一個人,在編程上超越了絕大部分做過這種課程設計的人,用以現(xiàn)實世界為依據(jù)的觀點觀察了這個課題,設想了一系列實用的、會在現(xiàn)實中遇到的功能。結果這個課題變得無比復雜了,以致于編寫了1000行程序代碼才解決了這個問題。一天同學告訴我說他用匯編寫的程序都200行了,我說:我昨天晚上就寫200行了。如此長的程序以致于有人聽到后取笑:聽說xxx寫的程序2000行。我無法反駁,只是想,對于任何一個實用的系統(tǒng)來說,其控制程序沒有短于2000行的吧。對于匯編,雖然我也很了解匯編,但是以前從沒有試圖比較c與匯編之間的效率問題。但是在這次設計中親切的了解到了。程序中產(chǎn)生了某些問題

42、,需要斷點調試,將程序代碼反匯編后吃了一驚。以前聽說一般一條c語言一般會被解釋為3條匯編指令,但是我以前從未想像到i=0;這樣一條語句等于3條匯編指令,而i+;這樣一條語句被解釋為8條匯編指令。不由得脊背發(fā)冷,幸虧最初就決定用c寫這個系統(tǒng),不然的話,我這里共2000行的代碼,有1000行是程序語句。如果用匯編寫的話,至少要寫5000行吧。對于keil c51,雖然是一個很有用的工具。但是現(xiàn)在不免存在著暇痣。程序中用到了匯編中的一條nop指令,所以使用了keil c51的c與匯編交叉編譯。#pragma asmnop#pragma endasm但是keil c51 6中,居然出現(xiàn)了大堆了名稱未定

43、義出錯提示。而且對于預編譯指令#ifndef characterlib_h#define characterlib_h#endif居然未正確的解釋,無語ing。很高興這兩個問題在keil c51 8.02版中已經(jīng)解決了。關于這些,后面有詳細的描述。正如我在題記中所說c51中的c語言,不是c語言。雖然c51中c語言的語法完全相同,但是編程方法和pc上編程有極大的不同。首先pc上面的內存海量,你不用考慮某個變量該放在data?idata?or xdata?當然,最好放在code段,只要你不準備修改這個變量,因為一般單片機的片內rom比ram要大很多,rom以kb衡量,ram以b衡量。data訪問最

44、快,但是最小,只有128b,只能放最最最常用的東西,比如你床頭放的東西最方便,但是只能放很少的東西,不然你的床會變成豬窩。idata次之,xdata為外擴的存儲器,容量最大,但是訪問最慢。一般放極大但是不常用的東西。其次在安裝操作系統(tǒng)的pc上編程,不用考慮usb的端口地址,硬盤的端口地址,顯示器的中斷之類的。但是在單片機上,控制程序本身就是一個操作系統(tǒng)。經(jīng)常會用到各個外部芯片的端口地址,中斷號之類的。這個時候c51中的_at_關鍵字就幫上忙了。這個關鍵字我找了好長時間的說。沒有這個關鍵字,整個程序的設計就進行不下去了。因為標準c中并沒有提供直接定位內存地址的關鍵字或者功能。而程序中必須對某些端

45、口進行直接的讀寫。寫到這里,不僅想起了微軟。微軟的系統(tǒng)一向以兼容性好而出名。單片機編程與pc編程最大的不同大概就是,單片機系統(tǒng)的軟件本身就是一個操作系統(tǒng),而pc編程是對操作系統(tǒng)公開的接口進行編程。簡單的說就是,微軟給我們很多積木,我們自己來設計其造型。微軟為了讓操作系統(tǒng)兼容各種硬件做了多少工作?付出了多少努力?創(chuàng)新了多少技術?這恐怕我們這些人難以了解的。但是我自己做這樣一個簡單的系統(tǒng)就必須加入許多的復雜的技術,完成許多復雜的轉換。屏蔽許多硬件的特性,使之使用起來更加柔和,更加貼近硬件。實在難以想象像windows這樣的系統(tǒng)會怎樣的復雜。其實我一直迷惑微軟是如何將windows制造出來,一直想微

46、軟是如何做到的。峰谷分時電價的現(xiàn)狀分析與發(fā)展趨勢探討 電價是電力市場最有效的經(jīng)濟調節(jié)杠桿。隨著電力經(jīng)濟體制改革與電力市場化,運用電價來調節(jié)電力經(jīng)濟運行,以優(yōu)化電力資源配置,提高電力企業(yè)整體經(jīng)濟效益,已經(jīng)勢在必行。分時電價是在改革中逐步試點與推廣的一種新型電價制度,它是根據(jù)不同時段發(fā)供電成本不同而制定的不同電價。它包括峰谷分時電價與豐枯分時電價。本文試圖對峰谷分時電價的必要性、現(xiàn)狀與發(fā)展趨勢作些探討。 1 實施峰谷分時電價的必要性 峰谷分時電價是電力產(chǎn)品的瞬時性及供求平衡的客觀要求。電能產(chǎn)品作為一種特殊商品,其最大的特點是瞬時性,即電能的產(chǎn)、供、銷是同時完成的。電能沒有半成品,也不能大量儲存。這

47、一特點決定了電能產(chǎn)品供給彈性小,對即時需求依賴性很強。電力產(chǎn)品的特點決定電力企業(yè)生產(chǎn)特點是不論發(fā)供電設備使用情況如何,設施每天滿負荷或輕負荷運行,設備都必須保持良好的狀態(tài)。而且電力生產(chǎn)除保持電力供求平衡外,為保證安全供電,還必須留有足夠的發(fā)電備用容量。因此電力企業(yè)的基本折舊費、大修理及維修費用、管理費用等固定費用,占電力企業(yè)總成本的50%至60%,使生產(chǎn)與供給較為穩(wěn)定。而電力需求在一年四季與一天的不同時段呈現(xiàn)出波動頻繁與波動幅度較大的特點。一年的用電高峰集中于最熱與最冷的季節(jié),其它季節(jié)為低谷用電;一天的用電高峰集中于18點至22點,低谷用電集中于23點至次日7點。電力生產(chǎn)的穩(wěn)定性與需求波動性矛

48、盾決定了實施分時電價成為最佳的選擇。通過分時電價調節(jié)需求,實現(xiàn)供求平衡。 峰谷分時電價以均衡價格為理論依據(jù),有利于運用價格機制均衡電力負荷,實現(xiàn)電力資源優(yōu)化配置。就電力短期供給和需求而言,在某一時點,電力生產(chǎn)成本、物價指數(shù)、季節(jié)變化、政策變動等因素的影響視為既定,電價便成為調節(jié)負荷率、促進資源優(yōu)化配置的唯一因素。如圖所示: 假設均衡價格為p2,均衡需求量為q2,在高峰用電期,需求量為q1,且q1q2,此時若實行傳統(tǒng)價格不變(假定為p3),則p3p2,一方面促使發(fā)電企業(yè)為追求超額利潤而加大供電量,另一方面用戶也將自覺避開電價高峰,調整負荷分布,從而降低高峰需求量,增加低谷用電量,自覺削峰填谷,均

49、衡電力負荷。正是分時電價不同時段的價差在自動調節(jié)著電力供給與需求的均衡,從而實現(xiàn)電力資源的有效配置與優(yōu)化組合。 在結構失衡、自然力制約、峰谷差拉大的情況下,實施峰谷分時電價更有必要。長期以來,我國電網(wǎng)建設滯后于電源建設,造成低壓配電網(wǎng)多,網(wǎng)架結構薄弱,輸配電能力不足,有電送不出;而電源結構較為單一,火電與水電比重較大,其它電源比重小,或剛開始建設起步,調峰電源較少,現(xiàn)有火、水電調峰性能差,加之受自然力影響,如遇酷冷、酷熱、洪旱天氣的影響,峰谷差急劇拉大,即使某些電網(wǎng)電能較為富余,高峰時也要拉閘限電,低谷時發(fā)電機組大量閑置或棄水調峰。在此情況下,實施分時電價,引導客戶錯峰用電與削峰填谷用電,以均

50、衡電力負荷,實現(xiàn)供需平衡,并產(chǎn)生錯峰效益與提高整體經(jīng)濟效益,其意義十分重大。 2 峰谷分時電價的現(xiàn)狀分析 我國自1993年在上海市試行峰谷分時電價以來,逐步推廣,現(xiàn)在全同絕大部分省市工業(yè)大用戶中均已實施峰谷分時電價制。其一般做法是將一天分為三個時段:高峰時段(7:30至11:30;18:00至23:00),低谷時段(23:0055次日7:00),其余時間為平時段。高峰時段電價上浮5060%,低谷時段電價下浮5060%,平時段電價相當于基礎電價不變。從上海等地實施分時電價的現(xiàn)實來看,效果明顯。 2.1 使用效果分析 1993年至2000年,上海市在工業(yè)大用戶中實行峰谷分時電價,削峰填谷效果明顯,

51、用電狀況由,過去的結構失衡、高峰時段缺電現(xiàn)象嚴重轉變?yōu)楣┬杞Y構較為合理與供需基本平衡。2001年上海市電力公司擴大到對居民用戶實行峰谷分時電價,居民的每日低谷用電量平均達到全日用電量的40%以上。由于低谷電價較低,居民得到更多的實惠。據(jù)有關統(tǒng)計數(shù)字顯示,居民人均每月可節(jié)省12.7%的電費,提高了居民對電力消費的興趣。在上海市居民中安裝峰谷分時電表后,用電量增長了15%以上。同時,推動了其他能源用戶改用電能的進程。 2.2 負荷轉移與成本分析 上海市居民用戶家中基本上都裝有蓄熱式電熱水器,其功率9001800kw,一般都選擇在低谷時段使用,高峰負荷向低谷轉移效果明顯,從已投入試點運行的10萬戶看

52、,若按每戶轉移1kw計算,則可轉移10萬kw以上高峰負荷。按常規(guī)機組造價4000元kw計算,即可減少4億元人民幣的投入(還不含輸配電設備投入和電能損耗的費用),這就降低了電價中的容量成本,提高了經(jīng)濟效益。湖北省在推行峰谷分時電價時測算,該省境內已有200萬戶有蓄熱式電熱水器,共計300萬kw,若鼓勵居民避開高峰時段用電,可削峰填谷20萬kw,可減少20億元人民幣的投入,這將大大降低電力容量成本,提高電力行業(yè)的整體經(jīng)濟效益。 2.3 其它各項指標分析 2001年上海市將分時電價推廣到居民用戶中以來,電力運行狀況良好。當年,發(fā)電量完成了323.38億kwh,比上一年增長5.14%;售電量完成321

53、.8億kwh,比上一年增長5.02%;最高發(fā)電出力為633.5萬kw,同比增長12.68%;日最高發(fā)電量為12303萬kwh,同比增長10.04%;線損率比上一年下降0.31個百分點;供電煤耗率與上一年持平;供電可靠率達到99.76%,比上一年提高0.09個百分點。 總之,實行分時電價,能引導用戶合理用電,優(yōu)化資源配置,提高供電企業(yè)的市場份額,擴大電力銷售收入。這對提高電力系統(tǒng)負荷率和發(fā)電設備的利用率,充分發(fā)揮夜間的供電能力,緩解高峰用電緊張局面,減少供電容量成本均可起到明顯的作用。但現(xiàn)時的峰谷分時電價仍存在以下問題: (1)思想認識不足 某些至今仍未實行分時電價的供電企業(yè)領導認為,推行分時電

54、價會引起購電成本增加、表計維護加大與平均電價下降,導致經(jīng)濟效益不佳。這是對前面所闡述的分時電價的優(yōu)越性認識不足所造成的不必要的看法。實踐證明,實行分時電價,有利于電力企業(yè)整體效益的提高。 (2)峰谷價差幅度小 據(jù)有關資料顯示,峰谷價差在國外可拉大到8至10倍,而我國一般為2至3倍。由于峰谷價差小,客戶削峰填谷的用電積極性雖有所調動,但調動得不很充分,削峰填谷用電仍有進一步挖掘的空間和潛力。 (3)時段劃分長,缺乏靈活性 除個別地方實行尖峰、高峰、平段、低谷四時段外,一般為高、平、谷三時段,上海市對居民用戶實施的分時電價還只分為峰谷二時段,時段劃分太長,而且每一時段電價一經(jīng)確定就難以改變,缺乏靈

55、活性,不能隨時精確地使電價反映發(fā)供電成本的變化。 (4)實施的范圍比較窄 除上海等極少數(shù)地方外,我國目前的分時電價僅在工業(yè)大用戶中實行,其對用戶需求與電力負荷的調整只屬于整個電力運行的一部分。同時,由于峰谷分時電價僅對電力用戶實行,未能調動產(chǎn)、供、銷、用協(xié)同推廣峰谷分時電價的積極性。因此,峰谷分時電價發(fā)揮的作用極其有限。 3 峰谷分時電價改革與發(fā)展的趨勢 3.1 完善峰谷分時電價運行機制 改革我國峰谷分時電價體制并使之日趨完善是我國當前電價改革的主要任務之一。筆者認為當前峰谷分時電價體制可以從以下幾個方面進行改進與完善: (1)擴大峰谷分時電價差 對于已實行的峰谷分時電價,應根據(jù)實際需要進一步

56、拉大峰谷電價差。可參照國外做法,逐步拉大到價差為8至10倍,以充分調動廣大用戶削峰填谷的用電積極性,尤其是低谷用電,其電價的制定應以電價臨界點即完全競爭價格為下限,最大限度增加低谷用電量。 (2)加大峰谷分時電價實施的靈活度,改革原來的“一經(jīng)定價,較長時間不變”的模式 盡最大努力,縮短分時時段與電價變更的時間,以快速應對發(fā)供電成本變化的市場需求,達到靈活有效調節(jié)的目的。 (3)擴大峰谷分時電價的實施范圍 首先,峰谷分時電價應普遍推廣到商業(yè)與居民用電的領域。雖然商業(yè)用電和居民生活用電在用電總量中所占的比重并不大,但其絕對數(shù)仍很大,而且是我國電力消費未來的熱點與快速增長點。隨著流通現(xiàn)代化、現(xiàn)代商業(yè)

57、、電子商務與網(wǎng)絡營銷的發(fā)展,商業(yè)服務已突破時空限制,為商業(yè)用電負荷從高峰轉移到低谷創(chuàng)造了條件;隨著電熱技術和低谷電蓄冰蓄熱技術的發(fā)展,低谷蓄電成為可能。同時,空調、蓄熱式熱水器大量進入居民家庭,這些均為居民用戶實施峰谷分時電價創(chuàng)造了條件。雖然峰谷分時電表的改造需要定的投資,但從長遠看,其總體效益是好的。目前峰谷分時電價已率先進入上海市商業(yè)與城鎮(zhèn)居民家庭,其成功的經(jīng)驗值得推廣,我國峰谷分時電價應逐步從只在工業(yè)大用戶中實行推廣到城鎮(zhèn)商業(yè)與居民家庭。 其次,峰谷分時電價應推廣到上網(wǎng)電價與輸配電價領域、我國自改革開放以來,已經(jīng)打破了垂直壟斷的管理體制,初步實行發(fā)電和輸配電分離。在發(fā)電方面,已成立華能、大唐、華電、國電、中電投五大集團公司,還有其他獨立發(fā)電廠;在輸配電方面,已成立國家電網(wǎng)公司與南方電網(wǎng)公司。因此,必須從電廠開始,做到發(fā)、輸、配電均實行峰谷分時電價,才能做到利益均衡,公平負擔,充分調動產(chǎn)、供、銷、用各個方面推廣峰谷分時電價的積極性。例如,發(fā)、輸電不實行峰谷分時電價,供電企業(yè)按平均電價購電,

溫馨提示

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

評論

0/150

提交評論