找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1653|回復: 0
打印 上一主題 下一主題
收起左側(cè)

基于單片機的光能電子時鐘設(shè)計

[復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:729128 發(fā)表于 2020-4-15 18:31 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
溫度顯示:本設(shè)計采用DS18B20芯片,作為常用的數(shù)字溫度傳感器.DS18B20具有硬件開銷低,抗干擾能力強,對于溫度測控顯示誤差小等優(yōu)點。并且采用單線結(jié)構(gòu),也就是說只需要一根線和cpu連接,就可以實現(xiàn)在不依賴其他外部部件的情況下輸入或輸出串行數(shù)據(jù)。并有直接使用信號線供電的特點。在正常情況下,電源可以測量范圍為3.2v~5.0v的電壓,并且相對于同種芯片測量準確度更加高,測溫范圍為:零下五十五度到一百二十度,在零下十度~八十五度范圍內(nèi),準確度可以達到上下浮動零點五的誤差。當轉(zhuǎn)換數(shù)位為12位時,溫度基礎(chǔ)分辨率可以達到0.0598C°。程序中所有的數(shù)字精度及時間的轉(zhuǎn)換都可以用簡單的編譯程序控制來實現(xiàn),可以實現(xiàn)短時性上下限報警設(shè)定的功能。用戶利用一些常規(guī)的編程改變數(shù)字大小就可以控制報警器的閾值。
1.2.2其他模塊
  鍵盤控制模塊:本設(shè)計采用的是獨立式鍵盤。每一個按鍵都單獨占用了一根I/O接口,并且各個按鍵接口都相互獨立,也就是說單個按鍵并不會影響其他I/O接口的工作狀態(tài)。所以通過程序很容易就知道輸入線的電平狀態(tài)可以很輕松判斷哪個按鍵被按下了。該種設(shè)計使得每個按鍵有單獨的功能,更加便于操作。
  顯示模塊:使用LCM12864液晶顯示屏顯示數(shù)字。液晶顯示屏具有體積小,表面積大,成像清晰穩(wěn)定,質(zhì)感輕薄,電耗低抗干擾能力強等優(yōu)點。

第二章 系統(tǒng)硬件設(shè)計
2.1時鐘硬件選擇
2.1.1單片機選擇。
經(jīng)過同種單片機的數(shù)據(jù)對比,本時鐘采用了常規(guī)的AT89C51芯片,單片機計算效率高,程序運算簡單,可用度高,只需要一些簡單的編程就可以實現(xiàn)對所有的的算法及邏輯控制,并且因為其耗能少,體積小,成本低廉技術(shù)商業(yè)化程度高等優(yōu)點,使AT89C51在各個領(lǐng)域都有廣泛的使用。
AT89C51相比其他芯片而言具有低電壓高性能的特性,而且是所帶4k字節(jié)的flash存儲器的單片機。在正常情況下,可擦除只讀類的儲存器的單片機能夠反復擦除九十次以上。而由AT89C51單片機是使用了非常高的精密器件制作工藝所制作,與工業(yè)標準的MCS-51輸出管腳和指令集兼容。AT89C51單片機的存在為高級算效率低制造成本的嵌入式控制系統(tǒng)提供了可能。

AT89C51單片機
圖2-1
各個管腳說明:
VCC:為電路供電電壓。
GND:端口接地。
PO:在進行編程時,原碼由該口輸入。當系統(tǒng)開始校驗的時候原碼由此口所輸出與此同時p0外部電壓被拉高。
P1:在系統(tǒng)進行編程或者校對時, 該引腳接口將所有第八位的地址接收。
P2:同上在系統(tǒng)進行編程或校驗時接收高八位地址信號以及控制信號。
P3:作為輸入,將低電平轉(zhuǎn)換為高電平
2.1.2顯示模塊
方案一:使用LCM12864液晶顯示屏顯示數(shù)字。液晶顯示屏的優(yōu)勢是相對傳統(tǒng)顯示屏在重量上占比較輕厚度也更加薄、便于攜帶和運輸。能耗更低、幾乎不存在有輻射的危險。而且在顯示模式上有著直角顯示以及成像穩(wěn)定不花屏等優(yōu)點,可觀測的實際面積較大,圖像更好,抗鋸齒干擾能力更強的特點。
方案二:采用點陣數(shù)碼管顯示,所謂的點陣數(shù)碼管就是由發(fā)光二極管均勻排版的成品,通過列矩陣控制的方式點亮相應(yīng)的二極管從而形成可控制的的顯示單元,不過該種方式更適用于顯示文字,如果僅用于顯示數(shù)字則性價比較低。
    方案三:采用傳統(tǒng)的LED數(shù)碼管顯示。同比其他方式而言使用數(shù)碼管的優(yōu)勢在于:損耗更低,使用壽命更長,對環(huán)境要求更低,容易維護,高精度,重量小,操作簡單但可顯示的信息相對有限,一般只能用作為數(shù)字顯示。
根據(jù)需求及上述所論,決定采用方案一。
2.1.3鍵盤模塊
    方案一: 使用獨立式鍵盤。每一個按鍵都單獨占用了一根I/O接口,并且各個按鍵接口都相互獨立,也就是說單個按鍵并不會影響其他I/O接口的工作狀態(tài)。所以通過程序很容易就知道輸入線的電平狀態(tài)可以很輕松判斷哪個按鍵被按下了。該種設(shè)計使得每個按鍵有單獨的功能,更加便于操作。優(yōu)點是軟件結(jié)構(gòu)簡單,電路配置靈活。
    方案二:采用矩陣式鍵盤,相比獨立式鍵盤矩陣式鍵盤更適用于對按鍵數(shù)量要求更多的場合。矩陣式鍵盤一般由行線和列線組成,所有的按鍵都分布在每行與每列的交叉點上,這樣可以節(jié)省I/O接口。此鍵盤擴展性好,但操作相對更加復雜。對于容錯率要求更高。
因此根據(jù)作品實際要求,我們采用方案一。
2.1.4時鐘芯片模塊
時鐘芯片我們使用了DS1302時鐘芯片,DS1302是一個價格低廉,簡單方便,用法多樣的實時時鐘芯片,與其他時鐘芯片不同的是,它是一個在性能上更加穩(wěn)定并且對于電壓要求更低的實時時鐘芯片,具備31字節(jié)RAM,并且可以實現(xiàn)在斷電狀態(tài)下完成一次性傳輸多個ram數(shù)據(jù)和多字節(jié)的時鐘信號。在功能方面ds1302可以實現(xiàn)提供年、月、禮拜、天、時、分、秒的功能。并且其對工作電壓電壓壓寬要求更低,支持雙電源供電。用于數(shù)據(jù)記錄,特別是對某些具有特殊意思的數(shù)據(jù)點的記錄上,能實現(xiàn)數(shù)據(jù)與出現(xiàn)該數(shù)據(jù)的時間同時記錄,廣泛應(yīng)用于各個測量系統(tǒng)中。因此,同比其他時鐘芯片,我們采用DS1302。
2.2系統(tǒng)硬件框圖
電子時鐘電路是由AT89C51單片機為控制核心,具有在線編程功能,功耗相對較低支持在超低電壓的狀態(tài)下持續(xù)工作,顯示部分采用12864點陣液晶屏顯示,整個電子時鐘系統(tǒng)由太陽能供電系統(tǒng)供電系統(tǒng)硬件框圖如下:

圖2-4
2.3液晶顯示模塊設(shè)計
2.3.1概述
12864點陣.液晶顯示模塊.可以顯.示字母、數(shù)字符號、中.文字型.及圖形,具有.繪圖及文.字畫.面.混..合.顯.示.功.能。是一-種具.有4位/8位并行、2線.或3線串.行多.種.接.口方式,內(nèi)部含有國標- -級、二級簡體中文字庫的點陣圖形液晶顯示模塊;其顯示分辨率為128X64,內(nèi)置8192個16*16點漢字,和128個16*8點ASCII字符集.利用該模塊靈活的接口方式和簡單、方便的操作指令,可構(gòu)成全中文人機交互圖形界面?梢燥@示.8X4行.16X16點陣的漢字,也可.完成圖形顯示.低電壓低功耗是其又一- 顯著特點。由該模塊構(gòu)成的液晶顯示方案與同類型的圖形點陣液晶顯示模塊相比,不論硬件電路結(jié)構(gòu)或顯示程序.都要簡潔得多,且該模塊的價格也略低于相同.點陣的圖形液晶模塊。1286.4由20個引腳其.哥哥引腳功能如下圖所示:


2.3.2單片機接口設(shè)計
VCC和直.流電源相連接,當+5V電壓在穩(wěn)定在正常范圍時,程序數(shù)據(jù)可讀寫,當電壓低于4. 25V時,讀寫被禁止,但計時功能依然可以進行,計時器供電切換為內(nèi)部鋰電池供電: VSS 與BLK引腳接地: DB0~DB7是雙向地址/數(shù)據(jù)復用線,與單片機2口相接, 實現(xiàn)數(shù)據(jù)傳送: VEE 與VO間接一個滑動變阻器.

圖2-5
2.3.3屏幕顯示
  頁面顯示分為三個界面,通過按鍵切換,分別為開機界面、主界面及鬧鐘界面。主
界面包括時間,星期,溫度,節(jié)日,若該日不是節(jié)日則顯示上午下午、鬧鐘圖標鬧鐘界面為鬧鐘及秒表。
2.4時鐘芯片模塊
2.4.1時鐘芯片概述
隨著電子技術(shù)的不斷發(fā)展,電子時鐘技術(shù)已經(jīng)非常的完善,通過芯片傳遞的電子信號計時,將其時間數(shù)據(jù)經(jīng)單片機輸出,大大提高了電子時鐘的穩(wěn)定性和準確性。DS1302是一個價格低廉,簡單方便,用法多樣的實時時鐘芯片,與其他時鐘芯片不同的是,它是一個在性能上更加穩(wěn)定并且對于電壓要求更低的實時時鐘芯片,具備31字節(jié)RAM,并且可以實現(xiàn)在斷電狀態(tài)下完成一次性傳輸多個ram數(shù)據(jù)和多字節(jié)的時鐘信號。在功能方面ds1302可以實現(xiàn)提供年、月、禮拜、天、時、分、秒的功能。并且其對工作電壓電壓壓寬要求更低,支持雙電源供電。用于數(shù)據(jù)記錄,特別是對某些具有特殊意思的數(shù)據(jù)點的記錄上,能實現(xiàn)數(shù)據(jù)與出現(xiàn)該數(shù)據(jù)的時間同時記錄,廣泛應(yīng)用于各個測量系統(tǒng)中。用于數(shù)據(jù)記錄,特別是對某些具有特殊意思的數(shù)據(jù)點的記錄上,能實現(xiàn)數(shù)據(jù)與出現(xiàn)該數(shù)據(jù)的時間同時記錄,因此廣泛應(yīng)用于測量系統(tǒng)中
其引腳分布如下:

圖2-6
2.4.2時鐘芯片原理
A、引腳功能及連接
DS1302的引腳排列,其中Vcc1為后備電源,VCC2為主電源。在主電源關(guān)閉的情況下,也能保持時鐘的連續(xù)運行。DS1302由Vcc1或Vcc2兩者中的較大者供電。當Vcc2大于Vcc1+0.2V時,Vcc2給DS1302供電。當Vcc2小于Vcc1時,DS1302由Vcc1供電。X1和X2是振蕩源,外接32.768kHz晶振。CE是復位/片選線,通過把CE輸入驅(qū)動置高電平來啟動所有的數(shù)據(jù)傳送。CE輸入有兩種功能:首先,CE接通控制邏輯,允許地址/命令序列送入移位寄存器;其次,CE提供終止單字節(jié)或多字節(jié)數(shù)據(jù)的傳送手段。當CE為高電平時,所有的數(shù)據(jù)傳送被初始化,允許對DS1302進行操作。如果在傳送過程中CE置為低電平,則會終止此次數(shù)據(jù)傳送,I/O引腳變?yōu)楦咦钁B(tài)。上電運行時,在Vcc>2.0V之前,CE必須保持低電平。只有在SCLK為低電平時,才能將CE置為高電平。I/O為串行數(shù)據(jù)輸入輸出端(雙向)。SCLK為時鐘輸入端。
    B、DS1302的控制字節(jié)
