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

下載本文檔

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

文檔簡介

1、<p><b>  課程論文</b></p><p>  題 目: Proteus課程設(shè)計 </p><p>  萬年歷 </p><p>  學(xué)生姓名: </p>

2、<p>  學(xué)生學(xué)號: </p><p>  系 別: 電氣信息工程學(xué)院 </p><p>  專 業(yè): 自動化 </p><p>  年 級: &l

3、t;/p><p>  任課教師: </p><p><b>  電氣信息工程學(xué)院制</b></p><p><b>  2013年11月</b></p><p><b>  目錄</b></p><p>

4、  1.1引言……………………………………………..……….….3</p><p>  1.2功能要求……………………………………………….….3</p><p><b>  1.3方案論證</b></p><p>  1.3.1方案論述 …………………………….……………..….3</p><p>  1.3.2方案比

5、較…………………………………………….…...4</p><p>  1.3.3時鐘模塊…………………………………………….…...5</p><p>  1.3.4語音報時模塊……………………………………….…...5</p><p>  1.4邏輯總框圖………………………………………..……..5</p><p>  1.5設(shè)計所需的元件

6、………………………………………..5</p><p><b>  1.6單元電路設(shè)計</b></p><p>  1.6.1主控制系統(tǒng)……………………………………..…..……6</p><p>  1.6.2時鐘震蕩電路……………………………………………7</p><p>  1.6.3復(fù)位電路………………………………

7、………..…….….8</p><p>  1.6.4DS1302時鐘電路…………………………….……...……8</p><p>  1.6.5按鍵電路………………………………………………….10</p><p>  1.6.6顯示電路………………………………………………….11</p><p>  1.7流程圖與軟件設(shè)計</p>

8、;<p>  1.7.1程序流程圖……………………………………....…….12</p><p>  1.7.2軟件設(shè)計……………………………………………….13</p><p>  1.7.3軟件調(diào)試……………………………………………….13</p><p>  1.8整體電路與仿真結(jié)果分析…………………….……13</p><p

9、>  1.9結(jié)論與心得………………………………………………14</p><p>  參考文獻………………………………………………………..14</p><p>  附錄……………………………………………………………..15</p><p><b>  電子萬年歷</b></p><p><b>  學(xué)生:

10、張圣矗</b></p><p><b>  指導(dǎo)教師:張水鋒</b></p><p>  電氣信息工程學(xué)院 自動化專業(yè)</p><p><b>  1.1 引言</b></p><p>  該電子時鐘主要采用AT89C51單片機作為主控核心,由DS1302時鐘芯片提供時鐘、LED動態(tài)掃描

11、顯示屏顯示AT89C51單片機是由Atmel公司推出的,功耗小,電壓可選用4~6V電壓供電;DS1302時鐘芯片是美國DALLAS公司推出的具有涓細電流充電功能的低功耗實時時鐘芯片,它可以對年、月、日、星期、時、分、秒進行計時,還具有閏年補償?shù)榷喾N功能,而且DS1302的使用壽命長,誤差??;數(shù)字顯示是采用的LED顯示屏來顯示,可以同時顯示年、月、日、星期、時、分、秒等信息。此外,該電子時鐘還具有時間校準(zhǔn)等功能。</p>&

12、lt;p>  本文提出了一種基于AT89C51單片機的時鐘設(shè)計方案,本方案以AT89C51單片機作為主控核心,與時鐘芯片DS1302、按鍵、LED顯示等模塊組成硬件系統(tǒng)。在硬件系統(tǒng)中設(shè)有獨立按鍵和LED顯示器,能顯示豐富的信息,根據(jù)使用者的需要可以隨時對時間進行校準(zhǔn)、選擇時間等,綜上所述此電子時鐘具有讀取方便、顯示直觀、功能多樣、電路簡潔、成本低廉等諸多優(yōu)點,符合電子儀器儀表的發(fā)展趨勢,具有廣闊的市場前景。</p>

13、<p><b>  1.2功能要求</b></p><p>  1、顯示年月日時分秒及星期信息</p><p>  2、具有可調(diào)整日期和時間功能</p><p>  3、增加閏年計算功能</p><p><b>  4、實現(xiàn)語音報時</b></p><p><

14、b>  1.3方案論證</b></p><p>  1.3.1 方案論述:</p><p>  隨著國內(nèi)超大規(guī)模集成電路的出現(xiàn),微處理器及其外圍芯片有了迅速的發(fā)展。集成技術(shù)的最新發(fā)展之一是將CPU和外圍芯片,如程序存儲器、數(shù)據(jù)存儲器、并行I/O口、串行I/O口、定時/計數(shù)器、中斷控制器及其他控制部件集成在一個芯片之中,制成單片計算機(Single-Chip Microco

15、mputer)。而近年來推出的一些高檔單片機還包括有許多特殊功能單元,如A/D、D/A轉(zhuǎn)換器、調(diào)制解調(diào)器、通信控制器、鎖相環(huán)、DMA、浮點運算單元、PWM控制輸出單元、PWM輸出時的死區(qū)可編程控制功能等。因此,只要外加一些擴展電路及必要的通道接口就可以構(gòu)成各種計算機應(yīng)用系統(tǒng),如工業(yè)流水線控制系統(tǒng)、作為家用電器的主控制器、分布式控制系統(tǒng)的終端節(jié)點或作為其主控制節(jié)點起中繼的作用、數(shù)據(jù)采集系統(tǒng)、自動測試系統(tǒng)等。  單片機的出現(xiàn),并在各技術(shù)領(lǐng)

