加入星計劃,您可以享受以下權(quán)益:

  • 創(chuàng)作內(nèi)容快速變現(xiàn)
  • 行業(yè)影響力擴散
  • 作品版權(quán)保護
  • 300W+ 專業(yè)用戶
  • 1.5W+ 優(yōu)質(zhì)創(chuàng)作者
  • 5000+ 長期合作伙伴
立即加入

基于單片機的電子琴設計STC89C51

09/12 10:00
1748
服務支持:
技術交流群

完成交易后在“購買成功”頁面掃碼入群,即可與技術大咖們分享疑惑和經(jīng)驗、收獲成長和認同、領取優(yōu)惠和紅包等。

虛擬商品不可退

當前內(nèi)容為數(shù)字版權(quán)作品,購買后不支持退換且無法轉(zhuǎn)移使用。

加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點資訊討論
放大
實物圖
相關方案
  • 方案介紹
  • 相關文件
  • 相關推薦
  • 電子產(chǎn)業(yè)圖譜
申請入駐 產(chǎn)業(yè)圖譜

第一章 緒論

1.1 課題背景

單片機因其體積小,功能強,價格低廉而得到廣泛應用,同時隨著我國經(jīng)濟的飛速發(fā)展,單片機在越來越多的領域得到了廣泛的應用,現(xiàn)在國內(nèi)的單片機多用于電話,玩具和LCD等產(chǎn)品,預計在未來,利用單片機發(fā)明的產(chǎn)品會越來越多,作為一名應用電子的應屆畢業(yè)生來說,理解和掌握單片機的工作原理和使用技巧是必備的技能,基于這種考慮,我這次畢業(yè)設計的題目為簡易電子琴。

我所設計的該產(chǎn)品時根據(jù)自身的興趣和愛好所設計的,通過對傳統(tǒng)電子琴的認識和了解,知道了傳統(tǒng)的電子琴是利用單片機的匯編語言的編程來實現(xiàn)的,而且功能單一,我所設計的產(chǎn)品是基于對89c51單片機的深入理解對傳統(tǒng)電子琴的小小的改革和創(chuàng)新,并且以簡單的C語言程序替代了復雜的匯編語言程序,我相信在電子琴的不斷革新達到人們所需娛樂設備的標準的時候,電子琴會被投入到批量生產(chǎn)之中。單片微型計算機大規(guī)模集成電路技術發(fā)展的產(chǎn)物,屬于第四代電子計算機它具有高性能、高速度、體積小、價格低廉、穩(wěn)定可靠、應用廣泛的特點。他的應用必定導致傳統(tǒng)的控制技術從根本上發(fā)生變革。因此,單片機的開發(fā)應用已成為高科技和工程領域的一項重大課題。

1.2 設計依據(jù)

電子琴是現(xiàn)代電子科技與音樂結(jié)合的產(chǎn)物,是一種新型的鍵盤樂器。它在現(xiàn)代音樂扮演重要的角色,單片機具有強大的控制功能和靈活的編程實現(xiàn)特性,它已經(jīng)溶入現(xiàn)代人們的生活中,成為不可替代的一部分。本文的主要內(nèi)容是用STC89C51單片機為核心控制元件,設計一個電子琴。以單片機作為主控核心,與鍵盤揚聲器等模塊組成核心主控制模塊,在主控模塊上設有8個按鍵。

主要對使用單片機設計簡易電子琴進行了分析,并介紹了基于單片機電子琴硬件的組成。利用單片機產(chǎn)生不同頻率來獲得我們要求的音階,最終可隨意彈奏要表達的音符。并且分別從原理圖,主要芯片,各模塊原理及各模塊的程序的調(diào)試來詳細闡述。

對于單片機來產(chǎn)生不同的頻率非常方便,我們可以利用單片機的定時/計數(shù)器T0來產(chǎn)生這樣的方波頻率信號,因此,就可以彈奏出不同的歌曲和音調(diào)。

