設計了一個以AT89S52為主控核心的電子琴系統(tǒng),系統(tǒng)由單片機AT89S52、獨立按鍵模塊、功率放大模塊、揚聲器、數(shù)碼管組成,用C語言編寫了51程序,該系統(tǒng)可以實現(xiàn)按鍵彈奏音樂和存儲播放功能。該系統(tǒng)可以主要優(yōu)點有硬件電路結(jié)構(gòu)簡單易實現(xiàn),電子琴所需功能基本具備,系統(tǒng)穩(wěn)定可靠。缺點是音量調(diào)節(jié)大小不明顯,可加入多首音樂或者按鍵選擇音樂的功能。
目 錄
1. 設計背景
1.1單片機背景
1.2單片機電子琴應用
2.設計方案
3. 方案實施
3.1硬件設計
3.1.1總體電路設計
3.1.2單片機簡介
3.1.3按鍵設計
3.1.4LED數(shù)碼管
3.1.5揚聲器
3.1.6電源電路
3.1.7時鐘電路
3.2軟件設計
3.3仿真與調(diào)試
3.3.1仿真軟件介紹
3.3.2仿真結(jié)果
4. 結(jié)果與結(jié)論
4.1實現(xiàn)的功能
4.2設計結(jié)論
5. 收獲與致謝
6. 參考文獻
7. 附件
1. 設計背景 1.1單片機背景 單片機是經(jīng)典的嵌入式微控制器(Microcontroller Unit),縮寫為MCU,最早是被利用于工業(yè)控制領域。因為在工業(yè)控制領域單片機有著廣泛的應用,所以誕生了單片機開發(fā)板這樣的系統(tǒng)使更多的產(chǎn)品開發(fā)人員、業(yè)內(nèi)人士、學生來學習單片機這門技術(shù),其中比較出名的單片機開發(fā)板有電子人DZR-01A。單片機是從芯片內(nèi)部僅有的特殊處理器發(fā)展起來的,它最開始的設計思路是將CPU與大量的外圍設備通過一個微處理器集成在一起,從而使得計算機系統(tǒng)變得更迷你,組裝到繁雜的且對體積要求比較小的控制裝備之中更簡單。Zilog公司的Z80便是最早使用這種設計思想做出來的的cpu,自此以后,單片機和計算機CPU的發(fā)展便成為了兩個不同的方向。 單片機相當于把一個復雜的計算機系統(tǒng)濃縮到一個微小的芯片上,它計算機相比只缺少了輸入/輸出設備,所以可以把它看作一個微型的計算機?梢愿艣r的講成:一塊相當于一臺計算機的芯片。它的質(zhì)量輕、體積小、價格便宜、為開發(fā)、應用和學習提供了便利條件。所以,如果你想要了解計算機原理與結(jié)構(gòu),那么學習使用單片機是最簡單的選擇。 1.2單片機電子琴應用 電子琴是大規(guī)模集成電路和音樂結(jié)合的產(chǎn)物,它因為能模擬各種樂器的音色而受到群眾們喜愛。本設計制作了一種除了有普通電子琴彈奏功能外,還擁有一種存儲播放樂曲功能。本設計是以AT89S52單片機作為一個簡單電子琴系統(tǒng)設計的核心部件,其原理是因為每個表有固定的振動頻率,所以可以利用89S52單片機內(nèi)部的定時/計數(shù)器改變計數(shù)值來產(chǎn)生各個音調(diào)對應的方波頻率來驅(qū)動揚聲器播放出不同音調(diào)。這僅僅只是單片機應用的一個點,希望能由點到面,更好的了解和應用單片機技術(shù)。 2.設計方案 2.1方案一:采用CPLD外接揚聲器、鍵盤、數(shù)碼管等。 8個譯碼輸出顯示的數(shù)碼管,以顯示目標芯片的32 位輸出信號,且8個發(fā)光管也能顯示目標器件的8位輸出信號。時鐘為50MHz ,輸出接揚聲器。 具體過程:主系統(tǒng)可由兩個模塊組成:當系統(tǒng)檢測到有按鍵按下時,對應音符的頻率由模塊1獲得,這是一個數(shù)控分頻器。由其clk端輸入一具有較高頻率的信號,分頻后輸出。 音符的持續(xù)時間須根據(jù)樂曲的速度及每個音符的節(jié)拍數(shù)決定,模塊2的功能是為模塊1提供決定所發(fā)音的分頻預置值,而此數(shù)在模塊1輸入口停留的時間即為此音符的節(jié)拍值。 2.2方案二:采用單片機外接揚聲器、鍵盤、數(shù)碼管等。 采用AT89S52單片機的兩個定時器(如T0,T1)控制頻率,在P1.0引腳上輸出方波周期信號,產(chǎn)生聲音,按下不同的模擬按鍵就會產(chǎn)生不同的音符,所以使用者可以通過本電子琴系統(tǒng)暢所欲為的彈奏自己想要彈的樂曲。 具體過程:當系統(tǒng)掃描到鍵盤上有鍵子被按下,則快速檢測出是那一個鍵子,然后單片機的定時器被啟動,發(fā)出一定頻率的脈沖,該頻率的脈沖經(jīng)喇叭驅(qū)動電路放大濾波后,就會發(fā)出相應的音調(diào)。。如果在前一個按下的鍵發(fā)聲的同時有另一個鍵被按下,則啟用中斷系統(tǒng),前面鍵的發(fā)音停止,轉(zhuǎn)到后按的鍵的發(fā)音程序,發(fā)出后按鍵的音。 2.3方案對比 對比兩套方案各有優(yōu)缺點,方案一采用CPLD,工作速度快,系統(tǒng)穩(wěn)定,效果好,但是其價格昂貴;而方案二在設計這樣小型電子方面,無論是效果還是工作速度與方案一相差不大,而且價格較為便宜。因此,選擇方案二即單片機加外設的方式設計該系統(tǒng)比較好。 3. 方案實施 3.1硬件設計 3.1.1總體電路設計 由AT89S52單片機、獨立鍵盤、音頻功率放大模塊、揚聲器、數(shù)碼管、存儲播放模塊所組成。
圖1 系統(tǒng)結(jié)構(gòu)框架 3.1.2單片機簡介 AT89S52 是一種低功耗、高性能CMOS8位微控制器,具有8K 在系統(tǒng)可編程Flash存儲器。使用Atmel 公司高密度非易失性存儲器技術(shù)制造,與工業(yè)80C51 產(chǎn)品指令和引腳完全兼容。片上Flash允許程序存儲器在系統(tǒng)可編程,亦適于常規(guī)編程器。在單芯片上,擁有靈巧的8 位CPU和在系統(tǒng)可編程Flash,使得AT89S52為眾多嵌入式控制應用系統(tǒng)提供高靈活、超有效的解決方案。 AT89S52具有以下標準功能: 8k字節(jié)Flash,256字節(jié)RAM, 32 位I/O 口線,看門狗定時器,2 個數(shù)據(jù)指針,三個16 位 定時器/計數(shù)器,一個6向量2級中斷結(jié)構(gòu),全雙工串行口。另外,AT89S52 可降至0Hz 靜態(tài)邏 輯操作,支持2種軟件可選擇節(jié)電模式。空閑模式下,CPU 停止工作,允許RAM、定時器/計數(shù)器、串口、中斷繼續(xù)工 作。掉電保護方式下,RAM內(nèi)容被保存,振蕩器被結(jié),單片機一切工作停止,直到下一個中斷或硬件復位為止。 
圖2 AT89S52 3.1.3按鍵設計 本設計共含有10個按鍵,其中8個按鍵分別接著P2.0~P2.7引腳,代表著8個音符。當按下這八個按鍵其中一個按鍵時,數(shù)碼管也會顯示一個與音調(diào)對應的數(shù)字來指示用戶所按下的按鍵。而另外兩個按鍵為功能按鍵,按下可播放已存儲的歌曲,另一個按下可中斷播放音樂。這兩個功能按鍵連接著的引腳分別是P3.2、P3.3。如圖3所示。 
圖3按鍵圖 3.1.4LED數(shù)碼管 由于本次設計需要的單片機I/O端口不多,所以數(shù)碼管顯示方式采用了靜態(tài)顯示驅(qū)動,數(shù)碼管將直接由單片機I/O端口驅(qū)動, 又因為LED數(shù)碼管是電流控制元件,所以使用時要上一個加限流電阻。數(shù)碼管顯示是通過單片機查表得出編碼,然后單片機再驅(qū)動端口決定數(shù)碼管顯示的數(shù)字,按鍵與數(shù)碼管顯示程序的一致性就是這么實現(xiàn)的。連接在P0.1-P0.3,4個引腳上,并加一個排阻。如圖4所示。
圖4數(shù)碼管與單片機的連接圖 3.1.5揚聲器 揚聲器采用兩個三極管來放大音頻,串連著一個可調(diào)節(jié)電阻,用來調(diào)節(jié)聲音大小,整個模塊由單片機P1.0引腳控制。如圖5所示。 
圖5揚聲器的連接圖 3.1.6電源電路 經(jīng)由電解電容和非極性電容構(gòu)成的濾波網(wǎng)絡和三端穩(wěn)壓器LM7805的穩(wěn)壓作用后,輸出+5V的直流電壓。 圖6電源電路圖 3.1.7時鐘電路 時鐘頻率直接影響單片機的速度,時鐘電路的質(zhì)量也直接影響單片機系統(tǒng)的穩(wěn)定性。常用的時鐘電路有兩種方式,一種是內(nèi)部時鐘方式,另一種是外部時鐘方式。 AT89C51內(nèi)部有一個用于構(gòu)成振蕩器的高增益反相放大器,輸入端為芯片引腳XTAL1,輸出端為引腳XTAL2。這兩個引腳跨接石英晶體振蕩器和微調(diào)電容,構(gòu)成一個穩(wěn)定的自激振蕩器,圖9是AT89S51內(nèi)部時鐘方式的電路,C1和C2的典型值通常選擇為30pF,石英晶體常選6MHz或12MHz的。本設計采用內(nèi)部時鐘方式做時鐘電路
圖7時鐘電路圖 3.2軟件設計 本設計的基本流程是對初始化的單片機進行鍵盤掃描,判斷其有無按鍵按下,若有則需要繼續(xù)判斷按鍵的類別,判斷它是功能選擇鍵還是獨立鍵盤上的音調(diào)鍵,若是獨立鍵盤,則通過P1.0發(fā)生頻率播放音調(diào),通過P0顯示數(shù)碼管數(shù)字。若是功能選擇鍵,則播放程序儲存好的音樂歌曲,然后檢測是否按下中斷鍵,若是則停止播放,不是則一直播放到結(jié)束。此設計使用的語言選擇中,匯編語言是面向特定機型的需要,在不同的計算機指令系統(tǒng)上和不同的微控制器上,指令結(jié)構(gòu)有著云泥之別,就算指令大同小異,它也不能夠移植。C語言是一種高級語言,可以結(jié)構(gòu)化編程,還可以 移植。使用標準C語言的程序編程,完全可以不作任何修改就能夠移植到不同的系統(tǒng)平臺上;谝陨蠈Ρ龋驹O計系統(tǒng)更適合C語言來進行編程。 3.3仿真與調(diào)試 3.3.1仿真軟件介紹 Proteus是英國著名的EDA工具(仿真軟件),從原理圖布圖、代碼調(diào)試到單片機與外圍電路協(xié)同仿真,一鍵切換到PCB設計,真正實現(xiàn)了從概念到產(chǎn)品的完整設計。是目前世界上唯一將電路仿真軟件、PCB設計軟件和虛擬模型仿真軟件三合一的設計平臺。 3.3.2仿真結(jié)果 利用Proteus仿真軟件將Keil軟件中的C語言程序?qū)敕抡骐娐分校瑹襞軩1亮,按下播放鍵,單片機存儲的音樂可自動播放,按下停止鍵,音樂播放停止。復位鍵按下后,系統(tǒng)復位,八個按鍵可隨按鍵者隨意按下彈奏音樂,同時數(shù)碼管顯示相對應的節(jié)奏。
圖6仿真結(jié)果圖 4. 結(jié)果與結(jié)論 4.1實現(xiàn)的功能 根據(jù)功能需求與電路結(jié)構(gòu)得知,當開關按下時,將可有其連接的輸入口讀取到低電平,再次制作的一個八鍵的電子琴,若按下S1,則發(fā)出中音DO,如按下S2,則發(fā)中Re,以此類推,按下的同時數(shù)碼管顯示相對應的數(shù)字。此外,該電子琴不僅可以自己彈奏也可自動播放所存儲的音樂,數(shù)碼管顯示相對應的音符。 4.2設計結(jié)論 本設計利用AT89S52單片機設計一個簡易電子琴,具備電子琴的基本功能,分析了利用單片機簡易電子琴設計的基本原理,并介紹了AT89S52單片機設計的電子琴統(tǒng)硬件系統(tǒng)。改變AT89S52的定時器里面的特殊功能寄存器TH0及TL0在模式1下的計數(shù)值,便會產(chǎn)生不同方波頻率,然后通過揚聲器產(chǎn)生對應的音調(diào)。最終將編寫的源程序轉(zhuǎn)換為機器碼導入單片機芯片,仿真調(diào)試運行后,就可以實現(xiàn)利用按鍵彈奏想要的歌曲。與此同時仿真調(diào)試軟件用的是protues,源程序編譯軟件用的是keil,所以對這兩款軟件的掌握熟練度也增加了許多。 5. 收獲與致謝 課程設計是培養(yǎng)學生綜合運用所學知識,發(fā)現(xiàn),提出,分析和解決實際問題,鍛煉實踐能力的重要環(huán)節(jié),是對學生實際工作能力的具體訓練和考察過程,隨著科學技術(shù)發(fā)展的日新月異,大規(guī)模芯片已經(jīng)成為當今計算機運用中空前活躍的領域,在生活中可以說是無處不在。以此作為二十一世紀的大學生來說掌握開發(fā)技術(shù)是十分重要的。 通過本次實驗,我不僅可以鞏固以前學過的知識,如數(shù)電知識,系統(tǒng)設計和C語言,而且學到了很多在書本上所沒有學到的知識,如實踐經(jīng)驗和操作技巧。我懂得了理論與實踐相結(jié)合是很重要的,只有理論知識是遠遠不夠的,光看書部進行相關的聯(lián)系是行不通的,只有把所學的理論知識與實踐結(jié)合起來,從而提高自己的實際動手能力和獨立思考能力。在此次電子琴設計中也讓我學會了Proteus和Keil這兩個軟件的基本應用,多掌握了兩門技術(shù),對自己以后要做此方面的設計打下了基礎。于此同時也讓我知道了,做任何事情都要學會團隊合作要多學多問,知道請教,不能自己一味悶頭去做,應該多請教老師和同伴的意見和建議。在設計過程難免會遇到各種各樣的問題,同時在設計的的過程中發(fā)現(xiàn)了自己的不足之處,對以前學過的知識理解的不夠深刻,掌握的不夠牢固,通過這次課程設計之后,把以前學過的知識重新溫故,全部整合,進一步深刻理解。我們要學會學習的能力,能夠舉一反三,觸類旁通,這樣對自己以后的發(fā)展有很大的幫助,因此我們需要在學習中學習,在實踐中找出答案!
7. 附件 仿真圖如下: 
電路圖如下: 
PCB圖如下: 
實物圖如下: 
代碼如下:
- #include "reg51.h"
- #define shumaguan P0 //定義數(shù)碼管段碼輸出
- sbit LED =P1^1 ;
- sbit SPK =P1^0 ;
- sbit K1= P3^2;
- sbit K2= P3^3; //定義方波輸出口
-
- unsigned int tone1,tone2;
- /*****標準音符表*****/
- //用于使定時器初值變化以產(chǎn)生相應頻率的定時
- unsigned char code yinfu[]={0xfb,0xe9, //Do
- 0xfc,0x5c, //Re
- 0xfc,0xc1, //Mi
- 0xfc,0xef, //Fa
- 0xfd,0x45, //So
- 0xfd,0x92, //La
- 0xfd,0xd0, //Si
- 0xfd,0xee, //Do#
- 0x00,0x00 //音符之間的間隔,只要間隔時間小于65ms時,
- //喇叭不會發(fā)出聲音,用作拍子之間的短暫停頓
- };
-
- /*****生日快樂歌音調(diào)表*****/
- unsigned char code shengri_tone[]={ 1,0,1,2,1,4,3,0,
- 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)
- };
-
- /*****生日快樂歌節(jié)拍表*****/
- unsigned char code shengri_beat[]={ 24,1,24,48,48,48,72,5,
- 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)的延時
- };
-
-
- /*****15ms延時子程序,用于節(jié)拍*****/
- void delay(void)
- {
- unsigned char n=15;
- while(n--)
- {
- unsigned char i;
- for(i=0;i<125;i++);
- }
- }
-
- /*****定時器0初始化*****/
- void initTimer(void)
- {
- TMOD=0x01; //定時器0,工作方式1;定時器1,工作方式1
- TH0=tone1;
- TL0=tone2;
- }
-
- /*****定時器0中斷服務程序*****/
- void timer0(void) interrupt 1
- {
- TH0=tone1;
- TL0=tone2;
- SPK=~SPK; //取反,以產(chǎn)生方波
- }
-
- /*****演奏子程序1*****/
- void play1(void)
- {
- unsigned char m=0;
- unsigned char s;
- unsigned char a=1;
- while(1)
- {
- EA=0;
- LED=0;
- a=shengri_tone[m]; //取音符
- shumaguan=a;
- s=shengri_beat[m]; //取節(jié)拍
- tone1=yinfu[2*a-2];
- tone2=yinfu[2*a-1];
- EA=1;
- while(s--)
- {
-
- delay();
- }
-
- if((!K1)||(!K2)) //發(fā)現(xiàn)按鍵,立即退出播放
- {
- EA=0;SPK=0;shumaguan=0xff; m=34; //改過已
- return;
- }
- else
- LED=1;
- m++;
- if(m>=33) return; //數(shù)值是shengri相關表中的元素數(shù)量
- }
-
- }
-
- /*****按鍵檢測*****/
- void check_key(void)
- {
- P2=0xff;
- P3=0xff; //設置為輸入狀態(tài)
- switch(P2) //檢測按鍵,輸出數(shù)碼管、載入定時器初值、允許中斷
- {
- case 0xfe:shumaguan=0xf9;tone1=0xfb;tone2=0xe9;EA=1;break;
- case 0xfd:shumaguan=0xa4;tone1=0xfc;tone2=0x5c;EA=1;break;
- case 0xfb:shumaguan=0xb0;tone1=0xfc;tone2=0xc1;EA=1;break;
- case 0xf7:shumaguan=0x99;tone1=0xfc;tone2=0xef;EA=1;break;
- case 0xef:shumaguan=0x92;tone1=0xfd;tone2=0x45;EA=1;break;
- case 0xdf:shumaguan=0x82;tone1=0xfd;tone2=0x92;EA=1;break;
- case 0xbf:shumaguan=0xf8;tone1=0xfd;tone2=0xd0;EA=1;break;
- case 0x7f:shumaguan=0x80;tone1=0xfd;tone2=0xee;EA=1;break;
- default: EA=0;SPK=0;shumaguan=0xff;//沒有鍵按下則關閉中斷和數(shù)碼管 // 改過已
- }
- switch(P3)
- {
- case 0xfb:play1();break;
-
- }
- }
-
- /*****主程序*****/
- void main(void)
- {
- initTimer();
- shumaguan=0xff;
- TR0=1;
- ET0=1;
- SPK=0;
- while(1)
- {
- check_key();
- }
- }
復制代碼
完整的Word格式文檔51黑下載地址:
基于51單片機的簡易電子琴設計.doc
(5.11 MB, 下載次數(shù): 73)
2019-1-26 19:02 上傳
點擊文件名下載附件
基于51單片機的簡易電子琴設計 下載積分: 黑幣 -5
|