16、域中得到如此迅猛的發(fā)展,與單片機構(gòu)成計算機應(yīng)用系統(tǒng)所形成的下述特點有關(guān):  1、單片機構(gòu)成的應(yīng)用系統(tǒng)有較大的可靠性。這些可靠性的獲得除了依靠單片機芯片本身的高可靠性以及應(yīng)用有最少的聯(lián)接外,還可以方便地采用軟、硬件技術(shù)?! ?、系統(tǒng)擴展、系統(tǒng)配置較典型、規(guī)范,容易構(gòu)成各種規(guī)模的</p><p><b>  1.3.2方案比較</b></p><p><b&g

17、t;  一:控制MCU</b></p><p>  方案一:STM8,STM公司推出的新款MCU,性能高,外設(shè)資源豐富,</p><p>  帶有12位AD、12位DA、脈寬調(diào)制PWM、最高機器周期16MHz等。且</p><p>  其功耗非常小,價格便宜,性價比非常高。缺點是只能用官方開發(fā)的</p><p>  S-Link下

18、載器進行下載,其價格比較高,一般學(xué)習(xí)者手上都沒有。</p><p>  方案二:AT89S52,AT公司的51單片機。優(yōu)點是支持ISP在線下載;</p><p><b>  缺點是價格比較高。</b></p><p>  方案三:STC89C52,宏晶公司的51系列單片機,價格便宜,在國內(nèi)</p><p>  使用者非常

19、多。支持串口下載,使用非常方便,且具有很大的價格優(yōu)</p><p>  勢。缺點是僅支持串口下載,不支持在線下載,使用中會有些不方便。</p><p>  由于本設(shè)計對控制芯片的要求不高,因此選用方案三。</p><p><b>  1.3.3時鐘模塊</b></p><p>  方案一:用單片機的定時器產(chǎn)生1S的時基信

20、號,然后用程序來實現(xiàn)時</p><p>  鐘的時、分、秒計時,同時用程序來產(chǎn)生年、月、日。該方案優(yōu)點是</p><p>  減少使用外設(shè)芯片;缺點是用單片機模擬時鐘,使編程量增大,且用</p><p>  定時器產(chǎn)生時基信號,精度不高。</p><p>  方案二:使用時鐘芯片DS12C887。優(yōu)點是8位數(shù)據(jù)線并行控制,控制</p&g

21、t;<p>  簡單;自帶有鋰電池,外部掉電時,其內(nèi)部時間信息還能夠保持 10年之久。缺點是并行控制,占用太多的IO口,且價格很高,不適合一般的電子制作。</p><p>  方案三:使用時鐘芯片DS1302。優(yōu)點是同步串行通信,僅使用3個IO口,占用最少的單片機資源;其內(nèi)部功能強大。更重要的是其價格便宜,具有非常高的性價比。缺點是串行通信,控制比較復(fù)雜。</p><p> 

22、 綜上,本設(shè)計選擇方案三。</p><p>  1.3.4語音報時模塊</p><p>  方案一:使用語音芯片BLA902。優(yōu)點是錄音量大,最大支持1GB MP3格式的語音數(shù)據(jù),支持FAT文件格式,語音音質(zhì)好,32KHz采樣,并內(nèi)置功放。缺點是價格高,且需要自己進行語音合成,使用不方便。</p><p>  方案二:使用專用OTP時鐘語音芯片NY3P035AP8。

23、OTP時鐘語音芯片專門為時鐘語音電路設(shè)計,內(nèi)置32段語音數(shù)據(jù),包括了各種時鐘報時語音,且內(nèi)置功放。更主要的是價格低,單信號線控制,使用方便。 綜上,本設(shè)計選擇方案二。</p><p><b>  1.4邏輯總框圖</b></p><p>  該電子萬年歷的總體設(shè)計框圖如圖(1)所示。</p><p>  1.5設(shè)計所需的元件:</p>

24、;<p>  元件名稱 型號 數(shù)量/個</p><p>  單片機 AT89C51 1 </p><p>  時鐘芯片 DS1302 1</p><p>  晶振 12MHz 1</p><p>  晶振

25、 32.768kHz 1</p><p>  電容 30pF 2</p><p>  電容 22uF 1</p><p>  按鍵開關(guān) 4</p><p>  電阻 10K 9

26、</p><p>  滑動變阻器 1K 1</p><p>  電池 1.5V 4</p><p>  LCD LCD1602 1</p><p>  電源Vcc +5V 1</p><p> 

27、 導(dǎo)線 若干</p><p>  1.6單元電路設(shè)計:</p><p>  1.6.1主控制系統(tǒng)</p><p>  單片機中央處理系統(tǒng)的方案設(shè)計,選用AT89C51單片機作為中央處理器,如圖(2)所示。該單片機除了擁有MCS-51系列單片機的所有優(yōu)點外,內(nèi)部還具有8K的在系統(tǒng)可編程FLASH存儲器,低功耗的空閑和掉電模式,極

