電子音樂鬧鐘的設(shè)計與仿真-本科畢業(yè)設(shè)計_第1頁
已閱讀1頁,還剩36頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、<p><b>  本科畢業(yè)設(shè)計</b></p><p>  題 目 電子音樂鬧鐘的設(shè)計與仿真 </p><p><b>  摘 要</b></p><p>  電子音樂鬧鐘在日常生活中具有很廣泛的應用。 本課題設(shè)計了一個基于單片機控制的電子音樂鬧鐘,從硬件和軟件兩個方面對系統(tǒng)進行

2、了詳細設(shè)計。硬件系統(tǒng)主要包括單片機主控模塊、顯示模塊、按鍵模塊和音樂播放模塊。其中單片機模塊采用AT89C51,顯示模塊采用簡單實用的數(shù)碼管,音樂播放利用揚聲器發(fā)聲控制。系統(tǒng)能夠準確地顯示時、分、秒信息,通過獨立按鍵實現(xiàn)時間調(diào)整和鬧鐘時間的設(shè)置,能夠定時播放預先設(shè)置的電子音樂。軟件方面基于模塊化編程思想,開發(fā)環(huán)境采用 Keil C51。最后利用硬件仿真軟件Proteus構(gòu)建硬件仿真平臺,對系統(tǒng)進行了功能驗證。仿真結(jié)果充分說明系統(tǒng)設(shè)計是完

3、全可行的。</p><p>  關(guān)鍵詞:單片機;電子音樂鬧鐘;LED數(shù)碼管;獨立按鍵</p><p><b>  ABSTRACT</b></p><p>  Electronic music alarm clock has a wide range of applications in our daily life. This topic h

4、as designed a based on single chip microcomputer control electronic music alarm clock, from two aspects of hardware and software of the system has carried on the detailed design. Hardware system mainly includes the SCM c

5、ontrol module, display module, key module and music playback module. The AT89C51 single chip microcomputer module, display module adopts the simple and practical digital tube, music playb</p><p>  Key words:

6、 Single chip microcomputer; Electronic music alarm clock; LED digital tube; Separate button</p><p><b>  目 錄 </b></p><p><b>  1 引言1</b></p><p>  1.1 研究目的和意義

7、1</p><p>  1.2 本系統(tǒng)主要研究的內(nèi)容1</p><p>  2 方案的選擇和論證1</p><p>  2.1 單片機型號的選擇1</p><p>  2.3 顯示器的選擇2</p><p>  2.4 計時部分的選擇2</p><p>  2.5 單片機播放音樂原理

8、3</p><p>  2.5.1 音調(diào)的確定3</p><p>  2.5.2 音樂節(jié)拍的產(chǎn)生3</p><p>  3 電子音樂鬧鐘系統(tǒng)詳細設(shè)計4</p><p>  3.1 系統(tǒng)功能方框圖4</p><p>  3.2 硬件詳細設(shè)計5</p><p>  3.2.1 AT89C

9、51 單片機簡介5</p><p>  3.2.2 晶振電路6</p><p>  3.2.3 復位電路7</p><p>  3.2.4 鍵盤電路的設(shè)計7</p><p>  3.2.5 顯示電路8</p><p>  3.2.7 顯示驅(qū)動模塊8</p><p>  3.2.8 發(fā)

10、音電路模塊9</p><p>  3.3 軟件詳細設(shè)計9</p><p>  3.3.1 主程序設(shè)計9</p><p>  3.3.2 定時器定時模塊10</p><p>  3.3.3 鬧鐘模塊11</p><p>  3.3.4 計時模塊11</p><p>  3.3.5 鍵盤

11、掃描模塊13</p><p>  3.3.6 播放音樂模塊14</p><p><b>  4 系統(tǒng)調(diào)試15</b></p><p>  4.1 軟件介紹15</p><p>  4.1.1 PROTEUS ISIS 軟件介紹15</p><p>  4.1.2 KEIL C51 軟件介

12、紹15</p><p>  4.2 利用Proteus和Keil進行聯(lián)合調(diào)式15</p><p><b>  5 仿真結(jié)果17</b></p><p><b>  6 結(jié)論18</b></p><p><b>  參考文獻19</b></p><p

13、><b>  致 謝20</b></p><p><b>  附 錄21</b></p><p><b>  1 引言</b></p><p>  1.1 研究目的和意義</p><p>  目的:設(shè)計一個電子鬧鐘,該鬧鐘可由使用者自己校準時間并根據(jù)需要在規(guī)定的時

14、間發(fā)出音樂提醒使用者,防止遺忘時間。</p><p>  意義:電子音樂鬧鐘在生活中很常見,有了它,使得我們忙碌的生活不在枯燥,也不用擔心會錯過什么重要的事。隨著現(xiàn)在生活壓力的增大,失眠現(xiàn)象已經(jīng)很普遍,特別是當?shù)诙煊兄匾虑榈臅r候,老是怕睡過而導致人們睡不好,有了電子鬧鐘,我們再也不用擔心這種事會發(fā)生了,而是能好好地睡到鬧鐘鬧醒的那一刻,如果再加上那么一段美妙的音樂,這樣,我們會伴隨柔和的音樂而起床。所以,電子

