2023年全國碩士研究生考試考研英語一試題真題(含答案詳解+作文范文)_第1頁
已閱讀1頁,還剩36頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、<p><b>  課程設(shè)計說明書</b></p><p>  課程名稱: 2011級機電專業(yè)課程設(shè)計 </p><p>  題 目: 智能電子鐘(LCD顯示) </p><p>  學(xué) 院: 機電工程學(xué)院 系: 機電 </p><p>  專

2、業(yè): 機械設(shè)計制造及其自動化 </p><p>  班 級: 機制xxx班 </p><p>  學(xué) 號: xxxxxxxxx </p><p>  學(xué)生姓名: xxxxx </p><p>

3、  起訖日期: — </p><p>  指導(dǎo)教師: xxxxxx 職稱: </p><p>  系分管主任: </p><p>  審核日期: </p>

4、<p><b>  摘 要</b></p><p>  電子時鐘主要是利用電子技術(shù)將時鐘電子化、數(shù)字化,擁有時鐘精確、體積小、界面友好、可擴展性能強等特點,被廣泛應(yīng)用于生活和工作當(dāng)中。另外,在生活和工農(nóng)業(yè)生產(chǎn)中,也常常需要溫度,這就需要電子時鐘具有多功能性。本設(shè)計主要為實現(xiàn)一款可正常顯示時鐘/日歷、帶有定時鬧鈴的多功能電子時鐘。</p><p>  

5、本文對當(dāng)前電子鐘開發(fā)手段進行了比較和分析,最終確定了采用單片機技術(shù)實現(xiàn)多功能電子時鐘。本設(shè)計應(yīng)用AT89C51芯片作為核心,使用DS1302實時時鐘日歷芯片完成時鐘/日歷的基本功能。這種實現(xiàn)方法的優(yōu)點是電路簡單,性能可靠,實時性好,時間精確,操作簡單,編程容易。</p><p>  該電子時鐘可以應(yīng)用于一般的生活和工作中,也可通過改裝,提高性能,增加新功能,從而給人們的生活和工作帶來更多的方便。</p>

6、;<p>  關(guān)鍵詞:電子時鐘;多功能;AT89C51;DS1302</p><p><b>  總體設(shè)計方案</b></p><p><b>  1.1 方案設(shè)計</b></p><p>  實時時鐘芯片具備年、月、日、時、分、秒計時功能和多點計時功能,計時數(shù)據(jù)的更新每秒自動進行一次,不需程序干預(yù)。計算機

7、可通過中斷或查詢方式讀取計時數(shù)據(jù)進行顯示,因此計時功能的實現(xiàn)無需占用CPU的時間,程序簡單。此外,實時時鐘芯片多數(shù)帶有鋰電池做后備電源,具備永不停止的計時功能;具有可編程方波輸出功能,可用做實時測控系統(tǒng)的采樣信號等;有的實時時鐘芯片內(nèi)部還帶有非易失性RAM,可用來存放需長期保存但有時也需變更的數(shù)據(jù),由于功能完善,精度高,軟件程序設(shè)計相對簡單,且計時不占用CPU時間,因此,在工業(yè)實時測控系統(tǒng)中多采用這一類專用芯片來實現(xiàn)實時時鐘功能。<

8、;/p><p>  利用單片機內(nèi)部的定時/計數(shù)器進行中斷定時,配合軟件延時實現(xiàn)時、分、秒的計時及秒表計時。該方案節(jié)省硬件成本,且能使設(shè)計者對單片機的指令系統(tǒng)能有更深入的了解,從而掌握單片機應(yīng)用技術(shù)MCS-51匯編語言程序設(shè)計方法,因此,本系統(tǒng)設(shè)計采用此種軟件控制方法來實現(xiàn)計時。而由于Atmel公司的AT89C51是一種自帶4KB Flash存儲器的低電壓、高性能的CMOS 8位微處理器。該器件采用Atmel高密度非易

9、失存儲器制造技術(shù)制造,與工業(yè)標準的MCS-51指令集和輸出引腳相兼容。它的功能強大,而且也比較容易購買,故本設(shè)計中所選的單片機為AT89C51單片機。</p><p><b>  系統(tǒng)框圖</b></p><p>  按照系統(tǒng)設(shè)計功能的要求,初步確定系統(tǒng)由主控模塊、時控模塊、及顯示模塊和鍵盤接口模塊共4個模塊組成。主控芯片使用51系列AT89C51單片機,時鐘芯片使用

10、美國DALLAS公司推出的一種高性能、低功耗、帶RAM的實時時鐘DS1302。采用DS1302作為計時芯片,可以做到計時準確。更重要的是,DS1302可以在很小電流的后備電源(2.5~5.5V電源,再2.5V時耗電小于300nA),而且DS1302可以編程選擇多種充電電流來為后備電源進行慢速充電,可以保證后備電源基本不耗電。顯示模塊采用普通的液晶顯示屏(LCD),設(shè)計框圖如圖1所示</p><p>  圖1 設(shè)

11、計方案框圖</p><p>  第2章 核心芯片簡介</p><p>  2.1 DS1302簡介</p><p>  DS1302是美國DALLAS公司推出的一種高性能、低功耗、帶RAM的實時時鐘芯片,它可以對年、月、日、周日、時、分、秒進行計時,且具有閏年補償功能,工作電壓寬達2.5~5.5V。時鐘可工作在24小時格式或12小時(AM/PM)格式。 DS13