28、大的降低了電路的功耗,還包含了定時器、程序存儲器、數(shù)據(jù)存儲器等硬件,其硬件能符合整個控制系統(tǒng)的要求,不需要外接其他存儲器芯片和定時器件,方便地構(gòu)成一個最小系統(tǒng)。整個系統(tǒng)結(jié)構(gòu)緊湊,抗干擾能力強,性價比高。</p><p>  圖2 AT89C51引腳圖</p><p>  1.6.2時鐘振蕩電路</p><p>  時鐘振蕩電路圖(3)所示,時鐘振蕩電路用于產(chǎn)生

29、單片機正常工作時所需要的時鐘信號,電路由兩個30pF的瓷片電容和一個12MHz的晶振組成,并接入到單片機的XTAL1和XTAL2引腳處,使單片機工作于內(nèi)部振蕩模式。此電路在加電后延遲大約10ms振蕩器起振,在XTAL2引腳產(chǎn)生幅度為3V左右的正弦波時鐘信號,其振蕩頻率主要由石英晶振的頻率決定。電路中兩個電容C1、C2的作用使電路快速起振,提高電路的運行速度。</p><p>  圖(3) 時鐘振蕩電路圖<

30、/p><p><b>  圖(4) 復(fù)位電路</b></p><p><b>  1.6.3復(fù)位電路</b></p><p>  復(fù)位電路由電阻和極性電容組成,如圖(4)所示,通過高電平使單片機復(fù)位,在時鐘電路開始工作后,當(dāng)高電平的時間超過大約2us時,即可實現(xiàn)復(fù)位。此復(fù)位電路為上電復(fù)位,較為簡單。若改進可以添加手動復(fù)位的功能

31、,上電復(fù)位發(fā)生在開機加電時,由系統(tǒng)自動完成,手動復(fù)位通過一個按鍵來實現(xiàn),在程序運行時,若遇到死機,死循環(huán)或程序“跑飛”等情況,通過手動復(fù)位就可以實現(xiàn)重新啟動的操作。手動按鈕復(fù)位需要人為在復(fù)位輸入端RST上加入高電平。一般采用的辦法是在RST端和正電源Vcc之間接一個按鈕和一個電阻。 </p><p>  1.6.4 DS1302時鐘電路</p><p>  時鐘電路主要由時鐘芯片DS130

32、2、備用電池、晶振等幾部分組成,如圖(6)所示。DS1302采用3線串行接口,占用引腳少,內(nèi)部集成了可編程日歷時鐘,用戶可以根據(jù)需要通過單片機的控制來自行設(shè)置,支持雙電源供電,可以使用外部主電源和備用電源,備份電源能夠使時鐘芯片繼續(xù)工作。</p><p>  圖(5) DS1302管腳圖 </p><p>  圖(6) DS1302時鐘電路</p><p>  

33、DS1302各引腳的功能為:</p><p>  8: Vcc1:備用電池端;</p><p>  1: Vcc2:5V電源。當(dāng)Vcc2>Vcc1+0.2V時,由Vcc2向DS1302供電,當(dāng)Vcc2< Vcc1時,由Vcc1向DS1302供電;</p><p>  7: SCLK:串行時鐘,輸入;  </p><p&

34、gt;  6: I/O:數(shù)據(jù)輸入輸出口;</p><p>  5: CE/RST:復(fù)位腳;</p><p>  2、3: X1、X2 是外接晶振腳 (32.768KHZ的晶振);</p><p>  4: 地(GND)。</p><p>  DS1302有關(guān)日歷、時間的寄存器:</p><p>  圖(7)DS1

35、302有關(guān)日歷、時間的寄存器</p><p>  1、秒寄存器(81h、80h)的位7定義為時鐘暫停標(biāo)志(CH)。當(dāng)初始上電時該位置為1,時鐘振蕩器停止,DS1302處于低功耗狀態(tài);只有將秒寄器的該位置改寫為0時,時鐘才能開始運行。</p><p>  2、小時寄存器(85h、84h)的位7用于定義DS1302是運行于12小時模式還是24小時模式。當(dāng)為高時,選擇12小時模式。在12小時模式

36、時,位5是 ,當(dāng)為1時,表示PM。在24小時模式時,位5是第二個10小時位</p><p>  3、控制寄存器(8Fh、8Eh)的位7是寫保護位(WP),其它7位均置為0。在對任何的時鐘和RAM的寫操作之前,WP位必須為0。當(dāng)WP位為1時,寫保護位防止對任一寄存器的寫操作。也就是說在電路上電的初始態(tài)WP是1,這時是不能改寫上面任何一個時間寄存器的,只有首先將WP改寫為0,才能進行其它寄存器的寫操作。</p&

37、gt;<p>  DS1302讀寫時序 </p><p>  DS1302是SPI總線驅(qū)動方式。它不僅要向寄存器寫入控制字,還需要讀取相應(yīng)寄存器的數(shù)據(jù)。DS1302的控制字如圖(8):</p><p>  圖(8)DS1302的控制字圖</p><p>  控制字的最高有效位(位7)必須是邏輯1,如果它為0,則不能把數(shù)據(jù)寫入到DS1302中。</