15、音樂鬧鐘給人們的生活帶來了極大的方便。于是,研究這樣一個電子音樂鬧鐘有著非?,F(xiàn)實的意義。 </p><p>  1.2 本系統(tǒng)主要研究的內(nèi)容</p><p>  本設(shè)計主要研究用proteus和keil協(xié)同仿真一個電子音樂鬧鐘,主要包括硬件電路詳細設(shè)計和軟件詳細設(shè)計兩方面。其中硬件電路部分可分為四個模塊:鍵盤模塊;②顯示模塊;③計時模塊;④音樂播放模塊。軟件部分則應做到程序的準確、簡單

16、、可讀性強。最后通過硬軟件的結(jié)合實現(xiàn)電子音樂鬧鐘的精確計時、鬧鐘設(shè)置和播放音樂功能。</p><p>  2 方案的選擇和論證</p><p><b>  2.1 單片機選擇</b></p><p>  通過分析多種單片機,認為AT89C51 是比較適合做電子音樂鬧鐘的芯片,器件采用ATMEL 高密度非易失存儲器制造技術(shù)制造,與MCS-51 指

17、令集和輸出管腳相兼容。單片機的可擦除只讀存儲器可以反復擦除1000次以上,其壽命較長,使用更方便。再者他的數(shù)據(jù)保留時間可達10年。AT89C51 是一種高效微控制器,是最好的選擇。</p><p><b>  2.2 按鍵的選擇</b></p><p>  方案一:矩陣式鍵盤。為了節(jié)省I/O口,通常將按鍵排列成矩陣形式。雖然電路連接復雜,但是提高了I/O口的利用率,在

18、修改時鐘或設(shè)置鬧鈴時間時可以直接從鍵盤輸入,快捷、方便。如果選擇此方案,軟件編程較復雜,適用于需很多個按鍵的場合。 </p><p>  方案二:獨立式按鍵。獨立式按鍵是直接用I/O口線構(gòu)成單個按鍵電路,一個按鍵單獨占用1根I/O線。雖然會給布線帶來諸多不便,但程序設(shè)計簡單,適合用于按鍵較少的場合。如果系統(tǒng)中的鍵較少,就可以使用獨立式按鍵,因此,此方案適用于按鍵較少的情況。如果使用該方案,無論從硬件還是軟件方

19、面實現(xiàn)起來都比較方便,所以我選擇方案二。</p><p>  2.3 顯示器的選擇</p><p>  方案一:液晶顯示器。此顯示器體積小,便于攜帶;并且液晶顯示器可視面積大。其缺點為此顯示器的亮度和對比度不是很好,并且壽命有限,驅(qū)動電路復雜,使用起來更麻煩。</p><p>  方案二:數(shù)碼管顯示器。數(shù)碼管的驅(qū)動電路簡單,并且在亮度、可視角度和刷新速率等方面,都更

20、具優(yōu)勢。LED壽命長,背光功耗低、更環(huán)保,它不含有害金屬汞,免去了對人體對環(huán)境的損害; 第三、LED背光讓顯示器顯得更輕薄,LED采用發(fā)光二極管,不需要復雜的光路設(shè)計,實現(xiàn)真正的光源平面化,所以顯示器也能節(jié)省很多空間。如果選擇了此方案,那么在夜間看時間的時候就非常方便。其缺點是耗電量較大。綜合考慮,數(shù)碼管使用起來較為方便,因此我選擇用數(shù)碼管做顯示器。</p><p>  2.4 計時部分的選擇</p>

21、<p>  DS1302時鐘芯片,大可以實現(xiàn)計時功能,而且系統(tǒng)不怕掉電且時間精確。它采用備份電池供電,在系統(tǒng)斷電時仍可以工作。實時時鐘芯片的這些優(yōu)點,使得它廣泛應用于需要顯示時間的場合,但這種芯片比較貴,況且,設(shè)計本系統(tǒng)目的是為了學習單片機程序的編寫和調(diào)試,因此采用了軟件編程的方法來計時而沒有采用價格較高的時鐘芯片。</p><p>  2.5 單片機播放音樂原理</p><p&

22、gt;  一般情況下,用單片機蜂鳴器來演奏音樂基本都是單音頻率,不像專用樂器那樣能演奏多種音色的音樂。所以音調(diào)和節(jié)拍是該設(shè)計要了解的兩個概念。音調(diào)表示了一個音符的頻率有多高,節(jié)拍表示了一個音符能唱多久。</p><p>  2.5.1 音調(diào)的確定</p><p>  音調(diào)主要是通過頻率來確定的,我們可以根據(jù)音調(diào)表查出各個音符所對應的相應頻率,接下來就需要用51單片機發(fā)出相應的頻率即可,主要

23、方法就是使用定時器定時中斷,將蜂鳴器對應I/O口來回取反就行了。下面我舉個例子說明一下怎么確定一個頻率對應的定時器的定時值。</p><p>  例如標準音高A : 頻率f = 440 Hz, 其對應的周期為:T = 1/ f = 1/440 =2272μs ,那么單片機上對應蜂鳴器的I/O 口來回取反的時間應為: t = T/2 = 2272/2 = 1136 μs ,也就是清零、置位在一個周期內(nèi)完成. <

24、;/p><p>  音符與節(jié)拍數(shù)的關(guān)系如表1所示。</p><p>  表1 音符與節(jié)拍數(shù)的關(guān)系</p><p>  2.5.2 音樂節(jié)拍的產(chǎn)生</p><p>  一般情況下,如果一首樂曲沒有說明,一拍的時長大約400ms到500ms之間 ,我們可以通過軟件延時的方法來延時這么長時間。</p><p>  for(t1

25、= 0; t1 < t; t1++) </p><p>  for(t2 = 0; t2 < 8000; t2++); </p><p>  通過改變t的值就可以唱出不同節(jié)拍的音樂。</p><p>  表2所示為不同曲調(diào)下的1/4和1/8節(jié)拍的時間設(shè)定。</p><p>  如果單片機要實現(xiàn)播放音樂,那么必須在程序設(shè)計中要

