單片機電子時鐘課程設(shè)計報告_第1頁
已閱讀1頁,還剩29頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、<p><b>  目 錄</b></p><p>  1、引言 ··························

2、···························3</p><p>  2、總體設(shè)計 ····

3、83;····································&

4、#183;·····4</p><p>  3、詳細(xì)設(shè)計 ·························&

5、#183;··················5</p><p>  3.1硬件設(shè)計 ············&#

6、183;······························5</p><p>  3.2軟件設(shè)計

7、3;····································&#

8、183;····10</p><p>  4、實驗結(jié)果分析··························

9、83;·················26</p><p>  5、心得體會··············

10、···································27</p&g

11、t;<p>  6、參考文獻(xiàn)·································&

12、#183;···············27</p><p><b>  摘   要 </b></p><p>  單片機自20世紀(jì)70年代問世以來,以其極高的性能價格比,受到人們

13、的重視和關(guān)注,應(yīng)用很廣、發(fā)展很快。單片機體積小、重量輕、抗干擾能力強、環(huán)境要求不高、價格低廉、可靠性高、靈活性好、開發(fā)較為容易。由于具有上述優(yōu)點,在我國,單片機已廣泛地應(yīng)用在工業(yè)自動化控制、自動檢測、智能儀器儀表、家用電器、電力電子、機電一體化設(shè)備等各個方面,而51單片機是各單片機中最為典型和最有代表性的一種。這次畢業(yè)設(shè)計通過對它的學(xué)習(xí)、應(yīng)用,以AT89S51芯片為核心,輔以必要的電路,設(shè)計了一個簡易的電子時鐘,它由4.5V直流電源供電

14、,通過數(shù)碼管能夠準(zhǔn)確顯示時間,調(diào)整時間,從而到達(dá)學(xué)習(xí)、設(shè)計、開發(fā)軟、硬件的能力。 </p><p>  關(guān)鍵詞: 單片機 AT89C51</p><p><b>  1.引言</b></p><p>  20世紀(jì)末,電子技術(shù)獲得了飛速的發(fā)展,在其推動下,現(xiàn)代電子產(chǎn)品幾乎滲透了社會的各個領(lǐng)域,有力地推動了社會生產(chǎn)力的發(fā)展和

15、社會信息化程度的提高,同時也使現(xiàn)代電子產(chǎn)品性能進(jìn)一步提高,產(chǎn)品更新?lián)Q代的節(jié)奏也越來越快。 時間對人們來說總是那么寶貴,工作的忙碌性和繁雜性容易使人忘記當(dāng)前的時間。忘記了要做的事情,當(dāng)事情不是很重要的時候,這種遺忘無傷大雅。但是,一旦重要事情,一時的耽誤可能釀成大禍。 </p><p>  目前,單片機正朝著高性能和多品種方向發(fā)展趨勢將是進(jìn)一步向著CMOS化、低功耗、小體積、大容量、高性能、低價

16、格和外圍電路內(nèi)裝化等幾個方面發(fā)展。下面是單片機的主要發(fā)展趨勢。單片機應(yīng)用的重要意義還在于,它從根本上改變了傳統(tǒng)的控制系統(tǒng)設(shè)計思想和設(shè)計方法。從前必須由模擬電路或數(shù)字電路實現(xiàn)的大部分功能,現(xiàn)在已能用單片機通過軟件方法來實現(xiàn)了。這種軟件代替硬件的控制技術(shù)也稱為微控制技術(shù),是傳統(tǒng)控制技術(shù)的一次革命。 </p><p>  單片機模塊中最常見的是數(shù)字鐘,數(shù)字鐘是一種用數(shù)字電路技術(shù)實現(xiàn)時、分、秒計時的裝置,與機械

17、式時鐘相比具有更高的準(zhǔn)確性和直觀性,且無機械裝置,具有更更長的使用壽命,因此得到了廣泛的使用.</p><p>  數(shù)字鐘是采用數(shù)字電路實現(xiàn)對.時,分,秒.數(shù)字顯示的計時裝置,廣泛用于個人家庭,車站, 碼頭辦公室等公共場所,成為人們?nèi)粘I钪胁豢缮俚谋匦杵?由于數(shù)字集成電路的發(fā)展和石英晶體振蕩器的廣泛應(yīng)用,使得數(shù)字鐘的精度,遠(yuǎn)遠(yuǎn)超過老式鐘表, 鐘表的數(shù)字化給人們生產(chǎn)生活帶來了極大的方便。<

18、;/p><p><b>  2.總體設(shè)計</b></p><p>  1、準(zhǔn)確計時,以數(shù)字形式顯示時、分、秒的時間。</p><p>  2、小時以24小時計時形式,分秒計時為60進(jìn)位。 </p><p>  3、校正時間功能,即能隨意設(shè)定走時時間。</p><p>  4、設(shè)計5V直流電源,系統(tǒng)時鐘