12、02與單片機的接口使用同步串行通信,僅用3條線與之相連接??刹捎靡淮蝹魉鸵粋€字節(jié)或突發(fā)方式一次傳送多個字節(jié)的時鐘信號或RAM數(shù)據(jù)。DS1302內(nèi)部有一個31×8的用于臨時性存放數(shù)據(jù)的RAM寄存器。DS1302是DS1202的升級產(chǎn)品,與DS1202兼容,但增加了主電源/后背電源雙電源引腳,同時提供了對后背電源進行涓細電流充電的能力。</p><p>  2.1.1 DS1302引腳功能與內(nèi)部結(jié)構(gòu)<

13、;/p><p>  DS1302的引腳功能如表1所示,外形及內(nèi)部結(jié)構(gòu)如圖2所示:</p><p>  表1 DS1302引腳功能表</p><p><b>  X1 X2</b></p><p>  圖2 DS1302管腳圖及內(nèi)部結(jié)構(gòu)圖</p><p>  2.1.2 DS1302控制

14、字</p><p>  DS1302的控制字節(jié)如表2所示:</p><p>  表2 DS1302控制字節(jié)的含義</p><p>  控制字節(jié)的最高有效位(位7)必須是邏輯1,如果它為0,則不能把數(shù)據(jù)寫入到DS1302中。位6如果為0,則表示存取日歷時鐘數(shù)據(jù),為1表示存取RAM數(shù)據(jù);位5至位1指示操作單元的地址;最低有效位(位0)如為0表示要進行寫操作,為1表示進

15、行讀操作,控制字節(jié)總是從最低位開始輸出。</p><p>  2.1.3 DS1302復(fù)位引腳</p><p>  通過把輸入驅(qū)動置高電平來啟動所有的數(shù)據(jù)傳送。 輸入有兩種功能:首先,接通控制邏輯,允許地址/命令序列送入移位寄存器;其次,提供了終止單字節(jié)或多字節(jié)數(shù)據(jù)的傳送手段。當(dāng)為高電平時,所有的數(shù)據(jù)傳送被初始化,允許對DS1302進行操作。如果在傳送過程中置為低電平,則會終止此次數(shù)據(jù)傳

16、送,并且I/O引腳變?yōu)楦咦钁B(tài)。上電運行時,在Vcc≥2.5V之前,必須保持低電平。只有在SCLK為低電平時,才能將RST置為高電平。</p><p>  2.1.4 DS1302數(shù)據(jù)的輸入與輸出</p><p>  在控制指令字輸入后的下一個SCLK時鐘的上升沿時數(shù)據(jù)被寫入DS1302,數(shù)據(jù)輸入從低位即位0開始。同樣,在緊跟8位的控制指令字后的下一個SCLK脈沖的下降沿讀出DS1302的

17、數(shù)據(jù),讀出數(shù)據(jù)時從低位0位至高位7,數(shù)據(jù)讀寫時序如圖3所示:</p><p>  圖3 數(shù)據(jù)讀寫時序</p><p>  2.1.5 DS1302寄存器</p><p>  DS1302共有12個寄存器,其中有7個寄存器與日歷、時鐘相關(guān),存放的數(shù)據(jù)位為BCD碼形式。其日歷、時間寄存器及其控制字見表3。</p><p>  此外,DS130

18、2還有年份寄存器、控制寄存器、充電寄存器、時鐘突發(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(讀)。&l

19、t;/p><p>  表3 DS1302的日歷、時鐘寄存器及其控制字</p><p>  2.2 AT89C51簡介</p><p>  AT89C51是一種帶4K字節(jié)FLASH存儲器(FPEROM—Flash Programmable and Erasable Read Only Memory)的低電壓、高性能CMOS 8位微處理器,俗稱單片機。AT89C2051

20、是一種帶2K字節(jié)閃存可編程可擦除只讀存儲器的單片機。單片機的可擦除只讀存儲器可以反復(fù)擦除1000次。該器件采用ATMEL高密度非易失存儲器制造技術(shù)制造,與工業(yè)標準的MCS-51指令集和輸出管腳相兼容。由于將多功能8位CPU和閃爍存儲器組合在單個芯片中,ATMEL的AT89C51是一種高效微控制器,AT89C2051是它的一種精簡版本。AT89C51單片機為很多嵌入式控制系統(tǒng)提供了一種靈活性高且價廉的方案。</p><

21、p>  2.2.1 AT89C51芯片引腳及特點</p><p>  AT89S51芯片的引腳結(jié)構(gòu)如圖4所示:</p><p>  圖4 AT89C51芯片的引腳結(jié)構(gòu)圖</p><p> ?。?)功能特性概括:</p><p>  AT89C51提供以下標準功能:40個引腳、4K Bytes Flash片內(nèi)程序存儲器、128 Byte

22、s的隨機存取數(shù)據(jù)存儲器(RAM)、32個外部雙向輸入/輸出(I/O)口、5個中斷優(yōu)先級2層中斷嵌套中斷、2個數(shù)據(jù)指針、2個16位可編程定時/計數(shù)器、2個全雙工串行通信口、看門狗(WDT)電路、片內(nèi)振蕩器及時鐘電路。此外,AT89C51可降至0Hz的靜態(tài)邏輯操作,并支持兩種軟件可選的節(jié)電工作模式??臻e模式下,CPU暫停工作,而RAM、定時/計數(shù)器、串行通信口、外中斷系統(tǒng)可繼續(xù)工作。掉電模式凍結(jié)振蕩器而保存RAM的數(shù)據(jù),停止芯片其它功能直至

