這個是我最近的課程設計,做完了給大家分享一下吧 基本要求:基于51單片機的多音階電子琴可以采用16個按鍵矩陣,設計成16個音階,來實現隨意彈奏想要表達的音樂。 設計提示: 1)掌握鍵盤的掃描識別編程方法; 2)理解數碼管動態顯示原理。 3)可先利用單片機定時器T0或T1實現基準時間(如20ms)
利用51開發板以及外接的矩陣鍵盤,以及數碼管和蜂鳴器,設計出功能簡單的電子琴,從而了解蜂鳴器發出不同音調的原理,加深對蜂鳴器原理的認識。同時了解矩陣鍵盤的掃描原理以及加深數碼管動態顯示的原理。 另外,元件的使用以及畫總電路圖使用到了PROTEL軟件,代碼的編寫下載使用keil軟件,本次大作業也會讓我對這兩個軟件的使用更加熟練。
實驗原理 音節由不同頻率的方波產生,音節與頻率的關系見下面的表格。要產生音頻方波,只要算出某一咅頻的周期(頻率的倒數),然后將此周期除以2,即為半周期的時間。利用計時器計時此半周期時間,每當計時到后就將輸出信號的I/O反相,然后重復計時此半周期時間再對I/O 反相,就可在I/O腳得到此頻率的方波。在51單片機上,產生方波的I/O腳選用P2.5,P2.5輸出不同頻率的方波,蜂 鳴器便會發出不同的聲音。另外,音樂的節拍是由延時實現的,如果1拍為0.4秒,1/4拍是 0.1秒。只要設定延時時間,就可求得節拍的時間。延時作為基本延時時間,節拍值只能是它的整數倍。
系統設計
本課題只要給蜂鳴器不同頻率的信號既可以實現不同音調的發聲。單片機實驗板上的數碼顯示管可以顯示四位數字,但是并行口只有八個,所以只能選用動態掃描方式。鍵盤由于板子上沒有鍵盤,只能使用外接鍵盤,插在P1口,蜂鳴器接在P2.5口,數碼顯示管接在P0口。 功能單元框圖如下圖:
Snip20180423_18.jpg (28.58 KB, 下載次數: 30)
下載附件
2018-4-23 22:53 上傳
功能描述: 矩陣鍵盤:輸入不同的按鍵信號,用來選擇蜂鳴器頻率以及數碼管的顯示。 AT89S51: 主控制模塊。 74HC573: 鎖存器,數碼管采取動態掃描方式,為了選擇數碼管顯示的是第幾個七段數碼管,需要借助鎖存器。 數碼管:顯示數字。 蜂鳴器:發出聲音 時鐘與復位電路:提供時鐘信號與復位信號。
硬件設計 (本章用來論述各個功能單元的具體實現電路,并詳細介紹設計過程,如元器件的選型、特點以及具體原理電路圖)
單元一: 4*4鍵盤矩陣
按鍵數目較多的場合常常采用矩陣式鍵盤,也稱行列式鍵盤。鍵盤由行線和列線組成,按鍵位于行列線的交叉點上。一個4*4的行列結構可以構成一個16個按鍵的鍵盤,需要一個8位的并行IO口。很明顯,再按鍵數目較多的場合,矩陣式鍵盤要比獨立式鍵盤節省較多的IO口線。本實驗中矩陣鍵盤接在P1口。
單元二:SST89E51芯片 SST89E51是一個低功耗,高性能CMOS 8位單片機,片內含4k Bytes ISP(In-system programmable)的可反復擦寫1000次的Flash只讀程序存儲器,器件采用高密度、非易失性存儲技術制造,兼容標準MCS-51指令系統及80C51引腳結構,芯片內集成了通用8位中央處理器和ISP Flash存儲單元,SST89E51在眾多嵌入式控制應用系統中得到廣泛應用。
單元三:時鐘與復位電路 時鐘信號分為內部時鐘信號與外部時鐘信號,本實驗中使用的是外部時鐘信號,CPU外面有一個11.0592Mhz的外接晶振。復位操作是單片機的初始化操作,只需要給AT89S51單片機的復位引腳RST加上大于兩個機器周期的高電平就可以使得單片機復位。
單元四:鎖存器74HC573 74HC573是擁有八路輸出的透明鎖存器,輸出為三態門,是一種高性能硅柵CMOS器件。當輸入的數據消失時,在鎖存器芯片的輸出端,數據仍然保持。 單元五:數碼管顯示
單元六:蜂鳴器電路
有源蜂鳴器是一種一體化結構的電子迅響器,采用直流電壓供電,廣泛應用于計算機、打印機、復印機、報警器、電子玩具、汽車電子設備、電話機、定時器等電子產品中作發聲器件。蜂鳴器主要分為壓電式蜂鳴器和電磁式蜂鳴器兩種類型。蜂鳴器在電路中用字母“H”或“HA”(舊標準用“FM”、“LB”、“JD”等)表示。
軟件設計
接下來的代碼為初始化各值: ORG 0000H AJMP KEY1 ORG 0030H MOV A,#0 MOV R7,#0 SETB P2.5
下面為鍵盤掃描的主程序: KEY1: MOV P1,#0F0H ;給列送高電平 LCALL DELAY ;延時,使電路穩定下來 MOV R4,00H MOV A,P1 ;取P1口的值 ANL A,#0F0H ;屏蔽行線的影響 CJNE A,#0F0H,L ;如果有鍵按下,就跳轉到L
下面為數碼管顯示的程序,2.0為第一個鎖存器的使能端,首先通過給P0口賦值#07H,讓第一塊鎖存器的輸出值鎖定,選定四個數碼管顯示我們只使用第四個。然后關閉使能端,第二塊鎖存器的輸出控制一個數碼管的顯示數字。 通過查表法給數碼管送入不同的數值。 DISPLAY: CLR P2.0 ; SETB P2.1 MOV P0,#07H CLR P2.1 SETB P2.0 MOV DPTR,#TABLE MOV A,R7 MOVC A,@A+DPTR MOV P0,A 下面是發出聲音的代碼: MUSIC: MOV R3,#200 MOV A,R7 JZ KEY1 LCALL FENGMING AJMPKEY1
下面是鍵盤掃描程序的子程序:
L: LCALL DELAY ;延時去除抖動 MOV A,P1 ;重新取值 JB ACC.4,L1 ;P1.4這一列有鍵按下?沒有則跳轉到L1 MOV R3,#00H ;R3用作記列號 AJMP Q1 L1: JB ACC.5,L2 MOV R3,#01H AJMP Q1 L2: JB ACC.6,L3 MOV R3,#02H AJMP Q1 L3: JB ACC.7,KEY1 MOV R3,#03H AJMP Q1 Q1: MOV P1,#0FH ;給行送高電平 LCALL DELAY ;延時,穩定電路 MOV A,P1 ;取值 ANL A,#0FH ;屏蔽高四位 JB ACC.0,Q2 ;判斷是不是第0行,不是則轉移 MOV R4,#00H ;如果是,那把0送給R4(R4存行(轉換為鍵號)) AJMP JIA Q2: JB ACC.1,Q3 MOV R4,#04H AJMP JIA Q3: JB ACC.2,Q4 MOV R4,#08H AJMP JIA Q4: JB ACC.3,KEY1 MOV R4,#0CH AJMP JIA JIA: MOV A,R3 ;行號加上列號就是改鍵的值 ADD A,R4 MOV R7,A ;調整后放在R7寄存器中 AJMP KEY1 DELAY: MOV R6,#20H ;仿真時測試延時為13ms Q6: MOV R5,#0BBH DJNZ R5,$ DJNZ R6,Q6 RET
蜂鳴器的子程序:控制不同的計數器初值,從而達到分頻的效果。建立了兩個表格TABLE2和TABLE3,利用查表法取出初值分別裝入TH0和TL0。計數器工作時我沒有采用中斷,而是通過判斷TF溢出位來查看計數是否完成。R3是為了進行兩百個循環,即增長響聲時間。
FENGMING: MOV R3,#200 SETBP2.5 MAIN01: MOV TMOD,#01H MOV DPTR,#TABLE2 MOVA,R7 MOVC A,@A+DPTR MOV R5,A MOV DPTR,#TABLE3 MOVA,R7 MOVC A,@A+DPTR MOV R6,A MOV TH0,R6 MOV TL0,R5 SETB TR0 WAIT: JNB TF0, WAIT;判斷是否溢出 CLR TF0 CPL P2.5 ;蜂鳴器響 DJNZ R3,MAIN01 ;蜂鳴器的延時程序 RET
下面為代碼中用到的三個表格,分別為數碼管顯示的表格和計數器高低位TL0和TH0的表格。
TABLE: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H ,7FH,6FH,77H DB 7CH,39H,5EH,79H,71H; TABLE2: DB25H,080H,84H,0D9H,68H,0B9H,5BH,78H,79H, DB 0E4H,0A8H,0E6H,6FH,88H,40H,66H TABLE3:DB 0FEH,0FDH,0FEH,0FAH,0FBH,0FBH,0FDH,0FEH, DB 0FDH,0FEH,0FAH,0FBH,0FBH,0FDH,0FBH,0FBH
若有不足還請大家指出
|