26、考慮到節(jié)拍,節(jié)拍數(shù)和節(jié)拍碼的對照表如表3所示。</p><p>  表2 各調(diào)節(jié)拍的時間設(shè)定</p><p>  表3 節(jié)拍數(shù)與節(jié)拍碼的對照</p><p>  3 電子音樂鬧鐘系統(tǒng)詳細設(shè)計</p><p>  3.1 系統(tǒng)功能方框圖 </p><p>  根據(jù)設(shè)計需求分析,系統(tǒng)主要包括以下幾個模塊:微處理器模塊、單

27、片機最小系統(tǒng)、數(shù)碼管顯示模塊、按鍵模塊以及揚聲器發(fā)聲模塊,具體方框圖如圖3.1所示。</p><p>  圖3.1 系統(tǒng)功能方框圖</p><p>  下面從硬件和軟件兩個方面對系統(tǒng)進行詳細設(shè)計。</p><p>  3.2 硬件詳細設(shè)計</p><p>  3.2.1 AT89C51 單片機簡介</p><p> 

28、 AT89C51是這幾年我國非常流行的單片機, AT89C51是一種高性能、低電壓的CMOS單片機,它的片內(nèi)包含4k bytes可重復擦寫的FLASH只讀程序存儲器,同時還有128 bytes的隨機存取數(shù)據(jù)的存儲器。由ATMEL公司開發(fā)生產(chǎn),在8051、8751的基礎(chǔ)上增強了許多特性。如時鐘頻率更高,運行速度更快。是嵌入式微控制器,與嵌入式微處理器相比,微控制器的最大特點是單片化,體積大大減小,功耗和成本下降,可靠性提高。AT89C51

29、是一種高效的微控制器,為很多嵌入式控制系統(tǒng)提供了質(zhì)優(yōu)價廉的方案。它可以滿足多方面的性能需求。AT89C51 采用了高性能的處理器結(jié)構(gòu),指令執(zhí)行時間較短。</p><p>  P0口是開路型漏極雙向輸入輸出口,也即數(shù)據(jù)、地址復用口。P1口可作輸入口,因其自帶有上拉電阻的雙向輸入輸出口。P2口也是帶有上拉電阻的雙向輸入輸出口。P3口也是一個雙功能口,當作為通用I/O口外,P3口還可以工作于專用功</p>

30、<p>  圖3.2.1 AT89C51單片機</p><p>  能,P3口在輸入方面多了一個緩沖器,P3口無須再加上拉電阻。其電源正負極分別接在40和20引腳上。</p><p>  3.2.2 晶振電路</p><p>  晶振電路是構(gòu)成單片機的最小系統(tǒng),單片機必須在時鐘的驅(qū)動下才能進行工作。單片機系統(tǒng)里都有晶振,在單片機里晶振的作用非常大,全稱

31、晶體振蕩器。反相放大器的輸入端為XTAL1,即19引腳,輸出端為XTAL2,即18引腳。在XTAL1和XTAL2兩端跨接石英晶體及兩個電容就可以構(gòu)成穩(wěn)定的自激振蕩器。晶振電路如圖3.2.2所示。</p><p>  圖3.2.2 晶振電路</p><p>  3.2.3 復位電路</p><p>  一個單片機系統(tǒng)至少有單片機芯片、電源、晶體振蕩器,還需要有能使單片

32、機復位的電路。復位電路分上電復位和手動按鍵復位兩種,電路如圖3.2.3所示。</p><p>  圖3.2.3 復位電路</p><p>  3.2.4 鍵盤電路的設(shè)計</p><p>  鍵盤電路采用4個獨立按鍵和上拉電阻實現(xiàn)對鬧鐘時間的設(shè)定。其分別接在單片機的P1^1、P1^2、P1^3、P1^4引腳上,如圖3.2.4所示。</p><p&g

33、t;  圖 3.2.4 鍵盤輸入電路</p><p>  3.2.5 顯示電路</p><p>  此為六個七段共陽數(shù)碼管,1、2、3、4、5、6表示數(shù)碼管位控制管腳,分別接在74HC138的15、14、13、12、11、10引腳上,實現(xiàn)對6位數(shù)碼管位的選擇;a、b、c、d、e、f、g,就是數(shù)碼管的段碼輸入,分別接在單片機P0口的P0.0~P0.6引腳。顯示電路如圖3.2.5所示。<

34、;/p><p>  圖3.2.5 數(shù)碼管顯示電路</p><p>  3.2.6 顯示驅(qū)動模塊 </p><p>  74HC138是一款高速CMOS器件,適合內(nèi)存地址解碼或數(shù)據(jù)路由應用??山邮?位加權(quán)地址輸入(A,B,C),在高性能存貯器系統(tǒng)中,這種譯碼器可提高譯碼效率。所以采用74HC138來驅(qū)動位碼,段碼由上拉電阻驅(qū)動。其三位地址輸入1、2、3引腳分別接在單片機P

35、2口的21、22、23引腳上。具體電路如圖3.2.6所示。</p><p>  圖3.2.6 74HC138功能引腳圖 圖3.2.7 蜂鳴器發(fā)音電路</p><p>  3.2.7 發(fā)音電路模塊 </p><p>  蜂鳴器是一種常用的電子器件,在很多的場合都有廣泛的應用,一般用來發(fā)出報警或者提示的聲音。在本系統(tǒng)中,利用蜂鳴器進行鬧