23、外中斷激活或硬件復(fù)位。同時該芯片還具有PDIP、TQFP和PLCC等三種封裝形式,以適應(yīng)不同產(chǎn)品的需求。</p><p><b> ?。?)管腳說明:</b></p><p><b>  VCC:供電電壓。</b></p><p><b>  GND:接地。</b></p><p&

24、gt;  P0口:P0口為一個8位漏級開路雙向I/O口,也即地址/數(shù)據(jù)總線復(fù)用口。作為輸出口用時,能驅(qū)動8個TTL邏輯門電路。對端口寫“1”時,被定義為高阻輸入。</p><p>  在訪問外部數(shù)據(jù)存儲器或程序存儲器時,這組口線分時轉(zhuǎn)換地址(低8位)和數(shù)據(jù)總線復(fù)用,在訪問期間激活內(nèi)部上拉電阻。</p><p>  在Flash編程時,P0口接收指令字節(jié),而在程序校驗時,輸出指令字節(jié),校驗時

25、,要求外接上拉電阻。</p><p>  P1口:P1口是一個帶內(nèi)部上拉電阻的8位雙向I/O口,P1口的輸出緩沖級可驅(qū)動(吸收或輸出電流)4個TTL邏輯門電路。對端口寫“1”,通過內(nèi)部的上拉電阻把端口拉到高電平,此時可作輸入口。作輸入口使用時,因為內(nèi)部存在上拉電阻,某個引腳被外部信號拉低時會輸出一個電流(I)。</p><p>  在Flash編程和程序校驗期間,P1接收低8位地址。部分端

26、口還有第二功能,如表4所示</p><p>  表4 P1口部分引腳第二功能</p><p>  P2口:P2口是一個帶有內(nèi)部上拉電阻的8位雙向I/O口, P2口的輸出緩沖級可驅(qū)動(吸收或輸出電流)4個TTL邏輯門電路。對端口寫“1”,通過內(nèi)部的上拉電阻把端口拉到高電平,此時可作輸入口。作輸入口使用時,因為內(nèi)部存在上拉電阻,某個引腳被外部信號拉低時會輸出一個電流(I)。</p&g

27、t;<p>  在訪問外部程序存儲器或16位地址的外部數(shù)據(jù)存儲器(例如執(zhí)行MOVX@DPTR指令)時,P2口送出高8位地址數(shù)據(jù)。在訪問8位地址的外部數(shù)據(jù)寄存器(例如執(zhí)行MOVX@Ri指令)時,P2口線上的內(nèi)容(也即特殊功能寄存器(SFR)區(qū)中P2寄存器的內(nèi)容),在整個訪問期間不改變。</p><p>  在Flash編程或校驗時,P2亦接收高位地址和其它控制信號。</p><p&

28、gt;  P3口: P3口是一個帶有內(nèi)部上拉電阻的雙向8位I/O口, P3口的輸出緩沖級可驅(qū)動(吸收或輸出電流)4個TTL邏輯門電路。對P3口寫“1”時,它們被內(nèi)部的上拉電阻拉高并可作為輸入端口。作輸入口使用時,被外部信號拉低的P3口將用上拉電阻輸出電流(I)。</p><p>  P3口除了作為一般的I/O口線外,更重要的用途是它的第二功能,如表5所示:</p><p>  P3口還接收

29、一些用于Flash閃速存儲器編程和程序校驗的控制信號。</p><p>  表5 P3口引腳第二功能</p><p>  RST:復(fù)位輸入。當(dāng)振蕩器工作時,RST引腳出現(xiàn)兩個機器周期以上的高電平時間將使單片機復(fù)位。WDT溢出將使該引腳輸出高電平,設(shè)置SFR AUXR的DISRTO位(地址8EH)可打開或關(guān)閉該功能。 DISRTO位缺省為RESET輸出高電平打開狀態(tài)。 </p>

30、;<p>  ALE/:當(dāng)訪問外部存儲器或數(shù)據(jù)存儲器時,ALE(地址鎖存允許)輸出脈沖用于鎖存地址的低8位字節(jié)。即使不訪問外部寄存器,ALE仍以時鐘振蕩頻率的1/6輸出固定的正脈沖信號,因此它可對外輸出時鐘或用于定時目的。值得注意的是:每當(dāng)訪問外部數(shù)據(jù)存儲器時將跳過一個ALE脈沖。</p><p>  對Flash存儲器編程期間,該引腳還用于輸入編程脈沖()。</p><p>

31、;  如有必要,可通過對特殊功能寄存器(SFR)區(qū)中的8EH單元的D0位置位,可禁止ALE操作。該位置位后,只要一條MOVX和MOVC指令才會激活A(yù)LE。此外,該引腳會被微弱拉高,單片機執(zhí)行外部程序時,應(yīng)設(shè)置ALE無效。</p><p> ?。撼绦虼鎯υ试S()輸出是外部程序存儲器的讀選通信號,當(dāng)AT89S51由外部程序存儲器取指令(或數(shù)據(jù))時,每個機器周期兩次有效,即輸出兩個脈沖。當(dāng)訪問外部數(shù)據(jù)存儲器時,沒有兩次

