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

下載本文檔

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

文檔簡介

1、<p>  題目 多功能數(shù)字電子時(shí)鐘 </p><p>  班級 ************** </p><p>  學(xué)號 ************ </p><p>  姓名 ****** </p>&

2、lt;p>  指導(dǎo) ********** </p><p>  時(shí)間 2010年12月18日 </p><p>  電工電子技術(shù)課程設(shè)計(jì)任務(wù)書</p><p>  姓名 **** 班級 08電子二班 指導(dǎo)老師 ***** </p&

3、gt;<p><b>  目錄</b></p><p>  總體方案與原理說明. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .1</p><p>  單元電路1——單片機(jī)最小系統(tǒng). . . . . . . . . . . . . . . . . . . . .

4、. . . . . .3</p><p>  單元電路2——指示燈與數(shù)碼管顯示電路 . . . . . . . . . . . . . . . . . . . . . .5</p><p>  單元電路3——鍵盤檢測電路. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .7</p><p> 

5、 單元電路4——AT24C02存儲電路. . . . . . . . . . . . . . . . . . . . . . . . . . .9</p><p>  總體電路原理相關(guān)說明. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .11</p><p>  總體電路原理圖. . . . .

6、 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .13</p><p>  PCB印制電路板圖 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .14</p><p>  元件清單 . . . . . . . . . . . . . . .

7、. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .15</p><p>  參考文獻(xiàn). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .16</p><p>  設(shè)計(jì)心得體會(huì). . . . .

8、. . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . .17</p><p>  附件:C源程序. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .18</p>

9、<p><b>  總體方案與原理說明</b></p><p>  這是一個(gè)具有時(shí)間、日期、秒表、鬧鈴以及斷電儲存數(shù)據(jù)功能的多功能數(shù)字電子時(shí)鐘。它主要由以下幾部分組成:單片機(jī)最小系統(tǒng);指示燈及數(shù)碼管顯示電路;按鍵電路;以及AT24C02存儲電路。整機(jī)的邏輯框圖如右圖所示:</p><p>  本時(shí)鐘的主控芯片是一臺AT89S51單片機(jī),AT89S51是一個(gè)

10、低功耗,高性能CMOS 8位單片機(jī),片內(nèi)含4k Bytes ISP(In-system programmable)的可反復(fù)擦寫1000次的Flash只讀程序存儲器,器件采用ATMEL公司的高密度、非易失性存儲技術(shù)制造,兼容標(biāo)準(zhǔn)MCS-51指令系統(tǒng)及80C51引腳結(jié)構(gòu),芯片內(nèi)集成了通用8位中央處理器和ISP Flash存儲單元,功能強(qiáng)大的微型計(jì)算機(jī)的AT89S51可為許多嵌入式控制應(yīng)用系統(tǒng)提供高性價(jià)比的解決方案。</p>&

11、lt;p>  AT89S51具有如下特點(diǎn):40個(gè)引腳,4k Bytes Flash片內(nèi)程序存儲器,128 bytes的隨機(jī)存取數(shù)據(jù)存儲器(RAM),32個(gè)外部雙向輸入/輸出(I/O)口,5個(gè)中斷優(yōu)先級2層中斷嵌套中斷,2個(gè)16位可編程定時(shí)計(jì)數(shù)器,2個(gè)全雙工串行通信口,看門狗(WDT)電路,片內(nèi)時(shí)鐘振蕩器。此外,AT89S51設(shè)計(jì)和配置了振蕩頻率可為0Hz并可通過軟件設(shè)置省電模式??臻e模式下,CPU暫停工作,而RAM定時(shí)計(jì)數(shù)器,串行

12、口,外中斷系統(tǒng)可繼續(xù)工作,掉電模式凍結(jié)振蕩器而保存RAM的數(shù)據(jù),停止芯片其它功能直至外中斷激活或硬件復(fù)位。同時(shí)該芯片還具有PDIP、TQFP和PLCC等三種封裝形式,以適應(yīng)不同產(chǎn)品的需求。</p><p>  整個(gè)電路由一臺單片機(jī)和一些外圍電路組成。它的計(jì)時(shí)采用單片機(jī)內(nèi)部的定時(shí)器,其晶振頻率為11.0592MHz。其主要功能都是通過C語言編程來實(shí)現(xiàn)的。其顯示部分用四位數(shù)碼管來顯示,能同時(shí)顯示小時(shí)和分鐘。它主要有以

13、下幾個(gè)功能:(1)時(shí)間顯示及調(diào)整:在正常狀態(tài)下顯示當(dāng)前時(shí)間,并隨時(shí)可以通過控制按鍵進(jìn)行調(diào)整。(2)日期顯示及調(diào)整:在日期顯示狀態(tài)下可以顯示當(dāng)前日期,進(jìn)入日期調(diào)整狀態(tài)后還可以調(diào)整日期。(3)秒表功能:進(jìn)入秒表狀態(tài)后可以進(jìn)行秒表計(jì)時(shí),它能計(jì)時(shí)的長度為100分鐘,當(dāng)時(shí)間在0~10分鐘內(nèi)計(jì)時(shí)精度為0.1秒,四位數(shù)碼管中第一位顯示分鐘,中間兩位顯示秒鐘,最后一位顯示0.1秒表;當(dāng)時(shí)間在10~100分鐘內(nèi)計(jì)時(shí)精度為1秒,四位數(shù)碼管前兩位顯示分鐘,后

14、兩位顯示秒鐘。(4)鬧鈴功能:在進(jìn)入鬧鈴調(diào)整狀態(tài)后可以設(shè)定鬧鈴時(shí)間,當(dāng)時(shí)間到達(dá)設(shè)定好的時(shí)間時(shí)蜂鳴器就會(huì)發(fā)出“嘀嘀”的報(bào)警聲。(5)整點(diǎn)報(bào)時(shí)功能:當(dāng)時(shí)間到達(dá)整點(diǎn)時(shí)蜂鳴器會(huì)發(fā)出“嘀”的一聲報(bào)警,以提示到達(dá)整點(diǎn)。(6)斷電存儲數(shù)據(jù)的功能:當(dāng)時(shí)鐘在運(yùn)行時(shí),它會(huì)實(shí)時(shí)將當(dāng)前時(shí)間存入一個(gè)AT24C02存儲器中,在每次啟動(dòng)時(shí)它會(huì)首先從該存儲器中讀取數(shù)據(jù),這樣將保證時(shí)鐘</p><p>  以下我將對各部分的原理進(jìn)行詳細(xì)的闡述。&