36、鐘音樂的播放。其控制端一端接在P3口的P3.7引腳上,另一端接地。具體電路如圖3.2.7所示。</p><p>  3.3 軟件詳細設(shè)計</p><p>  3.3.1 主程序設(shè)計</p><p>  主程序部分采用程序設(shè)計的模塊化思想設(shè)計,模塊化設(shè)計的優(yōu)點是效率高,其模塊相對獨立,便于修改。在執(zhí)行程序時,主程序只需要調(diào)用子程序就可完成相應的功能。主程序流程圖如圖3

37、.3.1所示。</p><p>  圖3.3.1 主程序流程圖</p><p>  3.3.2 定時器定時模塊</p><p>  電子音樂鬧鐘設(shè)計中主要使用定時器T0,利用中斷進行時間的增加,進而實現(xiàn)計時功能。</p><p>  其流程圖如圖3.3.2所示。</p><p>  圖3.3.2 定時程序流程圖<

38、/p><p>  3.3.3 鬧鐘模塊</p><p>  判定有沒有到達鬧鐘設(shè)定時間是通過將鬧鐘設(shè)定時間與當前時間進行對比來確定是否進行鬧鈴。其程序流程圖如圖3.3.3所示。</p><p>  圖3.3.3 鬧鐘程序流程圖</p><p>  3.3.4 計時模塊</p><p>  計時函數(shù)部分,主要是通過單片機定時

39、器中斷進行的,當單片機產(chǎn)生一次中斷,counter=20時,說明1秒時間到,然后把counter清0 ,把秒sec加1。以此類推,然后再依次判斷分鐘和小時。計時模塊流程圖如圖3.3.4所示。</p><p>  圖3.3.4計時流程圖</p><p>  3.3.5 鍵盤掃描模塊 </p><p>  圖3.3.5 鍵盤掃描流程圖</p><p

40、>  此部分主要是通過判斷counter 在不同值時通過調(diào)用加1、減1子函數(shù)對時間和鬧鐘的時、分、秒進行設(shè)置。在鬧鐘設(shè)置時,按下key1時鐘停止,進入鬧鐘設(shè)置模式,key2用來選擇時、分、秒的設(shè)定,按一下設(shè)置秒、兩下設(shè)置分、三下設(shè)置時,key3用來選擇加,key4用來選擇減,設(shè)定好了之后再次按下key1即可完成鬧鐘時間設(shè)定,時間正常走。</p><p>  3.3.6 播放音樂模塊</p>&

41、lt;p>  當當前時間與所設(shè)的鬧鐘時間相等時,調(diào)用曲目,查找相應的音符,音符的高四位(即音頻)裝入T0,音符的低四位(即節(jié)拍)裝入節(jié)拍單元。T0開始計數(shù),從P3.7輸出脈沖信號,播放音樂。音樂播放結(jié)束,返回主程序。</p><p>  播放音樂流程圖如圖3.3.7所示。</p><p><b>  Y</b></p><p>  圖3.

42、3.7 播放音樂流程圖</p><p><b>  4 系統(tǒng)調(diào)試</b></p><p><b>  4.1 軟件介紹</b></p><p>  4.1.1 PROTEUS ISIS 軟件介紹</p><p>  Proteus軟件是英國Labcenter 公司出版的EDA工具軟件。目前,Prot

43、eus仿真系統(tǒng)支持的主流單片機有ARM7(LPC21xx)、8051/52系列、AVR系列等,它支持第三方軟件開發(fā)、編譯。Proteus主要由ISIS和ARES兩部分組成,ISIS主要用于原理圖設(shè)計及與電路原理圖的交互仿真。Proteus的ISIS是一款專業(yè)的單片機軟件仿真系統(tǒng),Proteus ISIS是 Proteus軟件的核心,具有高質(zhì)量的原理圖,良好的用戶界面,自動走線,層次設(shè)計,總線支持等特性。該軟件具有數(shù)字電路仿真、模擬電路仿

44、真等,ISIS提供的Proteus VSM實現(xiàn)了混合式的SPICE電路仿真,他將高級圖表應用,單片機仿真,第三方程序與調(diào)試環(huán)境有機結(jié)合,可以完成原理圖設(shè)計、電路分析與仿真及單片機程序仿真、測試及驗證。并且有各種虛擬儀器。</p><p>  4.1.2 KEIL C51 軟件介紹</p><p>  Keil C51是德國Keil Software公司出品的51系列兼容單片機C語言軟件開發(fā)

45、系統(tǒng),KEIL C51標準C編譯器為8051微控制器的軟件開發(fā)提供了C語言環(huán)境,同時保留了匯編代碼高效快速的特點。KEILC51軟件提供了豐富的庫函數(shù)和功能強大的集成開發(fā)調(diào)試工具,全windows界面。</p><p>  4.2 利用Proteus和Keil進行聯(lián)合調(diào)式</p><p>  根據(jù)前面的硬件詳細設(shè)計,利用Proteus構(gòu)建硬件平臺,具體原理圖如4.2.1所示。在Keil開發(fā)