32、有效的信號。</p><p>  EA/VPP:外部訪問允許。欲使CPU僅訪問外部程序存儲器(地址為0000H-FFFFH),EA端必須保持低電平(接地)。需要注意的是:如果加密位LB1被編程,復(fù)位時內(nèi)部會鎖存EA端狀態(tài)。</p><p>  如EA端保持高電平(接VCC端),CPU則執(zhí)行內(nèi)部程序存儲器中的指令。</p><p>  Flash存儲器編程期間,該引腳

33、用于施加+12V編程電壓(VPP)。</p><p>  XTAL1:反向振蕩放大器的輸入及內(nèi)部時鐘工作電路的輸入端。</p><p>  XTAL2:反向振蕩放大器器的輸出端。</p><p> ?。?)晶體振蕩器特性:</p><p>  AT89C51中有一個用于構(gòu)成內(nèi)部振蕩器的高增益反相放大器,引腳XTAL1和XTAL2分別為該反向放

34、大器的輸入端和輸出端。這個反向放大器與作為反饋元件的片外石英晶體或陶瓷諧振器一起構(gòu)成自激振蕩器。</p><p>  外接石英晶體(或陶瓷諧振器)及電容C1、C2接在放大器的反饋回路中構(gòu)成并聯(lián)振蕩電路。對外接電容C1、C2雖然沒有十分嚴格的要求,但電容容量的大小會輕微影響振蕩頻率的高低、振蕩器工作的穩(wěn)定性、起振的難易程度及溫度穩(wěn)定性。如果使用石英晶體,電容應(yīng)該使用30pF10pF。</p><

35、p>  還可以使用外部時鐘。這種情況下,外部時鐘脈沖接XTAL1端,即內(nèi)部時鐘發(fā)生器的輸入端, XTAL2應(yīng)懸空。</p><p>  由于外部時鐘信號是通過一個2分頻觸發(fā)器后作為內(nèi)部時鐘信號的,所以外部時鐘信號的占空比沒有特殊要求,但最小高電平持續(xù)時間和最大低電平持續(xù)時間應(yīng)符合產(chǎn)品技術(shù)條件的要求。</p><p>  2.2.2 AT89C51的主要性能參數(shù):</p>

36、<p>  (1)與MCS-51產(chǎn)品指令系統(tǒng)完全兼容。</p><p> ?。?)4K字節(jié)在系統(tǒng)可編程(ISP)Flash閃速存儲器。</p><p>  (3)1000次擦寫周期。</p><p> ?。?)4.0—5.5V的工作電壓范圍。</p><p> ?。?)全靜態(tài)工作模式:0Hz--33Hz。</p>

37、<p>  (6)三級程序加密。</p><p> ?。?)128x8字節(jié)的內(nèi)部RAM。</p><p>  (8)32個雙向可編程I/O口線。</p><p> ?。?)2個16位可編程定時/計數(shù)器。</p><p> ?。?0)6個中斷源。</p><p> ?。?1)全雙工UART串行通道。</p

38、><p>  (12)低功耗空閑和掉電模式。</p><p> ?。?3)中斷可從空閑模式喚醒系統(tǒng)。</p><p>  (14)看門狗(WDT)及雙數(shù)據(jù)指針。</p><p> ?。?5)掉電標識和快速編程特性。</p><p> ?。?6)靈活的在系統(tǒng)編程(ISP-字節(jié)或頁寫模式)。</p><p&

39、gt;  第3章 智能電子鐘軟硬件電路的設(shè)計</p><p><b>  3.1 時鐘電路</b></p><p>  使用串行接口時鐘芯片DS1302設(shè)計時鐘電路。該設(shè)計方案以單片機AT89S51為主控芯片,以串行時鐘芯片DS1302為核心計時芯片,組成數(shù)字時鐘電路。該電路不但能準確地計時、附加其它功能,而且,其三線接口可以節(jié)省接口資源,在斷電后不丟失時間和數(shù)

40、據(jù)信息。該設(shè)計方案的接口電路如圖5所示:</p><p>  圖5 DS1302接口電路</p><p><b>  3.2 硬件設(shè)計</b></p><p>  該設(shè)計的硬件電路由主控部分(單片機AT89C51)、計時部分(實時時鐘芯片DS1302)、D1602LCD、電源部分(三端穩(wěn)壓器7805)4個部分組成。各部分之間相互協(xié)作,構(gòu)成

41、一個統(tǒng)一的有機整體,實現(xiàn)數(shù)字時鐘的功能。各部分的硬件電路設(shè)計如下。設(shè)計總電路圖見附錄一。</p><p>  3.2.1 單片機AT89C51外圍電路設(shè)計</p><p>  單片機AT89S51作為主控芯片,控制整個電路的運行。單片機外圍需要一個復(fù)位電路,復(fù)位電路的功能是:系統(tǒng)上電時提供復(fù)位信號,直至系統(tǒng)電源穩(wěn)定后,撤消復(fù)位信號。為可靠起見,電源穩(wěn)定后還要經(jīng)一定的延時才撤銷復(fù)位信號,以

42、防電源開關(guān)或電源插頭分-合過程中引起的抖動而影響復(fù)位。該設(shè)計采用含有二極管的復(fù)位電路,復(fù)位電路可以有效的解決電源毛刺和電源緩慢下降(電池電壓不足)等引起的問題,在電源電壓瞬間下降時可以使電容迅速放電,一定寬度的電源毛刺也可令系統(tǒng)可靠復(fù)位。復(fù)位電路的設(shè)計圖如圖6所示:</p><p>  圖6 單片機復(fù)位電路圖</p><p>  AT89S51具有在系統(tǒng)可編程功能,可以很方便的改寫單片機

