天天看點

《51單片機應用開發從入門到精通》——2.12 電子琴

本節書摘來異步社群《51單片機應用開發從入門到精通》一書中的第2章,第2.12節,作者:張華傑 ,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視

51單片機應用開發從入門到精通

本執行個體是采用44矩陣式鍵盤設計出16個音符,随意彈奏。

電子琴電路設計如圖2-19所示。

《51單片機應用開發從入門到精通》——2.12 電子琴

單片機p3為輸入端口,接有44矩陣式鍵盤,鍵盤上标出16個音符。鍵盤的4條行線的一端與單片機p3端口的p3.0、p3.1、p3.2和p3.3口相接,另一端通過上拉電阻接到 + 5v上;4條列線的一端與p3端口的p3.4、p3.5、p3.6和p3.7口相接。單片機的p2.4端口為輸出端,通過限流電阻r1與三極管基極相接,三極管的集電極接有蜂鳴器。

電子琴程式設計的思路是:設計16個音符,與44矩陣式鍵盤16個按鍵一一對應。音符通過定時器t0産生,然後通過鍵盤掃描法,将按下的鍵轉換成相對應的音符。

1.流程圖

程式設計流程如圖2-20所示。

《51單片機應用開發從入門到精通》——2.12 電子琴

2.程式

彙編語言編寫的電子琴源程式jp04.asm代碼如下:

1.程式分析解釋

01~04:設定程式開始位址和中斷t0起始位址。

05~07:設定t0工作在模式1下;開通中斷并啟動t0工作。

08:調用掃描子程式key開始掃描,判斷是否有鍵按下。

09~22:存表(第13行語句),取碼(第14和第20行語句),向定時器裝初始值(第15和第21行語句)。與此同時,還将取到的高位位元組和低位位元組分别存入位址21h(第16行語句)和20h(第22行語句)處,以便在中斷子程式中對定時器重裝初始值用。位址22h用于暫存取碼指針。整個過程由于已将中斷關閉,是以定時器不能産生中斷信号,輸出端p2.4沒有輸出。

第10行語句是判斷f0是0還是1。f0是狀态字寄存器psw的一個自由使用的标志位。程式規定f0 = 1表示沒有鍵按下,f0 = 0表示有鍵按下。

23~26:再調用掃描程式,确認是否有鍵按下。當有鍵按下時,由于此時已經開通了中斷,定時器會産生中斷信号,使程式進入到中斷服務子程式運作,于是輸出端p2.4便有輸出。

27~44:掃描子程式。

45~47:有鍵按下後,将取碼指針存入位址22h,并令f0 = 0,用來标志有鍵按下。

48~55:中斷服務子程式。其中第48~49行為進棧保護現場,第53~54行為出棧恢複現場。50~51行重裝定時器初始值。第52行語句是輸出語句。第55行語句是中斷服務子程式傳回主程式的指令。

56~59:編碼表。表中的16個數是定時器發出16個音的定時器初始值。

60:程式結束。

2.至本章用過的指令歸類

 資料傳送類指令:mov、movc、push、pop。

 算術運算類指令:inc、div。

 邏輯運算及位移類指令:rl、rr、rlc、rrc、clr、anl、orl、xrl。

 控制轉移類指令:jmp、djnz、acall、ret、cjne、reti、jz。

 位操作類指令:cpl、clr、setb、jb、jnb、jbc、jnc、jc。

 僞指令:end、db、org。

1.模拟仿真前注意事項

在第30行語句與31行語句之間,增加一條模拟按鍵按下的語句。

setb tf0<code>`</code>

2.模拟仿真中注意事項

(1)注意觀察程式運作路線。當第一次掃描檢測到有鍵按下時,由于第09行語句将中斷屏蔽,是以程式運作不能進入到中斷服務子程式,輸出端p2.4沒有輸出。

在第二次掃描再次确認有鍵按下時,由于第24行語句将中斷開啟,是以定時器t0将産生中斷信号,通過程式标号tim0進入中斷服務子程式,使p2.4端口産生輸出。

(2)去掉模拟按鍵和模拟中斷溢出語句,觀察程式運作情況,由于沒有按鍵按下,是以p2.4沒有輸出。

将寫入程式的單片機插入實驗闆插座内,并檢查實驗闆上的蜂鳴器接口是否與程式中聲音輸出端口一緻,當檢查無誤後接通電源,即可按圖2-19所示進行音樂彈奏。

電子琴程式從功能設計上可分為兩大部分。

 利用單片機内定時器t0産生16個音符,16個音符代碼在表中的排列順序與16個按鍵上所标出的音符是對應的。

 通過對鍵盤不斷進行掃描,當确定有按鍵操作後,将所按下的鍵轉換成相對應的音符,并通過輸出端口使蜂鳴器發出相對應的聲音,聲音的長短由按鍵的時間決定。

繼續閱讀