15、lt;/p><p>  單元電路1——單片機(jī)最小系統(tǒng)</p><p>  單片機(jī)最小系統(tǒng)由一個(gè)單片機(jī)加上一個(gè)復(fù)位電路和振蕩電路組成。圖中右下角還有一個(gè)蜂鳴器電路,它用于鬧鈴的報(bào)警:</p><p><b> ?。?)復(fù)位電路</b></p><p>  單片機(jī)復(fù)位電路原理是在單片機(jī)的復(fù)位引腳RST上外接電阻和電容,實(shí)現(xiàn)上電復(fù)

16、位。當(dāng)復(fù)位電平持續(xù)兩個(gè)機(jī)器周期以上時(shí)復(fù)位有效。復(fù)位電平的持續(xù)時(shí)間必須大于單片機(jī)的兩個(gè)機(jī)器周期。具體數(shù)值可以由RC電路計(jì)算出時(shí)間常數(shù)。復(fù)位電路由按鍵復(fù)位和上電復(fù)位兩部分組成。(1)上電復(fù)位:8051系列單片及為高電平復(fù)位,通常在復(fù)位引腳RST上連接一個(gè)電容到VCC,再連接一個(gè)電阻到GND,由此形成一個(gè)RC充放電回路保證單片機(jī)在上電時(shí)RST腳上有足夠時(shí)間的高電平進(jìn)行復(fù)位,隨后回歸到低電平進(jìn)入正常工作狀態(tài),這個(gè)電阻和電容的典型值為10K和10

17、uF。(2)按鍵復(fù)位:按鍵復(fù)位就是在復(fù)位電容上并聯(lián)一個(gè)開關(guān),當(dāng)開關(guān)按下時(shí)電容被放電、RST也被拉到高電平,而且由于電容的充電,會(huì)保持一段時(shí)間的高電平來使單片機(jī)復(fù)位。</p><p><b>  (2)振蕩電路</b></p><p>  單片機(jī)系統(tǒng)里都有晶振,在單片機(jī)系統(tǒng)里晶振作用非常大,全稱叫晶體振蕩器,它結(jié)合單片機(jī)內(nèi)部電路產(chǎn)生單片機(jī)所需的時(shí)鐘頻率,單片機(jī)晶振提供的

18、時(shí)鐘頻率越高,那么單片機(jī)運(yùn)行速度就越快,單片接的一切指令的執(zhí)行都是建立在單片機(jī)晶振提供的時(shí)鐘頻率。在通常工作條件下,普通的晶振頻率絕對精度可達(dá)百萬分之五十。高級的精度更高。有些晶振還可以由外加電壓在一定范圍內(nèi)調(diào)整頻率,稱為壓控振蕩器(VCO)。晶振用一種能把電能和機(jī)械能相互轉(zhuǎn)化的晶體在共振的狀態(tài)下工作,以提供穩(wěn)定,精確的單頻振蕩。</p><p>  單片機(jī)晶振的作用是為系統(tǒng)提供基本的時(shí)鐘信號。通常一個(gè)系統(tǒng)共用一

19、個(gè)晶振,便于各部分保持同步。有些通訊系統(tǒng)的基頻和射頻使用不同的晶振,而通過電子調(diào)整頻率的方法保持同步。晶振通常與鎖相環(huán)電路配合使用,以提供系統(tǒng)所需的時(shí)鐘頻率。如果不同子系統(tǒng)需要不同頻率的時(shí)鐘信號,可以用與同一個(gè)晶振相連的不同鎖相環(huán)來提供。AT89S51使用11.0592MHz的晶體振蕩器作為振蕩源,由于單片機(jī)內(nèi)部帶有振蕩電路,所以外部只要連接一個(gè)晶振和兩個(gè)電容即可,電容容量一般在15pF至50pF之間。</p><p

20、>  單元電路2——指示燈及數(shù)碼管顯示電路</p><p><b>  1、數(shù)碼管顯示原理</b></p><p>  數(shù)碼管有一位、雙位、四位等幾種。而不管將幾位數(shù)碼管連在一起,數(shù)碼管和顯示原理都是一樣的,都是靠點(diǎn)亮內(nèi)部的發(fā)光二極管來發(fā)光。數(shù)碼管的內(nèi)部電路結(jié)構(gòu)如上圖所示:從(a)可看出,一位數(shù)碼管的引腳數(shù)是10個(gè),顯示一個(gè)8字需要7個(gè)小段,另外還有一個(gè)小數(shù)點(diǎn),

21、所以其內(nèi)部一共有8個(gè)小的發(fā)光二極管,最后還有一個(gè)公共端,生產(chǎn)商為了封裝統(tǒng)一,單位數(shù)碼管都封裝10個(gè)引腳。而它們的公共端又分為共陽極和共陰極。上頁圖的(b)和(c)分別為共陽極和共陰極數(shù)碼管的原理圖。</p><p>  本電子鐘上的數(shù)碼管采用的是4位共陽極數(shù)碼管。所謂“共陽”就是指其內(nèi)部的8個(gè)發(fā)光二極管的陽極全部接在一起,而它們的陰極是獨(dú)立的,通常在設(shè)計(jì)電路時(shí)一般把陽極接VCC,當(dāng)我們給數(shù)碼管的任一個(gè)陰極加低電平