43、存儲器內(nèi)的程序不需要把芯片中從工作環(huán)境中剝離,把AT89S ISP下載口接入電路,可使電路實現(xiàn)該功能。AT89S51需要接入一個普通12MHz晶振,為其提供穩(wěn)定的時鐘脈沖。該設(shè)計中有6個八段數(shù)碼顯示管LED,所以,在單片機AT89S51外圍需要接入6個三極管來驅(qū)動數(shù)碼顯示管。此外,單片機外圍需要接入3個開關(guān),用來調(diào)整時鐘。單片機外圍電路的設(shè)計圖如圖7示:</p><p>  3.2.2 DS1302與單片機的接

44、口設(shè)計</p><p>  時鐘芯片DS1302與單片機AT89S51的接口是由3條線來完成的,單片機AT89S51的P1.0與時鐘芯片的數(shù)據(jù)傳輸端相連,P1.1用來作為DS1302輸入時鐘SCLK控制端,P1.2控制DS1302的復(fù)位輸入端。DS1302接標準32.768KHz石英晶振。DS1302與單片機的接口電路如圖8所示:</p><p>  圖8 DS1302與AT89C51

45、連接圖</p><p>  3.2.4 電源設(shè)計</p><p>  時鐘芯片DS1302有很寬的工作電壓范圍,其工作電壓為2.5~5.5V。單片機AT89S51的工作電壓范圍相對較窄,為4.0~5.5V,所以本設(shè)計中,給電路接入三端穩(wěn)壓器7805,利用它的穩(wěn)壓功能給電路提供穩(wěn)定的+5V電壓,使電路的工作保持很高的可靠性。在電路中接入一個發(fā)光二極管作為指示燈,可以很方便地指示電源與電路是

46、否接通。該設(shè)計的電源部分如圖10所示:</p><p>  圖10 電源電路圖</p><p>  3.2.5 按鍵開關(guān)去抖設(shè)計</p><p>  按鍵開關(guān)在電路中的連接如圖所示。按鍵未按下時,A點電位為高電平5V;按鍵按下時,A點電位為低電平。A點電位就用于向CPU傳遞按鍵的開關(guān)狀態(tài)。但是由于按鍵的結(jié)構(gòu)為機械彈性開關(guān),在按鍵按下和斷開時,觸點在閉合和斷開瞬

47、間還會接觸不穩(wěn)定,引起A點電平不穩(wěn)定,如圖11所示,鍵盤的抖動時間一般為5~10ms,抖動現(xiàn)象會引起CPU對一次鍵操作進行多次處理,從而可能產(chǎn)生錯誤。因此必須設(shè)法消除抖動的不良后果。</p><p>  圖11 鍵操作和鍵抖動</p><p>  消除抖動的不良后果的方法有硬、軟件兩種。</p><p>  為了節(jié)省硬件,通常在單片機系統(tǒng)中,一般不采用硬件方法消除鍵

48、的抖動,而是用軟件消除抖動的方法。根據(jù)抖動特性,在第一次檢測到按鍵按下后,執(zhí)行一段延時5~10ms讓前延抖動消失后再一次檢測鍵的狀態(tài),如果仍保持閉合狀態(tài)電平,則確認真正有鍵按下。當(dāng)檢測到按鍵釋放后,也要給5~10ms的延時,待后延抖動消失后才轉(zhuǎn)入該鍵處理程序。</p><p><b>  3.3 軟件設(shè)計</b></p><p>  電子時鐘的程序主要包括3個方面的

49、內(nèi)容:一是DS1302從單片機中讀取數(shù)據(jù)進行計數(shù),二是利用按鍵進行時間的調(diào)整,三是單片機中讀取DS1302中的數(shù)據(jù)驅(qū)動LED數(shù)碼管顯示時間。STC89C52RC單片機主要I/O口的分配:P10、P11、P12分別接時鐘芯片的SCLK、I/O、RST引腳,P13、P14接兩個獨立按鍵。</p><p>  圖12 時間調(diào)整程序流程圖</p><p>  第4章 protues仿真與調(diào)試

50、</p><p><b>  4.1總原理圖</b></p><p>  利用keil軟件編寫源程序。在protues中畫好其電路圖如下圖14所示:</p><p>  圖13 電路板的原理圖</p><p><b>  4.2電路板的仿真</b></p><p><

51、b>  源 程 序</b></p><p>  #include <REG51.H></p><p>  #include <intrins.h></p><p>  #include "lcd.h"</p><p>  #include "1302.h"<

52、;/p><p>  #define uint unsigned int</p><p>  #define uchar unsigned char</p><p>  sbit Set = P3^0; //模式切換鍵</p><p>  sbit Up = P3^3; //加法按鈕</p><p>

53、  sbit Down = P3^6; //減法按鈕</p><p>  sbit out = P3^1; //立刻跳出調(diào)整模式按鈕</p><p>  char done,count,temp,flag,up_flag,down_flag;</p><p>  void show_time(); //液晶顯示程序</p>&l