46、環(huán)境中完成軟件代碼的編寫。首先新建立工程,選擇目標器件,再新建文件編寫軟件代碼,對工程文件進行編譯,得到二進制文件(*.hex)。最后將該二進制文件燒到單片機芯片內(nèi)部。具體程序加載過程如圖4.2.2所示。然后運行系統(tǒng),進行功能仿真。仿真調(diào)試的過程比較慢,一般要經(jīng)過調(diào)試、修改代碼、再調(diào)試,直到達到預期目標為止。一般調(diào)試可采用分模塊進行。</p><p>  圖4.2.1 硬件原理圖</p><

47、p>  圖4.2.2 程序加載窗口</p><p><b>  5 仿真結(jié)果</b></p><p>  本設(shè)計為簡易電子音樂鬧鐘,主要完成如下功能。</p><p>  1.系統(tǒng)上電即開始計時,顯示時間12:23:45,如果需要顯示不同時間只用修改sec、min、hour即可,具體見程序。</p><p>  2

48、.四個獨立按鍵用來控制鬧鐘,按下key1時鐘停止,進入鬧鐘設(shè)置模式,key2用來選擇時、分、秒的設(shè)定,按一下設(shè)置秒、兩下設(shè)置分、三下設(shè)置時,key3用來選擇加,key4用來選擇減,設(shè)定好了之后再次按下key1即可完成鬧鐘時間設(shè)定,時間正常走。</p><p>  3.當當前時間和設(shè)定時間一樣時,鬧鐘開始播放歌曲“世上只有媽媽好”,播放完畢后繼續(xù)運行,如果需要在此設(shè)定只用重復步驟2即可。

49、 </p><p>  運行系統(tǒng)后,時間顯示效果圖如圖5.2所示。</p><p>  圖5.2 硬件仿真圖</p><p>  調(diào)整鬧鐘時間仿真效果圖如圖5.3所示。</p><p>  圖5.3 調(diào)整后的時間</p><p><b>  6 結(jié)論</b></

50、p><p>  本課題設(shè)計了一個基于單片機控制的電子音樂鬧鐘。從硬件和軟件2個方面分別對系統(tǒng)進行了詳細設(shè)計。利用Proteus仿真軟件搭建硬件平臺對設(shè)計的系統(tǒng)進行了功能仿真。通過仿真效果,充分驗證了系統(tǒng)設(shè)計的可行性,達到了系統(tǒng)設(shè)計的預期目標。仿真系統(tǒng)操作簡單,運行較穩(wěn)定。但系統(tǒng)功能還不夠完善,需要改進的地方主要包括以下幾點:</p><p>  1、系統(tǒng)只能顯示時間信息的時、分、秒,而且運行一

51、段時間后,存在一定的誤差,需要經(jīng)常進行時間的校正。改進方法是采用專用的時鐘芯片,如DS1302,不僅可以顯示時、分、秒信息,還可以顯示年、月、日、星期幾等信息,而且時間誤差較小,無需經(jīng)常校正。</p><p>  2、系統(tǒng)存儲器內(nèi)只存儲了一手歌曲的相關(guān)數(shù)據(jù),未能實現(xiàn)鬧鐘音樂的選擇設(shè)置。改進方法是增加音樂歌曲的數(shù)目,如果數(shù)據(jù)較多,可考慮外擴存儲器實現(xiàn)。</p><p>  3、系統(tǒng)顯示信息較

52、少,因此采用的是數(shù)碼管顯示。如果增加更多的顯示信息,可考慮采用液晶顯示器。</p><p><b>  參考文獻</b></p><p>  [1] 潘永雄.新編單片機原理與應用. 西安電子科技大學出版社,2002</p><p>  [2] 張友德,趙志英,涂時亮.單片機微型機原理應用與實驗. 復旦大學出版社,2000</p>

53、<p>  [3] 周航慈、朱兆優(yōu)、李躍忠.智能儀器原理與設(shè)計. 北京航空航天大學出版社,2005</p><p>  [4] 江秀漢.可編程序控制器原理及應用(第二版).西安電子科技大學出版社,2003</p><p>  [5] 沈慶陽、郭庭吉.單片機實踐與應用.清華大學出版社,2002年</p><p>  [6] 竇振中.單片機外圍器件

54、實用手冊存儲器分冊.北京航空航天大學出版社,1998</p><p>  [7] 單片機C語言程序設(shè)計實訓100例,彭偉 編著</p><p>  [8] 高衛(wèi)東 ,51單片機原理與實踐 (C語言版)</p><p>  [9] 李建忠.單片機原理及運用. 西安電子科技大學出版社, 2001

55、 [10] 吳金戎、沈慶陽.8051單片機實踐與應用.清華大學出版社 ,2001 [11] 何立民.MCS51系列單片機應用系統(tǒng)設(shè)計.北京航空航天大學出版社, 1999

56、 </p><p>  [12] 李榮正、陳學軍.PIC單片機實驗教程. 北京航空

57、航天大學出版社,2006</p><p>  [13] 張義和、陳敵北.例說8051.人民郵電出版社,2006</p><p>  [14] AT89S51,8-bit Microcontroller with 4KB In-System Programmable Flash </p><p>  [15] Intel. Microcontroller Hand

58、book.1988</p><p>  [16] C程序設(shè)計(第三版),譚浩強 著,清華大學出版社</p><p><b>  致 謝</b></p><p>  畢業(yè)設(shè)計終于接近尾聲了,首先要感謝我的導師陳老師,他指導我各個模塊的設(shè)計和論文寫作的框架。</p><p>  這次畢業(yè)設(shè)計及論文寫作的時間不算很長,畢業(yè)設(shè)