19、電路、復(fù)位電路。 </p><p>  本次設(shè)計時鐘電路,使用了ATC89C51單片機芯片控制電路,單片機控制電單且省去了很多復(fù)雜的線路,使得電路簡明易懂,使用鍵盤鍵上的按鍵來調(diào)整時鐘的時、分、秒, 采用實時時鐘芯片</p><p>  現(xiàn)在市場上有很多實時時鐘集成電路,如DS1287、DS12887、DS1302等。</p><p>  實時時芯片具備年、月、日、

20、時、分、秒計時功能和多點定時功能,計時數(shù)據(jù)的更新每秒自動進(jìn)行一次,不需要程序干預(yù)。因此,在工業(yè)實時測控系統(tǒng)中多采用這一類專用芯片來實現(xiàn)實時時鐘功能。</p><p>  總設(shè)計原理框圖如下圖所示:</p><p><b>  3.詳細(xì)設(shè)計</b></p><p><b>  3.1硬件設(shè)計</b></p>&

21、lt;p>  3.1.1、STC89C51單片機介紹 </p><p>  STC89C51單片機內(nèi)部主要包括累加器ACC(有時也簡稱為A)、程序狀態(tài)字PSW、地址指示器DPTR、只讀存儲器ROM、隨機存取存儲器RAM、寄存器、并行I/O接口P0~P3、定時器/計數(shù)器、串行I/O接口以及定時控制邏輯電路等。這些部件通過內(nèi)部總線聯(lián)接起來,構(gòu)成一個完整的微型計算機。其管腳圖如圖 </p><

22、p>  STC89C51單片機管腳結(jié)構(gòu)圖</p><p><b>  VCC:電源。</b></p><p><b>  GND:接地。</b></p><p>  P0口:P0口為一個8位漏級開路雙向I/O口,每腳可吸收8TTL門電流。當(dāng)P1口的管腳第一次寫1時,被定義為高阻輸入。P0能夠用于外部程 序數(shù)據(jù)存儲器,

23、它可以被定義為數(shù)據(jù)/地址的第八位。在FIASH編程時,P0 口作為原碼輸入口,當(dāng)FIASH進(jìn)行校驗時,P0輸出原碼,此時P0外部必須被拉高。</p><p>  P1口:P1口是一個內(nèi)部提供上拉電阻的8位雙向I/O口,P1口緩沖器能接收輸出4TTL門電流。P1口管腳寫入1后,被內(nèi)部上拉為高,可用作 輸入,P1口被外部下拉為低電平時,將輸出電流,這是由于內(nèi)部上拉的緣故。在FLASH編程和校驗時,P1口作為第八位地址

24、接收。 </p><p>  P2口:P2口為一個內(nèi)部上拉電阻的8位雙向I/O口,P2口緩沖器可接收,輸出4個TTL門電流,當(dāng)P2口被寫“1”時,其管腳被內(nèi)部上拉電阻 拉高,且作為輸入。并因此作為輸入時,P2口的管腳被外部拉低,將輸出電流。這是由于內(nèi)部上拉的緣故。P2口當(dāng)用于外部程序存儲器或16位地址外部數(shù)據(jù)存 儲器進(jìn)行存取時,P2口輸出地址的高八位。在給出地址“1”時,它利用內(nèi)部上拉優(yōu)勢,當(dāng)對外部八位地址數(shù)據(jù)存

25、儲器進(jìn)行讀寫時,P2口輸出其特殊功能寄存器 的內(nèi)容。P2口在FLASH編程和校驗時接收高八位地址信號和控制信號。</p><p>  P3口:P3口管腳是8個帶內(nèi)部上拉電阻的雙向I/O口,可接收輸出4個TTL門電流。當(dāng)P3口寫入“1”后,它們被內(nèi)部上拉為高電平,并用作輸入。作為輸入,由于外部下拉為低電平,P3口將輸出電流(ILL)這是由于上拉的緣故。</p><p>  P3口也可作為AT

26、89C51的一些特殊功能口,如下表所示:</p><p><b>  口管腳 備選功能</b></p><p>  P3.0 RXD(串行輸入口)</p><p>  P3.1 TXD(串行輸出口)</p><p>  P3.2 /INT0(外部中斷0)</p><p>  P3.3 /INT1(

27、外部中斷1)</p><p>  P3.4 T0(記時器0外部輸入)</p><p>  P3.5 T1(記時器1外部輸入)</p><p>  P3.6 /WR(外部數(shù)據(jù)存儲器寫選通)</p><p>  P3.7 /RD(外部數(shù)據(jù)存儲器讀選通)</p><p>  P3口同時為閃爍編程和編程校驗接收一些控制信號。&