第二章 系統(tǒng)方案設計及主控芯片介紹

2.1 系統(tǒng)基本設計思路

此設計是用揚聲器播放彈奏的曲子。電路包括:鍵盤、單片機以及單片機周邊最小系統(tǒng)和晶振電路

2.1.1 各部分說明

(1)鍵盤用于彈奏音樂,八個按鍵8種音符。

(2)單片機通過輸出各種電脈沖信號驅(qū)動控制各部分正常工作。

2.1.1統(tǒng)工作過程

單片機要產(chǎn)生音頻脈沖,主要處理過程是在CPU中完成的,CPU會隨時對音符輸入信號進行讀取數(shù)據(jù)的操作。在讀取了相應的寄存器的值后,CPU將讀取的值進行處理,再通過I/O口把音樂通過揚聲器播放出來。

2.2 單元電路方案論證

根據(jù)設計要求,本系統(tǒng)主要由控制器模塊和輸入模塊構(gòu)成。為較好的實現(xiàn)各模塊的功能,我們分別設計了以下幾種方案并分別進行了論證。

2.2.1 控制器模塊

方案1:采用凌陽系列單片機為系統(tǒng)的控制器

凌陽系列單片機可以實現(xiàn)各種復雜的邏輯功能,模塊大,密度高,它將所有器件集成在一塊芯片上,減少了體積,提高了穩(wěn)定性。凌陽系列單片機提高了系統(tǒng)的處理速度,適合作為大規(guī)模實時系統(tǒng)的控制核心。

方案2:采用51系列作為系統(tǒng)控制器

單片機算術運算功能強,軟件編程靈活、自由度大,可用軟件編程實現(xiàn)各種算法和邏輯控制。由于其功耗低、體積較小、技術成熟和成本低等優(yōu)點,在各個領域應用廣泛。而且抗干擾性能好。

因51單片機價格比凌陽系列低得多,且本設計不需要很高的處理速度,從經(jīng)濟和方便使用角度考慮,本設計選擇了方案2。

2.2.2 發(fā)聲模塊

發(fā)聲模塊是本設計的最主要的部分。

基本方案:發(fā)生電路是這次設計電路中最重要的組成部分,他承載著把單片機所產(chǎn)生的聲音信號放大并輸出的重要作用,而我的設計中的發(fā)聲電路主要是由兩個S8050三極管驅(qū)動組成。S8050三極管是一種小功率的放大管,屬于NPN型號三極管,而對三極管引腳的判斷有以下方法。

1.判斷三極管的基極。對于NPN型號的三極管,用黑表筆接某一個電極,紅表筆分別接另外兩個電極,若測量電阻值兩個都小,調(diào)換表筆后被測電阻值都較大,則可判斷第一次測量中黑表筆所接的是基極;如果測量值一大一小,相差很大,則第一次測量中黑表筆接的不是基極,應該更換其他電極重測。

2.測量三極管發(fā)射極e和集電極c。三極管基極確定后,通過交換表筆,兩次測量e,c極間的電阻,如果兩次測量結(jié)果不相等,其中測得電阻值較小的一次為紅表筆的是e極黑表筆接的是c極。對于PNP型號的三極管,方法與NPN的相似,只是紅黑表筆的作用相反,在測量e,c極間電阻時要注意,由于三極管的V(BR)CEO很小,很容易將發(fā)射結(jié)擊穿。

當我們?nèi)龢O管的管腳判斷結(jié)束以后,我們就可以用兩個三極管構(gòu)成一個達林頓結(jié)構(gòu)。首先當單片機P1.0口輸出一個高電平,由兩個三極管構(gòu)成的達林頓成能導通,導通后又能對電流又一定的放大作用,這樣傳到揚聲器時信號能讓我們聽的更清楚。

圖2-1 聲音驅(qū)動電路

2.2.3 編程軟件模塊

方案1:采用匯編語言編程