DS1302 的控.制字如圖2-8所示?刂谱止(jié)的.最高有效位(位.7)必須.是邏.輯1,如果它為0,則不能把數(shù).據(jù)寫入DS1302中,位6如果為0,.則表示.存取日歷時鐘數(shù)據(jù),為1.表示.存取RAM數(shù)據(jù);位5至.位1指示操作單元的地址;最低.有效位(位0)如為0表示要進行寫操作,為1表示進行讀操作,控制.字節(jié)總是從最.低位.開.始輸.出。

圖2-7
C、數(shù)據(jù)輸入輸出(I/O)
在控.制指令字輸.入后.的下一個SCLK時鐘的上.升沿時,數(shù)據(jù).被寫入.DS1302,數(shù)據(jù)輸入從低位即位0開始。同樣,在緊跟.8位的控.制指令字后的下一個SCLK脈沖.的下.降沿讀出.DS1302的數(shù)據(jù),讀出.數(shù)據(jù)時.從低位0位到高位7。
D、DS1302的.寄存.器
 DS1302有12. 個寄存器,其中有.7個寄存器與.日歷、時鐘相關(guān),.存放的數(shù).據(jù)位.為BCD碼形式。 此外,DS13.02 還有年.份寄存器、控制寄存器、充電寄.存器、時鐘突發(fā)寄存器及與RAM相關(guān)的寄存器等。時鐘突發(fā)寄存器可一次性順序讀.寫.除.充電寄存器外的所.有寄存器.內(nèi)容。 DS1302與RAM相關(guān)的寄存.器.分為兩類:一類是單個RAM單元,共31個,每個單元組態(tài)為一個8位的字.節(jié),其命令控制字為C0H~FDH,其中奇數(shù)為讀操作,偶數(shù)為..寫操作;另一.類為突發(fā)方式.下的RAM寄存器,此方式.下可一次.性讀寫所有.的RAM的31個字節(jié),命令控制.字為FEH(寫)、FFH(讀)。
2.5供電系統(tǒng)的選擇

圖2-8

太陽能電池板:作為整個供電系統(tǒng)中的核心部分,太陽能電池板的主要作用就是將光能轉(zhuǎn)換為電能,并把這些轉(zhuǎn)換來的電能分流,一部分用于系統(tǒng)正常運作耗電,多出的部分送到蓄電池中儲存起來用于無光照時使用,因為生產(chǎn)工藝相對較為復雜所以太陽能電池板也是整個系統(tǒng)中價值最高的部分,并且太陽能電池板的質(zhì)量和成本直接決定了整個電子時鐘系統(tǒng)的質(zhì)量與成本。
    太陽能控制器:該部分的具體作用就是控制整個太陽能電池板各個區(qū)域的工作狀態(tài),而且還能起到對蓄電池的保護作用,具體實現(xiàn)在充電保護和過放電保護兩個階段。一般情況下,在某部分溫度過高時,溫度控制器還能提供溫度補償功能。但這種控制器工藝要求更高造價也更為昂貴。
   