28、lt;/p><p>  RST:復(fù)位輸入。當(dāng)振蕩器復(fù)位器件時,要保持RST腳兩個機器周期的高電平時間。</p><p>  ALE/PROG:當(dāng)訪問外部存儲器時,地址鎖存允許的輸出電平用于鎖存地址的地位字節(jié)。在FLASH編程期間,此引腳用于輸入編程脈沖。在平時,ALE 端以不變的頻率周期輸出正脈沖信號,此頻率為振蕩器頻率的1/6。因此它可用作對外部輸出的脈沖或用于定時目的。然而要注意的是:每當(dāng)

29、用作外部數(shù)據(jù)存儲器 時,將跳過一個ALE脈沖。如想禁止ALE的輸出可在SFR8EH地址上置0。此時, ALE只有在執(zhí)行MOVX,MOVC指令是ALE才起作用。另外,該引腳被略微拉高。如果微處理器在外部執(zhí)行狀態(tài)ALE禁止,置位無效。</p><p>  PSEN:外部程序存儲器的選通信號。在由外部程序存儲器取指期間,每個機器周期兩次/PSEN有效。但在訪問外部數(shù)據(jù)存儲器時,這兩次有效的/PSEN信號將不出現(xiàn)。<

30、;/p><p>  EA/VPP:當(dāng)/EA保持低電平時,則在此期間外部程序存儲(0000H-FFFFH),不管是否有內(nèi)部程序存儲器。注意加密方式1時, /EA將內(nèi)部鎖定為RESET;當(dāng)/EA端保持高電平時,此間內(nèi)部程序存儲器。在FLASH編程期間,此引腳也用于施加12V編程電源(VPP)。</p><p>  3.1.2、上電按鈕復(fù)位電路</p><p>  本設(shè)計采用

31、上電按鈕復(fù)位電路:首先經(jīng)過上電復(fù)位,當(dāng)按下按鍵時,RST直接與VCC相連,為高電平形成復(fù)位,同時電解電容被電路放電;按鍵松開時,VCC對電容充電,充電電流在電阻上,RST依然為高電平,仍然是復(fù)位,充電完成后,電容相當(dāng)于開路,RST為低電平,單片機芯片正常工作。其中電阻R2決定了電容充電的時間,R2越大則充電時間長,復(fù)位信號從VCC回落到0V的時間也長。</p><p>  3.1.3、晶振電路</p>

32、<p>  本設(shè)計晶振電路采用12M的晶振。晶振的作用是給單片機正常工作提供穩(wěn)定的時鐘信號。單片機的晶振并不是只能用12M,只要不超過20M就行,在準(zhǔn)許的范圍內(nèi),晶振越大,單片機運行越快,還有用12M的就是好算時間,因為一個機器周期為1/12時鐘周期,所以這樣用12M的話,一個時鐘周期為12us,那么定時器計一次數(shù)就是1us了,電容范圍在20-40pF之間,這里連接的是30pF的電容。</p><p&g

33、t;  機器周期=10*晶振周期=12*系統(tǒng)時鐘周期</p><p>  3.1.4.下載端口</p><p>  設(shè)計用到的STC89C52單片機芯片的ISP下載線是通過單片機的TXD,RXD引腳把程序燒進(jìn)去的。管腳TXD和RXD用于異步串行通信。其實STC89C52單片機的ISP下載線就是一個max232芯片連接STC和計算機的串行通信口。計算機把程序從九針串口送到max232芯片,電

34、平轉(zhuǎn)換后送進(jìn)單片機的串行口,也就是TXD和RXD。然后單片機的串行模塊把數(shù)據(jù)送到程序區(qū)。</p><p>  3.1.5、顯示電路 </p><p>  就時鐘而言,通??刹捎靡壕э@示或數(shù)碼管顯示。由于一般的段式液晶屏要專門的驅(qū)動電路,而且液晶顯示具有亮度高、價格便宜等優(yōu)點。</p><p>  3.1.6時鐘顯示校正電路</p><p> 

35、 本設(shè)計利用按鍵開關(guān)來校正時鐘顯示的數(shù)字。當(dāng)按鈕按下時,將在相應(yīng)的端口輸入一個低電平,通過相應(yīng)的程序來改變時鐘顯示。其中S1按鍵開關(guān)用來選擇要修改的數(shù)字;S2按鍵用來增加所選數(shù)字的數(shù)值;S3按鍵用來減少所選數(shù)字的數(shù)值。</p><p><b>  3.2軟件設(shè)計</b></p><p><b>  3.2.1主程序。</b></p>

36、<p>  主程序主要用于系統(tǒng)初始化:設(shè)置計時緩沖區(qū)的位置及初值,設(shè)置8155的工作方式、定時器的工作方式和計數(shù)初值等參數(shù)。主程序流程如下圖所示。</p><p><b>  開始</b></p><p><b>  定義堆棧區(qū)</b></p><p>  T0、數(shù)據(jù)緩沖區(qū)、標(biāo)志位初始化</p>