59、計是自己獨立完成的,設(shè)計開始時就對任務進行了按時分工,每天都要按時完成任務,這樣才能為順利完成好畢業(yè)設(shè)計提供時間基準。由于畢業(yè)設(shè)計是我獨立進行的設(shè)計,剛開始時,心里十分茫然,不知從何入手,通過陳老師的指導,在論文的寫作過程中,我不僅對所學過的理論知識有了更深入的理解,而且我的操作能力也有了可喜的進步。</p><p>  我認為理論知識無論學得再好再透,畢竟是抽象的,在沒用于實踐前是毫無意義可言的,而四年的學習中

60、我所缺少的就是理論和實踐的密切結(jié)合。畢業(yè)設(shè)計則恰恰像一場及時雨,讓我通過親身學習學會如何把理論知識應用于實踐。給了我充分的鍛煉機會。受益匪淺!</p><p><b>  謝謝老師!</b></p><p><b>  附 錄</b></p><p>  // 名稱: 簡易電子音樂鬧鐘</p><p&

61、gt;  // 版本: V1.0</p><p>  #include <reg52.h></p><p>  #include<intrins.h></p><p>  #define FOSC 11059200</p><p>  #define N 50//N為定時時間,Nms</p>

62、<p>  #define TH1_RES (65536 - N*FOSC/12/1000)/256</p><p>  #define TL1_RES (65536 - N*FOSC/12/1000)%256</p><p>  sbit speaker = P3^7; //蜂鳴器接口定義</p><p>  sb

63、it BIT0 = P2^0; //數(shù)碼管位選接口</p><p>  sbit BIT1 = P2^1;</p><p>  sbit BIT2 = P2^2;</p><p><b>  //</b></p><p>  unsigned char Timer0_H, Timer0

64、_L, time;</p><p>  unsigned char sec = 45,min = 23,hour = 12; //用來初始化系統(tǒng)時間</p><p>  unsigned char temp_sec = 45,temp_min = 23,temp_hour = 12;//用來保存設(shè)定鬧鐘之前的時間</p><p>  unsigned

65、char targetsec = 0,targetmin = 0,targethour = 0;//鬧鐘目標時間</p><p>  unsigned int counter = 0;//定時器計數(shù)變量</p><p>  /****鬧鐘時間設(shè)定標志*** </p><p><b>  1: 設(shè)定秒</b></p><p&

66、gt;<b>  2:設(shè)定分</b></p><p><b>  3:設(shè)定時</b></p><p>  ***********************/</p><p>  unsigned char adjust_select = 0; </p><p><b>  //共陰數(shù)碼管碼表

67、</b></p><p>  unsigned char code dseg_code[]={0xc0,0xf9,0xa4,0xb0,</p><p>  0x99,0x92,0x82,0xf8,</p><p>  0x80,0x90,0x88,0x83,</p><p>  0xa7,0xa2,0x86,0x8e};<

68、/p><p>  unsigned char a[6]={0,0,0,0,0,0};//用來保存每一位分解的值</p><p>  unsigned char dis_aa = 0;</p><p>  unsigned char key_flag = 0;</p><p>  unsigned char clock_flag =

69、 0;</p><p>  unsigned char first_flag = 0;</p><p>  unsigned char music_flag = 0;//鬧鐘時間到播放音樂標志變量</p><p>  unsigned char code FREQH[] = {</p><p>  0xF2, 0xF3, 0xF5,

70、 0xF5, 0xF6, 0xF7, 0xF8, //低音</p><p>  0xF9, 0xF9, 0xFA, 0xFA, 0xFB, 0xFB, 0xFC, 0xFC,//中音</p><p>  0xFC, 0xFD, 0xFD, 0xFD, 0xFD, 0xFE, //高音 </p><p>  0xFE, 0xFE, 0xFE

71、, 0xFE, 0xFE, 0xFE, 0xFF}; //超高音 </p><p>  unsigned char code FREQL[] = {</p><p>  0x42, 0xC1, 0x17, 0xB6, 0xD0, 0xD1, 0xB6, //低音</p><p>  0x21, 0xE1, 0x8C, 0xD8, 0x68, 0xE9,

72、0x5B, 0x8F, // </p><p>  0xEE, 0x44, 0x6B, 0xB4, 0xF4, 0x2D, //高音 </p><p>  0x47, 0x77, 0xA2, 0xB6, 0xDA, 0xFA, 0x16}; //超高音 //--------------------------------------</p>

73、;<p>  //世上只有媽媽好 ,表中數(shù)據(jù)根據(jù)世上只有媽媽好樂譜簡譜編寫而等 </p><p>  unsigned char code sszymmh[] = {</p><p>  6, 2, 2, 5, 2, 1, 3, 2, 2, 5, 2, 2, 1, 3, 2, 6, 2, 1, 5, 2, 1, </p><p

74、>  //一個音符有三個數(shù)字。第一個為第幾個音、中為第幾個八度、最后一個為時長(以半拍為單位)。</p><p>  6, 2, 4, 3, 2, 2, 5, 2, 1, 6, 2, 1, 5, 2, 2, 3, 2, 2, 1, 2, 1,</p><p>  6, 1, 1, 5, 2, 1, 3, 2, 1, 2, 2, 4, 2, 2, 3, 3, 2, 1, 5, 2, 2

75、,</p><p>  5, 2, 1, 6, 2, 1, 3, 2, 2, 2, 2, 2, 1, 2, 4, 5, 2, 3, 3, 2, 1,</p><p>  2, 2, 1, 1, 2, 1, 6, 1, 1, 1, 2, 1, 5, 1, 6, 0, 0, 0};</p><p>  //--------------------------------