匯編語言指令是用一些具有相應含義的助憶符來表達的,所以,它要比機器語言容易掌握和運用,但另一方面,它要直接使用CPU的資源,相對高級程序設計語言來說,它又顯得難掌握。

方案2:采用C語言編程

C語言與其他高級語言相比,具有運算符的豐富性、語法表述的靈活性、對軟硬件操作的兼容性、輸入輸出方式的新穎性等主要特征.深入分析研究這些特征,可以加深對C語言的認識;正確應用這些特征,可以靈活高效地解決各種實際問題.

因為我在大學期間對匯編語言沒有深入的了解,而且在編程時一直用C語言,所以我選擇了方案2。

2.2.4 最終方案

經(jīng)過反復論證,最終確定了如下方案:

(1)采用STC89C51單片機作為主控制器。

(2)采用達林頓效應使音樂信號放大。

(3)采用C語言編程。

2.3 STC89C51單片機

STC89C51是一種低功耗、高性能CMOS8位微控制器,具有 8K 在系統(tǒng)可編程Flash 存儲器。在單芯片上,擁有靈巧的8 位CPU 和在系統(tǒng)可編程Flash,使得STC89C51為眾多嵌入式控制應用系統(tǒng)提供高靈活、超有效的解決方案。 具有以下標準功能: 8k字節(jié)Flash,512字節(jié)RAM, 32 位I/O 口線,看門狗定時器,內(nèi)置4KB EEPROM,MAX810復位電路,三個16 位 定時器/計數(shù)器,一個6向量2級中斷結(jié)構(gòu),全雙工串行口。另外 STC89X51 可降至0Hz 靜態(tài)邏輯操作,支持2種軟件可選擇節(jié)電模式??臻e模式下,CPU 停止工作,允許RAM、定時器/計數(shù)器、串口、中斷繼續(xù)工作。掉電保護方式下,RAM內(nèi)容被保存,振蕩器被凍結(jié),單片機一切工作停止,直到下一個中斷或硬件復位為止。最高運作頻率35Mhz,6T/12T可選。

圖2-2 STC89C51單片機引腳圖

單片機是美國STC公司最新推出的一種新型51內(nèi)核的單片機。片內(nèi)含有Flash程序存儲器、SRAM、UARTSPI、PWM等模塊。

(一)STC89C51主要功能、性能參數(shù)如下:

(1)內(nèi)置標準51內(nèi)核,機器周期:增強型為6時鐘,普通型為12時鐘;

(2)工作頻率范圍:0~40MHZ,相當于普通8051的0~80MHZ;

(3)STC89C51RC對應Flash空間:4KB;

(4)內(nèi)部存儲器(RAM):512B;

(5)定時器計數(shù)器:3個16位;

(6)通用異步通信口(UART)1個;

(7)中斷源:8個;

(8)有ISP(在系統(tǒng)可編程)IAP(在應用可編程),無需專用編程器仿真器;

(9)通用IO口:3236個;

(10)工作電壓:3.8~5.5V;

(11)外形封裝:40腳PDIP、44腳PLCC和PQFP等。

(二)STC89C51單片機的引腳說明:

VCC:供電電壓。

GND:接地。

P0口:P0口為一個8位漏級開路雙向I/O口,每腳可吸收8TTL門電流。當P1口的管腳第一次寫1時,被定義為高阻輸入。P0能夠用于外部程序數(shù)據(jù)存儲器,它可以被定義為數(shù)據(jù)/地址的第八位。在FIASH編程時,P0 口作為原碼輸入口,當FIASH進行校驗時,P0輸出原碼,此時P0外部必須被拉高。

P1口:P1口是一個內(nèi)部提供上拉電阻的8位雙向I/O口,P1口緩沖器能接收輸出4TTL門電流。P1口管腳寫入1后,被內(nèi)部上拉為高,可用作輸入,P1口被外部下拉為低電平時,將輸出電流,這是由于內(nèi)部上拉的緣故。在FLASH編程和校驗時,P1口作為第八位地址接收。