37、<p><b>  調(diào)用鍵盤掃描程序</b></p><p><b>  否</b></p><p>  是C/R鍵? </p><p><b>  是</b></p><p>  地址指針指向計時緩沖區(qū)</p><p><b

38、>  調(diào)用時間設(shè)置程序</b></p><p><b>  主程序流程圖</b></p><p><b>  3.2.2計時。</b></p><p>  即定時器0中斷子程序,完成刷新計時緩沖區(qū)的功能。</p><p>  系統(tǒng)使用6MHz的晶振,假設(shè)定時器0工作在方式1,則定時

39、器的最大定時時間為65.536ms,這個值遠(yuǎn)遠(yuǎn)小于1s。因此本系統(tǒng)采用定時器與軟件循環(huán)相結(jié)合的定時方法。設(shè)定時器0工作在方式1,每隔50ms溢出中斷一次,則循環(huán)中斷20次延時時間是1s,上述過程重復(fù)60次為1分,分計時60次為1小時,小時計時24次則時間重新回到00:00:00。</p><p>  因定時器0工作在方式1,則50ms定時對應(yīng)的定時器初值為:65536-50ms/2us=40536=9E58H,即

40、TH0=9EH,TH0=58H。</p><p>  但應(yīng)當(dāng)指出:CPU從響應(yīng)T0中斷到完成定時器初值重裝這段時間,定時器T0并不停止工作,而是繼續(xù)計數(shù)。因此,為了確保T0能準(zhǔn)確定時50ms,重裝的定時器初值必須加以修正,修正的定時器初值必須考慮到從原定時器初值中扣除計數(shù)器多計的脈沖個數(shù)。由于定時器計數(shù)脈沖的周期恰好和機器周期吻合,因此修正量等于CPU從響應(yīng)中斷到重裝完TL0為止所用的機器周期數(shù)。CPU響應(yīng)中斷通

41、常要3~8個機器周期。經(jīng)過測試,定時器0重裝的計數(shù)初值設(shè)為9E5FH~9E67H,可以滿足精度要求。另外,MCS-51單片機只有二進(jìn)制加法指令,而時間是按十進(jìn)制遞增,因此用加法指令后必須進(jìn)行二-十進(jìn)制轉(zhuǎn)換。</p><p>  計時模塊流程圖如下圖所示。</p><p><b>  保護(hù)現(xiàn)場</b></p><p><b>  重裝定

42、時器初值</b></p><p><b>  循環(huán)次數(shù)減1</b></p><p><b>  否</b></p><p><b>  滿20次?</b></p><p><b>  是</b></p><p><

43、b>  秒單元加1</b></p><p><b>  否</b></p><p><b>  60s到?</b></p><p><b>  是</b></p><p>  秒單元清0,分單元加1</p><p><b> 

44、 否</b></p><p><b>  60分到?</b></p><p><b>  是</b></p><p>  分單元清0,時單元加1</p><p><b>  否</b></p><p><b>  24小時到?<

45、;/b></p><p><b>  是</b></p><p><b>  時單元清0</b></p><p><b>  恢復(fù)現(xiàn)場</b></p><p><b>  返回</b></p><p>  3.2.3時間設(shè)置模

46、塊。</p><p>  該模塊由鍵盤輸入相應(yīng)的數(shù)據(jù)來設(shè)置當(dāng)前時間。程序通過調(diào)用一個鍵盤設(shè)置子程序通過鍵盤掃描將鍵入的6位時間值送入顯示緩沖區(qū)。</p><p>  設(shè)置時間后,時鐘要從這個時間開始計時,而時分秒單元各占一個字節(jié),鍵盤占6個字節(jié)。因此程序中要調(diào)用一個合字子程序?qū)@示緩沖區(qū)中的6位BCD碼合并為3位壓縮BCD碼,并送入計時緩沖區(qū),作為當(dāng)前計時起始時間。</p>

47、<p>  該程序同時要檢測輸入時間值的合法性,若鍵盤輸入的小時值大于23,分、秒值大于59,則不合法,將取消本次設(shè)置,清零重新開始計時。</p><p>  時間設(shè)置和鍵盤設(shè)置子程序的流程圖如下圖所示。</p><p><b>  保護(hù)現(xiàn)場</b></p><p>  調(diào)用鍵盤設(shè)置子程序KETIN</p><p&

48、gt;  調(diào)用合字子程序COMB</p><p><b>  恢復(fù)現(xiàn)場</b></p><p><b>  返回</b></p><p><b>  時間設(shè)置流程圖</b></p><p><b>  保護(hù)現(xiàn)場</b></p><p&g