38、p><p>  位6:如果為0,則表示存取日歷時鐘數(shù)據(jù),為1表示存取RAM數(shù)據(jù);</p><p>  位5至位1(A4~A0):指示操作單元的地址;</p><p>  位0(最低有效位):如為0,表示要進行寫操作,為1表示進行讀操作。</p><p><b>  讀數(shù)據(jù):</b></p><p> 

39、 讀數(shù)據(jù)時在緊跟8位的控制字指令后的下一個SCLK脈沖的下降沿,讀出DS1302的數(shù)據(jù),讀出的數(shù)據(jù)是從最低位到最高位。</p><p><b>  寫數(shù)據(jù):</b></p><p>  控制字總是從最低位開始輸出。在控制字指令輸入后的下一個SCLK時鐘的上升沿時,數(shù)據(jù)被寫入DS1302,數(shù)據(jù)輸入也是從最低位(0位)開始。</p><p>  1

40、.6.5 按鍵電路</p><p>  按鍵電路由四個輕觸開關(guān)組成,如圖(9)所示。按鍵用來調(diào)整時間,其一端直接接到單片機的端口,另一端接地,當(dāng)按下按鍵時,相應(yīng)的端口變?yōu)榈碗娖剑ㄟ^一個與門只要這四個按鍵有一個按下就會在P3.2檢測到一低電平就觸發(fā)外部中斷0進入按鍵調(diào)節(jié)程序中,通過與個各鍵相連的端口P3.4_P3.7可以判斷是哪個鍵按下,從而作相應(yīng)的操作。</p><p>  圖(9)

41、按鍵電路</p><p><b>  1.6.6顯示電路</b></p><p>  1602液晶也叫1602字符型液晶 它是一種專門用來顯示字母、數(shù)字、符號等的點陣型液晶模塊 它有若干個5X7或者5X11等點陣字符位組成,每個點陣字符位都可以顯示一個字符。顯示電路采用LCD1602液晶顯示,如圖(10)所示,圖中只畫出了其相應(yīng)的接口,3腳用于調(diào)節(jié)LCD1602的背光

42、,4、5、6為LCD1602的控制口,用于控制其寫入或是讀出指令,7至14腳為LCD1602的數(shù)據(jù)口,將數(shù)傳送到LCD1602中。</p><p>  圖(10) LCD1602顯示電路</p><p>  LCD1602的特性</p><p>  +5V電壓,對比度可調(diào);</p><p><b>  內(nèi)含復(fù)位電路;</b&

43、gt;</p><p>  提供各種控制命令,如:清屏、字符閃爍、光標(biāo)閃爍、顯示移位等多種功能;</p><p>  有80字節(jié)顯示數(shù)據(jù)存儲器DDRAM;</p><p>  內(nèi)建有160個5X7點陣的字型的字符發(fā)生器CGROM,8個可由用戶自定義的5X7的字符發(fā)生器CGRAM;</p><p><b>  基本操作時序: <

44、/b></p><p>  讀狀態(tài):輸入:RS=L,RW=H,E=H;輸出:DB0~DB7=狀態(tài)字 ;</p><p>  寫指令:輸入:RS=L,RW=L,E=下降沿脈沖,DB0~DB7=指令碼 ;輸出:無。</p><p>  讀數(shù)據(jù):輸入:RS=H,RW=H,E=H;輸出:DB0~DB7=數(shù)據(jù) ;</p><p>  寫數(shù)據(jù):輸入

45、:RS=H,RW=L,E=下降沿脈沖,DB0~DB7=數(shù)據(jù) ;輸出:無。</p><p>  LCD1602的各種指令不再一一說明。</p><p>  1.7 流程圖與軟件設(shè)計:</p><p>  1.7.1、程序流程圖</p><p>  主程序首先初始化定時器、LCD1602及DS1302,然后就開始查詢按鍵,有鍵按下則開始調(diào)整時間和

46、日期,若沒有按下,則執(zhí)行下面的時間、日期的顯示,最后依次循環(huán)這些相同的操作,相應(yīng)流程圖如圖(11)所示:</p><p>  圖(12)程序流程圖</p><p>  按鍵的檢測是通過中斷的辦法來實現(xiàn),利用按鍵進行間調(diào)整。 K1按下則開始設(shè)置時間及日期,同時在第一行最右端顯示被選擇的對象,第一次按下K1時,設(shè)置年份,若按下K3,則是減1操作,按下K2是加1操作,設(shè)置好年后,第二次按下K1時

47、,則是設(shè)置月份,按K3減,按K2則加1,依次循環(huán)下去,則可以將時間和日期設(shè)置完畢,K4是確定鍵,設(shè)置好按下即可保存設(shè)置了。</p><p>  1.7.2、軟件設(shè)計</p><p>  軟件總設(shè)計:主程序首先對系統(tǒng)環(huán)境初始化,設(shè)置定時器T0工作模式為16位定時/計數(shù)器模式,置位總中斷允許位EA,并對鍵盤端口置位,再對LCD1602初始化,DS1302初始化。接著掃描鍵盤,在鍵盤程序里面是對

