版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、中國計量學(xué)院 課程設(shè)計 課程設(shè)計名稱: 智能儀表課程設(shè)計 題目 : 秒表/時鐘計時器,萬年歷的設(shè)計 指導(dǎo)教師 : 班級 : 07自動化2班 姓名 : 時間 : 2010/06/152010/07/1 2010年 7月 30 日目 錄1、簡介- 2 -2、設(shè)計目的- 2 -3、設(shè)計要求- 2 -4、系統(tǒng)方案- 3 -4.1電路設(shè)計:- 3 -4.2 系統(tǒng)硬件概述- 3 -4.2.1 主控制器at89s52- 3 -4.2.2時鐘電路ds1302- 4 -4.2.3 顯示驅(qū)動lcd1602- 5 -4.2.4 鍵盤接口- 6 -4.2.5 時鐘電路- 7 -4.3 系統(tǒng)軟件設(shè)計- 9 -4.3.1
2、 程序設(shè)計- 9 -4.3.2 程序流程圖- 10 -4.3.3陽歷程序的設(shè)計- 11 -4.3.4 時間調(diào)整程序設(shè)計- 11 -4.3.5陰歷程序設(shè)計- 13 -5結(jié)論- 15 -6設(shè)計心得- 16 -參考文獻(xiàn)- 16 -附錄- 16 -1、簡介隨著社會、科技的發(fā)展,人類得知時間,從觀太陽、擺鐘到現(xiàn)在電子鐘,不斷研究、創(chuàng)新。為了在觀測時間的同時,能夠了解其它與人類密切相關(guān)的信息,比如星期、日期等,電子萬年歷誕生了,它集時間、日期、星期功能于一身,具有讀取方便、顯示直觀、功能多樣、電路簡潔等諸多優(yōu)點,符合電子儀器儀表的發(fā)展趨勢,具有廣闊的市場前景。該電子萬年歷主要采用at89s52單片機(jī)作為主
3、控核心,由ds1302時鐘芯片提供時鐘、lcd動態(tài)掃描顯示屏顯示。at89s52單片機(jī)功耗小,有較強(qiáng)抗干擾能力;ds1302時鐘芯片是美國dallas公司推出的具有涓細(xì)電流充電功能的低功耗實時時鐘芯片,它可以對年、月、日、星期、時、分、秒進(jìn)行計時,還具有閏年補(bǔ)償?shù)榷喾N功能,而且ds1302的使用壽命長,誤差小;數(shù)字顯示是采用的lcd1602顯示屏來顯示,可以同時顯示年、月、日、星期、時、分、秒和對應(yīng)農(nóng)歷等信息。此外,該電子萬年歷還具有時間校準(zhǔn)等功能。2、設(shè)計目的智能儀表課程設(shè)計是自動化專業(yè)的專業(yè)實踐課程。本課程的目的是通過“秒表/時鐘計時器,萬年歷”的設(shè)計過程,結(jié)合所學(xué)課程,使學(xué)生掌握目前自動
4、化儀表的一般設(shè)計要求、工程設(shè)計方法、開發(fā)及設(shè)計工具的使用方法,通過這一設(shè)計實踐過程,鍛煉學(xué)生的動手能力和分析、解決問題的能力;積累經(jīng)驗,培養(yǎng)一絲不茍的工作態(tài)度和對所學(xué)知識的綜合應(yīng)用能力。 3、設(shè)計要求 1、 用六位led數(shù)碼管或lcm液晶顯示模塊顯示時、分、秒;2、 以24h計時方式計時;3、 使用按鍵開關(guān)可實現(xiàn)時分調(diào)整;4、 秒表/時鐘/萬年歷轉(zhuǎn)換功能;5、 帶有一定的擴(kuò)展功能:、省電模式功能;、可查萬年歷(包括農(nóng)歷)功能;4、系統(tǒng)方案4.1電路設(shè)計:圖示為電子萬年歷電路設(shè)計原理圖,系統(tǒng)由主控制器at89s52、時鐘電路ds1302、顯示電路及鍵掃描電路組成。 圖 4.1 秒表/時鐘計時器,
5、萬年歷電路圖4.2 系統(tǒng)硬件概述4.2.1 主控制器at89s52at89s52單片機(jī)采用高性能的靜態(tài)80s51設(shè)計,并采用先進(jìn)工藝制造,還帶有非易失性flash程序存儲器。它是一種高性能、低功耗的cmos微處理芯片,市場應(yīng)用最多。其主要特點如下:8kb flash rom,可以擦除1000次以上,數(shù)據(jù)保存10年。 256字節(jié)內(nèi)部ram; 電源控制模式; 時鐘可停止和恢復(fù); 空閑模式; 掉電模式; 6個中斷源; 4個中斷優(yōu)先級; 4個8位i/o口; 全雙工增強(qiáng)型tuar; 3個16位定時/計數(shù)器:t0、t1(標(biāo)準(zhǔn)80c51)和增加的t2(捕獲和比較) 全靜態(tài)工作方式:024mhz 4.2.2時
6、鐘電路ds1302 ds1302的性能特性: 實時時鐘,可對秒、分、時、日、周、月以及帶閏年補(bǔ)償?shù)哪赀M(jìn)行比較; 用于高速數(shù)據(jù)暫存的31*8位ram; 最少引腳的串行i/o; 2.55.5v電壓工作范圍; 2.5v時耗小于300na; 用于時鐘或ram數(shù)據(jù)讀/寫的單字節(jié)或多字節(jié)(脈沖方式)數(shù)據(jù)傳送方式; 簡單的三線接口; 可選的慢速充電(至vcc1)的能力。ds1302在任何數(shù)據(jù)傳送時必須先初始化,把rst腳置為高電平,然后把8位地址和命令字裝入移位寄存器,數(shù)據(jù)在sclk的上升沿被訪問到。在開始8個時鐘周期,把命令字節(jié)裝入移位寄存器后,另外的時鐘周期在讀操作時輸出數(shù)據(jù),在寫操作時寫入數(shù)據(jù)。時鐘脈
7、沖的個數(shù)在單字節(jié)方式下為8+8,在多字節(jié)方式下為8+字節(jié)數(shù),最大可達(dá)248字節(jié)數(shù)。如果在傳送過程中置rst腳為低電平,則會終止本次數(shù)據(jù)傳送,并且i/o引腳變?yōu)楦咦钁B(tài)。上電運行時,在vcc2.5v之前,rst腳必須保持低電平。只有在sclk為低電平時,才能將rst置為高電平。ds1302的控制字如表所示??刂谱止?jié)的最高有效位(位7)必須是邏輯1,如果它為0,則不能把數(shù)據(jù)寫入到ds1302中。位6如果為0,則表示存取日歷時鐘數(shù)據(jù);為1則表示存取ram數(shù)據(jù)。位51(a4a0)指示操作單元的地址。最低有效位(位0)如果為0,則表示藥進(jìn)行寫操作;為1表示進(jìn)行讀操作??刂谱止?jié)總是從最低位開始輸入/輸出。為
8、了提高對32個地址尋址能力(地址/命令位15=邏輯1),可以把時鐘/日歷或ram寄存器規(guī)定為多字節(jié)(burst)方式。位6規(guī)定時鐘或ram,而位0規(guī)定讀或?qū)憽T跁r鐘/日歷寄存器中的地址931或ram寄存器中的地址31不能存儲數(shù)據(jù)。在多字節(jié)方式下,讀或?qū)憦牡刂?的位0開始。必須按數(shù)據(jù)傳送的次序?qū)懽钕鹊?個寄存器。但是,當(dāng)以多字節(jié)方式寫ram時,為了傳送數(shù)據(jù)不必寫所有的31字節(jié),不管是否謝了全部31字節(jié),所寫的每一字節(jié)都將傳送至ram。表2.1 ds1302控制字 ds1302共有12個寄存器,其中有7個寄存器與日歷、時鐘相關(guān),存放的數(shù)據(jù)位為bcd碼形式。其日歷、時間寄存器及其控制字如上表所示,其
9、中奇數(shù)為讀操作,偶數(shù)為寫操作。時鐘暫停:秒寄存器的位7定義位時鐘暫停位。當(dāng)它為1時,ds1302停止振蕩,進(jìn)入低功耗的備份方式,通常在對ds1302進(jìn)行寫操作時(如進(jìn)入時鐘調(diào)整程序),停止振蕩。當(dāng)它為0時,時鐘將開始啟動。 am-pm/12-24小時方式:小時寄存器的位7定義為12或24小時方式選擇位。它為高電平時,選擇12小時方式。在此方式下,位5為第二個10小時位(2023h)。 ds1302的晶振選用32768hz,電容推薦值為6pf。因為振蕩頻率較低,也可以不接電容,對計時精度影響不大。4.2.3 顯示驅(qū)動lcd16021.位數(shù)多,可顯示32位,32個數(shù)碼管體積相當(dāng)龐大了。2.顯示內(nèi)容
10、豐富,可顯示所有數(shù)字和大、小寫字母。3.程序簡單,如果用數(shù)碼管動態(tài)顯示,會占用很多時間來刷新顯示,而1602自動完成此功能。1602采用標(biāo)準(zhǔn)的16腳接口,其中:(模塊背面有標(biāo)注)第1腳:vss為地電源第2腳:vdd接5v正電源第3腳:v0為液晶顯示器對比度調(diào)整端,接正電源時對比度最弱,接地電源時對比度最高,對比度過高時會產(chǎn)生“鬼影”,使用時可以通過一個10k的電位器調(diào)整對比度(建議接地,弄不好有的模塊會不顯示)第4腳:rs為寄存器選擇,高電平時選擇數(shù)據(jù)寄存器、低電平時選擇指令寄存器。第5腳:rw為讀寫信號線,高電平時進(jìn)行讀操作,低電平時進(jìn)行寫操作。第6腳:e端為使能端,當(dāng)e端由高電平跳變成低電
11、平時,液晶模塊執(zhí)行命令。第714腳:d0d7為8位雙向數(shù)據(jù)線。第1516腳:空腳(有的用來接背光)4.2.4 鍵盤接口鍵盤在單片機(jī)系統(tǒng)中是一個很重要的部件。為了輸入數(shù)據(jù)、查詢和控制系統(tǒng)的工作狀態(tài),都要用到鍵盤,鍵盤是人工干預(yù)計算機(jī)的主要手段。鍵盤可分為編碼和非編碼鍵盤兩種。編碼鍵盤采用硬件線線路來實現(xiàn)鍵盤編碼,每按下一個鍵,鍵盤能自動生成按鍵代碼,鍵數(shù)較多,而且還具有去抖動功能。這種鍵盤使用方便,但硬件較復(fù)雜,pc機(jī)所用的鍵盤就屬于這種。非編碼鍵盤僅提供按鍵開關(guān)工作狀態(tài),其他工作由軟件完成,這種鍵盤鍵數(shù)較少,硬件簡單,一般在單片機(jī)應(yīng)用系統(tǒng)中廣泛使用。此處主要介紹該類非編碼鍵盤及其與mcs51型
12、單片機(jī)的接口。1按鍵開關(guān)去抖動問題按鍵開關(guān)在電路中的連接如圖所示。按鍵未按下時,a點電位為高電平5v;按鍵按下時,a點電位為低電平。a點電位就用于向cpu傳遞按鍵的開關(guān)狀態(tài)。但是由于按鍵的結(jié)構(gòu)為機(jī)械彈性開關(guān),在按鍵按下和斷開時,觸點在閉合和斷開瞬間還會接觸不穩(wěn)定,引起a點電平不穩(wěn)定,如圖2-11b所示,鍵盤的抖動時間一般為510ms,抖動現(xiàn)象會引起cpu對一次鍵操作進(jìn)行多次處理,從而可能產(chǎn)生錯誤。因此必須設(shè)法消除抖動的不良后果。圖2.3 鍵操作和鍵抖動消除抖動的不良后果的方法有硬、軟件兩種。為了節(jié)省硬件,通常在單片機(jī)系統(tǒng)中,一般不采用硬件方法消除鍵的抖動,而是用軟件消除抖動的方法。根據(jù)抖動特性
13、,在第一次檢測到按鍵按下后,執(zhí)行一段延時510ms讓前延抖動消失后再一次檢測鍵的狀態(tài),如果仍保持閉合狀態(tài)電平,則確認(rèn)真正有鍵按下。當(dāng)檢測到按鍵釋放后,也要給510ms的延時,待后延抖動消失后才轉(zhuǎn)入該鍵處理程序。2鍵盤掃描控制方式在單片機(jī)應(yīng)用系統(tǒng)中,對鍵盤的處理工作僅是cpu工作內(nèi)容的一部分,cpu還要進(jìn)行數(shù)據(jù)處理、顯示和其他輸入輸出操作,因此鍵盤處理工作既不能占用cpu太多時間,又需要cpu對鍵盤操作及時作出響應(yīng)。cpu對鍵盤處理控制的工作方式有以下幾種:1. 程序控制掃描方式程序控制掃描方式是在cpu工作空余,調(diào)用鍵盤掃描子程序,響應(yīng)鍵輸入信號要求。2. 定時控制掃描方式定時控制掃描方式是利
14、用定時/計數(shù)器每隔一段時間和生定時中斷,cpu響應(yīng)中斷后對鍵盤進(jìn)行掃描,并在有鍵閉合時轉(zhuǎn)入該鍵的功能子程序。3. 中斷控制掃描方式中斷控制掃描方式是利用外部中斷源,響應(yīng)輸入信號。當(dāng)無按鍵按下時,cpu執(zhí)行正常工作程序。當(dāng)有按鍵按下時,cpu立即產(chǎn)生中斷。在中斷服務(wù)子程序中掃描鍵盤,判斷是哪一個鍵被按下,然后執(zhí)行該鍵的功能子程序。這種控制方式克服了前兩種控制方式可能產(chǎn)生的空掃描和不能及時響應(yīng)鍵輸入的缺點,既能及時處理鍵輸入,又能提高cpu運行效率,但要占用一個寶貴的中斷資源。圖即工作于中斷方式的矩陣式鍵盤接口電路。在初始化時p1.4p1.7置輸出0,p1.0p1.3置為輸入態(tài),p1.0p1.3分
15、別接至與門各輸入端。當(dāng)有鍵閉合時=0,cpu中斷后,在中斷服務(wù)子程序中,再完成鍵識別和鍵功能處理。本設(shè)計提供了解4個按鈕的小鍵盤,向p1口輸出低電平,如果有鍵盤斷按下什么鍵。在有鍵按下后,有一定的延時,防止鍵盤抖動。通過程序的掃描,判斷按鍵,并切換到不同的功能模式中。4.2.5 時鐘電路ds1302工作方式簡介及數(shù)據(jù)操作原理ds1302可以對年、月、日、星期、時、分、秒進(jìn)行計時, 且具有閏年補(bǔ)償功能, 工作電壓寬達(dá)2.55.5v。采用三線接口與cpu進(jìn)行同步通信, 并可采用突發(fā)方式一次傳送多個字節(jié)的時鐘信號或ram數(shù)據(jù)。ds1302內(nèi)部有一個33x8的用于臨時性存放數(shù)據(jù)的ram寄存器。ds13
16、02是的ds1202升級產(chǎn)品, 與ds1202兼容, 但增加了主電源/后背電源雙電源引腳, 同時提供了對后背電源進(jìn)行涓細(xì)電流充電的能力。ds1302時鐘芯片包括實時時鐘/日歷和31字節(jié)的靜態(tài)ram。它經(jīng)過一個簡單的串行接口與微處理器通信。實時時鐘/日歷提供秒、分、時、日、周、月和年等信息。對于小于31天的月和月末的日期自動進(jìn)行調(diào)整,還包括閏年校正的功能。時鐘的運行可以采用24時或帶am/pm的12小時格式。采用三線接口與cpu進(jìn)行同步通信,并可采用突發(fā)方式一次傳送多字節(jié)的時鐘信號或ram數(shù)據(jù)。ds1302有主電源/后備電源雙電源引腳:vcc1在單電源與電池供電的系統(tǒng)中提供低電源,并提供低功率的
17、電磁備份;vcc1在雙電池系統(tǒng)中提供主電源。在這種運行方式中,vcc1里連接到后備電源,以便在沒有主電源的情況下能保存時間信息以及數(shù)據(jù)。ds1302由vcc1或vcc2中較打大者供電。當(dāng)vcc2(vcc1+0.2v)時,vcc2給ds1302供電;當(dāng)vcc2vcc1時,ds1302由vcc1供電。 圖2.5 ds1302ds1302在任何數(shù)據(jù)傳送時必須先初始化,把rst腳置為高電平,然后把8位地址和命令字裝入移位寄存器,數(shù)據(jù)在sclk的上升沿被訪問到。在開始8個時鐘周期,把命令字節(jié)裝入移位寄存器后,另外的時鐘周期在讀操作時輸出數(shù)據(jù),在寫操作時寫入數(shù)據(jù)。時鐘脈沖的個數(shù)在單字節(jié)方式下為8+8,在多
18、字節(jié)方式下為8+字節(jié)數(shù),最大可達(dá)248字節(jié)數(shù)。如果在傳送過程中置rst腳為低電平,則會終止本次數(shù)據(jù)傳送,并且i/o引腳變?yōu)楦咦钁B(tài)。上電運行時,在vcc2.5v之前,rst腳必須保持低電平。只有在sclk為低電平時,才能將rst置為高電平。ds1302的控制字如圖所示??刂谱止?jié)的最高有效位(位7)必須是邏輯1,如果它為0,則不能把數(shù)據(jù)寫入到ds1302中。位6如果為0,則表示存取日歷時鐘數(shù)據(jù);為1則表示存取ram數(shù)據(jù)。位51(a4a0)指示操作單元的地址。最低有效位(位0)如果為0,則表示藥進(jìn)行寫操作;為1表示進(jìn)行讀操作??刂谱止?jié)總是從最低位開始輸入/輸出。為了提高對32個地址尋址能力(地址/命
19、令位15=邏輯1),可以把時鐘/日歷或ram寄存器規(guī)定為多字節(jié)(burst)方式。位6規(guī)定時鐘或ram,而位0規(guī)定讀或?qū)?。在時鐘/日歷寄存器中的地址931或ram寄存器中的地址31不能存儲數(shù)據(jù)。在多字節(jié)方式下,讀或?qū)憦牡刂?的位0開始。必須按數(shù)據(jù)傳送的次序?qū)懽钕鹊?個寄存器。但是,當(dāng)以多字節(jié)方式寫ram時,為了傳送數(shù)據(jù)不必寫所有的31字節(jié),不管是否謝了全部31字節(jié),所寫的每一字節(jié)都將傳送至ram。ds1302共有12個寄存器,其中有7個寄存器與日歷、時鐘相關(guān),存放的數(shù)據(jù)位為bcd碼形式。其日歷、時間寄存器及其控制字如下表所示,其中奇數(shù)為讀操作,偶數(shù)為寫操作。表2.3 ds1302控制字 時鐘暫
20、停:秒寄存器的位7定義位時鐘暫停位。當(dāng)它為1時,ds1302停止振蕩,進(jìn)入低功耗的備份方式,通常在對ds1302進(jìn)行寫操作時(如進(jìn)入時鐘調(diào)整程序),停止振蕩。當(dāng)它為0時,時鐘將開始啟動。 am-pm/12-24小時方式:小時寄存器的位7定義為12或24小時方式選擇位。它為高電平時,選擇12小時方式。在此方式下,位5為第二個10小時位(2023h)。 ds1302的晶振選用32768hz,電容推薦值為6pf。因為振蕩頻率較低,也可以不接電容,對計時精度影響不大。4.3 系統(tǒng)軟件設(shè)計4.3.1 程序設(shè)計電子萬年歷的程序主要包括3個方面的內(nèi)容:一是ds1302從單片機(jī)中讀取數(shù)據(jù)進(jìn)行計數(shù),二是利用按鍵
21、進(jìn)行時間的調(diào)整,三是單片機(jī)中讀取的數(shù)據(jù)進(jìn)行代碼轉(zhuǎn)換并驅(qū)動lcd顯示時間。4.3.2 程序流程圖開始全局變量初始化定時器初始化ds1302初始化彩屏初始化開機(jī)動畫mode=0mode=2mode=1部分按鍵掃描部分按鍵掃描讀取ds1302時鐘顯示數(shù)碼轉(zhuǎn)化及l(fā)cd顯示按鍵鍵值處理按鍵鍵值處理部分按鍵掃描顯示數(shù)碼轉(zhuǎn)化及l(fā)cd顯示顯示數(shù)碼轉(zhuǎn)化及l(fā)cd顯示按鍵鍵值處理 圖11 程序流程圖 4.3.3陽歷程序的設(shè)計因為使用了時鐘芯片ds1302,陽歷程序只需從ds1302各寄存器中讀出年、周、月、日、小時、分、秒等數(shù)據(jù),再處理即可。在首次對ds1302進(jìn)行操作之前,必須對它進(jìn)行初始化,然后從ds1302中
22、讀出數(shù)據(jù),再經(jīng)過處理后,送給顯示緩沖單元。陽歷程序流程圖見圖4-3-3所示開 始初始化ds13021302開始振蕩從1302中讀出年、周、月、日、小時、分、秒將bcd碼高低位分離,送顯示緩沖單元圖4-3-3 陽歷程序流程圖4.3.4 時間調(diào)整程序設(shè)計調(diào)整時間用三個調(diào)整按鈕,一個作為移位、控制用,一個作為加用,一個作為減一調(diào)整。分別定義為控制按鈕、加按鈕、減一按鈕。時間調(diào)整程序流程圖如圖4-3-4所示:控制鍵有效,進(jìn)入年調(diào)整程序等待按鍵程序加鍵有效分加1控制鍵有效,進(jìn)入月調(diào)整程序控制鍵有效,進(jìn)入日調(diào)整程序控制鍵有效,進(jìn)入時調(diào)整程序控制鍵有效,進(jìn)入分調(diào)整程序等待按鍵程序加鍵有效時加1等待按鍵程序加
23、鍵有效日加1等待按鍵程序加鍵有效月時加1等待按鍵程序加鍵有效年加1控制鍵有效,跳出時間調(diào)整程序,進(jìn)入主循環(huán)程序圖4-3-4 時間調(diào)整程序流程圖4.3.5陰歷程序設(shè)計陰歷程序的實現(xiàn)是要靠陽歷日期來推算的。要根據(jù)陽歷來推算陰歷日期,首先要設(shè)計算法。推算方法是,根據(jù)陽歷當(dāng)前日期在一年中的天數(shù)來計算陰歷日期。陽歷一個月不是30天就是31天(2月除外,閏年2月為29天,平年2月為28天)。陰歷一年有12個月或13個月(含閏月),一個月為30天或29天。如果把一個只有29天的月稱為小月,用1為標(biāo)志,把30天的月稱為大月,用0為標(biāo)志,那么12位二進(jìn)制就能表示一年12個月的大小。如果有閏月,則把閏月的月份作為
24、一個字節(jié)的高4位,低4位表示閏月大小,大月為0,小月為1,這樣一個字節(jié)就包括了所有閏月的信息。陰歷春節(jié)和陽歷元旦相差的天數(shù)也用一個字節(jié)表示。總共用4字節(jié)就可以存儲一年中任何一天陽歷和陰歷的對應(yīng)關(guān)系的有關(guān)數(shù)據(jù),例如2004年的陰歷和陽歷對應(yīng)關(guān)系如表4-3-5-1所示。表4-3-5-1 2004年的陰歷和陽歷對應(yīng)關(guān)系表月份123456789101112閏2月大小小大大大小大小大小大小大小二進(jìn)制0111010101010天數(shù) 293030302930293029302930十六進(jìn)制4252212004年的春節(jié)和元旦差21天,這樣2004年的信息表示為:21,42h,52h,21h。其中表示12個月大
25、小信息的字節(jié),第4位和第7位不用,第1個字節(jié)為十進(jìn)制,其它的都為十六進(jìn)制。按此方法,50年的陽歷和陰歷對應(yīng)關(guān)系表總共使用200字節(jié)。有了算法和數(shù)據(jù)以后,就可以設(shè)計軟件了。先要根據(jù)當(dāng)前陽歷的日期,算出陽歷為該年中的第幾天。圖4-3-5-2為計算陽歷中任何一天在該年中為第幾天的程序流程圖。置陽歷總天數(shù)為0當(dāng)前月為1月?總天數(shù)中加入該月天數(shù)月數(shù)加1與當(dāng)前月同?總天數(shù)中加入號數(shù)當(dāng)前號數(shù)是總天數(shù)計算陽歷天數(shù)結(jié)束,總天數(shù)中的數(shù)據(jù)為當(dāng)前日期在陽歷年中為第幾天ynny圖4-3-5-2 計算陽歷天數(shù)程序流程圖計算出當(dāng)前陽歷日期為該年中的第幾天后,再減去陽歷該年春節(jié)和元旦的日差,如果夠減,則相減的結(jié)果就是陰歷在該
26、年中的總第幾天了。根據(jù)該數(shù)據(jù)就可以推算出具體的當(dāng)前陰歷日期;如果不夠減,則表示當(dāng)前陰歷年為陽歷年的前一年。這種情況下,根據(jù)實際,當(dāng)前陰歷日期會處于陰歷11月或12月,此時春節(jié)和元旦的日差減去前面計算出的當(dāng)前陽歷日期在陽歷年為第幾天的數(shù)據(jù),其結(jié)果表示當(dāng)前陰歷日期離春節(jié)的天數(shù)。計算出的陽歷天數(shù)為該年的第幾天,存放在寄存器r2和r3中。計算出天數(shù)后,如果大于#ffh,則把#ffh存放在r2中,余值存放在r3中。也就是說在用寄存器r2和r3表示的天數(shù)信息中,r2充當(dāng)主寄存器,數(shù)據(jù)先存滿r2,再存r3。在整個轉(zhuǎn)換程序中,這里面的數(shù)據(jù)不能被覆蓋。計算出陽歷總天數(shù)后,就可以根據(jù)它來推算陰歷日期。推算方法是,
27、先用總天數(shù)減去春節(jié)和元旦的日差,如果結(jié)果為1,則該天正好是春節(jié)(因為春節(jié)在元旦之后,在計算春節(jié)和元旦的日差時,假設(shè)元旦為0天,春節(jié)為n天,則日差為n。而前面計算的陽歷總天數(shù)是該天在該年中的第幾天,是以元旦為1而得到的,與計算春節(jié)和元旦日差的這樣方法相比,其數(shù)值少了1,所以要在原來本應(yīng)該以0作為該天就是春節(jié)的依據(jù)的基礎(chǔ)上加1,所以以1作為該天是春節(jié)的標(biāo)志);如果結(jié)果小于1,則陰歷應(yīng)該是陽歷的前一年;如果結(jié)果大于1,說明陽歷和陰歷為同一年。再根據(jù)查表所得的該年的陰歷的閏年和大小月的信息,就可以推算出該天的陰歷日期了。圖4-3-5-3為由總天數(shù)推算出陰歷日期的程序流程圖。程序入口r2減1個月天數(shù) 夠
28、減?下個月為閏月?減去閏月天數(shù)月加1月份為當(dāng)前正在減的月份的前一個月的最后一天月份為當(dāng)前正在減的月份,號數(shù)為r2中的值r2=0?r3=0?r2=r2+r3r3=0yyyynnnn圖4-3-5-3 推算陰歷日期的程序流程圖5結(jié)論本設(shè)計硬件電路較簡單,所用器件較少,電路中使用了at89s52單片機(jī)、ds1302時鐘芯片、lcd1602液晶顯示器等主要芯片,實現(xiàn)了預(yù)計功能。在對芯片的管腳功能和用法有充分的了解后,根據(jù)設(shè)計要求設(shè)計硬件電路,包括單片機(jī)控制電路、時鐘電路、鍵盤掃描電路、顯示電路。然后通過軟件編程,實現(xiàn)了對年、月、日、時、分、秒、星期、閏年和陰歷的自動調(diào)整,用按鍵進(jìn)行控制,用液晶模塊進(jìn)行顯
29、示,實現(xiàn)切換等功能。電子萬年歷可以正常顯示時間并進(jìn)行時間調(diào)整,基本完成了預(yù)期要實現(xiàn)的目標(biāo)。6設(shè)計心得 硬件電路乍看起來很簡單,但是要把電路完全焊接正確也是相當(dāng)困難的,它需要我們仔細(xì),認(rèn)真。 在軟件聯(lián)合調(diào)試上,也會出現(xiàn)這樣那樣的問題,往往會有程序的死角或是許多錯誤,通過細(xì)心的調(diào)試,學(xué)到了很多,也學(xué)到了一些編程的技巧。做編程的工作不但鍛煉了我們編程的能力,更培養(yǎng)了細(xì)心、嚴(yán)謹(jǐn)?shù)淖黠L(fēng),我覺得對以后的工作中很有用。腳踏實地,認(rèn)真嚴(yán)謹(jǐn),實事求是的學(xué)習(xí)態(tài)度,不怕困難、堅持不懈、吃苦耐勞的精神是我在這次設(shè)計中最大的收益。我想這是一次意志的磨練,是對我實際能力的一次提升,也會對我未來的學(xué)習(xí)和工作有很大的幫助 經(jīng)
30、過幾天的程序設(shè)計和硬件設(shè)計,我感觸頗深的是解決問題的方法、技巧。在這幾天中,我們遇到許許多多問題,對待問題要多方法處理,多角度處理。通過這幾天的課程設(shè)計,我們不但增強(qiáng)了實踐能力和協(xié)作精神,而且懂得了聯(lián)系實際的重要性,也懂得了什么叫團(tuán)隊合作,這對我們以后的學(xué)習(xí)和工作不無裨益。當(dāng)然,我們的設(shè)計還存在著一些缺陷,有待于在將來設(shè)計中進(jìn)一步提高,在此懇請各位老師批評指正。參考文獻(xiàn)1 趙亮.單片機(jī)c語言編程與實例,人民郵電出版社2 王偉高性能、低功耗帶ram實時時鐘芯片ds1302(上),電子世界3 王偉高性能、低功耗帶ram實時時鐘芯片ds1302(下),電子世界4 樓然苗,李光飛mcs51系列單片機(jī)設(shè)
31、計實例,北京:北京航天航空大學(xué)出版社附錄元件清單: at89s52一片;1602顯示屏一塊;開關(guān)5個;10k電阻6個;25pf電容2個;24m晶振一個;發(fā)光二極管一個;排線插針若干;單片機(jī)程序/名稱:秒表時鐘萬年歷/版本:v2.2.0/時間:2010年7月1日/作者:alexander/*#include#include#include#include#includesbit blo= p20;/背光開關(guān)控制unsigned int back_light=1500;/用于背光控制unsigned char year_l;/農(nóng)歷年unsigned char month_1;/農(nóng)歷月unsigne
32、d char day_l; /農(nóng)歷天bitleap_month;/農(nóng)歷閏月unsigned char year_s=10;/日歷查詢陽歷年unsigned char month_s=6;/日歷查詢陽歷月unsigned char day_s=29;/日歷查詢陽歷日unsigned char week_s;/日歷查詢星期unsigned char time_buf7 = 10,4,7,1,11,59,55;/年周月日時分秒unsigned char mode; /顯示狀態(tài)unsigned char set_calendar;/日歷時鐘界面設(shè)置鍵鍵值bit add_one;bit sub_one;
33、unsigned char serch_select;/日歷查詢界面設(shè)置鍵鍵值bit add_one_s;bit sub_ont_s;unsigned char num_10ms;/定時器產(chǎn)生10ms的個數(shù)unsigned char sec_w; /秒表秒數(shù)unsigned char min_w; /秒表分鐘unsigned char hour_w;/秒表小時bitrun;/秒表啟動bit stop;/秒表停止bit pause;/秒表暫停void delayus(unsigned char us);/delay usvoid delayms(unsigned char ms);/delay
34、msvoid delays(unsigned char s); /delay svoid inittimer0(void); /定時器初始化void inittimer1(void);void main()inittimer0();blo=0;initlcd();delayms(20);ds1302_init();/ds1302_write_time();ds1302_read_time();lcd_animation();dispcalender();inittimer1();while(1)while(mode=0)ds1302_read_time();dispcalender();key
35、setscan();while(!(set_calendar=0)keyaddscan();keyaddturn();keysubscan();keysubturn();keysetscan();dispcalender();keymodescan();while(mode=1)keyserchselect_scan();displunar();keyaddscan();keyaddturn();keysubscan();keysubturn();keymodescan();while(mode=2)dis_10ms();if(num_10ms=100)sec_w+ ;num_10ms=0;d
36、ispwatch_d();if(sec_w=60)min_w+ ;sec_w=0;if(min_w=60)hour_w+ ;min_w=0;keypausescan();keysubscan();keyaddscan();if(run=1)tr0 = 1;run=0;if(pause)if(tr0 =0)num_10ms=0;/定時器產(chǎn)生10ms的個數(shù)sec_w=0;/秒表秒數(shù)min_w=0;/秒表分鐘hour_w=0;/秒表小時dispwatch_d();if(tr0 =1)tr0 = 0;pause=0;if(stop)tr0 = 0;stop=0;keymodescan();/*/* 函
37、數(shù)聲明 */*/void delayus(unsigned char us)/delay us/ unsigned char uscnt;/ uscnt=us1;/* crystal frequency in 12mhz*/ while(-us);/*/void delayms(unsigned char ms)/delay ms while(-ms) delayus(250); delayus(250); delayus(250); delayus(250); void delays(unsigned char s)/delay s while(-s) delayms(250); delay
38、ms(250); delayms(250); delayms(250); void inittimer0(void) tmod = 0x01; th0 = 0x0d8; tl0 = 0x0f0; ea = 1; et0 = 1;/tr0 = 1;void inittimer1(void) tmod |= 0x10; th1 = 0x63; tl1 = 0x0c0; ea = 1; et1 = 1; tr1 = 1;void timer0interrupt(void) interrupt 1 th0 = 0x0d8; tl0 = 0x0f0; num_10ms+;void timer1inter
39、rupt(void) interrupt 3 th1 = 0x63; tl1 = 0x0c0;if(back_light=1) back_light-;if(back_light=0)blo=1;elseblo=0;void lunarcalendar(int year,char month,char day)unsigned intlunar_temp; int spring_ny,sun_ny,staticdaycount; char index;bit flag; /spring_ny 記錄春節(jié)離當(dāng)年元旦的天數(shù)。 /sun_ny 記錄陽歷日離當(dāng)年元旦的天數(shù)。/用于判斷日期是在春節(jié)前還是春
40、節(jié)后/春節(jié)在陽歷1月20到2月20號之間 if( (lunarcalendartable(year-2000)*3+2) & 0x60) 5) = 1)/春節(jié)在陽歷的一月份 spring_ny = (lunarcalendartable(year-2000)*3+2) & 0x1f) - 1; else/春節(jié)在陽歷的二月份 spring_ny = (lunarcalendartable(year-2000)*3+2) & 0x1f) - 1 + 31; sun_ny = monthaddmonth-1 + day - 1; if( (!(year % 4) & (month 2)/2000年到
41、2099年不存在被4整除而不是400倍數(shù) sun_ny+; /staticdaycount記錄大小月的天數(shù) 29 或30 /index 記錄從哪個月開始來計算。 /flag 是用來對閏月的特殊處理。 /判斷陽歷日在春節(jié)前還是春節(jié)后 if (sun_ny = spring_ny)/陽歷日在春節(jié)后(含春節(jié)那天) year_l=year-2000; sun_ny -= spring_ny; month = 1; index = 1; flag = 0;lunar_temp=lunarcalendartable(year-2000)*3;/獲取每月有幾天表放入lunar_temp中l(wèi)unar_temp
42、=lunar_temp&0x0f;lunar_temp=lunar_temp8;lunar_temp+=lunarcalendartable(year-2000)*3+1;lunar_temp=lunar_temp7; if( (lunar_temp& (0x1000 (index-1) ) =0) staticdaycount = 29; else staticdaycount = 30; while(sun_ny = staticdaycount) sun_ny -= staticdaycount; index+;/農(nóng)歷月份加一 if(month = (lunarcalendartable
43、(year-2000)*3 & 0xf0) 4) )/農(nóng)歷閏月情況 flag = flag;/閏月處理 if(flag = 0) month+; else month+; if( (lunar_temp& (0x1000 (index-1) ) =0) staticdaycount=29;/小月 else staticdaycount=30;/大月 day = sun_ny + 1; else/陽歷日在春節(jié)前 倒序算 /spring_ny 記錄春節(jié)離當(dāng)年元旦的天數(shù)。/sun_ny 記錄陽歷日離當(dāng)年元旦的天數(shù)。 year_l=year-2001; spring_ny -= sun_ny; yea
44、r-; month = 12;lunar_temp=lunarcalendartable(year-2000)*3;/獲取沒個月有幾天表放入lunar_temp中l(wèi)unar_temp=lunar_temp&0x0f;lunar_temp=lunar_temp8;lunar_temp+=lunarcalendartable(year-2000)*3+1;lunar_temp=lunar_temp7; if ( (lunarcalendartable(year-2000)*3 & 0xf0) 4) = 0)/判斷有無閏月 index = 12; else index = 13; flag = 0;
45、 if( ( lunar_temp & (0x1000 (index-1) ) =0) staticdaycount = 29; else staticdaycount = 30; while(spring_ny staticdaycount) spring_ny -= staticdaycount; index-; if(flag = 0) month-; if(month = (lunarcalendartable(year-2000)*3 & 0xf0) 4) flag = flag; if( ( lunar_temp & (0x1000 (index-1) ) =0) staticda
46、ycount = 29; else staticdaycount = 30; day = staticdaycount - spring_ny + 1; / year_1= day; month_1= month;day_l=day; if(month = (lunarcalendartable(year-2000)*3 & 0xf0) 4)/判斷是否在農(nóng)歷閏月里面 leap_month=1; else leap_month=0;unsigned char calclulate_week(unsigned char year,unsigned char month,unsigned char day)unsig
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度木門及木飾面產(chǎn)品綠色認(rèn)證與質(zhì)量監(jiān)督合同4篇
- 2025版實驗室科研項目管理與科技獎勵服務(wù)合同3篇
- 二零二五年度關(guān)聯(lián)方間信貸資產(chǎn)轉(zhuǎn)讓合同規(guī)范文本3篇
- 2025版協(xié)議離婚手續(xù)辦理指南及離婚證獲取要領(lǐng)3篇
- KTV營業(yè)權(quán)轉(zhuǎn)讓及經(jīng)營合同版B版
- 二零二五版租賃房屋租賃保證金利息計算合同3篇
- 2025年度零投入的股權(quán)代持解除與轉(zhuǎn)讓協(xié)議
- 2025年針對普通員工的競業(yè)限制合同范本
- 二零二五年度智慧農(nóng)業(yè)版電路租用與物聯(lián)網(wǎng)應(yīng)用合同
- 二零二五年度數(shù)據(jù)中心運維用工服務(wù)協(xié)議
- 2024年1月高考適應(yīng)性測試“九省聯(lián)考”英語 試題(學(xué)生版+解析版)
- 《朝天子·詠喇叭-王磐》核心素養(yǎng)目標(biāo)教學(xué)設(shè)計、教材分析與教學(xué)反思-2023-2024學(xué)年初中語文統(tǒng)編版
- 成長小說智慧樹知到期末考試答案2024年
- 紅色革命故事《王二小的故事》
- 海洋工程用高性能建筑鋼材的研發(fā)
- 英語48個國際音標(biāo)課件(單詞帶聲、附有聲國際音標(biāo)圖)
- GB/T 6892-2023一般工業(yè)用鋁及鋁合金擠壓型材
- 冷庫安全管理制度
- 2023同等學(xué)力申碩統(tǒng)考英語考試真題
- 家具安裝工培訓(xùn)教案優(yōu)質(zhì)資料
- 在雙減政策下小學(xué)音樂社團(tuán)活動有效開展及策略 論文
評論
0/150
提交評論