22、時(shí),對應(yīng)的那個(gè)發(fā)光二極管就點(diǎn)亮了。</p><p>  當(dāng)使用多位一體數(shù)碼管時(shí),它們內(nèi)部的公共端是獨(dú)立的,而負(fù)責(zé)顯示什么數(shù)字的段線全部都是連在一起的,獨(dú)立的公共端可以控制多位數(shù)碼管中哪一位點(diǎn)亮。通常我們把公共端叫做“位選線”,連在一起的段線叫做“段選線”。</p><p>  2、顯示部分C源程序的編寫:</p><p>  由于在本電子鐘中4位數(shù)碼管的段選線是直接

23、接在單片機(jī)的P0口的,所以我們首先應(yīng)該計(jì)算出顯示各個(gè)數(shù)字所對應(yīng)的P0口輸出的二進(jìn)制編碼。例如如果要顯示一個(gè)“0”,對照上面的(a)圖,我們需要點(diǎn)亮數(shù)碼管中的a、b、c、d、e、f,而g和dp不點(diǎn)亮,故a、b、c、d、e、f、g、dp對應(yīng)的二進(jìn)制編碼就為:00000011。再對照數(shù)碼管段選線與單片機(jī)連接的順序就可得要賦給單片機(jī)P0口的值應(yīng)為10100000,轉(zhuǎn)換為十六進(jìn)制就是a0。同理可以得到其它數(shù)字對應(yīng)的十六進(jìn)制編碼:</p>

24、;<p>  uchar code table[10]={0xa0,0xbe,0x62,0x2a,0x3c,0x29,0x21,0xba,0x20,0x28};</p><p>  uchar code table_dot[10]={0x80,0x9e,0x42,0x0a,0x1c,0x09,0x01,0x9a,0x00,0x08};//帶小數(shù)點(diǎn)的數(shù)字段碼表</p><p>

25、;  3、指示燈功能說明:</p><p>  其中秒表、日期、鬧鈴、小時(shí)調(diào)整、分鐘調(diào)整為狀態(tài)指示燈,當(dāng)時(shí)鐘處于其中的某種狀態(tài)時(shí),對應(yīng)的指示燈會(huì)亮。秒針指示為秒針指示燈,它會(huì)每隔0.5秒閃爍一次,用來指示當(dāng)前正處于計(jì)時(shí)狀態(tài)(包括時(shí)間顯示和秒表狀態(tài))。</p><p>  顯示部分的具體C源程序見附錄。</p><p>  單元電路3——鍵盤檢測電路</p>

26、;<p>  上圖是5個(gè)按鍵與單片機(jī)的連接圖,其中一端是直接接地的,當(dāng)某一個(gè)按鍵被按下時(shí),與之對應(yīng)的I/O口就會(huì)被置為低電平,由于一上電時(shí)計(jì)算機(jī)的所有I/O口都是高電平,當(dāng)單片機(jī)檢測到某一個(gè)I/O口為低電平時(shí)就知道是哪個(gè)按鍵被按下了。</p><p>  但是如果直接檢測引腳是否為低電平的話是會(huì)有問題的。請看圖6。從圖中可以看出,理想波形與實(shí)際波形之間是有區(qū)別的,實(shí)際波形在按下和釋放的瞬間都會(huì)有抖動(dòng)

27、現(xiàn)象,抖動(dòng)時(shí)間的長短和按鈕的機(jī)械特性有關(guān),一般為5~10ms。通常我們手動(dòng)通常我們手動(dòng)按下鍵然后釋放,這個(gè)動(dòng)作中穩(wěn)定閉合的時(shí)間超過20ms。因此單片機(jī)在檢測鍵盤是否按下時(shí)都要加上去抖動(dòng)操作,有專門的去抖動(dòng)電路,但通常我們用軟件延時(shí)的方法就能很容易地解決抖動(dòng)的問題,因此沒必要增加多余的硬件電路。</p><p>  在編寫程序時(shí),一般在檢測按下是加入去抖延時(shí)。按鍵檢測的流程圖如下:</p><p