54、t;p>  void Delay1ms(unsigned int count)</p><p><b>  {</b></p><p>  unsigned int i,j;</p><p>  for(i=0;i<count;i++)</p><p>  for(j=0;j<120;j++);<

55、/p><p><b>  }</b></p><p><b>  /*延時子程序*/</b></p><p>  void mdelay(uint delay)</p><p><b>  { uint i;</b></p><p>  for(;delay

56、>0;delay--)</p><p>  {for(i=0;i<62;i++) //1ms延時.</p><p><b>  {;}</b></p><p><b>  }</b></p><p><b>  }</b></p><p> 

57、 void outkey() //跳出調(diào)整模式,返回默認顯示</p><p>  { uchar Second;</p><p>  if(out==0) </p><p>  { mdelay(8); </p><p><b>  count=0;</b></p><p&

58、gt;  hide_sec=0,hide_min=0,hide_hour=0,hide_day=0,hide_week=0,hide_month=0,hide_year=0;</p><p>  Second=Read1302(DS1302_SECOND);</p><p>  Write1302(0x8e,0x00); //寫入允許</p><p>  Write

59、1302(0x80,Second&0x7f);</p><p>  Write1302(0x8E,0x80); //禁止寫入</p><p>  done=0; </p><p>  while(out==0);</p><p><b>  }</b></p>

60、<p><b>  }</b></p><p>  ////////////////////////////////////////////////////////////////////////////////////////////////////////////</p><p>  void Upkey()//升序按鍵</p><p

61、><b>  { </b></p><p><b>  Up=1;</b></p><p><b>  if(Up==0)</b></p><p><b>  {</b></p><p>  mdelay(8);</p><

62、p>  switch(count)</p><p><b>  {case 1:</b></p><p>  temp=Read1302(DS1302_SECOND); //讀取秒數(shù)</p><p>  temp=temp+1; //秒數(shù)加1</p><p>  up_flag=1; //數(shù)據(jù)調(diào)整后更新標

63、志</p><p>  if((temp&0x7f)>0x59) //超過59秒,清零</p><p>  temp=0; </p><p><b>  break;</b></p><p><b>  case 2:</b></p><p&g

64、t;  temp=Read1302(DS1302_MINUTE); //讀取分數(shù)</p><p>  temp=temp+1; //分數(shù)加1</p><p>  up_flag=1;</p><p>  if(temp>0x59) //超過59分,清零</p><p><b>  temp=0;</

65、b></p><p><b>  break;</b></p><p><b>  case 3:</b></p><p>  temp=Read1302(DS1302_HOUR); //讀取小時數(shù)</p><p>  temp=temp+1; //小時數(shù)加1</p><

66、;p>  up_flag=1;</p><p>  if(temp>0x23) //超過23小時,清零</p><p><b>  temp=0;</b></p><p><b>  break;</b></p><p><b>  case 4:</b><

67、;/p><p>  temp=Read1302(DS1302_WEEK); //讀取星期數(shù)</p><p>  temp=temp+1; //星期數(shù)加1</p><p>  up_flag=1;</p><p>  if(temp>0x7) </p><p><b>  temp=1;</b&g

68、t;</p><p><b>  break;</b></p><p><b>  case 5:</b></p><p>  temp=Read1302(DS1302_DAY); //讀取日數(shù)</p><p>  temp=temp+1; //日數(shù)加1</p><p>

69、  up_flag=1;</p><p>  if(temp>0x31)</p><p><b>  temp=1;</b></p><p><b>  break;</b></p><p><b>  case 6:</b></p><p>  

70、temp=Read1302(DS1302_MONTH); //讀取月數(shù)</p><p>  temp=temp+1; //月數(shù)加1</p><p>  up_flag=1;</p><p>  if(temp>0x12)</p><p><b>  temp=1;</b></p><p>

71、;<b>  break;</b></p><p><b>  case 7:</b></p><p>  temp=Read1302(DS1302_YEAR); //讀取年數(shù)</p><p>  temp=temp+1; //年數(shù)加1</p><p>  up_flag=1;</p>

72、;<p>  if(temp>0x85)</p><p><b>  temp=0;</b></p><p><b>  break;</b></p><p>  default:break;</p><p><b>  }</b></p>&

73、lt;p>  while(Up==0);</p><p><b>  }</b></p><p><b>  }</b></p><p>  ////////////////////////////////////////////////////////////////////////////////////////

74、////////////////////</p><p>  void Downkey()//降序按鍵</p><p><b>  { </b></p><p><b>  Down=1;</b></p><p>  if(Down==0)</p><p><b

75、>  {</b></p><p>  mdelay(8);</p><p>  switch(count)</p><p><b>  {case 1:</b></p><p>  temp=Read1302(DS1302_SECOND); //讀取秒數(shù)</p><p>  t

76、emp=temp-1; //秒數(shù)減1</p><p>  down_flag=1; //數(shù)據(jù)調(diào)整后更新標志</p><p>  if(temp==0x7f) //小于0秒,返回59秒</p><p>  temp=0x59;</p><p><b>  break;</b></

77、p><p><b>  case 2:</b></p><p>  temp=Read1302(DS1302_MINUTE); //讀取分數(shù)</p><p>  temp=temp-1; //分數(shù)減1</p><p>  down_flag=1;</p><p>  if(temp==-1)<

78、;/p><p>  temp=0x59; //小于0秒,返回59秒</p><p><b>  break;</b></p><p><b>  case 3:</b></p><p>  temp=Read1302(DS1302_HOUR); //讀取小時數(shù)</p><

79、p>  temp=temp-1; //小時數(shù)減1</p><p>  down_flag=1;</p><p>  if(temp==-1)</p><p>  temp=0x23;</p><p><b>  break;</b></p><p><b>  case 4:&l

80、t;/b></p><p>  temp=Read1302(DS1302_WEEK); //讀取星期數(shù)</p><p>  temp=temp-1; //星期數(shù)減1</p><p>  down_flag=1;</p><p>  if(temp==0)</p><p>  temp=0x7;;</p&

81、gt;<p><b>  break;</b></p><p><b>  case 5:</b></p><p>  temp=Read1302(DS1302_DAY); //讀取日數(shù)</p><p>  temp=temp-1; //日數(shù)減1</p><p>  down_fl

82、ag=1;</p><p>  if(temp==0)</p><p><b>  temp=31;</b></p><p><b>  break;</b></p><p><b>  case 6:</b></p><p>  temp=Read13

83、02(DS1302_MONTH); //讀取月數(shù)</p><p>  temp=temp-1; //月數(shù)減1</p><p>  down_flag=1;</p><p>  if(temp==0)</p><p><b>  temp=12;</b></p><p><b>  b

84、reak;</b></p><p><b>  case 7:</b></p><p>  temp=Read1302(DS1302_YEAR); //讀取年數(shù)</p><p>  temp=temp-1; //年數(shù)減1</p><p>  down_flag=1;</p><p>

85、;  if(temp==-1)</p><p>  temp=0x85;</p><p><b>  break;</b></p><p>  default:break;</p><p><b>  }</b></p><p>  while(Down==0);</p

86、><p><b>  }</b></p><p><b>  }</b></p><p>  void Setkey()//模式選擇按鍵</p><p><b>  {</b></p><p><b>  Set=1;</b></