2.5.1太陽能板蓄電池的概括
太陽能板方陣在光照下開始工作,當光照越強輸出功率也就越大,當晚上或者陰雨天等光照不足的情況下,由白天或光照充足時蓄電池所儲存的電能進行放電維持系統(tǒng)整體的用電消耗,所以太陽能光伏發(fā)電系統(tǒng)對儲能設(shè)備的要求比較高,其作用體現(xiàn)為儲能并且為太陽能光伏發(fā)電工作陣和工作點起到一定的穩(wěn)定作用。
      蓄電池的選型:首先我們要統(tǒng)計我們每天所需要的電量總值,一般情況下我們的設(shè)備平均沒天耗電28mA左右,則1天的功耗為5V*0. 028A*24h=3. 36wh,由于大部分設(shè)備的耗.電.值會受到環(huán)境溫度以及自身溫度的影響,所以需要計算出每天各個時段的平局損耗。從而作為我們選擇蓄電池的標準.,假定我們采用12V.蓄電池,考慮到在沒有太陽的陰雨天可使充滿電的電池連續(xù)工作三個月,則需電池容量為3.36wh*90/12V/50%=50.4Ah.

2.5.2太陽能電池板的概括及選型

    由單體太陽能電池封裝成.滿足一定電壓和功率的小組合,根據(jù)需要由小組合構(gòu)成太陽能光伏發(fā)電系統(tǒng)方陣。太陽能電池可以串聯(lián),為得到需要的方陣電壓:可將太陽能電池組串聯(lián)起來,串聯(lián)后的電流取決于電流最小組件,串聯(lián)后輸出電壓是單體電壓之和,即U總=U1+2+3....為獲得較大的輸出電流,可把太陽能電池組件并聯(lián),并聯(lián)后的電流是電池組件電流之和,即總電流=11+I2+... +In
太陽能電池方陣.由單體太陽能電池封.裝成.滿足一定電壓和功率.的小組合,根據(jù).需.要可由小.組合構(gòu)成太陽.能電池光伏發(fā)電系統(tǒng)方陣,太陽能.電池方陣工作電壓-般為負載工作電壓的1.4倍。
計算太.陽.能.電.池.板的功率:按每天有效日照6小時計算,使電池.充電3天后可保證設(shè)備.60天的.用電量,再考慮到充電效率.和充電過程..中的損耗,太陽能板的輸出功耗為3.6WH*60/3/6h/70%=25. 7w.其中70%是充電過程.中太陽能.電池板的實際.使用功率。另.外各地.區(qū)的日照.時間不同,可適當.進行修改。
按照兩種容量方案計算,完成了太陽電源的設(shè)計:
1、測量的主要參數(shù):
電子萬年歷系統(tǒng)輸入電壓5V,輸出電流50mA,當?shù)厝照諘r數(shù)7~8個小時
2、蓄電池容量經(jīng)計算得出為45AH
3、太陽能電池容量陣列輸出功率為25.7W綜合以上結(jié)果,太陽能電源設(shè)計為:
蓄電池:采用含.鉛酸蓄電池,容量4.5AH,采用一個.容量為60.AH的蓄電池.,太陽.能陣列,輸.出功率.為25. 7W,采用標.準模塊.輸出容.量為25~38W, - 塊正好。
2.5.3太陽能電源安裝使用中注意的問題
1、陣列板選擇安裝.放置在無遮擋太陽.光和.避風處。
2、太陽能電池列陣板配套的蓄電池在第一次使用時,要先充電到額定容量,不可過充或過放。
3.注.意定.期維護.工作。此電源系.統(tǒng)經(jīng)濟可靠,安裝.方便,利于維護,在實踐中取得了滿意的效果。
2.5.4太陽能電源存在的問題
目前,太陽能電池產(chǎn)業(yè)發(fā)展的瓶頸主要有2方面問題:
第一.是價.格.問題。首先要研.制能穩(wěn)定獲得高.效率且低成本的半導體材.料:其次是能用低.成本.工藝路線生產(chǎn)這種光伏電池。從成.本上講,太陽.能電.池仍然.是目前.常規(guī).能源中成本最高的,當前.的.成.本對比如下表:


表2-2
    另一個是效率問題。在光電轉(zhuǎn)換過程中,由于一部分光譜能量過小小于半導體的能量間隙,這部分光譜對太陽能板生成電流沒有貢獻所以并不是所有入射光都可以被太陽能板所吸收,并且轉(zhuǎn)化為電流。這部分能量就會以熱能的形式釋放出去,所以并不是多有的入射光譜都能被電池吸收,并完全轉(zhuǎn)化成電流。一般情況下,單一.電池.的.最高效.率約在.23%左右,但是因為制.造工藝過程復雜,產(chǎn)量太.低,造成價.格偏高,如果用于電.子時鐘不符合經(jīng)濟效益,這也是目.前光伏電池發(fā)展的最大.瓶頸。

第三章 系統(tǒng)軟件設(shè)計
主程序的主要功能為操縱各個子程序從而實現(xiàn)軟件的功能。主程序流程圖如圖3-1所示。
3.1初始化子程序:

圖3-1
3.1初始化子程序:

圖3-2 DS1302初始化子程序

圖3-2 LCM12864初始化流程圖

圖3-3


第四章 系統(tǒng)整體使用與調(diào)試
4.1硬件調(diào)試

本系統(tǒng)是一個基于AT89C51單片機的.時間顯.示系統(tǒng),能顯示.公.歷年、月、日、時、分、秒以及.溫度、星期、節(jié)日等信息。系統(tǒng)所用時鐘芯片.DS1302具有高性能.、低功.耗的特點.,使本系統(tǒng)編.程方便,同.時.功.能也強。采用AT89C51.單片機的電子時鐘系統(tǒng).可以很好的改善.傳統(tǒng)采用模擬電路引起的計時不準確,不可靠,一致性差等問題。此系統(tǒng)計時精確,價格低廉,可以廣泛應(yīng)用在生活中,學習和工作任何領(lǐng)域,并且起到重要作用。
    電子時鐘.電路.系統(tǒng).較大,對于搭接電路就更能.不可輕視,龐大的.電路系統(tǒng)中只要出于.一處的錯.誤,則會.對檢測造.成很大的.不便,而且電路的交.線較多,對于.各種鋒.利.的引腳.要注意處理,否則.會刺破.帶有包皮的導線,則會對.電.路造成.短路現(xiàn)象。
在本電子時鐘的設(shè)計調(diào)試中遇到很多問題。但回想這些問題,只要認真思考都是可以避免的,一下為遇到的主要問題:
(1)在繪制PCB圖時,焊盤的孔徑不一致,導致最后在雕刻時,反復打孔,浪費時間。
解決辦法是:在把畫好的pcb導入到聲稱雕刻碼的軟件時,在焊盤選項可以很容易看到不一-致的焊盤的孔徑,然后改正。
(2)在調(diào)試蜂鳴器時,發(fā)現(xiàn)蜂鳴器不響。
解決辦法是:首先檢查三極管是否壞掉,其次檢查程序中是否出現(xiàn)錯誤。如果是三極管壞了,那么就是在焊接三極管是,焊烙鐵長時間接近三極管,導致三極管壞掉,如果是程序問題,那么就直接修改程序中的bug.
(3)在焊接元器件時,焊反了導致通電燒片子。
解決辦法是:在焊接前應(yīng)該看清楚元件的正反,然后插到板子上,這樣焊上去一般不會出現(xiàn)問題的。;

4.2軟件測試

電子時鐘是多功能的數(shù)字型系統(tǒng),可以看當前的日期、時間。由于功能多,所以它的程序設(shè)計也較為復雜,在編寫程序和調(diào)試時出現(xiàn)了相對較多的問題。最后經(jīng)過多次的模塊子程序的修改,一步步的完成,最終完成了軟件設(shè)計。在軟件的調(diào)試過程中主要遇到的問題如下:

(1)調(diào)試程序出現(xiàn)bug時,很難找到bug所在。
解決辦法:從main程序開始,一句一句檢查,并且揣摩其邏輯是否正確,如果不正確立即修改,然后在調(diào)試,直到程序中的bug為零。
(2)程序所實現(xiàn)的功能與自己預期的情況相差很遠
解決辦法:找到此功能所對應(yīng)的程序代碼,認真分析其中的邏輯看是否與自己的預期設(shè)想一致,如果不一致就修改直到修改正確為止。
(3)多個功能- -起實現(xiàn)時,出現(xiàn)不兼容情況。
    解決辦法:首先找到多個功能所實現(xiàn)的共同特點,然后再找到不同點,在把他們不同條件相互交換,這樣當一個功能實現(xiàn)時,另個-功能就不會出現(xiàn)干擾情況。