P2口:P2口為一個內(nèi)部上拉電阻的8位雙向I/O口,P2口緩沖器可接收,輸出4個TTL門電流,當P2口被寫“1”時,其管腳被內(nèi)部上拉電阻拉高,且作為輸入。并因此作為輸入時,P2口的管腳被外部拉低,將輸出電流。這是由于內(nèi)部上拉的緣故。P2口當用于外部程序存儲器或16位地址外部數(shù)據(jù)存儲器進行存取時,P2口輸出地址的高八位。在給出地址“1”時,它利用內(nèi)部上拉優(yōu)勢,當對外部八位地址數(shù)據(jù)存儲器進行讀寫時,P2口輸出其特殊功能寄存器的內(nèi)容。P2口在FLASH編程和校驗時接收高八位地址信號和控制信號。

P3口:P3口管腳是8個帶內(nèi)部上拉電阻的雙向I/O口,可接收輸出4個TTL門電流。當P3口寫入“1”后,它們被內(nèi)部上拉為高電平,并用作輸入。作為輸入,由于外部下拉為低電平,P3口將輸出電流(ILL)這是由于上拉的緣故。

P3.0 RXD(串行輸入口)

P3.1 TXD(串行輸出口)

P3.2 /INT0(外部中斷0)

P3.3 /INT1(外部中斷1)

P3.4 T0(記時器0外部輸入)

P3.5 T1(記時器1外部輸入)

P3.6 /WR(外部數(shù)據(jù)存儲器寫選通)

P3.7 /RD(外部數(shù)據(jù)存儲器讀選通)

P3口同時為閃爍編程和編程校驗接收一些控制信號。

I/O口作為輸入口時有兩種工作方式,即所謂的讀端口與讀引腳。讀端口時實際上并不從外部讀入數(shù)據(jù),而是把端口鎖存器的內(nèi)容讀入到內(nèi)部總線,經(jīng)過某種運算或變換后再寫回到端口鎖存器。只有讀端口時才真正地把外部的數(shù)據(jù)讀入到內(nèi)部總線。上面圖中的兩個三角形表示的就是輸入緩沖器CPU將根據(jù)不同的指令分別發(fā)出讀端口或讀引腳信號以完成不同的操作。這是由硬件自動完成的,不需要我們操心,1然后再實行讀引腳操作,否則就可能讀入出錯,為什么看上面的圖,如果不對端口置1端口鎖存器原來的狀態(tài)有可能為0Q端為0Q^為1加到場效應管柵極的信號為1,該場效應管就導通對地呈現(xiàn)低阻抗,此時即使引腳上輸入的信號為1,也會因端口的低阻抗而使信號變低使得外加的1信號讀入后不一定是1。若先執(zhí)行置1操作,則可以使場效應管截止引腳信號直接加到三態(tài)緩沖器中實現(xiàn)正確的讀入,由于在輸入操作時還必須附加一個準備動作,所以這類I/O口被稱為準雙向口。89C51的P0/P1/P2/P3口作為輸入時都是準雙向口。

RST:復位輸入。當振蕩器復位器件時,要保持RST腳兩個機器周期的高電平時間。

ALE/PROG:當訪問外部存儲器時,地址鎖存允許的輸出電平用于鎖存地址的地位字節(jié)。在FLASH編程期間,此引腳用于輸入編程脈沖。在平時,ALE端以不變的頻率周期輸出正脈沖信號,此頻率為振蕩器頻率的1/6。因此它可用作對外部輸出的脈沖或用于定時目的。然而要注意的是:每當用作外部數(shù)據(jù)存儲器時,將跳過一個ALE脈沖。如想禁止ALE的輸出可在SFR8EH地址上置0。此時, ALE只有在執(zhí)行MOVX,MOVC指令是ALE才起作用。另外,該引腳被略微拉高。如果微處理器在外部執(zhí)行狀態(tài)ALE禁止,置位無效。