28、>  因此,鍵盤檢測部分的C源程序的寫法應(yīng)如下所示:</p><p>  void keyscan()</p><p><b>  {</b></p><p>  if(key==0)</p><p><b>  {</b></p><p>  delay(10);&l

29、t;/p><p>  if(key==0)</p><p><b>  {</b></p><p>  (按鍵后要執(zhí)行的語句)</p><p>  while(!key);//等待按鍵釋放</p><p><b>  }</b></p><p><b

30、>  }</b></p><p><b>  }</b></p><p>  鍵盤檢測部分的具體C源程序見附錄。</p><p>  單元電路 4——AT24C02存儲電路</p><p>  單片機(jī)與AT24C02芯片通信使用I2C總線協(xié)議。</p><p><b>

31、  1、I2C總線:</b></p><p>  I2C總線是由數(shù)據(jù)線SDA和時(shí)鐘SCL構(gòu)成的串行總線,可發(fā)送和接收數(shù)據(jù)。I2C總線在傳送數(shù)據(jù)過程中共有三種類型信號, 它們分別是:開始信號、結(jié)束信號和應(yīng)答信號。</p><p>  開始信號:SCL為高電平時(shí),SDA由高電平向低電平跳變,發(fā)出數(shù)據(jù)開始傳輸信號。</p><p>  結(jié)束信號:SCL為高電平

32、時(shí),SDA由低電平向高電平跳變,發(fā)出數(shù)據(jù)傳輸結(jié)束信號。</p><p>  應(yīng)答信號:接收數(shù)據(jù)的I2C在接收到8bit數(shù)據(jù)后,向發(fā)送數(shù)據(jù)的I2C發(fā)出特定的低電平脈沖,表示已收到數(shù)據(jù)。CPU向受控單元發(fā)出一個(gè)信號后,等待受控單元發(fā)出一個(gè)應(yīng)答信號(0),CPU接收到應(yīng)答信號后,根據(jù)實(shí)際情況作出是否繼續(xù)傳遞信號的判斷。若未收到應(yīng)答信號,由判斷為受控單元出現(xiàn)故障。</p><p>  I2C規(guī)程運(yùn)

33、用主/從雙向通訊。器件發(fā)送數(shù)據(jù)到總線上,則定義為發(fā)送器,器件接收數(shù)據(jù)則定義為接收器。主器件和從器件都可以工作于接收和發(fā)送狀態(tài)。 總線必須由主器件(通常為微控制器)控制,主器件產(chǎn)生串行時(shí)鐘(SCL)控制總線的傳輸方向,并產(chǎn)生起始和停止條件。SDA線上的數(shù)據(jù)狀態(tài)僅在SCL為低電平的期間才能改變,SCL為高電平的期間,SDA狀態(tài)的改變被用來表示起始和停止條件。</p><p>  總體電路原理相關(guān)說明</p>

34、;<p><b>  作品外觀:</b></p><p>  1:小時(shí)調(diào)整指示燈2:秒針指示燈 3:分鐘調(diào)整指示燈4:秒表狀態(tài)指示燈</p><p>  5:日期狀態(tài)指示燈6:鬧鈴狀態(tài)指示燈 7:四位LED數(shù)碼管8:AT24C02存儲器</p><p>  9:AT89S51單片機(jī)10:蜂鳴器 11:鬧鈴開

35、關(guān)12:DC5.0V電源插口</p><p>  13:復(fù)位按鈕14:11.0593Hz晶振 15:模式鍵16:調(diào)整選擇鍵</p><p>  17:調(diào)整+鍵18:調(diào)整-鍵</p><p><b>  功能說明:</b></p><p><b>  1.功能鍵說明:</b>&

36、lt;/p><p>  (1) 模式鍵:按下該鍵時(shí)鐘將在正常狀態(tài)、秒表狀態(tài)、日期調(diào)整狀態(tài)和鬧鈴調(diào)整狀態(tài)之間循環(huán)切換。如果在秒表狀態(tài)、日期調(diào)整狀態(tài)或鬧鈴調(diào)整下進(jìn)行了操作,則按下該鍵將直接返回正常狀態(tài)。</p><p>  (2) 調(diào)整選擇鍵:按下該鍵將在小時(shí)調(diào)整狀態(tài)、分鐘調(diào)整狀態(tài)之間切換。</p><p>  (3) 調(diào)整+鍵:在正常狀態(tài)下按住該鍵不放將顯示當(dāng)前日期。在任

37、何調(diào)整狀態(tài)下按下該鍵對應(yīng)的項(xiàng)目將加1。</p><p>  (4) 調(diào)整-鍵:在正常狀態(tài)下按住該鍵不放將顯示當(dāng)前鬧鈴。在任何調(diào)整狀態(tài)下按下該鍵對應(yīng)的項(xiàng)目將減1。</p><p><b>  2.秒表功能:</b></p><p>  在正常狀態(tài)下按一下模式鍵將進(jìn)入秒表狀態(tài)。此時(shí)秒表狀態(tài)指示燈亮起,按下調(diào)整+鍵秒表開始計(jì)時(shí),再按一下停止計(jì)時(shí)。按下

38、秒表將清零。在計(jì)時(shí)的過程中按下調(diào)整-鍵,秒表顯示將靜止,但計(jì)時(shí)仍在繼續(xù),再按一下恢復(fù)顯示。在秒表狀態(tài)下進(jìn)行了任何操作后按一下模式鍵將直接返回到正常狀態(tài)。</p><p>  當(dāng)時(shí)間在0~10分鐘內(nèi)計(jì)時(shí)精度為0.1秒,四位數(shù)碼管中第一位顯示分鐘,中間兩位顯示秒鐘,最后一位顯示0.1秒表;當(dāng)時(shí)間在10~100分鐘內(nèi)計(jì)時(shí)精度為1秒,四位數(shù)碼管前兩位顯示分鐘,后兩位顯示秒鐘。</p><p>&l

39、t;b>  3:日期功能:</b></p><p>  在正常狀態(tài)下按住調(diào)整+鍵不放將進(jìn)入日期顯示狀態(tài),此時(shí)四位LED數(shù)碼管上顯示當(dāng)前日期。在正常狀態(tài)下按兩下模式鍵將進(jìn)入日期調(diào)整狀態(tài),此時(shí)日期狀態(tài)指示燈亮起。同時(shí)分鐘調(diào)整指示燈亮起,按下調(diào)整+鍵或調(diào)整-鍵可以調(diào)整日期。按一下調(diào)整選擇鍵將切換到月份調(diào)整狀態(tài),同時(shí)小時(shí)調(diào)整指示燈亮起,按下調(diào)整+鍵或調(diào)整-鍵可以調(diào)整月份。調(diào)整完后按一下可以直接返回到正常

40、狀態(tài)。</p><p><b>  4:鬧鈴功能:</b></p><p>  在正常狀態(tài)下按住調(diào)整-鍵不放將進(jìn)入日期顯示狀態(tài),此時(shí)四位LED數(shù)碼管上顯示當(dāng)前鬧鈴時(shí)間。在正常狀態(tài)下按三下模式鍵將進(jìn)入鬧鈴調(diào)整狀態(tài),此時(shí)鬧鈴狀態(tài)指示燈亮起。同時(shí)分鐘調(diào)整指示燈亮起,按下調(diào)整+鍵或調(diào)整-鍵可以調(diào)整當(dāng)前鬧鈴分鐘。按一下調(diào)整選擇鍵將切換到鬧鈴小時(shí)調(diào)整狀態(tài),同時(shí)小時(shí)調(diào)整指示燈亮起,

41、按下調(diào)整+鍵或調(diào)整-鍵可以調(diào)整鬧鈴小時(shí)。調(diào)整完后按一下模式鍵可以直接返回到正常狀態(tài)。當(dāng)時(shí)間到達(dá)鬧鈴時(shí)間時(shí),蜂鳴器會(huì)發(fā)出“嘀嘀”聲,按一下調(diào)整-鍵將停止響鈴。</p><p><b>  5:整點(diǎn)報(bào)時(shí)功能:</b></p><p>  當(dāng)時(shí)間到達(dá)整點(diǎn)時(shí)蜂鳴器會(huì)發(fā)出“嘀”的一聲,以提示到達(dá)整點(diǎn)。</p><p>  6:存儲數(shù)據(jù)的功能:</p

42、><p>  當(dāng)時(shí)鐘在運(yùn)行時(shí),它會(huì)實(shí)時(shí)將當(dāng)前時(shí)間存入一個(gè)AT24C02存儲器中,在每次啟動(dòng)時(shí)它會(huì)首先從該存儲器中讀取數(shù)據(jù),這樣將保證時(shí)鐘在斷電后數(shù)據(jù)不會(huì)丟失,再次接通電源后將接著上次的時(shí)間運(yùn)行。</p><p><b>  總體電路原理圖</b></p><p><b>  PCB印制電路板圖</b></p>&

43、lt;p><b>  元件清單</b></p><p><b>  參考文獻(xiàn)</b></p><p>  [1]郭天祥,《新概念51單片機(jī)C語言教程——入門、提高、開發(fā)、拓展全攻略》;北京:電子工業(yè)出版社;2009</p><p>  [2]宋戈、黃鶴松、員玉良、蔣海峰,《51單片機(jī)應(yīng)用開發(fā)范例大全》;北京:人民郵電

44、出版社;2010</p><p>  [3]閻石,《數(shù)字電子技術(shù)基礎(chǔ)(第四版)》;北京:高等教育出版社;1998</p><p>  [4]鄒顯圣,《基于AT89C51單片機(jī)數(shù)字時(shí)鐘的研究》,機(jī)電產(chǎn)品開發(fā)與創(chuàng)新;2009,(5)</p><p>  [5]劉伏文、王春華,《MCS-51單片機(jī)存儲器結(jié)構(gòu)詳解》;電子制作;2007,(10).</p>&l

45、t;p>  [6]盧旭錦,《基于Keil C的AT24C02串行E~2PROM的編程》;現(xiàn)代電子技術(shù);2007,(8)</p><p><b>  設(shè)計(jì)心得體會(huì)</b></p><p>  這是我入大學(xué)以來的第一次課程設(shè)計(jì),雖然沒什么經(jīng)驗(yàn),做出來的東西也似乎不那么盡人意,但這畢竟是我第一次通過自己的努力,完整地做出來了一件自己的作品。從中我也學(xué)到了很多在課堂上學(xué)

46、不到的東西,對于原來所學(xué)的東西也得到了鞏固和加深。</p><p>  通過這兩天的課程設(shè)計(jì),我對通過quartus編程設(shè)計(jì)一個(gè)產(chǎn)品有了一些更深層的認(rèn)識,比如產(chǎn)品及程序設(shè)計(jì)的“模塊化”,以前只是在課堂上接觸到了這些概念,但對它卻沒有什么深刻的認(rèn)識,而通過這次的課程設(shè)計(jì),我深切的感受到了“模塊化設(shè)計(jì)”的必要必以及給整個(gè)作品的設(shè)計(jì)帶來的便捷。同時(shí)對于quartus語言的編程能力也有了一定的提升。</p>

47、<p>  進(jìn)行電子課程設(shè)計(jì)其中很重要的一點(diǎn)就是原理圖和繪制。這其中要用到的專業(yè)軟件就是Altium Designer (Protel)。由于我前一段時(shí)間已經(jīng)自學(xué)過這個(gè)軟件,所以在這次課程設(shè)計(jì)中的原理圖繪制部分沒遇到過什么太大的問題。而有些不會(huì)使用這個(gè)軟件的同學(xué)則會(huì)遇到很大的問題,我又體會(huì)到了專業(yè)軟件尋我們專業(yè)的重要性。</p><p>  總之,我學(xué)這次實(shí)習(xí)對我們來說是一次很好的鍛煉,對我們學(xué)的專業(yè)

48、知識也有很大的鞏固與提高,也為我們以后的畢業(yè)設(shè)計(jì)積累了寶貴的經(jīng)驗(yàn)。同時(shí)我也希望學(xué)校能多搞一些這樣的課程設(shè)計(jì)</p><p><b>  附錄:C源程序</b></p><p>  #include<reg52.h></p><p>  #include"24c02.h"</p><p> 

49、 #define uchar unsigned char</p><p>  #define uint unsigned int</p><p>  sbit key1=P3^7;</p><p>  sbit key2=P3^6;</p><p>  sbit key3=P3^5;</p><p>  sbit ke

50、y4=P3^4;</p><p>  sbit led=P1^7; //定義秒針的指示燈</p><p>  sbit beep=P2^3;//定義蜂鳴器</p><p>  sbit led1=P1^0;//定義左邊數(shù)字調(diào)整指示燈</p><p>  sbit led2=P1^1;//定義右邊數(shù)字調(diào)整指示燈</p>&l

51、t;p>  sbit led3=P1^2;//定義秒表狀態(tài)指示燈</p><p>  sbit led4=P1^3;//定義日期調(diào)整狀態(tài)指示燈</p><p>  sbit led5=P1^4;//定義鬧鈴調(diào)整狀態(tài)指示燈</p><p>  uchar code table[10]={0xa0,0xbe,0x62,0x2a,0x3c,0x29,0x21,

52、0xba,0x20,0x28};</p><p>  uchar code table_dot[10]={0x80,0x9e,0x42,0x0a,0x1c,0x09,0x01,0x9a,0x00,0x08};</p><p>  uchar mode,adjust,hour,min,sec,num0,num1,month,day,bell_hour,bell_min;</p>