49、t;  顯示緩沖區(qū)首地址送R0鍵盤輸入次數(shù)送R7</p><p>  調(diào)用鍵盤掃描程序KEYSCAN</p><p><b>  鍵號送@R0</b></p><p><b>  顯示緩沖區(qū)地址加1</b></p><p><b>  循環(huán)次數(shù)減1</b></p>

50、<p><b>  否</b></p><p><b>  循環(huán)結(jié)束?</b></p><p><b>  是</b></p><p><b>  恢復(fù)現(xiàn)場</b></p><p><b>  返回</b></p&g

51、t;<p>  鍵盤設(shè)置子程序流程圖</p><p><b>  3.2.4顯示。</b></p><p>  連接電源后,調(diào)整時間,lcd屏上會顯示出年月日時分秒。</p><p>  顯示程序流程圖如下圖所示。</p><p><b>  保護(hù)現(xiàn)場</b></p>&

52、lt;p><b>  否</b></p><p><b>  允許顯示?</b></p><p><b>  調(diào)用拆字程序</b></p><p><b>  是</b></p><p><b>  動態(tài)掃描顯示</b><

53、/p><p><b>  返回</b></p><p><b>  顯示程序流程圖</b></p><p><b>  掃描鍵盤</b></p><p><b>  否</b></p><p>  調(diào)用顯示程序

54、 有鍵按下?</p><p><b>  是</b></p><p><b>  調(diào)用顯示程序</b></p><p><b>  否</b></p><p><b>  有鍵按下?</b></p><p><b>  是

55、</b></p><p><b>  求取鍵號</b></p><p><b>  返回</b></p><p><b>  鍵盤掃描程序流程圖</b></p><p><b>  3.2.5程序:</b></p><p&g

56、t;  #include<reg52.h></p><p>  #include<intrins.h></p><p>  #define uint unsigned int </p><p>  #define uchar unsigned char</p><p>  #define PIN P0</p&g

57、t;<p>  sbit LCDE=P2^7;</p><p>  sbit RW=P2^5;</p><p>  sbit RS=P2^6;</p><p>  sbit k1=P1^0;</p><p>  sbit k2=P1^1;</p><p>  sbit k3=P1^2;</p>

58、<p>  sbit sck=P3^6;</p><p>  sbit io=P3^4;</p><p>  sbit RST=P3^5;</p><p>  uint w[7]={0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c}; //寫地址</p><p>  uint r[7]={0x

59、81, 0x83, 0x85, 0x87, 0x89, 0x8b, 0x8d}; //讀地址</p><p>  char num1[10]="0123456789";</p><p>  unsigned char time1[7]={0x50,0x59,0x23,0x04,0x11,0x02,0x14};</p><p>  uint se

60、cond,hour,min,num,a,time[7];</p><p>  uint nian,yue,ri,shi,fen,miao,zhou;</p><p>  void delay(uint z)//延時程序</p><p><b>  {</b></p><p><b>  uint

61、 x,y;</b></p><p>  for(x=z;x>0;x--)</p><p>  for(y=110;y>0;y--);</p><p><b>  } </b></p><p>  void writecom(uchar com) //LCD寫命令</p>

62、<p><b>  {</b></p><p><b>  LCDE=0;</b></p><p><b>  RS=0;</b></p><p><b>  RW=0;</b></p><p><b>  PIN=com;</

63、b></p><p>  delay(10);</p><p><b>  LCDE=1;</b></p><p>  delay(10);</p><p><b>  LCDE=0;</b></p><p><b>  }</b></p&g

64、t;<p>  void writedata(uchar dat)//LCD寫數(shù)據(jù)</p><p><b>  {</b></p><p><b>  LCDE=0;</b></p><p><b>  RS=1;</b></p><p><b>

65、;  RW=0;</b></p><p><b>  PIN=dat;</b></p><p>  delay(10);</p><p><b>  LCDE=1;</b></p><p>  delay(10);</p><p><b>  LCDE=

66、0;</b></p><p><b>  RS=0;</b></p><p><b>  }</b></p><p>  void LCDINIT()//初始化LCD</p><p><b>  { </b></p><p> 

67、 delay(1000);</p><p><b>  LCDE=0;</b></p><p><b>  RW=0;</b></p><p>  writecom(0x38);設(shè)置顯示模式</p><p>  writecom(0x0c);不顯示光標(biāo),光標(biāo)不閃爍</p><p&

68、gt;  writecom(0x06);寫一個指針加1</p><p>  writecom(0x01);清屏</p><p>  writecom(0x80);設(shè)置數(shù)據(jù)指針起點</p><p><b>  }</b></p><p>  void ds1302writebyte(uint dat)//ds1302寫