/PSEN:外部程序存儲器的選通信號。在由外部程序存儲器取指期間,每個機器周期兩次/PSEN有效。但在訪問外部數(shù)據(jù)存儲器時,這兩次有效的/PSEN信號將不出現(xiàn)。

/EA/VPP:當/EA保持低電平時,則在此期間外部程序存儲器(0000H-FFFFH),不管是否有內(nèi)部程序存儲器。注意加密方式1時,/EA將內(nèi)部鎖定為RESET;當/EA端保持高電平時,此間內(nèi)部程序存儲器。在FLASH編程期間,此引腳也用于施加12V編程電源(VPP)。

XTAL1:反向振蕩放大器的輸入及內(nèi)部時鐘工作電路的輸入。

XTAL2:來自反向振蕩器的輸出。

(三)STC89C51單片機最小系統(tǒng):

最小系統(tǒng)包括單片機及其所需的必要的電源、時鐘、復位等部件,能使單片機始終處于正常的運行狀態(tài)。電源、時鐘等電路是使單片機能運行的必備條件,可以將最小系統(tǒng)作為應用系統(tǒng)的核心部分,通過對其進行存儲器擴展、A/D擴展等,使單片機完成較復雜的功能。

STC89C51是片內(nèi)有ROM/EPROM的單片機,因此,這種芯片構(gòu)成的最小系統(tǒng)簡單﹑可靠。用STC89C52單片機構(gòu)成最小應用系統(tǒng)時,只要將單片機接上時鐘電路和復位電路即可,結(jié)構(gòu)如圖2-3所示,由于集成度的限制,最小應用系統(tǒng)只能用作一些小型的控制單元。

中斷技術主要用于實時監(jiān)測與控制,要求單片機能及時地響應中斷請求源提出的服務請求,并作出快速響應、及時處理。這是由片內(nèi)的中斷系統(tǒng)來實現(xiàn)的。當中斷請求源發(fā)出中斷請求時,如果中斷請求被允許,單片機暫時中止當前正在執(zhí)行的主程序,轉(zhuǎn)到中斷服務處理程序處理中斷服務請求。中斷服務處理程序處理完中斷服務請求后,再回到原來被中止的程序之處(斷點),繼續(xù)執(zhí)行被中斷的主程序。

圖2-6為整個中斷響應和處理過程。

圖1 系統(tǒng)總體框圖

3.2 最小系統(tǒng)設計

最小系統(tǒng)包括單片機及其所需的必要的電源、時鐘、復位等部件,能使單片機始終處于正常的運行狀態(tài)。電源、時鐘等電路是使單片機能運行的必備條件,可以將最小系統(tǒng)作為應用系統(tǒng)的核心部分,通過對其進行存儲器擴展、A/D擴展等,使單片機完成較復雜的功能。

3.3 時鐘電路

STC89C51內(nèi)部有一個用于構(gòu)成振蕩器的高增益反相放大器,引腳RXD和TXD分別是此放大器的輸入端和輸出端。時鐘可以由內(nèi)部方式產(chǎn)生或外部方式產(chǎn)生。內(nèi)部時鐘在此不做詳細介紹。外部方式的時鐘電路如圖3所示,RXD接地,TXD接外部振蕩器。對外部振蕩信號無特殊要求,只要求保證脈沖寬度,一般采用頻率在12MHz或11.0592MHZ晶振。

圖3-1 89c51內(nèi)部時鐘電路

3.4 復位電路

當在89C51單片機的RST引腳引入高電平并保持2個機器周期時,單片機內(nèi)部就執(zhí)行復位操作(若該引腳持續(xù)保持高電平,單片機就處于循環(huán)復位狀態(tài))。

復位電路通常采用上電自動復位和按鈕復位兩種方式。

最簡單的上電自動復位電路中上電自動復位是通過外部復位電路的電容充放電來實現(xiàn)的。只要Vcc的上升時間不超過1ms,就可以實現(xiàn)自動上電復位。