53、<p>  /*mode為指示電子鐘模式的變量,mode=0為正常狀態(tài),1為秒表狀態(tài),2為日期調(diào)整狀態(tài),3為鬧鈴調(diào)整狀態(tài)。adjust為調(diào)整選擇變量,adjust=0時(shí)不調(diào)整任何變量,=1時(shí)為小時(shí)/月份調(diào)整狀態(tài),=2時(shí)為分鐘/日期調(diào)整狀態(tài)。hour、min、sec分別為時(shí)鐘的小時(shí)、分鐘、秒鐘。num0、num1為記錄定時(shí)器溢出次數(shù)的變量。month、day、bell_hour、bell_min分別為月份、日期、鬧鈴小時(shí)、鬧鈴

54、分鐘。*/</p><p>  bit frezze=0,date_display,bell_display,flag;</p><p>  /*frezze為表示秒表顯示是否靜止的變量(frezze=1時(shí)秒表顯示靜止)。date_display、bell_display為指示日期、鬧鈴顯示狀態(tài)的變量。*/</p><p>  uint min1,sec1,a,b;

55、 //min1、sec1為秒表狀態(tài)時(shí)的分、秒*10。a,b為秒表示數(shù)靜止時(shí)保存秒表分和秒和臨時(shí)變量*/</p><p>  /**************************************************/</p><p>  /********************延時(shí)函數(shù)********************/</p><p>  /