87、p><p>  if(Set==0)</p><p><b>  {</b></p><p>  mdelay(8);</p><p>  count=count+1; //Setkey按一次,count就加1</p><p>  done=1; //進入調(diào)整模式</p><

88、;p>  while(Set==0);</p><p><b>  }</b></p><p><b>  }</b></p><p>  void keydone()//按鍵功能執(zhí)行</p><p>  { uchar Second;</p><p> 

89、 if(flag==0) //關(guān)閉時鐘,停止計時</p><p>  { Write1302(0x8e,0x00); //寫入允許</p><p>  temp=Read1302(0x80);</p><p>  Write1302(0x80,temp|0x80);</p><p>  Write1302(0x8e,0x80); //禁

90、止寫入</p><p><b>  flag=1;</b></p><p><b>  }</b></p><p>  Setkey(); //掃描模式切換按鍵</p><p>  switch(count)</p><p>  {case 1:

91、do //count=1,調(diào)整秒</p><p><b>  {</b></p><p>  outkey(); //掃描跳出按鈕</p><p>  Upkey(); //掃描加按鈕</p><p>  Downkey(); //

92、掃描減按鈕</p><p>  if(up_flag==1||down_flag==1) //數(shù)據(jù)更新,重新寫入新的數(shù)據(jù)</p><p><b>  {</b></p><p>  Write1302(0x8e,0x00); //寫入允許</p><p>  Write1302(0x80,temp|0x80); //寫

93、入新的秒數(shù)</p><p>  Write1302(0x8e,0x80); //禁止寫入</p><p>  up_flag=0;</p><p>  down_flag=0;</p><p><b>  }</b></p><p>  hide_sec++; //位閃計數(shù)<

94、;/p><p>  if(hide_sec>3)</p><p>  hide_sec=0;</p><p>  show_time(); //液晶顯示數(shù)據(jù)</p><p>  }while(count==2);break; </p><p>  case 2:do //co

95、unt=2,調(diào)整分</p><p><b>  {</b></p><p>  hide_sec=0;</p><p><b>  outkey();</b></p><p><b>  Upkey();</b></p><p>  Downkey();

96、</p><p>  if(temp>0x60)</p><p><b>  temp=0;</b></p><p>  if(up_flag==1||down_flag==1)</p><p><b>  {</b></p><p>  Write1302(0x8e,

97、0x00); //寫入允許</p><p>  Write1302(0x82,temp); //寫入新的分數(shù)</p><p>  Write1302(0x8e,0x80); //禁止寫入</p><p>  up_flag=0;</p><p>  down_flag=0;</p><p><b>  }&l

98、t;/b></p><p>  hide_min++;</p><p>  if(hide_min>3)</p><p>  hide_min=0;</p><p>  show_time();</p><p>  }while(count==3);break;</p><p>  

99、case 3:do //count=3,調(diào)整小時</p><p><b>  {</b></p><p>  hide_min=0; </p><p><b>  outkey();</b></p><p><b>  Upkey();</b></

100、p><p>  Downkey();</p><p>  if(up_flag==1||down_flag==1)</p><p><b>  {</b></p><p>  Write1302(0x8e,0x00); //寫入允許</p><p>  Write1302(0x84,temp); //

101、寫入新的小時數(shù)</p><p>  Write1302(0x8e,0x80); //禁止寫入</p><p>  up_flag=0;</p><p>  down_flag=0;</p><p><b>  }</b></p><p>  hide_hour++;</p><

102、p>  if(hide_hour>3)</p><p>  hide_hour=0;</p><p>  show_time();</p><p>  }while(count==4);break;</p><p>  case 4:do //count=4,調(diào)整星期</p><p>

103、;<b>  {</b></p><p>  hide_hour=0; </p><p><b>  outkey();</b></p><p><b>  Upkey();</b></p><p>  Downkey();</p><p>  if(u

104、p_flag==1||down_flag==1)</p><p><b>  {</b></p><p>  Write1302(0x8e,0x00); //寫入允許</p><p>  Write1302(0x8a,temp); //寫入新的星期數(shù)</p><p>  Write1302(0x8e,0x80); //禁

105、止寫入</p><p>  up_flag=0;</p><p>  down_flag=0;</p><p><b>  }</b></p><p>  hide_week++;</p><p>  if(hide_week>3)</p><p>  hide_we

106、ek=0;</p><p>  show_time();</p><p>  }while(count==5);break;</p><p>  case 5:do //count=5,調(diào)整日</p><p><b>  {</b></p><p>  hide_week=

107、0; </p><p><b>  outkey();</b></p><p><b>  Upkey();</b></p><p>  Downkey();</p><p>  if(up_flag==1||down_flag==1)</p><p><b>  

108、{</b></p><p>  Write1302(0x8e,0x00); //寫入允許</p><p>  Write1302(0x86,temp); //寫入新的日數(shù)</p><p>  Write1302(0x8e,0x80); //禁止寫入</p><p>  up_flag=0;</p><p>

109、  down_flag=0;</p><p><b>  }</b></p><p>  hide_day++;</p><p>  if(hide_day>3)</p><p>  hide_day=0;</p><p>  show_time();</p><p>

110、;  }while(count==6);break;</p><p>  case 6:do //count=6,調(diào)整月</p><p><b>  {</b></p><p>  hide_day=0; </p><p><b>  outkey();</b></p&