除了上電復位外,有時還需要按鍵手動復位。本設計就是用的按鍵手動復位。按鍵手動復位有電平方式和脈沖方式兩種。其中電平復位是通過RST(9)端與電源Vcc接通而實現(xiàn)的。按鍵手動復位電路見圖4。時鐘頻率用11.0592MHZ時C取10uF,R取10kΩ。

圖3-2 89C51 復位電路

3.5 按鍵控制模塊

電子琴設有8個按鍵, 8個按鍵分別代表8個音符,包括中音段的全部音符,通過軟硬件設計。

如下圖:

圖3-3 按鍵模塊

3.6 播放模塊

播放模塊是由2個三極管構(gòu)成,三級管將信號放大,然后傳輸?shù)嚼?,喇叭它幾乎不存在噪聲,音響效果較好。

下圖是該模塊電路:

圖3-5 播放模塊

三極管是電流放大器件,有三個極,分別叫做集電極C,基極B,發(fā)射極E。分成NPN和PNP兩種。我們僅以NPN三極管的共發(fā)射極放大電路為例來說明一下三極管放大電路的基本原理。

(1)電流放大

下面的分析僅對于NPN型硅三極管。如上圖所示,我們把從基極B流至發(fā)射極E的電流叫做基極電流Ib;把從集電極C流至發(fā)射極E的電流叫做集電極電流 Ic。這兩個電流的方向都是流出發(fā)射極的,所以發(fā)射極E上就用了一個箭頭來表示電流的方向。三極管的放大作用就是:集電極電流受基極電流的控制(假設電源 能夠提供給集電極足夠大的電流的話),并且基極電流很小的變化,會引起集電極電流很大的變化,且變化滿足一定的比例關系:集電極電流的變化量是基極電流變 化量的β倍,即電流變化被放大了β倍,所以我們把β叫做三極管的放大倍數(shù)(β一般遠大于1,例如幾十,幾百)。如果我們將一個變化的小信號加到基極跟發(fā)射 極之間,這就會引起基極電流Ib的變化,Ib的變化被放大后,導致了Ic很大的變化。如果集電極電流Ic是流過一個電阻R的,那么根據(jù)電壓計算公式 U=R*I 可以算得,這電阻上電壓就會發(fā)生很大的變化。我們將這個電阻上的電壓取出來,就得到了放大后的電壓信號了。

(2)偏置電路

三極管在實際的放大電路中使用時,還需要加合適的偏置電路。這有幾個原因。首先是由于三極管BE結(jié)的非線性(相當于一個二極管),基極電流必須在輸入電壓 大到一定程度后才能產(chǎn)生(對于硅管,常取0.7V)。當基極與發(fā)射極之間的電壓小于0.7V時,基極電流就可以認為是0。但實際中要放大的信號往往遠比 0.7V要小,如果不加偏置的話,這么小的信號就不足以引起基極電流的改變(因為小于0.7V時,基極電流都是0)。如果我們事先在三極管的基極上加上一 個合適的電流(叫做偏置電流,上圖中那個電阻Rb就是用來提供這個電流的,所以它被叫做基極偏置電阻),那么當一個小信號跟這個偏置電流疊加在一起時,小 信號就會導致基極電流的變化,而基極電流的變化,就會被放大并在集電極上輸出。另一個原因就是輸出信號范圍的要求,如果沒有加偏置,那么只有對那些增加的 信號放大,而對減小的信號無效(因為沒有偏置時集電極電流為0,不能再減小了)。而加上偏置,事先讓集電極有一定的電流,當輸入的基極電流變小時,集電極 電流就可以減小;當輸入的基極電流增大時,集電極電流就增大。這樣減小的信號和增大的信號都可以被放大了。

(3)開關作用