56、*************************************************/</p><p>  void delay(m)</p><p><b>  {</b></p><p><b>  uint i,j;</b></p><p>  for(i=m;i>0;i-

57、-)</p><p>  for(j=110;j>0;j--);</p><p><b>  }</b></p><p><b>  void di()</b></p><p><b>  {</b></p><p><b>  bee

58、p=0;</b></p><p>  delay(12);</p><p><b>  beep=1;</b></p><p><b>  }</b></p><p>  /**************************************************/</p

59、><p>  /**********時(shí)間顯示時(shí)的顯示子函數(shù)**************/</p><p>  /**************************************************/</p><p>  void display(uchar hour_1,uchar min_1)</p><p><b>

60、  {</b></p><p>  uchar a,b,c,d;</p><p>  a=hour_1/10;//分離小時(shí)和分鐘的個(gè)位和十位</p><p>  b=hour_1%10;</p><p>  c=min_1/10;</p><p>  d=min_1%10;</p><

61、p>  if(a==0)//如果小時(shí)的十位為零則只顯示個(gè)位</p><p><b>  {</b></p><p><b>  P2=0xdf;</b></p><p><b>  P0=0xff;</b></p><p>  P0=table_dot[b];</

62、p><p><b>  delay(1);</b></p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p><b>  P2=0xbf;&l

63、t;/b></p><p><b>  P0=0xff;</b></p><p>  P0=table[a];</p><p><b>  delay(1);</b></p><p><b>  P2=0xdf;</b></p><p><b

64、>  P0=0xff;</b></p><p>  P0=table_dot[b];</p><p><b>  }</b></p><p><b>  delay(1);</b></p><p><b>  P2=0xef;</b></p>&

65、lt;p><b>  P0=0xff;</b></p><p>  P0=table[c];</p><p><b>  delay(1);</b></p><p><b>  P2=0x7f;</b></p><p><b>  P0=0xff;</b&

66、gt;</p><p>  P0=table[d];</p><p><b>  delay(1);</b></p><p><b>  P0=0xff;</b></p><p><b>  }</b></p><p>  /**************

67、**********************************/</p><p>  /*************秒表狀態(tài)時(shí)的顯示子函數(shù)*************/</p><p>  void display_stopwatch(uchar min1,uint sec1)//該函數(shù)為0~10分鐘內(nèi)的顯示子函數(shù),其中第一位顯示分鐘,第二、三位顯示秒鐘、最后一位顯示0.1秒<

68、/p><p><b>  { </b></p><p>  uchar a,b,c;</p><p>  a=(sec1%1000)/100;</p><p>  b=(sec1%100)/10;</p><p>  c=sec1%10;</p><p><b>  

69、P2=0xbf;</b></p><p>  P0=0xff; </p><p>  P0=table_dot[min1];</p><p><b>  delay(5);</b></p><p><b>  P2=0xdf;</b></p><p><

70、;b>  P0=0xff;</b></p><p>  P0=table[a];</p><p><b>  delay(5);</b></p><p><b>  P2=0xef;</b></p><p><b>  P0=0xff;</b></p&g

71、t;<p>  P0=table_dot[b];</p><p><b>  delay(5);</b></p><p><b>  P2=0x7f;</b></p><p><b>  P0=0xff;</b></p><p>  P0=table[c];<

72、;/p><p><b>  delay(5);</b></p><p><b>  P0=0xff;</b></p><p><b>  }</b></p><p>  /**************************************************/<

73、/p><p>  /*****************秒表顯示子函數(shù)2******************/</p><p>  void display_stopwatch2(uchar min1,uint sec1)</p><p>  { //該函數(shù)為10~99分鐘內(nèi)的顯示子函數(shù) </p><p>  uchar

74、a,b,c,d; //其中前兩位為分鐘,后兩位為秒鐘 </p><p>  a=min1/10;</p><p>  b=min1%10;</p><p>  c=sec1/100;</p><p>  d=(sec1/10)%10;</p><p><b>  P2=0xbf;</b

75、></p><p><b>  P0=0xff;</b></p><p>  P0=table[a];</p><p><b>  delay(1);</b></p><p><b>  P2=0xdf;</b></p><p><b>

76、  P0=0xff;</b></p><p>  P0=table_dot[b];</p><p><b>  delay(1);</b></p><p><b>  P2=0xef;</b></p><p><b>  P0=0xff;</b></p>

77、<p>  P0=table[c];</p><p><b>  delay(1);</b></p><p><b>  P2=0x7f;</b></p><p><b>  P0=0xff;</b></p><p>  P0=table[d];</p>

78、;<p><b>  delay(1);</b></p><p><b>  P0=0xff;</b></p><p><b>  }</b></p><p>  /**************************************************/</p>