69、單個數(shù)據(jù)</p><p><b>  {</b></p><p><b>  uint i;</b></p><p><b>  sck=0;</b></p><p><b>  _nop_();</b></p><p><b

70、>  _nop_();</b></p><p>  for(i=0;i<8;i++)</p><p><b>  {</b></p><p>  io=dat&0x01;</p><p><b>  dat>>=1;</b></p><

71、p><b>  _nop_();</b></p><p><b>  _nop_();</b></p><p><b>  sck=1;</b></p><p><b>  _nop_();</b></p><p><b>  _nop_(

72、);</b></p><p><b>  sck=0;</b></p><p><b>  _nop_();</b></p><p>  _nop_();</p><p><b>  }</b></p><p><b>  

73、}</b></p><p>  uint ds1302readbyte() //1302讀單個數(shù)據(jù)</p><p><b>  {</b></p><p>  uint i,value;</p><p><b>  sck=0;</b></p><p>

74、<b>  _nop_();</b></p><p><b>  _nop_();</b></p><p>  for(i=0;i<8;i++)</p><p><b>  {</b></p><p>  value>>=1;</p><p

75、><b>  if(io)</b></p><p><b>  {</b></p><p>  value=value|0x80;</p><p><b>  } </b></p><p><b>  sck=1;</b></p>

76、<p><b>  _nop_();</b></p><p><b>  _nop_();</b></p><p><b>  sck=0;</b></p><p><b>  _nop_();</b></p><p><b>  _

77、nop_();</b></p><p><b>  }</b></p><p>  return value;</p><p><b>  }</b></p><p>  void ds1302wr(uint add,uint dat) //多個字節(jié)寫入</p>&l

78、t;p><b>  {</b></p><p><b>  RST=0;</b></p><p><b>  _nop_();</b></p><p><b>  sck=0;</b></p><p><b>  _nop_();</

79、b></p><p><b>  RST=1;</b></p><p><b>  _nop_();</b></p><p>  ds1302writebyte(add);</p><p>  ds1302writebyte(dat);</p><p><b&g

80、t;  RST=0;</b></p><p><b>  _nop_();</b></p><p><b>  }</b></p><p>  uint ds1302rd(uint add)//讀取多個數(shù)據(jù)</p><p><b>  {</b></p&g

81、t;<p><b>  uint ks;</b></p><p><b>  RST=0;</b></p><p><b>  _nop_();</b></p><p><b>  sck=0;</b></p><p><b>  

82、_nop_();</b></p><p><b>  RST=1;</b></p><p><b>  _nop_();</b></p><p>  ds1302writebyte(add);</p><p>  ks=ds1302readbyte();</p><p

83、><b>  RST=0;</b></p><p><b>  _nop_();</b></p><p>  io=0; //此條語句必不可少。如果少了這條語句的話,液晶顯示會不完全。</p><p><b>  _nop_();</b></p><p><b&

84、gt;  io=1;</b></p><p><b>  _nop_();</b></p><p>  return ks;</p><p><b>  }</b></p><p>  void Ds1302Init()</p><p><b>  {&

85、lt;/b></p><p>  unsigned char n;</p><p>  ds1302wr(0x8E,0X00); //禁止寫保護(hù),就是關(guān)閉寫保護(hù)功能</p><p>  for(n=3;n<7;n++)//寫入7個字節(jié)的時鐘信號:分秒時日月周年</p><p><b>  {</b><

86、;/p><p>  ds1302wr(w[n],time1[n]);</p><p><b>  }</b></p><p>  ds1302wr(0x8E,0x80); //打開寫保護(hù)功能</p><p><b>  }</b></p><p>  void rdtime

87、()//1302讀初始時間</p><p><b>  {</b></p><p>  miao=ds1302rd(r[0]);</p><p>  fen=ds1302rd(r[1]);</p><p>  shi=ds1302rd(r[2]); </p><p>  zhou=d

88、s1302rd(r[5]);</p><p>  ri=ds1302rd(r[3]);</p><p>  yue=ds1302rd(r[4]);</p><p>  nian=ds1302rd(r[6]);</p><p><b>  }</b></p><p>  void displ

89、ay()</p><p><b>  { </b></p><p><b>  //顯示函數(shù)</b></p><p>  int i,j,a[8];</p><p>  writecom(0x80);</p><p>  a[0]=(num1[(nian)/16]);

90、 // 年</p><p>  a[1]=(num1[(nian)%16]);</p><p>  a[2]=0X3A;</p><p>  a[3]=num1[yue/16];//月</p><p>  a[4]=num1[yue%16];</p><p>  a[5]=0X3A;</p&

91、gt;<p>  a[6]=num1[ri/16];//日</p><p>  a[7]=num1[ri%16];</p><p>  for( i=0;i<8;i++)</p><p><b>  {</b></p><p>  writedata(a[i]);</p><

92、p>  delay(10);</p><p><b>  }</b></p><p>  writecom(0x80+0x40+7);</p><p>  a[0]=(num1[(shi)/16]); //小時</p><p>  a[1]=(num1[(shi)%16]);</p><