48、時間、日期及鬧鐘的調(diào)整,最下面是時間的顯示。</p><p>  軟件程序編寫:軟件程序編寫的好壞直接影響著系統(tǒng)運行情況的良好。因本程序涉及的模塊較多,所以程序編寫也采用模塊化設(shè)計,C語言具有編寫靈活、移植方便、便于模塊化設(shè)計的特點,所以本系統(tǒng)的軟件采用C51編寫。</p><p>  具體程序見附件一:程序</p><p>  1.7.3、軟件調(diào)試</p&g

49、t;<p>  在軟件調(diào)試過程中,當(dāng)調(diào)節(jié)時間和日期后,單片機上電后更新的是PC的時間,后來查找資料發(fā)現(xiàn),是設(shè)置ds1302的問題, </p><p>  對于開發(fā)板上的液晶一般RW都接的地,故不需要讀液晶狀態(tài),也不需要讀忙,但在仿真中還是加上了這一部分。</p><p>  還有一個問題,在按鍵操作時有時會出現(xiàn)功能不穩(wěn)定,這是由于按鍵存在抖動,所以后來加個去抖動的延時后在判斷

50、,基本就可以解決問題,</p><p>  1.8 整體電路與仿真結(jié)果分析:</p><p>  電子萬年歷硬件電路圖及仿真如圖(13)所示,系統(tǒng)由AT89C52單片機,按鍵掃描電路、顯示電路、時鐘電路、晶振電路、復(fù)位電路及電源指示電路。</p><p>  仿真正確顯示了時間,在LCD1602中正確顯示了當(dāng)前日期、時間,通過按按鍵K1,就可以開始設(shè)置時間,依次按K

51、1依次在年、月、日、時、分之間切換,,按K2鍵用于加1操作,K3鍵用于減1操作,K4是確定按鈕。仿真正確顯示了時間和日期,符合設(shè)計的要求。</p><p>  圖(13) 電子萬年歷硬件電路圖</p><p>  1.9 結(jié)論與心得:</p><p>  該設(shè)計涉及到了單片機的時序控制,數(shù)據(jù)接口包括并行數(shù)據(jù)接口以及串行通信接口,同時用到了控制按鍵、環(huán)境信息檢測、

52、數(shù)據(jù)顯示處理等。這次設(shè)計,基本上涉及到了所有的單片機控制功能模塊。因此,通過這次設(shè)計,能完全掌握單片機的所有基本控制,這也是我們組選擇該題目的一個重要原因。在這學(xué)期的課程序設(shè)計中,收獲知識的同時,還收獲了閱歷,收獲了成熟,通過查找大量資料,請教老師,以及不懈的努力,不僅培養(yǎng)了獨立思考、 動手制作的能力,在各種其它能力上也都有了提高。更重要的是,在課程序設(shè)計里,我們學(xué)會了很多學(xué)習(xí)的方法,知道了理論和實踐的巨大差別。而這是以后最實用的,真的

53、是受益匪淺。要面對社會的挑戰(zhàn),只有不斷的學(xué)習(xí)、實踐,再學(xué)習(xí)、再實踐。同時在與老師和同學(xué)的交流過程中,互動學(xué)習(xí),將知識融會貫通。通過自己的努力,做出了一個萬年歷,對以后的學(xué)習(xí)是一個莫大的鼓舞,激起了我的學(xué)習(xí)興趣和開發(fā)創(chuàng)新思維。</p><p><b>  參考文獻</b></p><p>  [1] 張毅坤 陳善久, 單片微型計算機原理及應(yīng)用 西安電子科技大學(xué)出版社&l

54、t;/p><p>  [2] 張毅剛,彭喜元,單片機原理與應(yīng)用設(shè)計 電子工業(yè)出版社</p><p>  [3] 趙建領(lǐng) 薛園園 ,零基礎(chǔ)學(xué)單片機C語言程序設(shè)計 機械工業(yè)出版社</p><p>  [4] 周向紅 51單片機課程設(shè)計 華中科技大學(xué)出版社, </p><p>  [5] 郭天祥 51單片機C語言教程-入門,提高,開發(fā),拓展全攻略,

55、電子工業(yè)出版社</p><p>  [6] 趙亮 侯國銳. 單片機C語言編程與實例 人民郵電出版社</p><p>  [7]陳忠平, 基于proteus的51單片機設(shè)計與仿真 電子工業(yè)出版社</p><p><b>  附錄:</b></p><p><b>  實驗源程序:</b></

56、p><p>  #include <reg51.h></p><p>  #include <intrins.h></p><p>  #include <string.h></p><p>  #define uint unsigned int</p><p>  #define uc

57、har unsigned char</p><p>  sbit IO= P1^0; //DS1302數(shù)據(jù)線</p><p>  sbit SCLK = P1^1; //DS130時鐘線</p><p>  sbit RST = P1^2; //DS1302復(fù)位線</p><p>  sbit RS = P2^0; //LC

58、D數(shù)據(jù)/命令選擇端</p><p>  sbit RW = P2^1; //LCD讀/寫控制</p><p>  sbit EN = P2^2; //LCD使能端</p><p>  sbit K1=P3^4;//選擇</p><p>  sbit K2=P3^5;//加</p><p>  sbit

59、 K3=P3^6;//減</p><p>  sbit K4=P3^7; //確定</p><p>  uchar tCount=0;</p><p>  uchar MonthsDays[]={0,31,0,31,30,31,30,31,31,30,31,30,31};</p><p>  uchar *WEEK[]={&quo