111、gt;<p><b>  Upkey();</b></p><p>  Downkey();</p><p>  if(up_flag==1||down_flag==1)</p><p><b>  {</b></p><p>  Write1302(0x8e,0x00); //寫入允

112、許</p><p>  Write1302(0x88,temp); //寫入新的月數(shù)</p><p>  Write1302(0x8e,0x80); //禁止寫入</p><p>  up_flag=0;</p><p>  down_flag=0;</p><p><b>  }</b><

113、/p><p>  hide_month++;</p><p>  if(hide_month>3)</p><p>  hide_month=0;</p><p>  show_time();</p><p>  }while(count==7);break;</p><p>  case 7

114、:do //count=7,調(diào)整年</p><p><b>  {</b></p><p>  hide_month=0; </p><p><b>  outkey();</b></p><p><b>  Upkey();</b></p>

115、<p>  Downkey();</p><p>  if(up_flag==1||down_flag==1)</p><p><b>  {</b></p><p>  Write1302(0x8e,0x00); //寫入允許</p><p>  Write1302(0x8c,temp); //寫入新的年

116、數(shù)</p><p>  Write1302(0x8e,0x80); //禁止寫入</p><p>  up_flag=0;</p><p>  down_flag=0;</p><p><b>  }</b></p><p>  hide_year++;</p><p> 

117、 if(hide_year>3)</p><p>  hide_year=0;</p><p>  show_time();</p><p>  }while(count==8);break;</p><p>  case 8: count=0;hide_year=0; //count8, 跳出調(diào)整模式,返回默認顯示狀態(tài)</p&

118、gt;<p>  Second=Read1302(DS1302_SECOND);</p><p>  Write1302(0x8e,0x00); //寫入允許</p><p>  Write1302(0x80,Second&0x7f);</p><p>  Write1302(0x8E,0x80); //禁止寫入</p&

119、gt;<p><b>  done=0;</b></p><p>  break; //count=7,開啟中斷,標志位置0并退出</p><p>  default:break;</p><p><b>  }</b></p><p><b>  }</b>&l

120、t;/p><p>  void show_time() //液晶顯示程序</p><p><b>  {</b></p><p>  DS1302_GetTime(&CurrentTime); //獲取時鐘芯片的時間數(shù)據(jù)</p><p>  TimeToStr(&CurrentTime);

121、//時間數(shù)據(jù)轉(zhuǎn)換液晶字符</p><p>  DateToStr(&CurrentTime); //日期數(shù)據(jù)轉(zhuǎn)換液晶字符</p><p>  GotoXY(0,1);</p><p>  Print(CurrentTime.TimeString); //顯示時間</p><p>  GotoXY(0,0);</p&g

122、t;<p>  Print(CurrentTime.DateString); //顯示日期</p><p>  GotoXY(15,0);</p><p>  Print(week_value); //顯示星期</p><p>  GotoXY(11,0);</p><p>  Print("W

123、eek"); //在液晶上顯示 字母 week</p><p>  Delay1ms(400); //掃描延時</p><p><b>  }</b></p><p><b>  main()</b></p><p><b>  {</b&g

124、t;</p><p>  flag=1; //時鐘停止標志</p><p>  LCD_Initial(); //液晶初始化</p><p>  Initial_DS1302(); //時鐘芯片初始化</p><p>  up_flag=0;</p><p>  down_flag=0;<

125、;/p><p>  done=0; //進入默認液晶顯示</p><p><b>  while(1)</b></p><p><b>  { </b></p><p>  while(done==1)</p><p>  keydone(); //

126、進入調(diào)整模式</p><p>  while(done==0)</p><p><b>  { </b></p><p>  show_time(); //液晶顯示數(shù)據(jù)</p><p>  flag=0; </p><p>  Se

127、tkey(); //掃描各功能鍵</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  LCD頭文件:</b></p><p> 

128、 #ifndef LCD_CHAR_1602_2005_4_9</p><p>  #define LCD_CHAR_1602_2005_4_9</p><p>  #include <intrins.h></p><p>  /***********1602液晶顯示部分子程序****************/</p><p> 

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論