93、p>  a[2]=0X3A;</p><p>  a[3]=num1[fen/16];//分鐘</p><p>  a[4]=num1[fen%16];</p><p>  a[5]=0X3A;</p><p>  a[6]=num1[miao/16]; //秒鐘</p><p>

94、  a[7]=num1[miao%16];</p><p>  for(j=0;j<8;j++) </p><p><b>  { </b></p><p>  writedata(a[j]);</p><p><b>  }</b></p><p><b

95、>  } </b></p><p>  void showtime(uint address,uint time)</p><p><b>  {</b></p><p>  delay(500);</p><p>  writedata(num1[time%16]);</p><p

96、>  writecom(0x80+0x40+address);</p><p>  writedata(num1[time/16]);</p><p>  writecom(0x80+0x40+1+address);</p><p>  writecom(0x0f);</p><p><b>  }</b><

97、/p><p>  void keyscan() //鍵盤掃描函數(shù)</p><p><b>  { </b></p><p>  if (0==k1) //K1時間停止</p><p><b>  { </b></p><p>  delay(1

98、0);</p><p><b>  if(0==k1)</b></p><p><b>  { </b></p><p><b>  num++;</b></p><p>  while(num>0&&num<=8)</p>

99、<p><b>  {</b></p><p>  if (0==k1)</p><p><b>  {</b></p><p><b>  if(0==k1)</b></p><p><b>  {num++;</b></p>

100、<p>  while(!k1)</p><p><b>  {</b></p><p>  switch(num)</p><p><b>  {</b></p><

101、p><b>  case 2:</b></p><p><b>  { </b></p><p><b>  uint i;</b></p><p><b>  num++;</b></p><p><b>  a=1;</b>

102、</p><p>  writecom(0x80+0x40+0x0e);</p><p>  writecom(0x0f);</p><p>  for(i=0;i<7;i++)</p><p><b>  {</b></p><p>  time1[i]=ds1302rd(r[i]);;&

103、lt;/p><p><b>  }</b></p><p><b>  }</b></p><p><b>  break;</b></p><p><b>  case 4:</b></p><p><b>  {<

104、/b></p><p><b>  num++;</b></p><p>  writecom(0x80+0x40+0x0b);</p><p>  writecom(0x0f);</p><p><b>  }</b></p><p><b>  break

105、;</b></p><p><b>  case 6:</b></p><p><b>  {</b></p><p><b>  num++;</b></p><p>  writecom(0x80+0x40+0x08);</p><p>

106、  writecom(0x0f);</p><p><b>  }</b></p><p><b>  break;</b></p><p><b>  case 8:</b></p><p><b>  {</b></p><p>

107、;<b>  num=0;</b></p><p><b>  a=0;</b></p><p>  Ds1302Init();</p><p>  delay(10);</p><p>  writecom(0x0c);</p><p><b>  }</b

108、></p><p><b>  break;</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }<

109、/b></p><p><b>  if(0==k2)</b></p><p><b>  {</b></p><p><b>  delay(5);</b></p><p><b>  if(0==k2)</b></p><p&

110、gt;<b>  {</b></p><p>  while(!k2)</p><p>  switch(num)//K2,時,分,秒加數(shù)</p><p><b>  {</b></p><p><b>  case 3:</b></p><p>

111、;<b>  {</b></p><p>  if(9==time1[0]%16)</p><p><b>  { </b></p><p>  time1[0]+=6;</p><p><b>  }</b></p><p>  time1[

112、0]++; </p><p>  if(time1[0]==0x60)</p><p>  time1[0]=0;</p><p>  showtime(0xd,time1[0]);</p><p><b>  }</b></p><p><b>  break;</b

113、></p><p><b>  case 5:</b></p><p><b>  { </b></p><p>  if(9==time1[1]%16)</p><p><b>  { </b></p><p>  time1[1]+=6;

114、</p><p><b>  }</b></p><p>  ++time1[1];</p><p>  while(0x60==time1[1])</p><p>  time1[1]=0;</p><p>  showtime(0xa,time1[1]); </p&

115、gt;<p><b>  }</b></p><p><b>  break;</b></p><p><b>  case 7:</b></p><p><b>  { </b></p><p>  if(9==time1[2]%16)&l

116、t;/p><p><b>  { </b></p><p>  time1[2]+=6;</p><p><b>  }</b></p><p>  ++time1[2];</p><p>  while(0x24==time1[2])</p><p&g

117、t;  time1[2]=0;</p><p>  Ds1302Init();</p><p>  showtime(7,time1[2]);</p><p><b>  }</b></p><p><b>  break;</b></p><p>

118、<b>  }</b></p><p><b>  }</b></p><p>  } </p><p><b>  if(0==k3)</b></p><p><b>  {</b></p><p><

119、b>  delay(5);</b></p><p><b>  if(0==k3)</b></p><p><b>  {</b></p><p>  while(!k3)</p><p>  switch(num) //K3,時,分,秒減數(shù)</p><

120、p><b>  {</b></p><p><b>  case 3:</b></p><p><b>  {</b></p><p>  if(0==time1[0]%16)</p><p><b>  { </b></p><

121、;p>  time1[0]-=6;</p><p>  if((0-6)==time1[0])</p><p>  time1[0]=0x5a;</p><p>  } </p><p>  --time1[0];</p><p>  showtime(0x0d,time1[0]);&l

122、t;/p><p><b>  }</b></p><p><b>  break;</b></p><p><b>  case 5:</b></p><p><b>  { </b></p><p>  if(0==time1[1]

123、%16)</p><p><b>  { </b></p><p>  time1[1]-=6;</p><p>  if((0-6)==time1[1])</p><p>  time1[1]=0x5a;</p><p><b>  }</b></p>

124、<p>  --time1[1];</p><p>  showtime(0x0a,time1[1]);</p><p><b>  }</b></p><p><b>  break;</b></p><p><b>  case 7:</b></p>

125、;<p>  { </p><p>  if(0==time1[2]%16)</p><p><b>  { </b></p><p>  time1[2]-=6;</p><p>  if((0-6)==time1[2])</p><p>  time1[

126、2]=0x5a;</p><p><b>  }</b></p><p>  --time1[2];</p><p>  showtime(0x07,time1[2]);</p><p><b>  }</b></p><p><b>  break;<

127、;/b></p><p><b>  } </b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }<

128、/b></p><p><b>  } </b></p><p><b>  } </b></p><p>  void main()</p><p><b>  {</b></p><p>  Ds1302Init();</

129、p><p>  LCDINIT();</p><p><b>  while(1)</b></p><p><b>  { </b></p><p>  keyscan();</p><p><b>  rdtime();</b></p>

130、<p>  display();</p><p><b>  }</b></p><p><b>  } </b></p><p><b>  4.實驗結(jié)果與分析</b></p><p><b>  5.心得體會</b></p>

131、<p>  我在這一次電子鐘的設(shè)計過程中,很是受益匪淺。通過對自己在大學(xué)三年時間里所學(xué)的知識的回顧,并充分發(fā)揮對所學(xué)知識的理解和對畢業(yè)設(shè)計的思考及書面表達(dá)能力,最終完成了。這為自己今后進(jìn)一步深化學(xué)習(xí),積累了一定寶貴的經(jīng)驗。撰寫論文的過程也是專業(yè)知識的學(xué)習(xí)過程,它使我運用已有的專業(yè)基礎(chǔ)知識,對其進(jìn)行設(shè)計,分析和解決一個理論問題或?qū)嶋H問題,把知識轉(zhuǎn)化為能力的實際訓(xùn)練。培養(yǎng)了我運用所學(xué)知識解決實際問題的能力。</p>

132、<p>  通過這次課程設(shè)計我發(fā)現(xiàn),只有理論水平提高了;才能夠?qū)⒄n本知識與實踐相整合,理論知識服務(wù)于教學(xué)實踐,以增強自己的動手能力。這個實驗十分有意義 我獲得很深刻的經(jīng)驗。通過這次課程設(shè)計,我們知道了理論和實際的距離,也知道了理論和實際想結(jié)合的重要性,也從中得知了很多書本上無法得知的知識。 </p><p>  我們的學(xué)習(xí)不但要立足于書本,以解決理論和實際教學(xué)中的實際問題為目的,還要

133、以實踐相結(jié)合,理論問題即實踐課題,解決問題即課程研究,學(xué)生自己就是一個專家,通過自己的手來解決問題比用腦子解決問題更加深刻。學(xué)習(xí)就應(yīng)該采取理論與實踐結(jié)合的方式,理論的問題,也就是實踐性的課題。這種做法既有助于完成理論知識的鞏固,又有助于帶動實踐,解決實際問題,加強我們的動手能力和解決問題的能力。</p><p><b>  參考文獻(xiàn)</b></p><p>  [1]

134、 謝自美.電子線路設(shè)計·實驗·測試[M].武漢:華中理工大學(xué)出版社,1992.</p><p>  [2] 何立民.單片機應(yīng)用系統(tǒng)設(shè)計[M].北京:北京航空航天大學(xué)出版社,1993.</p><p>  [3] 樓然笛.單片機開發(fā)[M].北京:人民郵電出版社,1994.[4] 付家才.單片機控制工程實踐技術(shù)[M].北京:化學(xué)工業(yè)出版社 2004.3.[5] 李光才.

溫馨提示

  • 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. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論