60、t;SUN","MON","TUS","WEN","THU","FRI","SAT"};</p><p>  uchar LCD_DSY_BUFFER1[]={"DATE 00-00-00 "}; //顯示格式</p><p>  uc

61、har LCD_DSY_BUFFER2[]={"TIME 00:00:00 "};</p><p>  uchar DateTime[7]; //所讀取的日期時間</p><p>  char Adjust_Index=-1; //當(dāng)前調(diào)節(jié)的時間對象:,,分,是,日,月,年(1,2,3,4,6)</p><p>  uchar Chang

62、e_Flag[]= "-MHDM-Y"; //(分,時,日,月,年)(不調(diào)節(jié)秒與周)</p><p>  /*---------延時程序------------------*/</p><p>  void DelayMS(uint ms)</p><p><b>  {</b></p><p>&

63、lt;b>  uchar i;</b></p><p>  while(ms--){for(i=0;i<120;i++);}</p><p><b>  }</b></p><p>  //-----------向DS1302寫入一字節(jié)------------------//</p><p>  

64、void Write_A_Byte_TO_DS1302(uchar x)</p><p>  {uchar i;</p><p>  for(i=0;i<8;i++){</p><p>  IO=x&0x01; //每一位與1與存入IO中</p><p>  SCLK=1;SCLK=0;//一個高脈沖將數(shù)據(jù)送入液晶控制器&

65、lt;/p><p>  x>>=1; // 右移</p><p><b>  }</b></p><p><b>  }</b></p><p>  //-----------從DS1302讀取一字節(jié)------------------//</p><p&g

66、t;  uchar Get_A_Byte_FROM_DS1302()</p><p>  {uchar i,b=0x00;</p><p>  for(i=0;i<8;i++){</p><p>  b |= _crol_((uchar)IO,i);</p><p>  SCLK=1;SCLK=0; //每一個高脈沖讀取一位數(shù)據(jù)

67、</p><p><b>  }</b></p><p>  return b/16*10+b%16; //返回BCD碼</p><p><b>  }</b></p><p>  //-----------從DS1302指定位置讀數(shù)據(jù)------------------//</p>

68、<p>  uchar Read_Data(uchar addr)</p><p><b>  {</b></p><p>  uchar dat;</p><p>  RST = 0;SCLK=0;RST=1; //RST高電平時讀/寫</p><p>  Write_A_Byte_TO_DS1302(

69、addr); //先寫入地址</p><p>  dat = Get_A_Byte_FROM_DS1302();</p><p>  SCLK=1;RST=0;</p><p>  return dat;</p><p><b>  }</b></p><p>  //---------向DS1

70、302某地址寫入數(shù)據(jù)--------------------//</p><p>  void Write_DS1302(uchar addr,uchar dat)</p><p>  {SCLK=0;RST=1;</p><p>  Write_A_Byte_TO_DS1302(addr);</p><p>  Write_A_Byte_

71、TO_DS1302(dat);</p><p>  SCLK=0;RST=0; //高脈沖寫入數(shù)據(jù)</p><p><b>  }</b></p><p>  //--------------設(shè)置時間----------------//</p><p>  void SET_DS1302()</p>&

72、lt;p>  {uchar i;</p><p>  //寫控制字,取消寫保護</p><p>  Write_DS1302(0x8E,0x00);</p><p>  //分時日月年依次寫入</p><p>  for(i=1;i<7;i++)</p><p>  { //分的起始地址10000010

73、(0x82),后面依次是時,日,月,周,年,寫入地址每次遞增2</p><p>  Write_DS1302(0x80+2*i,(DateTime[i]/10<<4)|(DateTime[i]%10));</p><p><b>  } </b></p><p>  Write_DS1302(0x8E,0x80); //加保護&l

74、t;/p><p><b>  }</b></p><p>  //----------讀取當(dāng)前日期時間------------//</p><p>  void GetTime()</p><p><b>  {uchar i;</b></p><p>  for(i=0;i&l

75、t;7;i++){DateTime[i]=Read_Data(0X81+2*i);}</p><p><b>  }</b></p><p>  //-----------讀LCD狀態(tài)------------------//</p><p>  uchar Read_LCD_State()</p><p>  {uc

76、har state;</p><p>  RS=0;RW=1;EN=1; //輸出:D0~D7=狀態(tài)字</p><p>  DelayMS(1);</p><p>  state=P0; //從P0口讀LCD狀態(tài)</p><p>  EN = 0;DelayMS(1);</p><p>  return sta

77、te;</p><p><b>  }</b></p><p>  //-----------忙等待------------------//</p><p>  void LCD_Busy_Wait()</p><p><b>  {</b></p><p>  while(

78、(Read_LCD_State()&0x80)==0x80);</p><p>  DelayMS(5);</p><p><b>  }</b></p><p>  //-----------向LCD寫數(shù)據(jù)------------------//</p><p>  void Write_LCD_Data(u

79、char dat)</p><p><b>  {</b></p><p>  LCD_Busy_Wait();</p><p>  RS=1;EN=0;RW=0; //寫數(shù)據(jù),EN為高脈沖,</p><p>  P0=dat;EN=1;DelayMS(1);EN=0;</p><p>&l

80、t;b>  }</b></p><p>  //-------------寫LCD指令-------------------//</p><p>  void Write_LCD_Command(uchar cmd)</p><p><b>  {</b></p><p>  LCD_Busy_Wait