結(jié)論
     時鐘.歷史.悠久,種類繁多,隨著科學.技術(shù)的發(fā)展和進步,其技.術(shù)性能也在逐步提高。本課題的.題目是設(shè)計太陽能電子時鐘系統(tǒng),該電子時鐘.主要采用AT89C54單片機作為控制核心,有DS1302時鐘.芯片提供時鐘、12864 液晶顯示屏顯示,提高系統(tǒng)穩(wěn)定性,采用數(shù)字. .溫度傳感器DS18B20芯片.控制溫度顯示,獨.立式鍵盤按鍵切換功能。同時本設(shè)計.實用太陽能電源進行供電,普及了潔凈、環(huán)保、可持續(xù)性發(fā)展的思想,把太陽能.帶入人們?nèi)粘I畹募毼⑻,將環(huán)保與節(jié)能并舉?偨Y(jié)如下:由于時間.緊迫,工作量大,設(shè)計仍有不足之處,有.待改進,提出以下幾點.需要.改進的地方:
1、雖然太. .陽能作為一種巨大、清潔、普遍的.可再生能源,將有望成為未來的可靠能源,但應(yīng)用還為普及,成本也較高,努力降低.太陽能供電成本是當前一-大難題。
2、程序設(shè)計邏輯性強,期間運行優(yōu)良,但為了使系統(tǒng)更完善,應(yīng)對系統(tǒng)進行更深的軟件抗干擾設(shè)計。
隨著人民.生活水平.的日益提高,人民不僅僅滿足精確.時間的顯示,更加注意其外觀、新潮的外觀能更加吸.引消費者的注意,所以我們.設(shè)計了精美,新穎切實用,更具人性化的外觀。電子時鐘添.加了更多功能,例如溫度顯示,節(jié)日顯示,秒表等,更多的功能可以讓用戶使用更加方便。隨著.經(jīng)濟水平的不斷發(fā)展、科技的不斷進步及人們.對生活環(huán)境的逐漸重視,太陽能.類的清潔能源產(chǎn)品.將越來越.得到青瞇,這類產(chǎn)品將具更見廣闊的前景。

參考文獻
[1]羅運俊.太陽能利用技術(shù)【D】,化學工業(yè)出版社.2011.
[2]錢伯章.太陽能技術(shù)與應(yīng)用【J】,科學出版社.2010.
[3]張毅剛,單片機原理及應(yīng)用【D】,高等教育出版社.2014.
[4].皮大熊.單片機課程設(shè)計指導書【D】,北京理工大學出版社.2010.
[5].樓然苗.51系列單片機設(shè)計實例【D】.北京航空航天出版社】.2004.
[6].凌玉華,單片機原理及應(yīng)用系統(tǒng)設(shè)計【D】,中南大學出版社.2006.
[7].胡漢才,單片機原理及應(yīng)用【D】,清華大學出版社.2004.
[8].徐江海.單片機實用教程【D】.機械工業(yè)出版社2007.

致謝
在畢業(yè)設(shè)計論文即將完成之際,我想對所有曾經(jīng)給過我們幫助和支持的人表示衷心的感謝。
首先,感謝我們的父母,是他們給了我們無私的愛,我深知他們?yōu)榱宋覀兦髮W和生活所付出的巨大的犧牲和努力,至今我一直無以回報,在此,僅表達我們對他們的深深思念和感恩。
感謝我們的指導老師陸程。她在畢業(yè)設(shè)計上給了我們大量的指導,讓我們學會了很多知識,掌握了單片機的使用,c語言的應(yīng)用以及太陽能供電的基本原理,也獲得了實踐鍛煉的機會。她對我們的嚴格要求將使我們終身受益。另外,還要感謝學校為我們提供的良好的實習環(huán)境及生活環(huán)境,讓我們在這個陌生的環(huán)境里感受到溫暖。感謝大學三年里的老師們,他們?nèi)陙韺ξ覀兊慕逃屛覀兌昧巳绾巫鍪,更讓我們明白了如何做人。感謝一起的同學們,他們是我們學習、工作、生活上的伙伴,也是面對困難與挫折是的并肩戰(zhàn)友。還有許許多多給了我們指導和幫助的朋友,在此一并表示衷心的感謝,你們的幫助,我會一直銘記在心!最后,衷心感謝在場的各位審閱論文的老師,謝謝你們在百忙之中抽出時間來簡評本次答辯。

附錄
//-------------------------------------
// 名稱:用DS1302與12864LCD設(shè)計的可調(diào)電子日歷與時鐘
//---------------------------------------
// 說明:本例運行時會以PC時間表為默認時間開始,運行過程中可以通過K1鍵
//       選擇調(diào)節(jié)對象,所選中的調(diào)整對象會反白顯示,用K2,K3鍵進行加減,用K4鍵保存。
//       本例會自動將時間調(diào)節(jié)控制為合法日期時間,對于星期的調(diào)節(jié)會
//        在調(diào)整年月日時自動完成,閏年問題也會自動判斷。
//-------------------------------------------
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define LCD_DB_PORT P0         // 液晶數(shù)據(jù)線端口DB0-DB7
#define LCD_START_ROW 0xc0     //起始行命令
#define LCD_PAGE 0xB8         //頁指令
#define LCD_COL  0x40         //列指令
bit Reverse_Display=0;//是否反相顯示(白底黑字/黑底白字)
//液晶引腳定義
sbit SDA=P1^0;      //DS1302數(shù)據(jù)線
sbit CLK=P1^1;      //DS1302時鐘線
sbit RST=P1^2;      //DS1302復位線
sbit DI=P2^0;
sbit RW=P2^1;
sbit E=P2^2;
sbit CS1=P2^3;
sbit CS2=P2^4;
sbit CS3=P2^2;

char Adjust_Index=-1;  //當前調(diào)節(jié)的時間對象:秒,分,時,日,月,年(0,1,2,3,4,6)
uchar MonthsDays[]={0,31,0,31,30,31,30,31,31,30,31,30,31};   // 一年中每個月的天數(shù),二月的天數(shù)由年份決定
uchar DateTime[7];//所讀取的日期時間
//DS1302函數(shù)聲明
void Write_Byte_TO_DS1302(uchar X); // 向DS1302寫入一個字節(jié)
uchar Read_Byte_FROM_DS1302();        //從DS1302中讀取一個字節(jié)
uchar Read_Data_FROM_DS1302(uchar addr);  //從DS1302指定位置讀取數(shù)據(jù)    , 讀數(shù)據(jù)
void Write_Data_TO_DS1302(uchar addr,uchar dat);  // 向DS1302指定位置寫入數(shù)據(jù), 寫數(shù)據(jù)
void SET_DS1302();      //設(shè)置時間
void GetTime();          //讀取當前時間
uchar Is_Leapyear(uint year); //判斷是否為閏年
//12864LCD函數(shù)
void dht11();
extern void LCD12864_Initialization();
extern void Display_char(uchar P1,uchar L1,uchar *M) reentrant;
extern void Display_Word(uchar P2,uchar L2,uchar *M) reentrant;
extern void Datetime_Adjust(char X);
extern void SET_DS1302();      //  設(shè)置時間
//函數(shù)聲明
void Initialization();//初始化函數(shù)
extern bit Reverse_Display;//是否反相顯示(白底黑字/黑底白字)
extern uchar code Digits[];
extern uchar code WEEK_WORDS[];
extern uchar code Digits[];
extern uchar code DATE_TIME_WORDS[];
extern char Adjust_Index;  //當前調(diào)節(jié)的時間對象:秒,分,時,日,月,年(0,1,2,3,4,6)
extern uchar MonthsDays[];   // 一年中每個月的天數(shù),二月的天數(shù)由年份決定
extern uchar DateTime[7];//所讀取的日期時間
sbit k1=P3^4;       //選擇按鍵
sbit k2=P3^5;       //加
sbit k3=P3^6;       //減
sbit k4=P3^7;       //確定
uchar tcount=0;   
//水平與垂直偏移   
uchar H_Offset=0;   
uchar V_page_Offset=0;

