版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、基于 51 單片機的萬年歷設(shè)計單片機經(jīng)過幾十年的發(fā)展, 已經(jīng)廣泛應(yīng)用于生活中的各個領(lǐng)域。 單片機以其體 積小、功能全、性價比高等諸多優(yōu)點,在許多行業(yè)都得到了廣泛應(yīng)用。在工業(yè)控 制、家用電器、通信設(shè)備、信息處理、尖端武器等各種測控領(lǐng)域的應(yīng)用中獨占鰲 頭,單片機開發(fā)技術(shù)已成為電子信息、電氣、通信、自動化、機電一體化等專業(yè) 技術(shù)人員必須掌握的技術(shù)。基于單片機的萬年歷作為設(shè)計的課題, 因為它有很好的開放性和可發(fā)揮性, 對 作者的要求比較高,不僅考察了對單片機的掌握能力而且強調(diào)了對單片機擴展的 應(yīng)用。另外液晶顯示的萬年歷已經(jīng)越來越流行,特別適合在家庭居室、辦公室、 大廳、會議室、車站和廣場等地方使用,它
2、具有顯示清晰直觀、走時準確、可以 進行夜視等功能,并且還可以擴展出其它多種功能。所以,電子萬年歷作為設(shè)計 課題很有價值?,F(xiàn)在對于電子萬年歷的設(shè)計大多運用 51 單片機。主要是因為 51 單片機種類齊 全、結(jié)構(gòu)體系完整、指令系統(tǒng)功能完善、性能優(yōu)越、具有較高可靠性和高性價比 等特點。本篇論文主要介紹了運用單片機實現(xiàn)電子萬年歷的設(shè)計 , 萬年歷系統(tǒng)擬用STC89C5單片機控制,以DS1302時鐘芯片計時、1602液晶屏顯示。系統(tǒng)主要由單片機控制電路,顯示電路以及校正電路三個模塊組成。本文闡述了系統(tǒng)的硬件 工作原理,所應(yīng)用的各個接口模塊的功能以及其工作過程,論證了設(shè)計方案理論 的可行性。目錄第一章 緒
3、論 11.1 本課題主要的研究工作 1第二章 系統(tǒng)的硬件設(shè)計與實現(xiàn) 22.1 電路設(shè)計框圖 22.2 系統(tǒng)硬件概述 22.3 主要單元電路的設(shè)計 22.3.1 單片機主控制模塊的設(shè)計 22.3.2 時鐘電路模塊的設(shè)計 32.3.3 獨立式鍵盤設(shè)計 42.3.4 顯示模塊的設(shè)計 4第三章 系統(tǒng)的軟件設(shè)計 63.1 程序流程圖 . 63.1.1 系統(tǒng)總流程圖 63.1.2 DS1302 時鐘程序流程圖 73.1.3 LCD 顯示程序流程圖 83.2 程序的設(shè)計 93.2.1 DS1302 讀寫程序 93.2.2 液晶顯示程序 11第四章 仿真與調(diào)試 134.1 KEIL 軟件調(diào)試流程 . 134.
4、2 PRoteu軟件運行流程 134.3 萬年歷的功能仿真 13致 謝 15參考文獻 16附錄:主程序 17第一章 緒論1.1 本課題主要的研究工作本項目是一種基于 AT89C51片機的萬年歷設(shè)計,本方案以AT89C51片機作為 主控核心,與時鐘芯片DS1302、按鍵、LCD1602液晶顯示器組成硬件系統(tǒng)。在硬 件系統(tǒng)中設(shè)有獨立按鍵和 LCD1602 顯示器,能顯示豐富的信息,根據(jù)使用者的需 要可以隨時對時間進行更改,讀取方便、顯示直觀。當程序執(zhí)行后,LCD顯示即時時間、年月日、星期。設(shè)置 4個操作鍵:K1:選 擇鍵;K2:加鍵;K3:減鍵;K4:確定鍵。1 本設(shè)計的主要內(nèi)容:(1)熟悉萬年歷
5、各模塊的工作原理;(2)選擇適當?shù)男酒驮骷?,確定系統(tǒng)電路,繪制電路原理圖,尤其 是各接口電路;(3)熟悉單片機使用方法和 C語言,編寫出相應(yīng)模塊的應(yīng)用程序;(4)分別在各自的模塊中調(diào)試出對應(yīng)的功能,在 Proteus 軟件上進行仿 真,并實現(xiàn)各種功能。2 設(shè)計目標:萬年歷實現(xiàn)以下三個功能:(1)具有年、月、日、星期、時、分、秒等功能;(2)具備年、月、日、星期、時、分、秒校準功能,具備自動調(diào)節(jié)閏年 的功能;(3)具有與即時時間同步的功能。28第二章系統(tǒng)的硬件設(shè)計與實現(xiàn)2.1電路設(shè)計框圖根據(jù)設(shè)計方案給出了系統(tǒng)總體的設(shè)計框圖,如圖1所示:LCD液晶模塊DS1302模塊主控制殮塊TS鍵盤模塊圖1
6、為使時鐘走時與標準時間一致,校時電路是必不可少的,鍵盤模塊用來校正 液晶上顯示的時間;STC89C51單片機通過輸出各種電脈沖信號來驅(qū)動控制各部分 正常工作;而系統(tǒng)的時間、等數(shù)據(jù)則最終通過液晶模塊顯示出來。2.2系統(tǒng)硬件概述本電路是以STC89C5單片機為控制核心,該芯片具有在線編程功能,功耗低, 能在3.3V的超低壓下工作;時鐘芯片采用DS1302它是一款高性能、低功耗、自帶RAM勺實時時鐘芯片, 具有掉電自動保存功能。可自動對秒、分、時、日、周、月、年進行計數(shù),具有 閏年補償功能,而且精度高位的 RAM做為數(shù)據(jù)暫存區(qū),工作電壓2.5V5.5V范圍 內(nèi),2.5V時耗電小于300nA。顯示模塊
7、采用1602顯示屏,它內(nèi)置192種字符,可顯示32個符號或數(shù)字,清 晰可見,而且功率消耗小壽命長抗干擾能力強。其工作電壓為5v。2.3主要單元電路的設(shè)計2.3.1單片機主控制模塊的設(shè)計一個典型的單片機最小系統(tǒng)一般由時鐘電路、復(fù)位電路、電源指示燈和外部 擴展接口等部分組成。單片機的最小系統(tǒng)如下圖所示,單片機的XTAL0和XTAL1引腳用于連接晶振電 路。RESET為復(fù)位引腳,連接復(fù)位電路,用于初始化MCU232時鐘電路模塊的設(shè)計DS1302內(nèi)含有一個實時時鐘/日歷和31字節(jié)靜態(tài)RAM通過簡單的串行接口 與單片機進行通信。圖中VCC偽后備電源,VCC2為主電源。DS1302由VCC1或VCC2 兩
8、者中的較大者供電。所以在主電源關(guān)閉的情況下,也能保持時鐘的連續(xù)運行。X1和X2是振蕩源,外接32.768KHZ晶振用來為芯片提供計時脈沖。RST是復(fù)位/ 片選線,通過把RST俞入驅(qū)動置高電平來啟動所有的數(shù)據(jù)傳送。DS1302的硬件接線圖如圖2所示:C2Header 2圖2時鐘芯片DS1302的工作原理:(1) DS1302的控制字節(jié):DS1302控制字節(jié)的高有效位(位7)必須是邏輯1, 如果它為0,貝U不能把數(shù)據(jù)寫入 DS1302中,位6如果為0,則表示存取日歷時鐘 數(shù)據(jù),為1表示存取RAM數(shù)據(jù);位5至位1指示操作單元的地址;最低有效位(位 0)如為0表示要進行寫操作,為1表示進行讀操作,控制
9、字節(jié)總是從最低位開始 輸出(2) 數(shù)據(jù)輸入輸出(I/O ):在控制指令字輸入后的下一個 SCLK寸鐘的上升沿 時,數(shù)據(jù)被寫入DS1302數(shù)據(jù)輸入從低位即位0開始。同樣,在緊跟8位的控制 指令字后的下一個SCLK脈沖的下降沿讀出DS1302的數(shù)據(jù),讀出數(shù)據(jù)時從低位 0 位到高位7。(3) DS1302的寄存器:DS1302有 12個寄存器,其中有7個寄存器與日歷、 時鐘相關(guān),存放的數(shù)據(jù)位為BCD碼形式?!?CH是時鐘暫停標志位,當該位為1時, 時鐘振蕩器停止,DS1302處于低功耗狀態(tài);當該位為0時,時鐘開始運行?!癢P 是寫保護位,在任何的對時鐘和 RAM的寫操作之前,“WP必須為0。當“WP
10、為 1 時,寫保護位防止對任一寄存器的寫操作。2.3.3 獨立式鍵盤設(shè)計獨立式鍵盤每個鍵單獨占用一根 I/O 口線。鍵盤的工作方式可分為編程控制 方式和中斷控制方式。CPU在 一個工作周期內(nèi),利用完成其他任務(wù)的空余時間,調(diào) 用鍵盤掃描子程序,經(jīng)程序查詢,若無鍵操作,則返回;若有鍵操作,則進而判 斷是哪個鍵,并執(zhí)行相應(yīng)的鍵處理程序。這種方式為編程掃描方式。由于單片機 在正常應(yīng)用過程中,可能會經(jīng)常進行鍵操作,因而編程控制方式使CPU經(jīng)常處于工作狀態(tài), 在進行本次設(shè)計中,只涉及到了選擇、加、減、確定四個功能。因此 采用獨立式鍵盤。2.3.4 顯示模塊的設(shè)計本設(shè)計中要對時間、溫度進行顯示,液晶顯示屏
11、1602模塊作為輸出。 1602字 符型LCD!常有14條引腳線或16條引腳線的LCD多出來的2條線是背光電源線。 它可以顯示兩行,每行16個字符,采用單+5V電源供電,外圍電路配置簡單。1602 液晶模塊內(nèi)部的字符發(fā)生存儲器已經(jīng)存儲了 160 個不同的點陣字符圖形,每一個 字符都有一個固定的代碼,比如大寫的英文字母“ A”的代碼是01000001B(41H), 顯示時模塊把地址 41H中的點陣字符圖形顯示出來,我們就能看到字母“A”。LCD1602引腳功能:1 VSS般接地2 VDD接 電源(+5V)3 V0 液晶顯示器對比度調(diào)整端。4 RS RS為寄存器選擇。5 R/WR/W為讀寫信號線。
12、6 E E(或EN)端為使能(enable)端,下降沿使能。1602主要管腳介紹:V0為液晶顯示器對比度調(diào)整端,接正電源時對比度最弱, 接地電源時對比度最高,對比度過高時會產(chǎn)生鬼影使用時可以通過一個 10K 的電 位器調(diào)整對比度。RS為寄存器選擇端,高電平時選擇數(shù)據(jù)寄存器,低電平時選擇指令寄存器。R/W為讀寫信號線端,高電平時進行讀操作,低電平時進行寫操作。 當RS和R/W共同為低電平時可以寫入指令或者顯示地址;當RS為高電平R/W為低電平時可以寫入數(shù)據(jù)。E為使能端,當E端由高電平跳變成低電平時,液晶模塊 執(zhí)行命令。將L1602的RS端和P2.0,R/W端和P2.1, E 端和P2.2相連,當
13、RS=0 時,對LCD1602寫入指令;當RS=1時,對LCD1602寫入數(shù)據(jù)。當R/W端接高電平 時芯片處于讀數(shù)據(jù)狀態(tài),反之處于寫數(shù)據(jù)狀態(tài),E端為使能信號端。當R/W為高電 平,E端也為咼電平,RS為低電平時,液晶顯示屏顯示需要顯示的示數(shù)。顯示模塊電 路圖如圖3所示:VCCU1101112J1115 -i6上i7:18 i1920P1.0(T2) P1.1(T2EX) P1.2P1.3P1.4P1.5P1.6 P1.7 RESET (RXD)P3.0 (TXD)P3.1 P3.2(INT0) P3.3(INT1) P3.4(T0) P3.5(T1)P3.6(WR) P3.7(RD XTAL0
14、 XTAL1VSSVCCT10K3產(chǎn)4540I6VCCP0.0P0.1P0.2P0.3P0.4P0.5P0.6P0.7 ea/VppALE/PROGPSENP2.7P2.6P2.5P2.4P2.3P2.2P2.1P2.039W373635262423222178910111213141516VSS VDD V0 RS RW EDB0DB1DB2DB3DB4DB5DB6DB7E1E2LCD1602VCCST8C9C52第三章系統(tǒng)的軟件設(shè)計3.1程序流程圖3.1.1系統(tǒng)總流程圖系統(tǒng)總流程圖分析:首先系統(tǒng)初始化,系統(tǒng)開始運行,當有設(shè)置鍵按下時進 入修改時間模式,無按鍵按下時讀取時間、溫度等數(shù)據(jù)送入液
15、晶屏顯示;在修改 時間模式下設(shè)置時間完成后再送數(shù)據(jù)到液晶屏顯示,如圖 4所示:圖43.1.2 DS1302時鐘程序流程圖入液晶屏顯示。這時若有設(shè)置鍵按下時,進行時間修改,完成后將數(shù)據(jù)送入 時鐘芯片;若沒有按鍵按下,則直接存入EPROM送入液晶屏顯示。時鐘程序S1302 開始計時時,首先進行初始化,當有中斷信號時,讀取時鐘芯片的數(shù)據(jù),如圖5所示:圖53.1.3 LCD顯示程序流程圖顯示程序流程圖分析:首先對1602顯示屏進行初始化(初始化大約持續(xù)10ms號,左右),然后檢查忙信號,若BF=O,則獲得顯示RAM的地址,寫入相應(yīng)的數(shù)據(jù)顯示;若BF=1,則代表模塊正在進行內(nèi)部操作,不接受任何外部指令和
16、數(shù)據(jù),直到BF=O為止,如圖6所示:J結(jié)束3.2程序的設(shè)計321 DS1302讀寫程序DS1302是 SPI總線驅(qū)動方式。它不僅要向寄存器寫入控制字,還需要讀取相應(yīng)寄存器的數(shù)據(jù)。要想與 DS1302通信,首先要先了解 DS1302的控制字。DS1302的控制字如圖7:765432101RAMA4A3UKA2AlAORD控制字總是從最低位開始輸出。在控制字指令輸入后的下一個SCLK寸鐘的上升沿時,數(shù)據(jù)被寫入 DS1302數(shù)據(jù)輸入從最低位(0位)開始。同樣,在緊跟 8 位的控制字指令后的下一個 SCLK脈沖的下降沿,讀出DS1302的數(shù)據(jù),讀出的 數(shù)據(jù)也是從最低位到最高位。依據(jù)讀寫時序如圖8和圖9
17、:一(尺帀 1畑 z 1盟 i 盟 |陽 |眈”-圖8單字節(jié)讀RST齪lk丄fLfmfLfunLrLfLfLfLfLTLfnLfnjn 0( R/訐 肌 剛 A2 | 陽 | 第1Di D2 D3 D4 D5 D6 3圖9 單字節(jié)寫在進行任何數(shù)據(jù)傳輸時,RST必須被置高電平,每個SCLK為上升沿時數(shù)據(jù)被 輸入,下降沿時數(shù)據(jù)被輸出。先把 RST置低,禁止數(shù)據(jù)傳輸,SCLK置低,清零時 鐘總線,RST再置高,允許數(shù)據(jù)傳輸。傳送完成后,RST置低,禁止字節(jié)的傳送。部分源程序如下:void write_byte(uchar dat) /寫一個字節(jié)ACC=dat;RST=1;for(a=8;a>0
18、;a-) IO=ACC0;SCLK=0;SCLK=1;ACC=ACC>>1;uchar read_byte() / 讀一個字節(jié)RST=1;for(a=8;a>0;a-)ACC7=IO;SCLK=1;SCLK=0;ACC=ACC>>1;return (ACC);void write_1302(uchar add,uchar dat) /向 1302 芯片寫函數(shù),指定寫入地址,數(shù)據(jù)RST=0;SCLK=0;RST=1;write_byte(add);write_byte(dat);SCLK=1;RST=0;uchar read_1302(uchar add) / 從
19、1302 讀數(shù)據(jù)函數(shù),指定讀取數(shù)據(jù)來源 地址uchar temp;RST=0;SCLK=0;RST=1;write_byte(add);temp=read_byte();SCLK=1;RST=0;return(temp);3.2.2 液晶顯示程序1602通過D0D7的8位數(shù)據(jù)端傳輸數(shù)據(jù)和指令,其模塊內(nèi)的控制器有11條控 制指令。當液晶顯示屏的接口電路與單片機系統(tǒng) I/O 按照并行數(shù)據(jù)傳輸方式連接 完成以后,即可以對STC89C5單片機進行編程。在液晶屏完成顯示之前首先要對 液晶進行初始化。部分源程序如下:lcdnit()/*液晶初始化函數(shù)*write_1602com(0x38); /設(shè)置液晶工
20、作模式, 16*2行顯示, 5*7點陣, 8位數(shù)據(jù) write_1602com(0x0c);/開顯示不顯示光標write_1602com(0x06);/整屏不移動,光標自動右移write_1602com(0x01);/清顯示write_1602com(yh+1); /日歷顯示固定符號從第一行第 1 個位置之后開始顯示 for(a=0;a<14;a+)write_1602dat(tab1a); /向液晶屏寫日歷顯示的固定符號部分 /delay(3);write_1602com(er+2); /時間顯示固定符號寫入位置, 從第 2 個位置后開始顯示 for(a=0;a<8;a+)wri
21、te_1602dat(tab2a); /寫顯示時間固定符號,兩個冒號delay(3);第四章 仿真與調(diào)試4.1 Keil 軟件調(diào)試流程建立新工程并保存,保存后會彈出一個設(shè)備選擇對話框,選擇MCU后點確定返回主界面。新建文件并保存,以 .C 為后綴。接著選擇 Source Group1 ,右擊鼠 標彈出快捷菜單,選擇“ Add File to Group 'Source Groupl ",出現(xiàn)一個對話 框,加入文件后點 close 返回主界面。再打開工程屬性設(shè)置對話框,主要設(shè)置工 作包括在Target選項卡中設(shè)置晶振頻率、在Debug選項卡中設(shè)置生成hex文件等。 然后編寫程序
22、并調(diào)試。在模擬調(diào)試程序后,還須通過編程器將 .hex 目標文件寫入 單片機中才能觀察仿真的效果。4.2 Proteus 軟件運行流程運行Proteus程序后,進入軟件的主界面,過左側(cè)工具欄中的P(從庫中選擇元件命令 )命令,在 Pick Devices 左側(cè)窗口中選擇所需元件的關(guān)鍵字,然后放置 元件并調(diào)整方向和位置以及參數(shù)設(shè)置,最后進行連線。按 P 在庫中查找元器件, 將所需要的元器件放置好后,繪制成原理圖。4.3 萬年歷的功能仿真當電路搭建好之后,選中單片機 STC89C5,1 左鍵點擊 STC89C5,1 在出現(xiàn)的對 話框里點擊Program File按鈕,找到剛才Keil軟件編譯得到的H
23、EX文件,載入 然后點擊“0K按鈕就可以模擬了。點擊模擬調(diào)試按鈕的運行按鈕,進人調(diào)試狀 態(tài)。按相應(yīng)的按鍵可調(diào)節(jié)分,時,星期,日期,月份,年份,并且可以自動閏年 調(diào)整。按鍵功能自上而下依次為:選擇鍵、加、減、確定。在 Protues 中仿真, 如圖 10,圖 11,圖 12所示: 1LCD +RTE l0-L2-2?riONTIFE lSi 2H 46:.: I AlC2 :=rr°:RF1 -1-, 總口 :VO %LK TOTWC2X1U2 DS133Z胡iH<7z- S'v4JTT il 1KTAjinKTKI2BSTPCL1M1 陽別畑 PgWPOL 4/04 卩
24、口敬修PEUkbSPH T/H iiTPSENPZ1TASP2.1M9 PZ2AC P ZA11AL£FZ.AH0P1 0PZAG PZJffAU 工T慣皆FlUKXbPl 1/T: pjiwinP1.1 PUM3 P-| 4,psaTim勺 mTOP-15P -I AFgjrriR1.T1S 3n qj 廣 o .-sr3"空衿/ Z ITW.?23 B 7w叫二.1.至di T31 n?-T3#OS 匚衛(wèi) d3Z orilDT N fl 3« - 4 I d3 612nSISTKI博毎腑囲庁申弗鼠:喜月日廳分):- IBej_zL-口O-0o o , oja.
25、10'AHIB *M3,"HTTT圖10電路圖仮復(fù)按"Fki選擇所調(diào)節(jié)的時象(年月目時分):.搖咼d dm .o ao o圖11鍵盤調(diào)節(jié)圖12調(diào)節(jié)鍵盤后致謝至此,關(guān)于畢業(yè)設(shè)計的所有內(nèi)容就介紹完了,系統(tǒng)的仿真電路和程序設(shè)計合 理。在整個設(shè)計過程中,充分發(fā)揮了人的主觀能動性,自主學習,學到了許多沒 學到的知識。程序編寫中,由于思路不清晰,開始時遇到了很多的問題,經(jīng)過靜 下心來思考查資料,和同學討論,理清了思路,完成對程序的編寫。通過設(shè)計提 高了對單片機的認識,進一步熟悉和掌握單片機的結(jié)構(gòu)及工作原理。通過實際程 序設(shè)計和調(diào)試,逐步掌握模塊化程序設(shè)計方法和調(diào)試技術(shù),提高軟件
26、設(shè)計、調(diào)試 能力;通過這次設(shè)計熟悉以單片機核心的應(yīng)用系統(tǒng)開發(fā)的全過程,掌握硬件電路 設(shè)計的基本方法和技術(shù),掌握相關(guān)電路參數(shù)的計算方法。最終較好的完成了設(shè)計, 達到了預(yù)期的目的,完了最初的設(shè)想。但是由于時間和個人暫時的能力的原因, 整個系統(tǒng)看起來還是顯得非常的簡單,只實現(xiàn)了一些最基本的功能,還有許多不 足和可以擴展的地方。畢業(yè)設(shè)計的完成,為我的大學學習生活畫下了最后一筆。應(yīng)該感謝的人很多, 首先感謝學院給我們提供了一個展現(xiàn)自己的舞臺,在長江職業(yè)技術(shù)學院這個良好 的學習環(huán)境中,我們得到了很多鍛煉的機會,使得我們的動手能力和專業(yè)技能都 有了很大的提高。其次要感謝教單片機的鄧柳老師的悉心教導(dǎo)和全程負責
27、畢業(yè)報 告完成的陳卉老師,還有幫助我完成的學校電子競賽組的同學。是你們?yōu)槲覄?chuàng)造 了良好的學習和完成畢業(yè)設(shè)計的環(huán)境,你們的支持和鼓勵使我對這次的設(shè)計完成 有了信心和動力,使我能夠順利地完成課題的設(shè)計工作,在此向這些幫助我的人 致以誠摯的謝意。最后,還要特別感謝我的父母,養(yǎng)育之恩,無以回報,你們永 遠健康快樂是我最大的心愿。正是在爸媽身體和精神的養(yǎng)育下才讓我得以全身心 投入學習和研究中,順利完成學業(yè)。即將踏上社會了,在人生的又一個十字路口上,我將帶著你們的期望和關(guān)懷, 在將來的工作崗位上勤奮實干,積極進取,用優(yōu)異的成績來回報大家對我的關(guān)心 和幫助!參考文獻1彭偉 單片機C語言程序設(shè)計實例100例
28、電子工業(yè)出版社2009年5月;2 王文杰 許文斌 主編 單片機應(yīng)用技術(shù) 冶金工業(yè)出版社 2008 年 6 月; 3張福祥 C 語言程序設(shè)計 遼寧大學出版社 2007 年2月;4 郭天祥 十天學會單片機 哈爾濱工程大學出版社 2007 年 6月;附錄:主程序/ 名稱:用DS1302與1602LCC設(shè)計的可調(diào)式電子日歷與時鐘/ 說明:本例會自動調(diào)節(jié)合法日期時間,對于星期的調(diào)節(jié)會在/調(diào)整年月日時自動完成,閏年問題也會自動判斷。/#include <reg51.h>#include <string.h>#define uchar unsigned char#define uin
29、t unsigned intsbit SDA=P1A0; /DS1302 數(shù)據(jù)線sbit CLK=PM1; /DSB1302 時鐘線sbit RST=P1A2; /DS1302 復(fù)位線sbit RS=P2A0;/LCD寄存器選擇sbit RW=P2A1;/LCD讀/寫控制sbit EN=P2A2;/LCD啟用sbit K1=P3A4;/選擇sbit K2=P3A5;/加sbit K3=P3A6;/減sbit K4=P3A7;/確定uchar tCount=0;/ 一年中每個月的天數(shù),二月的天數(shù)由年份決定uchar MonthsDays=0,31,0,31,30,31,30,31,31,30,3
30、1,30,31;/周日,周一到周六0,1-6讀取DS1302時分別是1-7uchar *WEEK="SUN","MON","TUS","WEN","THU","FRI","SAT";/LCD 顯示緩沖uchar LCD_DSY_BUFFER1="DATE 00-00-00 ";uchar LCD_DSY_BUFFER2="TIME 00:00:00 ";uchar DateTime7; / 所讀取的日期時間char
31、Adjust_Index=-1; / 當前調(diào)節(jié)的時間對象:秒,分,時,日,月,年(0,1,2,3,4,6)(不調(diào)節(jié)秒周)寫數(shù)據(jù)的程序uchar Change_Flag="-MHDM-Y" / (分,時,日,月,年)/延時,向DS1302寫、讀一字節(jié)以及從 DS1302旨定位置度、/延時void DelayMS(uint x)uchar i;while(x-) for(i=0;i<120;i+);/向DS1302寫入一個字節(jié)void Write_A_Byte_TO_DS1302(uchar x) uchar i;for(i=0;i<8;i+)SDA=x&1
32、; CLK=1; CLK=0; x>>=1;/從DA1302讀取一字節(jié)uchar Get_A_Byte_FROM_DS1302() uchar i,b,t;for(i=0;i<8;i+)b>>=1;t=SDA;b|=t<<7;CLK=1;CLK=0;/BCD 碼轉(zhuǎn)換return b/16*10+b%16;/從DS1302旨定的位置讀數(shù)據(jù) uchar Read_Data(uchar addr) uchar dat;RST=0;CLK=0;RST=1;Write_A_Byte_TO_DS1302(addr);dat=Get_A_Byte_FROM_DS13
33、02();CLK=1;RST=0;return dat;/向DS1302某地址寫入數(shù)據(jù) void Write_DS1302(uchar addr,uchar dat) CLK=0;RST=1;Write_A_Byte_TO_DS1302(addr);Write_A_Byte_TO_DS1302(dat);CLK=0;RST=0;/ 設(shè)置時間 void SET_DS1302()uchar i;Write_DS1302(0x8E,0x00);/ 寫控制字,取消寫保護 for(i=1;i<7;i+) / 分時日月年依次寫入/ 分的起始地址 10000010(0x82), 后面續(xù)依次是時,日,月
34、,周,年, 寫入地址每次遞增 2Write_DS1302(0x80+ 2*i,(DateTimei/10<<4)|(DateTimei%10);Write_DS1302(0x8E,0x80);/ 加保護/ 讀取當前日期時間/void GetTime()uchar i;for(i=0;i<7;i+)DateTimei=Read_Data(0x81+2*i);/1602LCD 的若干顯示控制代碼。/uchar Read_LCD_State()讀 LCD犬態(tài)uchar Read_LCD_State()uchar state;RS=0;RW=1;EN=1;DelayMS(1);sta
35、te=P0;EN=0;DelayMS(1);return state;/void LCD_Busy_Wait() 忙等待void LCD_Busy_Wait()while(Read_LCD_State()&0x80)=0x80);DelayMS(5);/void Write_LCD_Data(uchar dat) 向 LCD寫數(shù)據(jù)void Write_LCD_Data(uchar dat)LCD_Busy_Wait();RS=1;RW=0;EN=0;P0=dat;EN=1;DelayMS(1);EN=0; /void Write_LCD_Command(uchar cmd)寫 LCD旨
36、令void Write_LCD_Command(uchar cmd)LCD_Busy_Wait();RS=0;RW=0;EN=0;P0=cmd;EN=1;DelayMS(1);EN=0; /void Init_LCD()LCD 初始化void Init_LCD()Write_LCD_Command(0x38);DelayMS(1);Write_LCD_Command(0x01);DelayMS(1);Write_LCD_Command(0x06);DelayMS(1);Write_LCD_Command(0x0c);DelayMS(1); /void Set_LCD_POS(uchar P)
37、設(shè)置液晶顯示位置 void Set_LCD_POS(uchar p)Write_LCD_Command(p|0x80);/在LCD上顯示字符串void Display_LCD_String(uchar p,uchar *s)uchar i;Set_LCD_POS(p);for(i=0;i<16;i+)Write_LCD_Data(si); DelayMS(1);/ 日期與時間值轉(zhuǎn)換為數(shù)字字符void Format_DateTime(uchar d,uchar *a)a0=d/10+'0'a1=d%10+'0'/ 判斷是否為閏年uchar isLeapYea
38、r(uint y)return(y%4=0&&y%100!=0)|(y%400=0);/ 求自 2000.1.1 開始的任何一天是星期幾/ 函數(shù)沒有通過,求出總天數(shù)后再求星期幾,/ 因為求總天數(shù)可能會超越 uint 的范圍。 void RefreshWeekDay()uint i,d,w=5;/ 已知 1999.12.31 是周五 for(i=2000;i<2000+DateTime6;i+) d=isLeapYear(i)?366:365; w=(w+d)%7;d=0;for(i=1;i<DateTime4;i+) d+=MonthsDaysi; d+=DateT
39、ime3;/保存星期,06表示星期日至周六,為了與 DS1302的星期格式匹配,返回值需 要加 1DateTime5=(w+d)%7+1;/void DateTime_Adjust(char x)switch(Adjust_Index)case 6:/ 年 00-99 if(x=1&&DateTime6<99) DateTime6+; if(x=-1&&DateTime6>0) DateTime6-;/ 獲取 2 月天數(shù) MonthsDays2=isLeapYear(2000+DateTime6)?29:28;/ 如果年份變化后當前月份的天數(shù)大于上限
40、則設(shè)為上限 if(DateTime3>MonthsDaysDateTime4)DateTime3=MonthsDaysDateTime4;RefreshWeekDay();/ 刷新星期 break;case 4:/ 月 01-12 if(x=1&&DateTime4<12) DateTime4+; if(x=-1&&DateTime4>1) DateTime4-;/ 獲取 2 月天數(shù) MonthsDays2=isLeapYear(2000+DateTime6)?29:28;/ 如果月份變化后當前月份的天數(shù)大于上限則設(shè)為上限 if(DateTim
41、e3>MonthsDaysDateTime4)DateTime3=MonthsDaysDateTime4; RefreshWeekDay();/ 刷新星期 break;case 3:/ 日 00-28/29/30/31 ;調(diào)節(jié)之前首先根據(jù)年份得出該年中 2 月的 天數(shù)MonthsDays2=isLeapYear(2000+DateTime6)?29:28; / 根據(jù)當前月份決定調(diào)節(jié)日期的上限 if(x=1&&DateTime3<MonthsDaysDateTime4)DateTime3+;if(x=-1&&DateTime3>0) DateTime3-;RefreshWeekDay();/ 刷新星期break;case 2:/ 時if(x=1&&DateTime2<23) DateTime2+; if(x=-1&&DateTime2>0) DateTime2-; break;case 1:/ 分if(x=1&a
溫馨提示
- 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. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 農(nóng)民培訓計劃與實施手冊
- 加工非標制作合同范本
- 2025年度影視剪輯技術(shù)支持與咨詢服務(wù)合同
- 2025年度生物質(zhì)能發(fā)電項目投資與建設(shè)合同
- 公司資金借貸合同范例
- 供酒供銷合同范例
- 2025年度洗滌設(shè)備行業(yè)技術(shù)培訓與咨詢服務(wù)合同
- 加工箍筋合同范本
- 買賣購房指標合同范例
- 樂有假租房合同范本
- 元宇宙視域下非遺保護與傳播途徑探究
- 2025年買賣個人房屋合同(4篇)
- 2025代運營合同范本
- 武漢2025年湖北武漢理工大學管理人員招聘筆試歷年參考題庫附帶答案詳解
- 家庭燃氣和煤氣防火安全
- 第十一章《功和機械能》達標測試卷(含答案)2024-2025學年度人教版物理八年級下冊
- 初三物理常識試卷單選題100道及答案
- 使用錯誤評估報告(可用性工程)模版
- 高中英語新課程標準解讀課件
- 客服人員績效考核評分表
- 變壓器檢修風險分析及管控措施
評論
0/150
提交評論