81、();</p><p>  RS=0;EN=0;RW=0; //寫指令,EN高脈沖,輸出:D0~D7=數(shù)據(jù)</p><p>  P0=cmd;EN=1;DelayMS(1);EN=0;</p><p><b>  }</b></p><p>  //-------------LCD初始化---------------

82、----//</p><p>  void Init_LCD()</p><p><b>  {</b></p><p>  Write_LCD_Command(0x38); //設(shè)置16*2顯示,5*7點陣,8位數(shù)據(jù)接口</p><p>  DelayMS(1);</p><p>  Wri

83、te_LCD_Command(0x01); //顯示清零,數(shù)據(jù)指針清零</p><p>  DelayMS(1);</p><p>  Write_LCD_Command(0x06); //寫一個字符后地址指針自動加1</p><p>  DelayMS(1);</p><p>  Write_LCD_Command(0x0c);

84、 //設(shè)置開顯示,不顯示光標(biāo)</p><p>  DelayMS(1);</p><p><b>  }</b></p><p>  //------------------------------------------</p><p>  //設(shè)置液晶顯示位置</p><p>  //---

85、---------------------------------------</p><p>  void Set_LCD_POS(uchar p){</p><p>  Write_LCD_Command(p|0x80);//相當(dāng)于在0x80基礎(chǔ)上加入位置量</p><p><b>  }</b></p><p>

86、  //----在LCD上顯示字符串---------//</p><p>  void Display_LCD_String(uchar p,uchar *s)</p><p>  {uchar i;</p><p>  Set_LCD_POS(p);</p><p>  for(i=0;i<16;i++)</p>

87、<p><b>  {</b></p><p>  Write_LCD_Data(s[i]); //在固定位置顯示時間日期</p><p>  DelayMS(1);</p><p><b>  }</b></p><p><b>  }</b></p>

88、<p>  //---------日期與時間值轉(zhuǎn)換為數(shù)字字符----------------//</p><p>  void Format_DateTime(uchar d,uchar *a)</p><p><b>  {</b></p><p>  a[0]=d/10+'0';</p><

89、p>  a[1]=d%10+'0';</p><p><b>  }</b></p><p><b>  //判斷是否為閏年</b></p><p>  uchar isLeapYear(uint y)</p><p>  {return (y%4==0&&y

90、%100!=0)||(y%400==0);}</p><p>  //求自2000.1.1開始的任何一天是星期幾</p><p>  //函數(shù)沒有通過,求出總天數(shù)后再求星期幾</p><p>  //因為求總天數(shù)可能會超出uint的范圍</p><p>  void RefreshWeekDay()</p><p> 

91、 {uint i,d,w=5; //已知1999.12.31是周五</p><p>  for(i=2000;i<2000+DateTime[6];i++)</p><p><b>  {</b></p><p>  d=isLeapYear(i)?366:365;</p><p>  w=(w+d)%7;&l

92、t;/p><p><b>  }</b></p><p><b>  d=0;</b></p><p>  for(i=1;i<DateTime[4];i++)</p><p>  {d+=MonthsDays[i];}</p><p>  d+=DateTime[3]

93、;</p><p>  //保存星期,0~6表示星期日,星期一,二,...,六,為了與DS1302的星期格式匹配,返回值需要加1</p><p>  DateTime[5]=(w+d)%7+1;</p><p><b>  }</b></p><p>  //*****年月日時分++/--********//</p

94、><p>  void DateTime_Adjust(char x)</p><p>  {switch(Adjust_Index)</p><p><b>  {</b></p><p>  case 6: //年00-99</p><p>  if(x==1&&DateT

95、ime[6]<99) DateTime[6]++;</p><p>  if(x==-1&&DateTime[6]>0) DateTime[6]--;</p><p><b>  //獲取2月天數(shù)</b></p><p>  MonthsDays[2]=isLeapYear(2000+DateTime[6])?29:

96、28;</p><p>  //如果年份變化后當(dāng)前月份的天數(shù)大于上限則設(shè)為上限</p><p>  if(DateTime[3]>MonthsDays[DateTime[4]])</p><p>  {DateTime[3]=MonthsDays[DateTime[4]];}</p><p>  RefreshWeekDay();

97、//刷新星期</p><p><b>  break;</b></p><p>  case 4: //月01-12</p><p>  if(x==1&&DateTime[4]<12) DateTime[4]++;</p><p>  if(x==-1&&DateTime[4]&

98、gt;1) DateTime[4]--;</p><p>  MonthsDays[2]=isLeapYear(2000+DateTime[6])?29:28;</p><p>  if(DateTime[3]>MonthsDays[DateTime[4]])</p><p>  {DateTime[3]=MonthsDays[DateTime[4]];}&

99、lt;/p><p>  RefreshWeekDay();</p><p><b>  break;</b></p><p>  case 3: //日00-28、29、30、31,調(diào)節(jié)之前首先根據(jù)年份得出該年中斷二月 天數(shù)</p><p>  MonthsDays[2]=isLeapYear(2000+DateTime