//---------------------------------------------------------------
//    檢查LCD是否忙
//--------------------------------------------------------------
bit LCD_IS_BUSY()
{
      LCD_DB_PORT=0xFF;
    RW=1;
    _nop_();
    DI=0;
    E=1;
    _nop_();
    E=0;
    return (bit)(P0&0x80);
}
//---------------------------------------------------------------
//    向LCD寫入一個字節(jié)(一般用于發(fā)送命令)
//--------------------------------------------------------------
void Write_Byte_To_LCD(uchar comand)
{
   while(LCD_IS_BUSY());  
   LCD_DB_PORT=0xFF;
   RW=0;
   _nop_();
   DI=0;
   LCD_DB_PORT=comand;
   E=1;
   _nop_();
   E=0;
}
//---------------------------------------------------------------
//    向LCD寫入數(shù)據(jù)
//--------------------------------------------------------------
void Write_Data_To_LCD(uchar dat)
{
   while(LCD_IS_BUSY());  
   LCD_DB_PORT=0xFF;
   RW=0;
   _nop_();
   DI=1;
   if(!Reverse_Display)       //根據(jù)Reverse_Display決定是否反相顯示
       LCD_DB_PORT=dat;
   else
      LCD_DB_PORT=~dat;
   E=1;
   _nop_();
   E=0;
}

//********************************************************************
//1MS為單位的延時程序,不準確
//********************************************************************
void lcd_delay_ms(unsigned char m)
{
    unsigned char n;
    while(m--){
        for(n=0;n<125;n++)
            {;}
        }   
}

//---------------------------------------------------------------
//    初始化LCD
//--------------------------------------------------------------
void LCD12864_Initialization()
{
  CS1=1;
  CS2=1;
  Write_Byte_To_LCD(0x38);
    lcd_delay_ms(10);
  Write_Byte_To_LCD(0x0F);
    lcd_delay_ms(10);
  Write_Byte_To_LCD(0x06);
    lcd_delay_ms(10);
//  Write_Byte_To_LCD(LCD_START_ROW);
  Write_Byte_To_LCD(0x01);
    lcd_delay_ms(10);
}
//---------------------------------------------------------------
//    通用顯示函數(shù)  從第P頁第L列顯示W(wǎng)個字節(jié)數(shù)據(jù),具體顯示的數(shù)據(jù)在r所指的數(shù)組中
//--------------------------------------------------------------
void LCD_Show(uchar P,uchar L,uchar W,uchar *r) reentrant
{
    uchar i;
    if(L<64)
          {
            CS1=1;
            CS2=0;
            Write_Byte_To_LCD(LCD_PAGE+P);
            Write_Byte_To_LCD(LCD_COL+L);
            if(L+W<64)
              {
                for(i=0;i<W;i++)
                   Write_Data_To_LCD(r);
              }
            else
              {
                for(i=0;i<64-L;i++)
                      Write_Data_To_LCD(r);
                CS1=0;
                CS2=1;
                Write_Byte_To_LCD(LCD_PAGE+P);
                Write_Byte_To_LCD(LCD_COL);
                for(i=64-L;i<W;i++)
                      Write_Data_To_LCD(r);
              }
           }
    else
      {
            CS1=0;
            CS2=1;
            Write_Byte_To_LCD(LCD_PAGE+P);
            Write_Byte_To_LCD(LCD_COL+L-64);
            for(i=0;i<W;i++)
                  Write_Data_To_LCD(r);
      }
}
//---------------------------------------------------------------
// 顯示一個8×16點陣字符
//--------------------------------------------------------------
void Display_char(uchar P1,uchar L1,uchar *M) reentrant
{
   LCD_Show(P1,L1,8,M);
   LCD_Show(P1+1,L1,8,M+8);
}
//--------------------------------------------------------------------
// 顯示一個16×16點陣字符 (漢字上半部分與下半部分分別處在相鄰兩頁中)
//----------------------------------------------------------------------
void Display_Word(uchar P2,uchar L2,uchar *M) reentrant
{                                             
   LCD_Show(P2,L2,16,M);
   LCD_Show(P2+1,L2,16,M+16);
}
//--------------------------------------------------------------------
// 顯示一個16×32點陣字符 (漢字上半部分與下半部分分別處在相鄰兩頁中)
//----------------------------------------------------------------------
void Display_Word2(uchar P2,uchar L2,uchar *M) reentrant
{                                             
   LCD_Show(P2,L2,16,M);
   LCD_Show(P2+1,L2,16,M+16);
    LCD_Show(P2+2,L2,16,M+32);
    LCD_Show(P2+3,L2,16,M+48);
}


//*************************************************************************
//***********************DHT11*************************
//**************************************************************************

//sbit DATA = P1^3;        //定義數(shù)據(jù)引腳
//bit flag_1s,flag_200ms,tmp;

//----------------定義區(qū)--------------------//
uchar s1,s2,w1,w2;

sbit TRH = P1^3;//data數(shù)據(jù)端
unsigned char i;

typedef unsigned char unint8;
typedef unsigned char unint16;

unint8 TH_data,TL_data,RH_data,RL_data,CK_data;
unint8 TH_temp,TL_temp,RH_temp,RL_temp,CK_temp;
unint8 com_data,untemp,temp;
unint8 respond;

/*********************************************************************************/
void delayNOP()
{
         _nop_();
         _nop_();
         _nop_();
         _nop_();
}
/*********************************************************************************/


/*********************************************************************************/
// 毫秒級延時子程序
/*********************************************************************************/
void delay_ms(unsigned char ms)
{      
         unsigned char i;
         while(ms--)
         {
                  for(i = 0; i<250; i++)
                  {
                           _nop_();
                           _nop_();
                           _nop_();
                           _nop_();
                  }
         }
}
/*********************************************************************************/


/*********************************************************************************/
//5us級延時程序
/*********************************************************************************/
void delay_us()
{
         unint8 i;
         i--;
         i--;
         i--;
         i--;
         i--;
         i--;
}

/****************************************************************************/


/****************************************************************************/
//收發(fā)信號檢測,數(shù)據(jù)讀取
/****************************************************************************/
char receive()
{   
         unint8 i;
//         ST=0;
         com_data=0;
         for(i=0;i<=7;i++)   
         {
                  respond=2;
                  while((!TRH)&&respond++);
                  delay_us();
                  delay_us();
                  delay_us();
                  if(TRH)
                  {
                           temp=1;
                           respond=2;
                           while((TRH)&&respond++);
                  }
                  else
                           temp=0;
                  com_data<<=1;
                  com_data|=temp;   
         }
         return(com_data);  
}
/****************************************************************************/

//*--------寫字節(jié)函數(shù),向DS1302寫入一個字節(jié)--------*//
void Write_Byte_TO_DS1302(uchar X)    // 向DS1302寫入一個字節(jié)
  {
     uchar i;
     for(i=0;i<8;i++)
       {
         SDA=X&1;
         CLK=1;
         CLK=0;
         X>>=1;
       }
  }