79、<p>  /****************日期狀態(tài)時(shí)的顯示子函數(shù)************/</p><p>  void display_date(uchar month,uchar day)</p><p><b>  {</b></p><p>  uchar a,b,c,d;</p><p>  

80、a=month/10;</p><p>  b=month%10;</p><p><b>  c=day/10;</b></p><p><b>  d=day%10;</b></p><p>  if(a==0) //如果月份的十位為零則只顯示個(gè)位</p><

81、;p><b>  {</b></p><p><b>  P2=0xdf;</b></p><p><b>  P0=0xff;</b></p><p>  P0=table_dot[b];</p><p><b>  delay(1);</b>&l

82、t;/p><p><b>  P0=0xff;</b></p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p><b>  P2=0xbf;

83、</b></p><p><b>  P0=0xff;</b></p><p>  P0=table[a];</p><p><b>  delay(1);</b></p><p><b>  P2=0xdf;</b></p><p><

84、;b>  P0=0xff;</b></p><p>  P0=table_dot[b];</p><p>  delay(1);</p><p><b>  P0=0xff;</b></p><p><b>  }</b></p><p><b>

85、;  if(c==0)</b></p><p><b>  {</b></p><p><b>  P2=0x7f;</b></p><p><b>  P0=0xff;</b></p><p>  P0=table[d];</p><p>

86、<b>  delay(1);</b></p><p><b>  P0=0xff;</b></p><p><b>  P0=0xff;</b></p><p><b>  }</b></p><p><b>  else</b>&

87、lt;/p><p><b>  {</b></p><p><b>  P2=0xef;</b></p><p><b>  P0=0xff;</b></p><p>  P0=table[c];</p><p><b>  delay(1);&l

88、t;/b></p><p><b>  P2=0x7f;</b></p><p><b>  P0=0xff;</b></p><p>  P0=table[d];</p><p><b>  delay(1);</b></p><p><b

89、>  P0=0xff;</b></p><p><b>  P0=0xff;</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  /************************************

90、******/</p><p>  /****************鍵盤檢測函數(shù)**************/</p><p>  /******************************************/</p><p>  void keyscan()</p><p><b>  {</b></

91、p><p>  if(key1==0)//按下第一個(gè)鍵時(shí)鐘將在正常狀態(tài)、秒表狀態(tài)、日期調(diào)整狀態(tài)和</p><p>  {//鬧鈴調(diào)整狀態(tài)之間循環(huán)切換</p><p>  di(); //每按一下按鍵蜂鳴器“嘀”一下</p><p>  delay(10);</p><p>  i

92、f(key1==0)</p><p><b>  {</b></p><p><b>  mode++;</b></p><p>  if(mode==4) mode=0;//mode取值范圍為0~3,故mode加到4時(shí)應(yīng)清零</p><p>  if(flag==1) mode=0;/

93、/如果在秒表狀態(tài)、日期調(diào)整狀態(tài)或鬧鈴調(diào)整下進(jìn)行了操作,則flag將會(huì)被置1,如果按下key1時(shí)檢測到flag為1,則直接返回到正常模式</p><p>  if(mode==2||mode==3) adjust=2;</p><p>  else adjust=0;</p><p>  flag=0;//每次按下key1鍵時(shí)flag要置0</p>&

94、lt;p>  led=1; //切換模式時(shí)應(yīng)使秒針指示燈熄滅</p><p>  while(!key1);</p><p><b>  }</b></p><p><b>  }</b></p><p>  if(key2==0&&mode!=1)//按下第二個(gè)按鍵時(shí)

95、在小時(shí)/月份調(diào)整狀態(tài)、分鐘/日期調(diào)整狀態(tài)和非調(diào)整狀態(tài)之間循環(huán)切換</p><p><b>  {</b></p><p><b>  di();</b></p><p>  delay(10);</p><p>  if(key2==0)</p><p><b> 

96、 {</b></p><p>  if(mode==0)//在正常狀態(tài)下可以在小時(shí)/月份、分鐘/日期和非調(diào)整狀態(tài)之間切換</p><p><b>  {</b></p><p>  if(adjust==0) adjust=3;</p><p><b>  }</b></p

97、><p>  else//而在其他狀態(tài)下只能小時(shí)/月份、分鐘/日期之間切換</p><p><b>  {</b></p><p>  if(adjust==1) adjust=3;</p><p><b>  } </b></p><p><b>  

98、adjust--;</b></p><p>  while(!key2);</p><p><b>  }</b></p><p><b>  }</b></p><p>  if(key3==0)//在調(diào)整狀態(tài)時(shí)按下該鍵時(shí)對應(yīng)的變量加1 </p><p>&

99、lt;b>  {</b></p><p>  if(mode==0&&adjust==0)//在正常狀態(tài)且非調(diào)整狀態(tài)時(shí)按住該鍵將顯示日期,放開后恢復(fù)顯示時(shí)間</p><p><b>  {</b></p><p>  date_display=1;</p><p>  led=1;

100、//按住時(shí)應(yīng)保證秒針指示燈熄滅</p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  flag=1;//按下該鍵后flag被置1</p><p><b&

101、gt;  di();</b></p><p>  delay(10);</p><p>  if(key3==0)</p><p><b>  {</b></p><p>  switch(mode)</p><p><b>  {</b></p>

102、<p>  case 0: //mode為0時(shí),調(diào)整時(shí)間</p><p>  if(adjust==1)</p><p><b>  {</b></p><p><b>  hour++;</b></p><p>  if(hour==24)//當(dāng)小時(shí)加到24時(shí)應(yīng)該清零,

103、下面的同理</p><p><b>  hour=0;</b></p><p>  write_add(3,hour); //每調(diào)整一次將改變寫入AT24C02</p><p><b>  }</b></p><p>  else if(adjust==2)</p><p&g

104、t;<b>  {</b></p><p><b>  min++;</b></p><p>  if(min==60)</p><p><b>  min=0;</b></p><p>  write_add(2,min);</p><p><b

105、>  }</b></p><p><b>  break;</b></p><p>  case 2: //mode為2時(shí),調(diào)整日期</p><p>  if(adjust==1)</p><p><b>  {</b></p><p><b&

106、gt;  month++;</b></p><p>  if(month==13) month=1;</p><p>  write_add(5,month);</p><p><b>  }</b></p><p>  else if(adjust==2)</p><p><b

107、>  {</b></p><p><b>  day++;</b></p><p>  switch(month)</p><p><b>  {</b></p><p>  case 1:case 3:case 5:case 7:case 8:case 10:case 12:&l

108、t;/p><p>  if(day>=32)day=1;</p><p><b>  break;</b></p><p>  case 4:case 6:case 9:case 11:</p><p>  if(day>=31)day=1;</p><p><b>  br

109、eak;</b></p><p><b>  case 2:</b></p><p>  if(day>=29)day=1;</p><p><b>  break;</b></p><p><b>  }</b></p><p> 

110、 write_add(4,day);</p><p><b>  }</b></p><p><b>  break;</b></p><p>  case 3: //mode為3時(shí),調(diào)整鬧鈴時(shí)間</p><p>  if(adjust==1)</p><p>&

111、lt;b>  {</b></p><p>  bell_hour++;</p><p>  if(bell_hour==24)</p><p>  bell_hour=0;</p><p>  write_add(7,bell_hour);</p><p><b>  }</b>

112、</p><p>  else if(adjust==2)</p><p><b>  {</b></p><p>  bell_min++;</p><p>  if(bell_min==60)</p><p>  bell_min=0;</p><p>  write_

113、add(6,bell_min);</p><p><b>  }</b></p><p><b>  break;</b></p><p>  case 1://mode為1時(shí)為秒表狀態(tài),按下該鍵時(shí)啟動(dòng)或停止計(jì)時(shí)</p><p>  TR1=~TR1;//啟動(dòng)或停止定時(shí)器1</

114、p><p>  led=1;//確保計(jì)時(shí)停止時(shí)最后一個(gè)發(fā)光二極管熄滅 </p><p><b>  break;</b></p><p><b>  }</b></p><p>  while(!key3);</p><p><b>  }</b>&

115、lt;/p><p><b>  }</b></p><p><b>  }</b></p><p>  else date_display=0;</p><p>  if(key4==0) //在調(diào)整狀態(tài)時(shí)按下該鍵時(shí)對應(yīng)的變量減1</p><p>  {

116、 //此按鍵的注釋與上面的類似,這里不再重復(fù)</p><p>  if(mode==0&&adjust==0)</p><p><b>  {</b></p><p>  bell_display=1;</p><p><b>  led=1;</b></p>&

117、lt;p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p><b>  flag=1;</b></p><p><b>  di();</b><

118、/p><p>  delay(100);</p><p>  if(key4==0)</p><p><b>  {</b></p><p>  switch(mode)</p><p><b>  {</b></p><p><b>  cas

119、e 0:</b></p><p>  if(adjust==1)</p><p><b>  {</b></p><p>  if(hour==0)//當(dāng)小時(shí)加到24時(shí)應(yīng)該清零,下面的同理</p><p><b>  hour=24; </b></p><p&

120、gt;<b>  hour--;</b></p><p>  write_add(3,hour);</p><p><b>  }</b></p><p>  else if(adjust==2)</p><p><b>  {</b></p><p>

121、  if(min==0)</p><p><b>  min=60; </b></p><p><b>  min--;</b></p><p>  write_add(2,min);</p><p><b>  }</b></p><p><b&

122、gt;  break;</b></p><p><b>  case 2:</b></p><p>  if(adjust==1)</p><p><b>  {</b></p><p>  if(month==1) month=13;</p><p><b

123、>  month--;</b></p><p>  write_add(5,month);</p><p><b>  }</b></p><p>  else if(adjust==2)</p><p><b>  {</b></p><p>  swit

124、ch(month)</p><p><b>  {</b></p><p>  case 1:case 3:case 5:case 7:case 8:case 10:case 12:</p><p>  if(day==1)day=32;</p><p><b>  break;</b></

125、p><p>  case 4:case 6:case 9:case 11:</p><p>  if(day==1)day=31;</p><p><b>  break;</b></p><p><b>  case 2:</b></p><p>  if(day==1)d

126、ay=29;</p><p><b>  break;</b></p><p><b>  }</b></p><p><b>  day--;</b></p><p>  write_add(4,day);</p><p><b>  }&l

127、t;/b></p><p><b>  break;</b></p><p><b>  case 3:</b></p><p>  if(adjust==1)</p><p><b>  {</b></p><p>  if(bell_hour=

128、=0)</p><p>  bell_hour=24; </p><p>  bell_hour--;</p><p>  write_add(7,bell_hour);</p><p><b>  }</b></p><p>  else if(adjust==2)</p><

129、;p><b>  {</b></p><p>  if(bell_min==0)</p><p>  bell_min=60;</p><p>  bell_min--;</p><p>  write_add(6,bell_min);</p><p><b>  }</b

130、></p><p><b>  break;</b></p><p><b>  case 1:</b></p><p>  if(TR1==0) //當(dāng)秒表暫停時(shí)按下該按鍵則秒表清零 </p><p><b>  {</b></p><p

131、>  if(frezze) frezze=0; //如果在顯示靜止時(shí)按下了key1鍵使得計(jì)數(shù)暫停,則如果按下key2鍵,</p><p>  //應(yīng)退出顯示靜止?fàn)顟B(tài),顯示當(dāng)前秒表時(shí)間,再次按下s2鍵時(shí)秒表才清零</p><p>  else min1=0,sec1=0;</p><p><b>  }</b></p>&

132、lt;p>  else //若秒表正在計(jì)時(shí)時(shí)按下該按鍵則秒表顯示靜止,但計(jì)時(shí)仍繼續(xù) </p><p><b>  {</b></p><p>  if(frezze==0)</p><p><b>  {</b></p><p>  a=min1,b=sec1; //在計(jì)時(shí)過

133、程中將按下該鍵時(shí)秒表的分和秒存入臨時(shí)變量a和b</p><p><b>  }</b></p><p>  frezze=~frezze; //進(jìn)入或退出顯示靜止?fàn)顟B(tài)</p><p><b>  }</b></p><p><b>  }</b></p>&l

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論