100、[6])?29:28;</p><p>  //根據(jù)當(dāng)前月份決定調(diào)節(jié)日期的上限</p><p>  if(x==1&&DateTime[3]<MonthsDays[DateTime[4]]) DateTime[3]++;</p><p>  if(x==-1&&DateTime[3]>0) DateTime[3]--;&l

101、t;/p><p>  RefreshWeekDay();</p><p><b>  break;</b></p><p>  case 2: //時</p><p>  if(x==1&&DateTime[2]<23) DateTime[2]++;</p><p>  i

102、f(x==-1&&DateTime[2]>0) DateTime[2]--;</p><p><b>  break;</b></p><p>  case 1://分</p><p>  if(x==1&&DateTime[1]<59) DateTime[1]++;</p><

103、;p>  if(x==-1&&DateTime[1]>0) DateTime[1]--;</p><p><b>  break;</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  //---

104、定時器0每秒刷新LCD顯示----//</p><p>  void T0_INT() interrupt 1</p><p><b>  {</b></p><p>  TH0=-50000/256;</p><p>  TL0=-50000%256;</p><p>  if(++tCount

105、 !=2)return;</p><p><b>  tCount=0;</b></p><p>  //按指定格式生成待顯示的日期時間串</p><p>  Format_DateTime(DateTime[6],LCD_DSY_BUFFER1+5);</p><p>  Format_DateTime(DateTi

106、me[4],LCD_DSY_BUFFER1+8);</p><p>  Format_DateTime(DateTime[3],LCD_DSY_BUFFER1+11);</p><p><b>  //星期</b></p><p>  strcpy(LCD_DSY_BUFFER1+13,WEEK[DateTime[5]-1]);</p&g

107、t;<p><b>  //時分秒</b></p><p>  Format_DateTime(DateTime[2],LCD_DSY_BUFFER2+5);</p><p>  Format_DateTime(DateTime[1],LCD_DSY_BUFFER2+8);</p><p>  Format_DateTime(Da

108、teTime[0],LCD_DSY_BUFFER2+11);</p><p>  //顯示年月日,星期,時分秒</p><p>  Display_LCD_String(0x00,LCD_DSY_BUFFER1);</p><p>  Display_LCD_String(0x40,LCD_DSY_BUFFER2);</p><p><

109、b>  }</b></p><p>  //----------鍵盤中斷(INT0)-------------//</p><p>  void EX_INT0() interrupt 0</p><p><b>  {</b></p><p>  if(K1==0) //選擇調(diào)整對象(Y M D

110、 H M)</p><p><b>  {</b></p><p>  DelayMS(10);</p><p>  if(K1==0){ </p><p>  //while(K1==0);</p><p>  if(Adjust_Index==-1||Adjust_Index==1)&l

111、t;/p><p><b>  {</b></p><p>  Adjust_Index=7;</p><p><b>  }</b></p><p>  Adjust_Index--;</p><p>  if(Adjust_Index==5) Adjust_Index=4;&l

112、t;/p><p>  LCD_DSY_BUFFER2[13]='[';</p><p>  LCD_DSY_BUFFER2[14]=Change_Flag[Adjust_Index]; //顯示調(diào)節(jié)對象</p><p>  LCD_DSY_BUFFER2[15]=']';</p><p><b>  }&

113、lt;/b></p><p><b>  }</b></p><p>  else if(K2==0) //加</p><p>  {//while(K2==0);</p><p>  DelayMS(10);</p><p><b>  if(K2==0)</b&

114、gt;</p><p>  DateTime_Adjust(1);</p><p><b>  }</b></p><p>  else if(K3==0) //減</p><p><b>  {</b></p><p>  DelayMS(10);//while(K3

115、==0);</p><p><b>  if(K3==0)</b></p><p>  DateTime_Adjust(-1);</p><p><b>  }</b></p><p>  else if(K4==0) //確定</p><p><b> 

116、 {</b></p><p>  //while(K4==0);</p><p>  DelayMS(10);</p><p>  if(K4==0){</p><p>  SET_DS1302(); //將調(diào)整后的時間寫入DS1302</p><p>  LCD_DSY_BUFFER2[13]=&#

117、39; ';</p><p>  LCD_DSY_BUFFER2[14]=' ';</p><p>  LCD_DSY_BUFFER2[15]=' ';</p><p>  Adjust_Index=-1;</p><p><b>  }</b></p><p&

118、gt;<b>  }</b></p><p><b>  }</b></p><p>  void main()</p><p>  {Init_LCD();//液晶初始化</p><p>  IE=0x83; //允許INT0,T0中斷,EA=1,,ET0=1,EX0=1</p&

119、gt;<p>  IP=0x01; //設(shè)置外部中斷0為高級中斷</p><p>  IT0=0x01; //外部中斷0為電平觸發(fā),低電平有效</p><p>  TMOD=0x01; //設(shè)置定時器T0工作方式為方式1,</p><p>  TH0=-50000/256;//裝入初始值,定時1秒</p><p

120、>  TL0=-50000%256;</p><p>  TR0=1; //啟動定時器</p><p><b>  while(1)</b></p><p><b>  {</b></p><p>  //如果未執(zhí)行調(diào)整操作則正常讀取當(dāng)前時間</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. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論