//*--------讀字節(jié)函數(shù),從DS1302讀取一個字節(jié)--------*//
uchar Read_Byte_FROM_DS1302()        //從DS1302中讀取一個字節(jié)
{
   uchar i,byte,t;
   for(i=0;i<8;i++)
     {
      byte>>=1;
      t=SDA;
      byte|=t<<7;
      CLK=1;
      CLK=0;
     }
     //BCD碼轉(zhuǎn)換
     return byte/16*10+byte%16;
}
//-------------------------------------------------------------
//從DS1302指定位置讀取數(shù)據(jù)    , 讀數(shù)據(jù)
//---------------------------------------------------------------
uchar Read_Data_FROM_DS1302(uchar addr)  //從DS1302指定位置讀取數(shù)據(jù)    , 讀數(shù)據(jù)
   {
     uchar dat;
     RST=0;
     CLK=0;
     RST=1;
     Write_Byte_TO_DS1302(addr);  //向DS1302寫入一個地址
     dat=Read_Byte_FROM_DS1302(); //在上面寫入的地址中讀取數(shù)據(jù)
     CLK=1;
     RST=0;
     return dat;
   }
//-------------------------------------------------------------
//向DS1302指定位置寫入數(shù)據(jù), 寫數(shù)據(jù)
//---------------------------------------------------------------
void Write_Data_TO_DS1302(uchar addr,uchar dat)  // 向DS1302指定位置寫入數(shù)據(jù), 寫數(shù)據(jù)
  {
      CLK=0;
       RST=1;
       Write_Byte_TO_DS1302(addr);
       Write_Byte_TO_DS1302(dat);
       CLK=1;
       RST=0;
  }
//-----------------------------------------------------------
// 設(shè)置時間
//---------------------------------------------------------
void SET_DS1302()      //  設(shè)置時間
{
   uchar i;
   Write_Data_TO_DS1302(0x8E,0x00); //寫控制字,取消寫保護
   // 分,時,日,月,年依次寫入
   for(i=0;i<7;i++)
     {
      // 分的起始地址是10000010(0x82),后面依次是時,日,月,周,年,寫入地址每次遞增2
           Write_Data_TO_DS1302(0x80+2*i,(DateTime/10<<4)|(DateTime%10));
     }
   Write_Data_TO_DS1302(0x8E,0x80); //寫控制字,加寫保護
}
//--------------------------------------------------------
// 讀取當前時間
//-------------------------------------------------------
void GetTime()          //  讀取當前時間
{
  uchar i;
  for(i=0;i<7;i++)
    {
      DateTime=Read_Data_FROM_DS1302(0x81+2*i);
    }
}
//-------------------------------------------------------------------
// 判斷是否為閏年
//-------------------------------------------------------------------
uchar Is_Leapyear(uint year)
{
  return (year%4==0&&year%100!=0)||(year%400==0) ;
}
//------------------------------------------------------------------
//     求自2000.1.1開始的任何一天是星期幾?
//----------------------------------------------------------------------
void Refresh_Week_Day()
{
  uint i,d,w=5;  //已知1999年12.31是星期五
  for(i=2000;i<2000+DateTime[6];i++)
     {
        d=Is_Leapyear(i)?366:365;
        w=(w+d)%7;
     }
  d=0;
  for (i=1;i<DateTime[4];i++)
       {d+=MonthsDays;}
  d+=DateTime[3];
   //保存星期,0-6表示星期日,星期一至星期六,為了與DS1302的星期格式匹配,返回值需要加1
   DateTime[5]=(w+d)%7+1;
}
//-------------------------------------------------
//年,月,日和時,分++/--
//----------------------------------------------------
void Datetime_Adjust(char X)
{
  switch(Adjust_Index)
    {
       case 6:     //年調(diào)整,00-99
              if(X==1&&DateTime[6]<99)
                 {
                   DateTime[6]++;
                 }
              if(X==-1&&DateTime[6]>0)
                 {
                   DateTime[6]--;
                 }
              //獲取2月天數(shù)
              MonthsDays[2]=Is_Leapyear(2000+DateTime[6])?29:28;
              //如果年份變化后當前月份的天數(shù)大于上限則設(shè)為上限
              if(DateTime[3]>MonthsDays[DateTime[4]])
                  {
                    DateTime[3]=MonthsDays[DateTime[4]];
                   }
               Refresh_Week_Day();  //刷新星期
              break;
       case 4:  //月調(diào)整 01-12
              if(X==1&&DateTime[4]<12)
                 {
                   DateTime[4]++;
                 }
              if(X==-1&&DateTime[4]>1)
                 {
                   DateTime[4]--;
                 }
                  //獲取2月天數(shù)
              MonthsDays[2]=Is_Leapyear(2000+DateTime[6])?29:28;
              //如果年份變化后當前月份的天數(shù)大于上限則設(shè)為上限
              if(DateTime[3]>MonthsDays[DateTime[4]])
                  {
                    DateTime[3]=MonthsDays[DateTime[4]];
                   }
               Refresh_Week_Day();  //刷新星期
              break;
       case 3:     //     日調(diào)整00-28或00-29或00-30或00-31
                 //調(diào)節(jié)之前首先根據(jù)當前年份得出該年中2月的天數(shù)
              MonthsDays[2]=Is_Leapyear(2000+DateTime[6])?29:28;
              //根據(jù)當前月份決定調(diào)節(jié)日期的上限
              if(X==1&&DateTime[3]<MonthsDays[DateTime[4]])
                 {
                   DateTime[3]++;
                 }
              if(X==-1&&DateTime[3]>0)
                 {
                   DateTime[3]--;
                 }
              Refresh_Week_Day();  //刷新星期
              break;
       case 2:      //  時調(diào)整
              if(X==1&&DateTime[2]<23)
                 {
                   DateTime[2]++;
                 }
              if(X==-1&&DateTime[4]>0)
                 {
                   DateTime[2]--;
                 }
              break;
       case 1:      //  分調(diào)整
              if(X==1&&DateTime[1]<59)
                 {
                   DateTime[1]++;
                 }
              if(X==-1&&DateTime[4]>0)
                 {
                   DateTime[1]--;
                 }
              break;
        case 0:      // 秒調(diào)整
              if(X==1&&DateTime[1]<59)
                 {
                   DateTime[0]++;
                 }
              if(X==-1&&DateTime[4]>0)
                 {
                   DateTime[0]--;
                 }
              break;
    }
}

//-------------------------------------------------
// 與本程序有關(guān)的數(shù)字和漢字的點陣編碼 DotMatrix.c
// -----------------------------------------------
//中文提示(縱向取模,字節(jié)倒序)
//年、月、日、星期、時、分、秒等漢字點陣(16×16)
uchar code DATE_TIME_WORDS[]={   
    0x40,0x20,0x10,0x0C,0xE3,0x22,0x22,0x22,0xFE,0x22,0x22,0x22,0x22,0x02,0x00,0x00, //年
    0x04,0x04,0x04,0x04,0x07,0x04,0x04,0x04,0xFF,0x04,0x04,0x04,0x04,0x04,0x04,0x00,
    0x00,0x00,0x00,0x00,0x00,0xFF,0x11,0x11,0x11,0x11,0x11,0xFF,0x00,0x00,0x00,0x00,//月
    0x00,0x40,0x20,0x10,0x0C,0x03,0x01,0x01,0x01,0x21,0x41,0x3F,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0xFE,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0xFE,0x00,0x00,0x00,0x00,//日
    0x00,0x00,0x00,0x3F,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x3F,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0xBE,0x2A,0x2A,0x2A,0xEA,0x2A,0x2A,0x2A,0x2A,0x3E,0x00,0x00,0x00,//星
    0x00,0x48,0x46,0x41,0x49,0x49,0x49,0x7F,0x49,0x49,0x49,0x49,0x49,0x41,0x40,0x00,
    0x00,0x04,0xFF,0x54,0x54,0x54,0xFF,0x04,0x00,0xFE,0x22,0x22,0x22,0xFE,0x00,0x00,//期
    0x42,0x22,0x1B,0x02,0x02,0x0A,0x33,0x62,0x18,0x07,0x02,0x22,0x42,0x3F,0x00,0x00,
    0x00,0xFC,0x44,0x44,0x44,0xFC,0x10,0x90,0x10,0x10,0x10,0xFF,0x10,0x10,0x10,0x00,//時
    0x00,0x07,0x04,0x04,0x04,0x07,0x00,0x00,0x03,0x40,0x80,0x7F,0x00,0x00,0x00,0x00,
    0x80,0x40,0x20,0x98,0x87,0x82,0x80,0x80,0x83,0x84,0x98,0x30,0x60,0xC0,0x40,0x00,//分
    0x00,0x80,0x40,0x20,0x10,0x0F,0x00,0x00,0x20,0x40,0x3F,0x00,0x00,0x00,0x00,0x00,
    0x12,0x12,0xD2,0xFE,0x91,0x11,0xC0,0x38,0x10,0x00,0xFF,0x00,0x08,0x10,0x60,0x00,//秒
    0x04,0x03,0x00,0xFF,0x00,0x83,0x80,0x40,0x40,0x20,0x23,0x10,0x08,0x04,0x03,0x00
};