76、------</p><p>  //-----半拍延時函數(shù)---------------------------------</p><p>  void delay(unsigned char t) </p><p><b>  {</b></p><p>  unsigned char t1;</p&

77、gt;<p>  unsigned long t2;</p><p>  for(t1 = 0; t1 < t; t1++) //雙重循環(huán), 共延時t個半拍</p><p>  for(t2 = 0; t2 < 8000; t2++); //延時期間, 可進入T0中斷去發(fā)音 300-500ms</p><p>  TR0 = 0;

78、 //關(guān)閉T0, 停止發(fā)音</p><p><b>  } </b></p><p>  //-------單音演奏函數(shù)-------------------------------</p><p>  void song() </p><p

79、><b>  {</b></p><p>  TH0 = Timer0_H; </p><p>  TR0 = 1; </p><p>  delay(time); } </p><p><b>

80、  }</b></p><p>  //定時器初始化函數(shù)</p><p>  void Timer1_inital()</p><p><b>  {</b></p><p>  TMOD = 0x11; //定時器0和定時器1都工作在模式1:16位</p><p>  TH1 =

81、 TH1_RES;</p><p>  TL1 = TL1_RES;</p><p><b>  TR1 = 1;</b></p><p><b>  EA = 1;</b></p><p><b>  ET1 = 1;</b></p><p>

82、;  ET0 = 1; //開T0中斷</p><p><b>  }</b></p><p>  //數(shù)碼管顯示延時函數(shù) </p><p>  void DelayXus(unsigned int n)</p><p><b>  {</b></p&g

83、t;<p>  unsigned int m,j;</p><p>  for(m=0;m<n;m++)</p><p>  for(j=0;j<120;j++);</p><p><b>  } </b></p><p><b>  //數(shù)碼管顯示函數(shù)</b><

84、/p><p>  void refresh()</p><p><b>  {</b></p><p>  for(dis_aa=0;dis_aa<6;dis_aa++)</p><p><b>  { </b></p><p>  P0 = ~dseg_code[a

85、[dis_aa]];</p><p>  switch(dis_aa)</p><p><b>  {</b></p><p>  case 5: BIT2=0;BIT1=0;BIT0=0;break;</p><p>  case 4: BIT2=0;BIT1=0;BIT0=1;break;</p>&l

86、t;p>  case 3: BIT2=0;BIT1=1;BIT0=0;break;</p><p>  case 2: BIT2=0;BIT1=1;BIT0=1;break;</p><p>  case 1: BIT2=1;BIT1=0;BIT0=0;break;</p><p>  case 0: BIT2=1;BIT1=0;BIT0=1;break;

87、</p><p>  default:break;</p><p><b>  }</b></p><p>  DelayXus(5);</p><p>  BIT2=1;BIT1=1;BIT0=1;//必須加上用來消影,如果不加則掃描亂的一塌糊涂</p><p><b>  } &

88、lt;/b></p><p><b>  }</b></p><p>  //時間計算函數(shù),用來求解時、分、秒每一位的值</p><p>  void calcuate_time()</p><p><b>  {</b></p><p>  a[0] = sec%1

89、0;</p><p>  a[1] = sec/10;</p><p>  a[2] = min%10;</p><p>  a[3] = min/10;</p><p>  a[4] = hour%10;</p><p>  a[5] = hour/10;</p><p><b> 

90、 }</b></p><p>  //按鍵掃描函數(shù),返回掃描結(jié)果</p><p>  unsigned char key_scan()</p><p><b>  {</b></p><p>  unsigned char key;</p><p>  if(P1 != 0xff)&

91、lt;/p><p><b>  {</b></p><p>  DelayXus(5);</p><p>  if(P1 != 0xff)</p><p><b>  {</b></p><p>  key = P1;</p><p>  return

92、 key;</p><p><b>  }</b></p><p>  return 0xff; //沒有實際意義,只是為了消除not every exit path returns a value警告</p><p><b>  } </b></p><p><b>  e

93、lse</b></p><p>  return 0xff;</p><p><b>  }</b></p><p>  //按鍵處理函數(shù),調(diào)用按鍵掃描函數(shù)</p><p>  void key_handle()</p><p><b>  {</b></

94、p><p>  unsigned char temp2 = 0; //temp1不要初始化成一個static靜態(tài)變量</p><p>  P1 = 0xff;</p><p>  _nop_();_nop_();</p><p>  temp2 = key_scan();</p><p>  if((temp2|

95、0xfd) == 0xfd)</p><p><b>  {</b></p><p>  adjust_select++;</p><p>  if(adjust_select == 4)</p><p>  adjust_select = 0;</p><p>  while((P1|0xfd)

96、 == 0xfd);</p><p><b>  }</b></p><p>  if((temp2|0xfb) == 0xfb)</p><p><b>  {</b></p><p>  switch(adjust_select)</p><p><b>  {

97、</b></p><p>  case 1: sec++; break;</p><p>  case 2: min++; break;</p><p>  case 3: hour++;break;</p><p>  default: break;</p><p><b>  }<

98、;/b></p><p>  while((P1|0xfb) == 0xfb);</p><p><b>  }</b></p><p>  if((temp2|0xf7) == 0xf7)</p><p><b>  {</b></p><p>  switch(ad

99、just_select)</p><p><b>  {</b></p><p>  case 1: sec--; break;</p><p>  case 2: min--; break;</p><p>  case 3: hour--;break;</p><p>  default:

100、 break;</p><p><b>  }</b></p><p>  while((P1|0xf7) == 0xf7);</p><p><b>  }</b></p><p>  targetsec = sec; // 保留目標時間值</p><p>  