下面說說三極管的飽和情況。像上面那樣的圖,因為受到電阻 Rc的限制(Rc是固定值,那么最大電流為U/Rc,其中U為電源電壓),集電極電流是不能無限增加下去的。當基極電流的增大,不能使集電極電流繼續(xù)增大 時,三極管就進入了飽和狀態(tài)。一般判斷三極管是否飽和的準則是:Ib*β〉Ic。進入飽和狀態(tài)之后,三極管的集電極跟發(fā)射極之間的電壓將很小,可以理解為 一個開關閉合了。這樣我們就可以拿三極管來當作開關使用:當基極電流為0時,三極管集電極電流為0(這叫做三極管截止),相當于開關斷開;當基極電流很 大,以至于三極管飽和時,相當于開關閉合。如果三極管主要工作在截止和飽和狀態(tài),那么這樣的三極管我們一般把它叫做開關管。

圖3-6 三極管引腳介紹

第四章 系統(tǒng)軟件設計

  1. 資料包括:

部分程序:

/*
8個按鍵發(fā)出8個基本音。 系統(tǒng)會記錄下彈奏的樂曲,并可以回放,
當沒有彈奏時能播放內(nèi)置音樂
*/

#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit speaker=P1^4;//喇叭接30腳
sbit key1=P1^0;//
sbit key2=P1^1;//
sbit key3=P1^2;//?? ? ?按鍵
sbit Do=P3^0;
sbit Re=P3^1;
sbit Mi=P3^2;
sbit Fa=P3^3;
sbit So=P3^4;
sbit La=P3^5;
sbit Si=P3^6;
sbit Do_=P3^7;?? ? ?//八個音符按鍵

uchar a,b,num_yf,num_jp,jiepai,qiehuan;
uchar code yinfu[]={0xfb,0xe0, ? ? ?//Do
0xfc,0x5c, ? ? ?//Re
0xfc,0xc1, ? ? ?//Mi
0xfc,0xe5, ? ? ?//Fa
0xfd,0x45, ? ? ?//So
0xfd,0x92, ? ? ?//La
0xfd,0xd1, ? ? ?//Si
0xfd,0xee, ? ? ?//Do#
0x00,0x00,?? ? ? //間隔
};
uchar code shengri_tone[]={ ? 1,0,1,2,1,4,3,0, //生日快樂音調(diào)
1,0,1,2,1,5,4,0,
1,0,1,8,6,4,3,2,0,
7,0,7,6,4,5,4,0 ? ? ? //0代表不發(fā)聲,即停頓;數(shù)字即為音調(diào)
};

uchar code shengri_beat[]={ ? 24,1,24,48,48,48,72,5,//節(jié)拍
24,1,24,48,48,48,72,5,
24,1,24,48,48,48,48,72,5,
24,1,24,48,48,48,72,5 ? ?//節(jié)拍,即tone表各音調(diào)的延時
};

uchar xdata save[220];?? ??? ??? ??? ? //保存音符的數(shù)組
uchar idata save_beat[220];?? ??? ??? ? //保存節(jié)拍的數(shù)組

void check_key();//改為P3組為按鍵
void delay(uint z);//延時函數(shù)聲明
void delay1(void);//聲明第二個延時函數(shù)
void play1(void);//播放生日快樂
void play2(void);//播放存儲存儲的音樂

void cunchu()
{
jiepai++;
if(save[num_yf]==9)
delay(20);
else
delay(15);
if(jiepai>=251)
jiepai=250;
}

void main()?? ??? ??? ? //主函數(shù)
{
TMOD=0x10;?? ??? ? //定時器工作方式1
TH0=a;
TL0=b;?? ??? ??? ? //定時器初值
ET0=1;?? ??? ??? ??? ?//中斷允許
TR0=0;?? ??? ??? ? //打開定時器
while(1)?? ??? ?//進入循環(huán)
{
check_key(); ?//掃描按鍵
}
}
需要完整的資料可在我的資源里下載,也可以加入我的紛傳圈子,里面有資源壓縮包的百度網(wǎng)盤下載地址及提取碼。

紛傳點擊用微信打開即可,過程有點繁瑣請見諒。

  • 有需要資料的可了解一下.docx

相關推薦

電子產(chǎn)業(yè)圖譜