//一、二、三、四、五、六和天等漢字點陣(16×16)
uchar code WEEK_WORDS[]={
0x00,0x40,0x42,0x42,0x42,0x42,0x42,0xFE,0x42,0x42,0x42,0x42,0x42,0x42,0x40,0x00,//天
0x00,0x80,0x40,0x20,0x10,0x08,0x06,0x01,0x02,0x04,0x08,0x10,0x30,0x60,0x20,0x00,
0x00,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0x00,//一
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x06,0x04,0x00,0x00,0x00,//二
0x00,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x18,0x10,0x00,
0x00,0x04,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x04,0x00,0x00,//三
0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00,
0x00,0xFE,0x02,0x02,0x02,0xFE,0x02,0x02,0xFE,0x02,0x02,0x02,0x02,0xFE,0x00,0x00,//四
0x00,0x7F,0x28,0x24,0x23,0x20,0x20,0x20,0x21,0x22,0x22,0x22,0x22,0x7F,0x00,0x00,
0x00,0x02,0x82,0x82,0x82,0x82,0xFE,0x82,0x82,0x82,0xC2,0x82,0x02,0x00,0x00,0x00,//五
0x20,0x20,0x20,0x20,0x20,0x3F,0x20,0x20,0x20,0x20,0x3F,0x20,0x20,0x30,0x20,0x00,
0x10,0x10,0x10,0x10,0x10,0x91,0x12,0x1E,0x94,0x10,0x10,0x10,0x10,0x10,0x10,0x00,//六
0x00,0x40,0x20,0x10,0x0C,0x03,0x01,0x00,0x00,0x01,0x02,0x0C,0x78,0x30,0x00,0x00,
0x06,0x09,0x09,0xE6,0xF8,0x0C,0x04,0x02,0x02,0x02,0x02,0x02,0x04,0x1E,0x00,0x00,
0x00,0x00,0x00,0x07,0x1F,0x30,0x20,0x40,0x40,0x40,0x40,0x40,0x20,0x10,0x00,0x00,/*"℃",0*/
};

//0-9等數(shù)字點陣(8×16)
uchar code Digits[]={  
    0x00,0x00,0xF0,0xF8,0x08,0x68,0xF8,0xF0,0x00,0x00,0x07,0x0F,0x0B,0x08,0x0F,0x07, //0
    0x00,0x20,0x20,0x30,0xF8,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x0F,0x00,0x00,  //1
    0x00,0x30,0x38,0x08,0x88,0xF8,0x70,0x00,0x00,0x0C,0x0E,0x0B,0x09,0x08,0x08,0x00, //    2
    0x00,0x30,0x38,0x88,0x88,0xF8,0x70,0x00,0x00,0x06,0x0E,0x08,0x08,0x0F,0x07,0x00, //3
    0x00,0x00,0xF8,0xF8,0x00,0xE0,0xE0,0x00,0x00,0x03,0x03,0x02,0x02,0x0F,0x0F,0x02,//4
    0x00,0xF8,0xF8,0x88,0x88,0x88,0x08,0x00,0x00,0x08,0x08,0x08,0x0C,0x07,0x03,0x00,//5
    0x00,0xC0,0xE0,0x78,0x58,0xC8,0x80,0x00,0x00,0x07,0x0F,0x08,0x08,0x0F,0x07,0x00,//6
    0x00,0x08,0x08,0x88,0xE8,0x78,0x18,0x00,0x00,0x00,0x0E,0x0F,0x01,0x00,0x00,0x00,//7
    0x00,0x70,0xF8,0xC8,0x88,0xF8,0x70,0x00,0x00,0x07,0x0F,0x08,0x09,0x0F,0x07,0x00,//8
    0x00,0xF0,0xF8,0x08,0x08,0xF8,0xF0,0x00,0x00,0x00,0x09,0x0D,0x0F,0x03,0x01,0x00,//9
    0xF0,0x08,0xF0,0x80,0x60,0x18,0x00,0x00,0x00,0x31,0x0C,0x03,0x1E,0x21,0x1E,0x00,/*"%",0*/
  0x08,0xF8,0x88,0x88,0x88,0x88,0x70,0x00,0x20,0x3F,0x20,0x00,0x03,0x0C,0x30,0x20,/*"R",1*/
  0x08,0xF8,0x08,0x00,0x00,0x08,0xF8,0x08,0x20,0x3F,0x21,0x01,0x01,0x21,0x3F,0x20,/*"H",2*/
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,0x00,0x00,/*".",0*/
};

