1927_基于單片機的萬年歷設計
1927_基于單片機的萬年歷設計,基于,單片機,萬年歷,設計
黃 河 科 技 學 院 畢 業(yè) 設 計 說 明 書 第 1 頁1 緒論萬年歷就是記錄一定時間范圍內(nèi)的具體陽歷與陰歷的日期的年歷,方便有需要的人查詢使用。隨著人們生活水平的提高和生活節(jié)奏的加快,對時間的要求越來越高,精準數(shù)字計時的消費需求也是越來越多。二十一世紀的今天,最具代表性的計時產(chǎn)品就是電子萬年歷,它是近代世界鐘表業(yè)界的第三次革命。電子萬年歷的出現(xiàn)帶來了鐘表計時業(yè)界跨躍性的進步。近年來,電子鐘已成為人們?nèi)粘I钪斜夭豢缮俚奈锲罚瑥V泛用于個人家庭以及車站、碼頭、劇院、辦公室等公共場所,給人們的生活、學習、工作、娛樂帶來了極大的方便。隨著技術(shù)的發(fā)展,人們已不再滿足于鐘表原先簡單的計時功能,希望出現(xiàn)一些新的功能,諸如日歷的顯示、鬧鐘的應用等,以帶來更大的方便,而所有這些,又都是以數(shù)字化的電子時鐘為基礎(chǔ)的。因此,研究實用電子時鐘及其擴展應用,有著非常現(xiàn)實的意義,具有很大的實用價值。由于數(shù)字集成電路技術(shù)的發(fā)展和采用了先進的石英技術(shù),現(xiàn)代電子鐘具有走時準確、性能穩(wěn)定、制作簡單等優(yōu)點,彌補了傳統(tǒng)鐘表的許多不足之處。我們利用單片機技術(shù)設計制作的電子萬年歷,可以很方便的由軟件編程進行功能的調(diào)整和改進,使其在能夠準確顯示年、月、日、時間、星期的同時,還能具有其他的功能。如設定鬧鐘、語單報時、陰陽歷的轉(zhuǎn)換、二十四節(jié)氣的顯示等,有一定的新穎性和實用性,同時體積小,攜帶方便,使用也更為方便,具有技術(shù)更新周期短、成本低、開放靈活等優(yōu)點,具備一定的市場前景。以基于單片機的萬年歷作為設計課題,因為它具有很好的開放性和可發(fā)揮性,要求比較高,不僅考察了對單片機的掌握能力而且強調(diào)了對單片機的擴展的應用。另外液晶顯示的萬年歷已經(jīng)越來越流行,具有顯示清晰直觀、走時準確、可以進行夜視等功能,并且還可以擴展出其它多鐘功能。所以,電子萬年歷作設計課題很有價值。 黃 河 科 技 學 院 畢 業(yè) 設 計 說 明 書 第 2 頁2 系統(tǒng)設計方案2.1 方案選擇和論證2.1.1 單片機芯片的選擇方案和論證方案一: 采用 89C51 芯片作為硬件核心,采用 Flash ROM,內(nèi)部具有 4KB ROM 存儲空間,能于 3V 的超低壓工作,而且與 MCS-51 系列單片機完全兼容,但是運用于電路設計中時由于不具備 ISP 在線編程技術(shù), 當在對電路進行調(diào)試時,由于程序的錯誤修改或?qū)Τ绦虻男略龉δ苄枰獰氤绦驎r,對芯片的多次拔插會對芯片造成一定的損壞。方案三:采用 STC12C5A60S2 單片機,定時器與傳統(tǒng) 8051 完全兼容,是標準的5V 工作電壓,內(nèi)部程序存儲器為 60K 存儲空間,不需要外擴存儲器。同樣具有 89C51的功能,且具有在線編程可擦除技術(shù),當在對電路進行調(diào)試時,由于程序的錯誤修改或?qū)Τ绦虻男略龉δ苄枰獰氤绦驎r,不需要對芯片多次拔插,所以不會對芯片造成損壞。STC12C5A60S2 的灌電流是 20mA,驅(qū)動能力超強,驅(qū)動大電流時不容易燒壞。相比之下,STC12C5A60S2 單片機具有在線編程可擦除技術(shù)和大容量存儲空間,利于設計及調(diào)試,所以選擇采用 STC12C5A60S2 單片機作為主控制系統(tǒng)。2.1.2 時鐘芯片的選擇方案和論證方案一:直接采用單片機定時計數(shù)器提供秒信號,使用程序?qū)崿F(xiàn)年、月、日、星期、時、分、秒計數(shù)。采用此種方案雖然減少芯片的使用,節(jié)約成本,但是,實現(xiàn)的時間誤差較大。所以不采用此方案。方案二:采用 DS1302 時鐘芯片來實現(xiàn)時鐘,DS1302 芯片是一種高性能的時鐘芯片,可自動對秒、分、時、日、周、月、年以及閏年補償?shù)哪赀M行計數(shù),而且精度高,位的 RAM 做為數(shù)據(jù)暫存區(qū),工作電壓 2.5V~5.5V 范圍內(nèi),2.5V 時耗電小于 300nA.相比單片機定時計數(shù)器,DS1302 芯片可自動計數(shù)且精度更高,所以選擇采用 DS1302作為時鐘芯片。2.1.3 顯示模塊的選擇方案和論證方案一:采用 LED 數(shù)碼管動態(tài)掃描 ,LED 數(shù)碼管價格適中 ,對于顯示數(shù)字最合適。 黃 河 科 技 學 院 畢 業(yè) 設 計 說 明 書 第 3 頁采用動態(tài)掃描法與單片機連接時,雖然占用的單片機口線少,但電路中的線路相對多,電路過于龐大。方案二:采用點陣式數(shù)碼管顯示,點陣式數(shù)碼管是由八行八列的發(fā)光二極管組成,對于顯示文字比較適合,如采用在顯示數(shù)字顯得太浪費,且價格也相對較高,所以也不用此種作為顯示。方案三:采用 LCD 液晶顯示屏,液晶顯示屏的顯示功能強大,可顯示大量文字、圖形,顯示多樣,清晰可見, 雖然價格貴,但卻免了一些線路的麻煩,外觀優(yōu)美,且可以顯示內(nèi)容多。相比方案一和方案二,方案三可顯示大量內(nèi)容,且線路簡單,所以采用了 LCD液晶顯示屏作為顯示。2.1.4 溫度傳感器的選擇方案和論證方案一:使用熱敏電阻作為傳感器,用熱敏電阻與一個相應阻值電阻相串聯(lián)分壓,利用熱敏電阻阻值隨溫度變化而變化的特性,采集這兩個電阻變化的分壓值,并進行A/D 轉(zhuǎn)換。 。此設計方案需用 A/D 轉(zhuǎn)換電路,增加硬件成本而且熱敏電阻的感溫特性曲線并不是嚴格線性的,會產(chǎn)生較大的測量誤差。方案二:采用數(shù)字式溫度傳感器 DS18B20,此類傳感器為數(shù)字式傳感器而且僅需要一條數(shù)據(jù)線進行數(shù)據(jù)傳輸,易于與單片機連接,可以去除 A/D 模塊,降低硬件成本,簡化系統(tǒng)電路。另外,數(shù)字式溫度傳感器還具有測量精度高、測量范圍廣等優(yōu)點。相比方案一,方案二不需要 A/D,可簡化電路,精度更高,所以采用了 DS18B20作為溫度傳感器。2.2 系統(tǒng)最終方案綜上各方案所述,對此次設計的方案選定: 采用 STC12C5A60S2 單片機作為主控制系統(tǒng); DS1302 提供時鐘;采用數(shù)字式溫度傳感器 DS18B20;LCD 液晶顯示屏動態(tài)掃描作為顯示。 黃 河 科 技 學 院 畢 業(yè) 設 計 說 明 書 第 4 頁3 系統(tǒng)的硬件和軟件設計3.1 系統(tǒng)的硬件設計3.1.1 系統(tǒng)設計框圖S T C 1 2 C 5 A 6 0 S 2主 主 主 主 主L E D 主 主 主 主 主 主 主 主主 主 主 主 主D S 1 3 0 2 主 主 主 主主 主 主 主主 主 主 主 主 主圖 3-1 系統(tǒng)框圖3.1.2 硬件概述本電路是由 STC12C5A60S52 單片機為控制核心,具有在線編程功能,低功耗,能在 3V 超低壓工作;時鐘電路由 DS1302 提供,它是一種高性能、低功耗、帶 RAM 的實時時鐘電路,它可以對年、月、日、周日、時、分、秒進行計時,具有閏年補償功能,工作電壓為 2.5V~5.5V。采用三線接口與 CPU 進行同步通信,并可采用突發(fā)方式一次傳送多個字節(jié)的時鐘信號或 RAM 數(shù)據(jù)。DS1302 內(nèi)部有一個 31*8 的用于臨時性存放數(shù)據(jù)的 RAM 寄存器??僧a(chǎn)生年、月、日、周日、時、分、秒,具有使用壽命長,精度高和低功耗等特點,同時具有掉電自動保存功能;溫度的采集由 DS18B20 構(gòu)成;顯示部份由 LCD 液晶顯示屏顯示。 黃 河 科 技 學 院 畢 業(yè) 設 計 說 明 書 第 5 頁3.1.3 單元電路的設計3.1.3.1 單片機主控模塊設計單片機控制系統(tǒng)及其外圍電路設計采用由 STC12C5A60S2 單片機為控制核心。STC12C5A60S2 單片機是宏晶科技生產(chǎn)的單時鐘單片機,是高速、低功耗、超強抗干擾的新一代 8051 單片機,具有 60K 的可編程 Flash 存儲器,指令代碼完全兼容傳統(tǒng)8051,但速度快 8-12 倍。片上 Flash 允許程序存儲器在線編程,亦適于常規(guī)編程器。STC12C5A60S2 具有以下標準功能: 60K 字節(jié) Flash,1280 字節(jié) RAM,36/40/44 個 I/O口線,看門狗定時器,4 個 16 位定時器,片內(nèi)晶振及時鐘電路。(1)單片機控制系統(tǒng)復位電路如圖 1 所示。SR20KC6uFV圖 3-2 復位電路設計(2)本次設計單片機采用 DIP 封裝,晶振為 12MHZ。其中 P3.0-P3.1 為 ISP 下載程序使用,其最小系統(tǒng)電路如圖 3-3 所示。18 引腳和 19 引腳接時鐘電路,XTAL1 接外部晶振和微調(diào)電容的一端,在片內(nèi)它是振蕩器倒相放大器的輸入,XTAL2 接外部晶振和微調(diào)電容的另一端,在片內(nèi)它是振蕩器倒相放大器的輸出.第 9 引腳為復位輸入端,接上電容,電阻及開關(guān)后形成電復位電路,20 引腳為接地端,40 引腳為電源端。 黃 河 科 技 學 院 畢 業(yè) 設 計 說 明 書 第 6 頁CRY21MHzP0.735489VALENX_D/OSIKTWGUF圖 3-3 單片機主控模塊3.1.3.2 時鐘電路模塊設計時鐘芯片采用 DS1302,晶振使用 32.768KHZ。DS1302 是 DALLAS 公司推出的涓流充電時鐘芯片 內(nèi)含有一個實時時鐘 /日歷和 31 字節(jié)靜態(tài) RAM 通過簡單的串行接口與單片機進行通信 實時時鐘/日歷電路提供年、月、日、時、分、秒、星期的信息,每月的天數(shù)和閏年的天數(shù)可自動調(diào)整,時鐘操作可通過 AM/PM 指示決定采用 24 或12 小時格式。DS1302 與單片機之間能簡單地采用同步串行的方式進行通信,僅需用到三個口線: RES 復位、 I/O 數(shù)據(jù)線和 SCLK 串行時鐘。時鐘 RAM 的讀寫數(shù)據(jù)以一個字節(jié)或多達 31 個字節(jié)的字符組方式通信。DS1302 工作時功耗很低,保持數(shù)據(jù)和 黃 河 科 技 學 院 畢 業(yè) 設 計 說 明 書 第 7 頁時鐘信息時功率小于 1mW。圖 3-4 顯示出 DS1302 的引腳排列,其中 Vcc1 為后備電源,Vcc2 為主電源。在主電源關(guān)閉的情況下,也能保持時鐘的連續(xù)運行。DS1302 由 Vcc1或 Vcc2 兩者中的較大者供電。當 Vcc2 大于 Vcc1+0.2V 時,Vcc2 給 DS1302 供電。當Vcc2 小于 Vcc1 時,DS1302 由 Vcc1 供電。X1 和 X2 是振蕩源,外接 32.768 KHz 晶振。RST 是復位/片選線,通過把 RST 輸入驅(qū)動置高電平來啟動所有的數(shù)據(jù)傳送。上電動行時,在 Vcc 大于等于 2.5V 之前,RST 必須保持低電平。在 SCLK 為低電平時,才能將 RST 置為高電平。 I/O 為串行數(shù)據(jù)輸入端(雙向) 。SCLK 始終是輸入端。VC12Y3.68KHZBTXGND4RS5IOLU0圖 3-4 時鐘電路模塊3.1.3.3 顯示電路模塊設計KNY12864M 是一種圖形點陣液晶顯示器,它主要由行驅(qū)動器、列驅(qū)動器及128×64 全點陣液晶顯示器組成??赏瓿蓤D形顯示,也可以顯示 8×4 個(16×16 點陣)漢字。與外部 CPU 接口可采用串行或并行方式控制。其顯示分辨率為 128×64,內(nèi)置8192 個中文漢字(16×16 點陣) 、128 個字符(16×8 點陣)及 64X256 點陣顯示RAM(GDRAM) 。利用該模塊靈活的接口方式和簡單、方便的操作指令,可構(gòu)成全中文人機交互圖形界面。其與單片機的接口電路如圖 3-5 所示。 黃 河 科 技 學 院 畢 業(yè) 設 計 說 明 書 第 8 頁VS1C2O3R4/W5E(LK)6DB079PNTUA圖 3-5 顯示電路模塊3.1.3.4 溫度采集模塊設計溫度采集采用 Dallas 半導體公司的數(shù)字化溫度傳感器 DS18B20,DS18B20 是單總線器件,線路簡單,體積小的特點,具有 9-12 為可編程分辨率,精度為±0.5℃。聲音功能采用 5V 蜂鳴器作為聲音報警器件,通過三極管進行放大輸出特定聲音。 QGI.圖 3-6 溫度采集模塊 黃 河 科 技 學 院 畢 業(yè) 設 計 說 明 書 第 9 頁3.1.3.5 雙電源供電電路設計系統(tǒng)采用雙電源,可以使用外接電源,也可直接使用 USB 5V 電源,由自鎖開關(guān)切換輸入。電源電路如圖 3-7 所示。 R61KL8+C0uF2PO5VGND4AT3USB-W圖 3-7 雙電源模塊3.1.3.6 RS-232 電路設計STC12C5A60S2 單片機具有在線編程可擦除技術(shù),連接串口,通過電腦端的 STC-ISP 軟件控制下載用戶程序到 STC 單片機,即可實現(xiàn)程序的燒寫。如圖 3-8 所示即為RS-232 轉(zhuǎn)換電路。 7IMXf圖 3-8 RS-232 轉(zhuǎn)換電路 黃 河 科 技 學 院 畢 業(yè) 設 計 說 明 書 第 10 頁3.1.4 電路原理及說明(1)時鐘芯片 DS1302 的工作原理DS1302 在每次進行讀、寫程序前都必須初始化,先把 SCLK 端置 “0”,接著把RST 端置“1 ”,最后才給予 SCLK 脈沖;讀/寫時序如下圖 4 所示。圖 5 為 DS1302 的控制字,此控制字的位 7 必須置 1,若為 0 則不能把對 DS1302 進行讀寫數(shù)據(jù)。對于位6,若對程序進行讀/寫時 RAM=1,對時間進行讀 /寫時,CK=0 。位 1 至位 5 指操作單元的地址。位 0 是讀/寫操作位,進行讀操作時,該位為 1;該位為 0 則表示進行的是寫操作??刂谱止?jié)總是從最低位開始輸入/輸出的。表 6 為 DS1302 的日歷、時間寄存器內(nèi)容:“CH”是時鐘暫停標志位,當該位為 1 時,時鐘振蕩器停止,DS1302 處于低功耗狀態(tài);當該位為 0 時,時鐘開始運行。 “WP”是寫保護位,在任何的對時鐘和RAM 的寫操作之前,WP 必須為 0。當“WP”為 1 時,寫保護位防止對任一寄存器的寫操作。(2)DS1302 的控制字節(jié)DS1302 的控制字如表-1 所示??刂谱止?jié)的高有效位(位 7)必須是邏輯 1,如果它為 0,則不能把數(shù)據(jù)寫入 DS1302 中,位 6 如果 0,則表示存取日歷時鐘數(shù)據(jù),為 1表示存取 RAM 數(shù)據(jù);位 5 至位 1 指示操作單元的地址;最低有效位(位 0)如為 0 表示要進行寫操作,為 1 表示進行讀操作,控制字節(jié)總是從最低位開始輸出。表 3-1 DS1302 的控制字格式RAM RD1 /CK A4 A3 A2 A1 A0 /WR(3)數(shù)據(jù)輸入輸出(I/O)在控制指令字輸入后的下一個 SCLK 時鐘的上升沿時,數(shù)據(jù)被寫入 DS1302,數(shù)據(jù)輸入從低位即位 0 開始。同樣,在緊跟 8 位的控制指令字后的下一個 SCLK 脈沖的下降沿讀出 DS1302 的數(shù)據(jù),讀出數(shù)據(jù)時從低位 0 位到高位 7。如下圖 3-9 所示 黃 河 科 技 學 院 畢 業(yè) 設 計 說 明 書 第 11 頁圖S C L KI / OREST R/W A 0A 1A 2 A 3 A 4R/C 1D 0D 1D 2單字節(jié)讀S C L KI / OREST R/W A 0A 1A 2 A 3 A 4R/C 1D 0D 1D 2單字節(jié)寫3-9 DS1302 讀/寫時序圖(4)DS1302 的寄存器DS1302 有 12 個寄存器,其中有 7 個寄存器與日歷、時鐘相關(guān),存放的數(shù)據(jù)位為BCD 碼形式, 其日歷、時間寄存器及其控制字見表 3-2。表 3-2 DS1302 的日歷、時間寄存器寫寄存器讀寄存器Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit080H 81H CH 10 秒 秒82H 83H 10 分 分1084H 85H 12/24 0AM/PM時 時86H 87H 0 0 10 日 日88H 89H 0 0 0 10 月 月8AH 8BH 0 0 0 0 0 星期8CH 8DH 10 年 年8EH 8FH WP 0 0 0 0 0 0 0此外,DS1302 還有年份寄存器、控制寄存器、充電寄存器、時鐘突發(fā)寄存器及與 RAM 相關(guān)的寄存器等。時鐘突發(fā)寄存器可一次性順序讀寫除充電寄存器外的所有寄存器內(nèi)容。 DS1302 與 RAM 相關(guān)的寄存器分為兩類:一類是單個 RAM 黃 河 科 技 學 院 畢 業(yè) 設 計 說 明 書 第 12 頁單元,共 31 個,每個單元組態(tài)為一個 8 位的字節(jié),其命令控制字為 C0H~FDH ,其中奇數(shù)為讀操作,偶數(shù)為寫操作;另一類為突發(fā)方式下的 RAM 寄存器,此方式下可一次性讀寫所有的 RAM 的 31 個字節(jié),命令控制字為 FEH(寫)、FFH( 讀)。 3.2 系統(tǒng)軟件設計程序開始時先對系統(tǒng)初始化,并設置好各種中斷。首先要給時鐘芯片設置初值,時鐘芯片便自行計數(shù)。此時檢測是否有按鍵按下,按鍵是為了調(diào)整時鐘。有按鍵按下則執(zhí)行按鍵處理程序,沒有按鍵按下則執(zhí)行下一步的操作,即取時鐘芯片中的時鐘值,然后送顯示。程序流程圖如下。系統(tǒng)初始化1 2 8 6 4 初始化顯示按鍵是否按下 按鍵處理程序取時鐘 、 溫度數(shù)據(jù)送 1 2 8 6 4 顯示圖 3-10 程序流程圖Yesno 黃 河 科 技 學 院 畢 業(yè) 設 計 說 明 書 第 13 頁4 仿真與調(diào)試4.1 調(diào)試儀器表 4-1 測試儀器表序 號 名 稱1 PC 機2 ISP 在線編程器3 V8 通用單片機仿真器4 數(shù)字萬用表4.2 硬件測試電子萬年歷的電路系統(tǒng)較大,對電路的要求比較高,尤其是焊接方面更是不可輕視,只要存在一處錯誤,就會對檢測造成很大的不便,而且電路的交線較多,對于各種鋒利的引腳要注意處理,否則會對電路造成短路現(xiàn)象。在本次電子萬年歷的設計調(diào)試中遇到了很多的問題。如果認真小心,這些都是可以避免的,以下為主要的問題:(1)上電之后,溫度傳感器溫度立刻升高,原因在于沒有分清 DS18B20 的1、2、3 引腳,導致溫度傳感器短路,溫度迅速升高。解決:按正確的引腳接法重新焊接 DS18B20,即可正常。(2)電源電路中的 USB 接口采用的是 B 型 USB,但購買元器件時采用的是 A 型USB,電路不可更改的情況下就變得不能正常供電。解決:采用重新打孔,將 B 型接口改裝成 A 型接口,并用導線將電源線調(diào)整。(3)串口方向在畫 PCB 過程中沒有注意到方向,使得不能正常使用串口下載。解決:首先嘗試用排針外接跳線連接到串口線上,方便簡單,但是在使用過程中總是出現(xiàn)斷線問題,使得下載變得很麻煩,后來改用打孔,用跳線將串口方向改過來,焊接在萬年歷板上,即可 黃 河 科 技 學 院 畢 業(yè) 設 計 說 明 書 第 14 頁正常下載和調(diào)試。4.3 軟件測試電子成年歷是多功能的數(shù)字型萬年歷,可查看當前日期(陰、陽歷) 、時間,還有溫度的儀器。因其功能很多,所以對于它的程序也較為復雜,所以在編寫程序和調(diào)試時出現(xiàn)了相對較多的問題。最后經(jīng)過多次的模塊子程序的修改,一步一步的完成,最終解決了軟件。在軟件的調(diào)試過程中主要遇到的問題如下:1.燒入程序后,LCD 只亮不顯示字符。解決:首先只寫 LCD 程序,讓其顯示一個基本的靜態(tài)字符,如果正常顯示可顯示屏正常。其次將靜態(tài)量變?yōu)閯討B(tài)量,使其逐漸開始顯示字符,解決了只顯示空白的問題。2.時間和溫度不能自動對應。解決:把不相關(guān)的程序暫時屏蔽,地農(nóng)歷的子程序獨立調(diào)試,發(fā)現(xiàn)在調(diào)用農(nóng)歷自動更新時,對十進制和十六進制處理不好,所以會造成錯亂。最后把相應的十進制進行修改,使得可以與十六進制對應,最后解決了此問題.3.加入農(nóng)歷的程序后,按鍵不能正常使用。解決:由于 DS18B20 是串行通信數(shù)據(jù),只用一個口線傳輸,在處理采集的模擬信號時需要一定的時間,當把萬年歷的程序相接入時,會對延時有很大的影響。所以在調(diào)用溫度子程序時,先關(guān)閉定時器 1 中斷允許,在溫度子程序反回時再打開定時器 1中斷允許。最終解決了此問題。4.4 測試結(jié)果分析經(jīng)過多次的反復測試與分析,加強對電路的原理及功能的熟悉感,同時提高了設計能力與及對電路的分析能力。同時在軟件的編程方面得到更大的提高,編程能力得到加強,當然,對所學的知識得到很大的提高與鞏固。 黃 河 科 技 學 院 畢 業(yè) 設 計 說 明 書 第 15 頁結(jié)論至此,關(guān)于畢業(yè)設計的所有內(nèi)容就介紹完了,進行這次畢業(yè)設計一切都是從頭開始,從最簡單的查資料、了解各個元件的功能起步,再確定設計方案、畫流程圖,編寫程序到最后進行調(diào)試,在我的個人角度下,這次畢業(yè)設計可以說是成功完成。系統(tǒng)的硬件、軟件設計合理,功能完備,運行穩(wěn)定、可靠。實驗結(jié)果表明此萬年歷實現(xiàn)后具有讀取方便、顯示直觀、功能多樣、電路簡潔等諸多優(yōu)點。在整個設計過程中,充分發(fā)揮了主觀能動性,自主學習,學到了許多沒學到的知識。程序編寫中,由于思路不清晰,開始時遇到了許多問題,經(jīng)過靜下心來思考,并請教了同學,理清了思路,才完成了對程序的編寫。但是由于時間和個人能力的原因,整個系統(tǒng)看起來還是顯得非常的簡單,只實現(xiàn)了一些基本的功能,還有許多不足之處和可以擴展的地方,例如實現(xiàn)鬧鐘報時等,這些有待以后來彌補,還望各位老師予以指正和修改。。 黃 河 科 技 學 院 畢 業(yè) 設 計 說 明 書 第 16 頁致謝經(jīng)過這么長時間的設計,從選題、設計到現(xiàn)在的終稿完成;由于所設計的課題涉及到專業(yè)領(lǐng)域較廣,要用到很多陌生的知識,在整個過程中,得到許多老師和同學們的幫助。在這兩個月來的設計過程中我請教了系中的老師,特別是我的導師蔡超峰老師,他對我的畢業(yè)設計提供了很多條件,同時也有許多同學幫我收集了大量的資料,在設計上給予我很大的幫助,尤其是軟件上?,F(xiàn)在設計已結(jié)束,在這里一并向這些老師和同學們表示感謝。同時感謝關(guān)心我的和我關(guān)心的人。再次,我要感謝一直陪我走完大學四年求學之路的同宿舍的姐妹位,和其他在我學習和生活中幫助過我的人,謝謝他們平時對我無微不致的照顧和關(guān)心。我很興能生活在這樣一個充滿活力的集體中,從他們的身上我學到了很多,看到了自己的不足,在不斷的發(fā)現(xiàn)和改正錯誤中成長,同時他們給我的大學生活留下了許多美好的回憶,讓我受益終生。鑒于本人水平有限,難免存在一些錯誤和漏洞,望各位老師、同學不吝賜教,在此再次向大家表示衷心的感謝。 黃 河 科 技 學 院 畢 業(yè) 設 計 說 明 書 第 17 頁參考文獻[1] 王法能 單片機原理及應用 科學出版社 2004[2] 張毅剛 單片機原理及應用 高等教育出版社 2006[3] 李宗吾.中國萬年歷 .北京:中國科學技術(shù)出版社.2006:115-191[4] 夏墨英.中國天文年歷.北京:科學出版社.1984:1256-2581[5] 周慈航.單片機應用程序設計技術(shù)[H]. 北京:北京航空航天大學出版社,1992[6] Anastasios Alexiadis,Ioannis Refanidis.Defining a Task’s Temporal Domain for Intelligent Calendar Applications[7] 余永權(quán).ATMEL89 系列單片機原理及應用[M]. 西安:電子工業(yè)出版社,1999.[8] 王毅平. MCS-51 單片機原理及應用[H].北京:人民郵電出版社, 1999[9] 陳堅,李昕,黃櫻.CHEN Jian.LI Xin.HUAN Ying 51 單片機最小化應用系統(tǒng)的Proteus 仿真-電腦知識與技術(shù).2008,2(18)[10] 陳正振 電子電路設計與制作 廣西交通職業(yè)技術(shù)學院信息工程系 2007[11] 竇振中 單片機外圍器件實用手冊存儲器分冊 北京航空航天大學出版社 2006[12] Joe Tullio,Elizabeth D.Mynatt.Use and Implications of a Shared,Forecasting Calendar.[13] 王威,劉佳,張志雄等.基于 Proteus 和 Keil 的單片機虛擬仿真平臺的設計-上海電力學院學報.2009,25(6).[14] 閆小坤編 數(shù)字電路 吉林大學出版社 2004[15] 朱定華,戴汝平 .單片機微機原理與應用[M].北京:北京交通大學出版社,2003.[16] Ashraf Khalil,Kay Connelly.Improving Cell Phone Awareness by Using Calendar Information.[17] 51 單片機 C 語言應用開發(fā)技術(shù)大全 龍脈工作室 劉坤 寧戈 趙紅波 張憲棟 人民郵電出版社 2008 年 9 月 黃 河 科 技 學 院 畢 業(yè) 設 計 說 明 書 第 18 頁附錄 A 原理圖P0.732654189VCLE/ROGSNMIKTXDWUYHzF位uZBQ+-()f 黃 河 科 技 學 院 畢 業(yè) 設 計 說 明 書 第 19 頁附錄 B 程序清單#include #include #include #define uchar unsigned char#define uint unsigned intbit w = 0; //調(diào)時標志位 sbit ACC0 = ACC^0;sbit ACC7 = ACC^7;unsigned char YEAR,MONTH,DATE,WEEK,HR,MIN,SEC,SEC100;//DS1302 子程序sbit DS1302_CLK = P3^5; sbit DS1302_IO = P3^6; sbit DS1302_RST = P3^7; void DS1302InputByte(uchar d){ uchar i;ACC = d;for(i=8; i>0; i--){DS1302_IO = ACC0; DS1302_CLK = 1;DS1302_CLK = 0;ACC = ACC >> 1; } }uchar DS1302OutputByte(void){ 黃 河 科 技 學 院 畢 業(yè) 設 計 說 明 書 第 20 頁uchar i;for(i=8; i>0; i--){ACC = ACC >>1; ACC7 = DS1302_IO;DS1302_CLK = 1;DS1302_CLK = 0;} return(ACC); }void Write1302(uchar ucAddr, uchar ucDa){DS1302_RST = 0;DS1302_CLK = 0;DS1302_RST = 1;DS1302InputByte(ucAddr); // 地址,命令 DS1302InputByte(ucDa);// 寫 1Byte 數(shù)據(jù)DS1302_CLK = 1;DS1302_RST = 0;} uchar Read1302(uchar ucAddr)//讀取某地址的數(shù)據(jù){uchar ucData;DS1302_RST = 0;DS1302_CLK = 0;DS1302_RST = 1;DS1302InputByte(ucAddr); ucData = DS1302OutputByte(); DS1302_CLK = 1; 黃 河 科 技 學 院 畢 業(yè) 設 計 說 明 書 第 21 頁DS1302_RST = 0;return(ucData);}void init1302(void) //設置 1302 的初始時間 { uchar cctt;cctt=Read1302(0x80);if(cctt&0x80){Write1302(0x8e,0x00);//允許寫操作Write1302(0x8c,0x0b);//年Write1302(0x8a,0x01);//星期Write1302(0x88,0x06);//月Write1302(0x86,0x06);//日Write1302(0x84,0x00);//小時Write1302(0x82,0x00);//分鐘Write1302(0x80,0x00);//秒Write1302(0x8e,0x80);//禁止寫操作}}/**************溫度************/#define SKIP_ROM 0xF0#define CONVERT_T 0x44#define READ_SCRATCHPAD 0xBEsbit DQ = P2^4;//ds18B20 信號線定義uchar TPH;uchar TPL;void DelayT(int num)//延時函數(shù){ 黃 河 科 技 學 院 畢 業(yè) 設 計 說 明 書 第 22 頁while(num--);}unsigned Init_DS18B20(void)//初始化 ds1820{uint answer_flag; DQ = 0; //單片機將 DQ 拉低DelayT(480); DQ = 1; DelayT(15);answer_flag=DQ; DelayT(240);DelayT(180);return(answer_flag);}uchar ReadBit(void){bit s;DQ=1;_nop_();DQ=0;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();DQ=1;s=DQ;DelayT(60);return(s);} 黃 河 科 技 學 院 畢 業(yè) 設 計 說 明 書 第 23 頁uchar ReadByte(void)//讀一個字節(jié){uchar i,j;uchar dat = 0;for (i=1;i>1);}return(dat);}void WriteByte(uchar dat)//寫一個字節(jié){uint i;bit n;for (i=1; i>1;if(n)//寫 1{DQ=0;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); 黃 河 科 技 學 院 畢 業(yè) 設 計 說 明 書 第 24 頁DQ=1;DelayT(60);}else//寫 0{DQ=0;DelayT(90);DQ=1;_nop_();_nop_();_nop_();_nop_();}}}void convert(void)//溫度轉(zhuǎn)換{Init_DS18B20();if(Init_DS18B20()){DelayT(100);WriteByte(SKIP_ROM);WriteByte(CONVERT_T);}}uint ReadTemp(void)//讀取溫度{uint t=0;float tt=0;convert(); 黃 河 科 技 學 院 畢 業(yè) 設 計 說 明 書 第 25 頁DelayT(100000);Init_DS18B20();if(Init_DS18B20()){DelayT(100);WriteByte(0xcc);WriteByte(0xbe);TPL=ReadByte();TPH=ReadByte();}t=TPH;t= 0x04 && HR = 0x06 && HR = 0x08 && HR = 0x13 && HR = 0x18 && HR = 0x22 && HR = 0x00 && HR 0x2)&&(year%0x4==0)){temp4+=1;}if (temp4>=temp3){temp4-=temp3;MONTHnth=0x1;MONTHnth_p=0x1; flag2=get_MONTHon_day(MONTHnth_p,table_aDATEr); flag_y=0; 黃 河 科 技 學 院 畢 業(yè) 設 計 說 明 書 第 42 頁if(flag2==0)temp1=0x1d; else temp1=0x1e; temp2=year_code[table_aDATEr]&0xf0;temp2=_cror_(temp2,4); while(temp4>=temp1){temp4-=temp1;MONTHnth_p+=1;if(MONTHnth==temp2){flag_y=~flag_y;if(flag_y==0)MONTHnth+=1;}else MONTHnth+=1;flag2=get_MONTHon_day(MONTHnth_p,table_aDATEr);if(flag2==0)temp1=0x1d;else temp1=0x1e;}day=temp4+1;}else{ temp3-=temp4;if (year==0x0){year=0x63;c=1;}else year-=1;table_aDATEr-=0x3;MONTHnth=0xc;temp2=year_code[table_aDATEr]&0xf0;temp2=_cror_(temp2,4);if (temp2==0)MONTHnth_p=0xc; else MONTHnth_p=0xd; // 黃 河 科 技 學 院 畢 業(yè) 設 計 說 明 書 第 43 頁flag_y=0;flag2=get_MONTHon_day(MONTHnth_p,table_aDATEr);if(flag2==0)temp1=0x1d;else temp1=0x1e;while(temp3>temp1){temp3-=temp1;MONTHnth_p-=1;if(flag_y==0)MONTHnth-=1;if(MONTHnth==temp2)flag_y=~flag_y;flag2=get_MONTHon_day(MONTHnth_p,table_aDATEr);if(flag2==0)temp1=0x1d;else temp1=0x1e;}day=temp1-temp3+1;}c_MONTHon=c; temp1=year/10;temp1=_crol_(temp1,4);temp2=year%10;year_MONTHon=temp1|temp2;temp1=MONTHnth/10;temp1=_crol_(temp1,4);temp2=MONTHnth%10;MONTHnth_MONTHon=temp1|temp2;temp1=day/10;temp1=_crol_(temp1,4);temp2=day%10;day_MONTHon=temp1|temp2; 黃 河 科 技 學 院 畢 業(yè) 設 計 說 明 書 第 44 頁}void nl(){unsigned char yy1,yy2;Conversion(0,YEAR,MONTH,DATE);writecom(0x90);writestring("20");writedat(year_MONTHon/16+'0');writedat(year_MONTHon%16+'0');writedat('/');writedat(MONTHnth_MONTHon/16+'0');writedat(MONTHnth_MONTHon%16+'0');writedat('/');writedat(day_MONTHon/16+'0');writedat(day_MONTHon%16+'0');yy1=(year_MONTHon/16)*10+year_MONTHon%16;yy2=yy1%12;switch(yy2){case 0: writecom(0x87);writestring("龍");break;case 1: writecom(0x87);writestring("蛇");break;case 2: writecom(0x87);writestring("馬");break;case 3: writecom(0x87);writestring("羊");break;case 4: writecom(0x87);writestring("猴"); 黃 河 科 技 學 院 畢 業(yè) 設 計 說 明 書 第 45 頁break;case 5: writecom(0x87);writestring("雞");break;case 6: writecom(0x87);writestring("狗");break;case 7: writecom(0x87);writestring("豬");break;case 8: writecom(0x87);writestring("鼠");break;case 9: writecom(0x87);writestring("牛");break;case 10: writecom(0x87);writestring("虎");break;case 11: writecom(0x87);writestring("兔");break;}}//向 LCD 中填寫 年 數(shù)據(jù)void writeyear(void){YEAR= Read1302(0x8d);writecom(0x80);writestring("20");writecom(0x81);writedat((YEAR/16)+0x30);writedat(YEAR%16+0x30);writecom(0x82);writestring("年"); 黃 河 科 技 學 院 畢 業(yè) 設 計 說 明 書 第 46 頁nl(); }//向 LCD 中填寫 月 數(shù)據(jù)void writemonth(void){MONTH = Read1302(0x89);writecom(0x83);if(MONTH/16 != 0){writedat((MONTH/16)+0x30);} //十位消隱else{writedat(0x20);}//同上writedat(MONTH%16+0x30);writecom(0x84);writestring("月");nl();}//星期處理并送入 LCM 的指定區(qū)域void writeweek(void){uchar sel;WEEK = Read1302(0x8b);sel = (Read1302(0x8b))%16; writecom(0x97);if(sel==7) {writestring("日");} //if(sel==6) {writestring("六");} //if(sel==5) {writestring("五");} //if(sel==4) {writestring("四");} //if(sel==3) {writestring("三");}//writedat(0xc8);LCM_WriteDatOrCom(1,0xfd);} //此指令等于LCM_WriteString("三"); 因為 "三"的內(nèi)碼失效。 黃 河 科 技 學 院 畢 業(yè) 設 計 說 明 書 第 47 頁if(sel==2) {writestring("二");} //if(sel==1) {writestring("一");} //星期一writecom(0x95);writestring("星期");}//向 LCM 中填寫 日 數(shù)據(jù)void writedate(void){DATE = Read1302(0x87);writecom(0x85);if(DATE/16 != 0){writedat((DATE/16)+0x30);} //十位消隱else{writedat(0x20);}//同上writedat(DATE%16+0x30);writecom(0x86);writestring("日");nl();}//向 LCM 中填寫 小時 數(shù)據(jù)void writehr(void){if(Read1302(0x85)!= HR){HR = Read1302(0x85);if (HR > 0x07 && HR max) item=mini;if(item= 6 ){e = 0;}Set_time(e);//調(diào)整}if(KEY_4 == 0 && w == 0) {clrlcd();//清屏w=1; //進入調(diào)時}while(KEY_4 == 0);//等待鍵松開 }else if (KEY_1 == 0) {DelayM(20);if(KEY_1 == 0 && w == 1){w = 0; e = 0;}if(KEY_1 == 0 && w == 0){clrlcd();//清屏display(dis_char);while(KEY_1 == 0); }clrlcd();//清屏days(); //節(jié)日顯示 黃 河 科 技 學 院 畢 業(yè) 設 計 說 明 書 第 53 頁updata (); //刷新數(shù)據(jù)writemin();//刷新 分nl();while(KEY_1 == 0);//等待鍵松開 }else if (KEY_2 == 0 && w == 1)// 加減調(diào)整{ DelayM(20);if(KEY_2 == 0 && w == 1){Set_time(e);//調(diào)整}while(KEY_2 == 0);//等待鍵松開}else if (KEY_3 == 0 && w == 1)// 加減調(diào)整 { DelayM(20);if(KEY_3 == 0 && w == 1){Set_time(e);//調(diào)整}while(KEY_3 == 0);//等待鍵松開}}main() {uchar e=0;KEY_1 = 10;KEY_2 = 0;KEY_3 = 0;KEY_4 = 0;//初始鍵盤YEAR=0xff;MONTH=0xff;DATE=0xff;WEEK=0xff;HR=0xff;MIN=0xff;SEC=0xff; //各數(shù)據(jù)刷新beep = 0; 黃 河 科 技 學 院 畢 業(yè) 設 計 說 明 書 第 54 頁DelayM(900);beep = 1;initlcd();//初始化液晶顯示器clrlcd();//清屏display(dis_char);//顯示歡迎字DelayM(8000); //顯示等留 3 秒clrlcd();//清屏 init1302();Init_DS18B20();while(1){Keydone();}}(程序不在論文里給出來,太長了!)
收藏