101、targetmin = min;</p><p>  targethour = hour;</p><p><b>  } </b></p><p>  /******* 暫時用處不大 ******/</p><p>  void refresh1()</p><p><b>  

102、{</b></p><p>  for(dis_aa=0;dis_aa<6;dis_aa++)</p><p><b>  { </b></p><p>  P0 = ~dseg_code[a[dis_aa]];</p><p>  switch(dis_aa)</p><p&g

103、t;<b>  {</b></p><p>  case 5: BIT2=0;BIT1=0;BIT0=0;break;</p><p>  case 4: BIT2=0;BIT1=0;BIT0=1;break;</p><p>  case 3: BIT2=0;BIT1=1;BIT0=0;break;</p><p> 

104、 case 2: BIT2=0;BIT1=1;BIT0=1;break;</p><p>  case 1: BIT2=1;BIT1=0;BIT0=0;break;</p><p>  case 0: BIT2=1;BIT1=0;BIT0=1;break; </p><p>  default:break;</p><p><b>

105、;  }</b></p><p>  DelayXus(1);</p><p>  BIT2=1;BIT1=1;BIT0=1;//必須加上用來消影,如果不加則掃描亂的一塌糊涂</p><p><b>  } </b></p><p><b>  }</b></p>&l

106、t;p>  //-----------主函數(shù)---------------------------</p><p>  void main(void)</p><p><b>  {</b></p><p>  unsigned char k, i = 0; </p><p>  time = 1; </p&

107、gt;<p><b>  PT0 = 1;</b></p><p><b>  PT1 = 0;</b></p><p>  Timer1_inital();</p><p><b>  while(1) </b></p><p><b>  {<

108、/b></p><p>  if(P1 != 0xff)</p><p><b>  {</b></p><p>  DelayXus(5);</p><p>  if(P1 != 0xff)</p><p><b>  { </b></p><p&

109、gt;  if(P1 == 0xfe)</p><p><b>  {</b></p><p>  clock_flag ++;</p><p>  if(clock_flag >=3) clock_flag = 0;</p><p>  while(P1 == 0xfe);</p><p&g

110、t;<b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  calcuate_time();</p><p>  if (clock_flag == 1)</p><p><b&g

111、t;  {</b></p><p>  if(first_flag == 0)</p><p><b>  {</b></p><p>  temp_sec = sec;</p><p>  temp_min = min;</p><p>  temp_hour = hour;<

112、/p><p>  first_flag = 1;</p><p><b>  }</b></p><p>  key_handle();</p><p><b>  }</b></p><p>  else if(clock_flag == 2)</p><p

113、><b>  {</b></p><p>  sec = temp_sec;</p><p>  min = temp_min;</p><p>  hour = temp_hour;</p><p>  clock_flag = 0;</p><p>  first_flag =

114、 0;</p><p><b>  TR1 = 1;</b></p><p><b>  } </b></p><p>  if(clock_flag == 0) //判斷鬧鐘時間有沒有到</p><p><b>  {</b>&

115、lt;/p><p>  if((sec == targetsec) && (min == targetmin) && (hour == targethour))</p><p><b>  {</b></p><p>  music_flag = 1;//準備播放音樂</p><p>  T

116、R1 = 0;//暫時關(guān)閉時鐘顯示</p><p><b>  }</b></p><p><b>  } </b></p><p>  if(music_flag == 1)</p><p><b>  {</b></p><p>  while(t

117、ime) </p><p><b>  {</b></p><p>  k = sszymmh[i] + 7 * sszymmh[i + 1] - 1;</p><p>  Timer0_H = FREQH[k]; </p><p>  Timer0_L = FREQL[k]; t

118、ime = sszymmh[i + 2]; i += 3;</p><p>  song(); //發(fā)出一個音符</p><p>  refresh1(); </p><p><b>  } </b></p><p><b>  TR1 =

119、 1;</b></p><p><b>  }</b></p><p><b>  } </b></p><p><b>  }</b></p><p>  void timer0_int() interrupt 1 //T0中斷程序,控制發(fā)音的音調(diào)

120、</p><p><b>  {</b></p><p>  TR0 = 0; //先關(guān)閉T0</p><p>  speaker = !speaker; //輸出方波, 發(fā)音</p><p>  TH0 = Timer0_H; //下

121、次的中斷時間</p><p>  TL0 = Timer0_L; //啟動T0</p><p>  TR0 = 1; </p><p><b>  }</b></p><p>  void timer1_int() interrupt 3</p><p&

122、gt;<b>  {</b></p><p>  TH1 = TH1_RES;</p><p>  TL1 = TL1_RES;</p><p>  counter++;</p><p>  if((clock_flag == 0) || (clock_flag == 2))</p><p>

123、<b>  {</b></p><p>  if(counter == 20)</p><p><b>  {</b></p><p>  counter = 0;</p><p><b>  sec++;</b></p><p>  if(sec ==

124、 60)</p><p><b>  {</b></p><p><b>  sec = 0;</b></p><p><b>  min++;</b></p><p>  if(min == 60)</p><p><b>  {</b

125、></p><p><b>  min = 0;</b></p><p><b>  hour++;</b></p><p>  if(hour == 24)</p><p><b>  {</b></p><p><b>  sec

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論