uchar code fuhao[]=
{
    0x00,0x00,0x00,0x00,0x80,0xC0,0x40,0x40,0x40,0x80,0x00,0x00,0x00,0x00,0x00,0x00,
  0x00,0xF0,0xFE,0x0F,0x01,0x00,0x00,0x00,0x00,0x01,0x07,0xFE,0xF0,0x00,0x00,0x00,
  0x00,0x3F,0xFF,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xFF,0x3F,0x00,0x00,0x00,
  0x00,0x00,0x01,0x03,0x06,0x0C,0x08,0x08,0x08,0x06,0x03,0x01,0x00,0x00,0x00,0x00,/*"0",0*/
  0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  0x00,0x00,0x01,0x01,0x01,0x01,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  0x00,0x00,0x08,0x08,0x08,0x0C,0x0F,0x0F,0x0C,0x08,0x08,0x08,0x00,0x00,0x00,0x00,/*"1",1*/
  0x00,0x00,0x00,0x80,0x40,0x40,0x40,0x40,0x40,0xC0,0x80,0x80,0x00,0x00,0x00,0x00,
  0x00,0x1E,0x19,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC1,0xFF,0x3E,0x00,0x00,0x00,
  0x00,0x00,0x00,0x80,0x40,0x30,0x18,0x0C,0x06,0x03,0x01,0x00,0xC0,0x00,0x00,0x00,
  0x00,0x0E,0x0D,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0E,0x03,0x00,0x00,0x00,/*"2",2*/
  0x00,0x00,0x80,0x80,0x40,0x40,0x40,0x40,0xC0,0x80,0x00,0x00,0x00,0x00,0x00,0x00,
  0x00,0x0F,0x0F,0x00,0x00,0x00,0x00,0x00,0x80,0xC1,0x7F,0x3E,0x00,0x00,0x00,0x00,
  0x00,0xC0,0xC0,0x00,0x00,0x01,0x01,0x01,0x03,0x02,0x06,0xFC,0xF0,0x00,0x00,0x00,
  0x00,0x03,0x07,0x04,0x08,0x08,0x08,0x08,0x08,0x04,0x06,0x03,0x00,0x00,0x00,0x00,/*"3",3*/
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,
  0x00,0x00,0x00,0x80,0x60,0x10,0x0C,0x03,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,
  0x30,0x2C,0x26,0x21,0x20,0x20,0x20,0x20,0xFF,0xFF,0x20,0x20,0x20,0x00,0x00,0x00,
  0x00,0x00,0x00,0x00,0x00,0x08,0x08,0x08,0x0F,0x0F,0x08,0x08,0x08,0x00,0x00,0x00,/*"4",4*/
  0x00,0x00,0x00,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0x00,0x00,0x00,
  0x00,0x00,0xFF,0x00,0x80,0x40,0x40,0x40,0x40,0xC0,0x80,0x00,0x00,0x00,0x00,0x00,
  0x00,0xC0,0xC3,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xFF,0xFC,0x00,0x00,0x00,
  0x00,0x03,0x04,0x04,0x08,0x08,0x08,0x08,0x08,0x04,0x07,0x03,0x00,0x00,0x00,0x00,/*"5",5*/
  0x00,0x00,0x00,0x00,0x80,0x80,0x40,0x40,0x40,0x40,0x80,0x80,0x00,0x00,0x00,0x00,
  0x00,0xE0,0xFC,0x07,0x81,0xC0,0x40,0x40,0x40,0xC0,0x83,0x03,0x00,0x00,0x00,0x00,
  0x00,0x7F,0xFF,0x83,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xFF,0xFC,0x00,0x00,0x00,
  0x00,0x00,0x01,0x07,0x06,0x0C,0x08,0x08,0x08,0x0C,0x06,0x03,0x00,0x00,0x00,0x00,/*"6",6*/
  0x00,0x00,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0x00,0x00,0x00,
  0x00,0x0E,0x03,0x00,0x00,0x00,0x00,0x00,0xE0,0x18,0x06,0x01,0x00,0x00,0x00,0x00,
  0x00,0x00,0x00,0x00,0x00,0xC0,0xFC,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  0x00,0x00,0x00,0x00,0x00,0x0F,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"7",7*/
  0x00,0x00,0x00,0x80,0xC0,0x40,0x40,0x40,0x40,0xC0,0x80,0x00,0x00,0x00,0x00,0x00,
  0x00,0x3E,0x7F,0xF1,0xC0,0xC0,0x80,0x00,0x00,0x80,0x41,0x7F,0x1E,0x00,0x00,0x00,
  0xF0,0xFC,0x0E,0x02,0x01,0x01,0x01,0x03,0x07,0x0E,0x1E,0xFC,0xF0,0x00,0x00,0x00,
  0x01,0x03,0x06,0x04,0x08,0x08,0x08,0x08,0x08,0x04,0x06,0x03,0x01,0x00,0x00,0x00,/*"8",8*/
  0x00,0x00,0x80,0x80,0x40,0x40,0x40,0x40,0x40,0x80,0x00,0x00,0x00,0x00,0x00,0x00,
  0xFC,0xFF,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xFE,0xF8,0x00,0x00,0x00,
  0x01,0x03,0x07,0x0C,0x08,0x08,0x08,0x08,0x04,0x06,0xE1,0x7F,0x1F,0x00,0x00,0x00,
  0x00,0x07,0x07,0x08,0x08,0x08,0x08,0x0C,0x06,0x03,0x01,0x00,0x00,0x00,0x00,0x00,/*"9",9*/
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  //:
  0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0xE0,0xE0,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x0F,0x0F,0x06,0x00,0x00,0x00,0x00,0x00,0x00,
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  0x01,0x01,0x01,0x01,0x01,0x01,0x00,0x00,/*"-",0*/
};



//----------------------------------------------------
// 主程序
//----------------------------------------------------
void main()
{

  Initialization();
    while(1)
      {
        if(Adjust_Index==-1)
            GetTime();
        read_TRH();
//        CS2=0; //左屏開顯示
//      CS1=1;
      Display_char(6,0,Digits+s1*16);// Hz_Wo為某個漢字的首地址
        Display_char(6,16,Digits+s2*16);
//    CS2=1; //右屏開顯示
//      CS1=0;
    Display_char(6,64,Digits+w1*16);
        Display_char(6,80,Digits+w2*16);
        }
}

void Initialization()//初始化函數(shù)
{
  IE=0x83;
    IP=0x01;
    IT0=0X01;
    TH0=-50000/256; // 寫入初值
  TL0=-50000%256; //  寫入初值
    TR0=1;
    LCD12864_Initialization();//液晶初始化函數(shù)
    //顯示年的前面固定的兩位
    Display_char(V_page_Offset,0+H_Offset,Digits+2*16);//顯示2
    Display_char(V_page_Offset,8+H_Offset,Digits);     //顯示0
   //-----------------------------------------------
   //在12864屏幕上固定顯示漢字:年月日,星期,時分秒
   //---------------------------------------------------





     Display_Word(V_page_Offset,  80+H_Offset,DATE_TIME_WORDS+3*32);  //星
     Display_Word2(V_page_Offset+2,32+H_Offset,fuhao+10*64);          //:
     Display_Word2(V_page_Offset+2,80+H_Offset,fuhao+10*64);          //:
     Display_Word(V_page_Offset,  96+H_Offset,DATE_TIME_WORDS+4*32);  //期


}
//--------------------------------------------------------------
//      定時器0刷新LCD顯示函數(shù)
//-------------------------------------------------------------
void T0_INT()interrupt 1
{
    TH0=-50000/256; // 寫入初值
    TL0=-50000%256; // 寫入初值
//     tcount++;
     if(++tcount!=2) return;
          tcount=0;
//         if(tcount%4==0)flag_200ms=1;
//    if(tcount==20)
//    {
//        tcount=0;
//        flag_1s=1;
//    }
     //年(后兩位)
     Reverse_Display=Adjust_Index==6;
     Display_char(V_page_Offset,16+H_Offset,Digits+DateTime[6]/10*16);
     Display_char(V_page_Offset,24+H_Offset,Digits+DateTime[6]%10*16);
     //星期
     Reverse_Display=Adjust_Index==5;
     Display_Word(V_page_Offset,112+H_Offset,WEEK_WORDS+(DateTime[5]%10-1)*32);
     //月
     Reverse_Display=Adjust_Index==4;
     Display_char(V_page_Offset,40+H_Offset,Digits+DateTime[4]/10*16);
     Display_char(V_page_Offset,48+H_Offset,Digits+DateTime[4]%10*16);
     //    日
     Reverse_Display=Adjust_Index==3;
     Display_char(V_page_Offset,64+H_Offset,Digits+DateTime[3]/10*16);
     Display_char(V_page_Offset,72+H_Offset,Digits+DateTime[3]%10*16);
     //時
     Reverse_Display=Adjust_Index==2;
     Display_Word2(V_page_Offset+2,H_Offset,fuhao+DateTime[2]/10*64);
     Display_Word2(V_page_Offset+2,16+H_Offset,fuhao+DateTime[2]%10*64);
      //分
     Reverse_Display=Adjust_Index==1;
     Display_Word2(V_page_Offset+2,48+H_Offset,fuhao+DateTime[1]/10*64);
     Display_Word2(V_page_Offset+2,64+H_Offset,fuhao+DateTime[1]%10*64);
     // 秒
     Reverse_Display=Adjust_Index==0;
     Display_Word2(V_page_Offset+2,96+H_Offset,fuhao+DateTime[0]/10*64);
     Display_Word2(V_page_Offset+2,112+H_Offset,fuhao+DateTime[0]%10*64);   
}
//----------------------------------------------------------
//       鍵盤中斷處理函數(shù)
//---------------------------------------------------------
void EX_INT0()interrupt 0
{
   if(k1==0)
         {
           if(Adjust_Index==-1||Adjust_Index==0)
             {Adjust_Index=7;}
           Adjust_Index--;
           if(Adjust_Index==5)
              {Adjust_Index=4;}     //跳過對星期的調(diào)節(jié)
         }
   else if(k2==0)             //    加
       {
          Datetime_Adjust(1);
       }
    else if(k3==0)             //    減
       {
          Datetime_Adjust(-1);
       }
    else if(k4==0)
       {
         SET_DS1302();
         Adjust_Index=-1;  //操作索引重設(shè)為-1,時間繼續(xù)正常顯示
       }

原理圖:

畢業(yè)設(shè)計4.0完結(jié)篇 - 副本.doc

672.5 KB, 下載次數(shù): 3, 下載積分: 黑幣 -5

如目錄

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表