150 likes | 337 Views
單元二. 電子琴. 8051 使喇叭發聲的方法. 要使喇叭發聲最簡單的方式就是送一個連續脈波給喇叭,然後喇叭上之線圈和磁鐵間的作用會使紙盆振動而發出聲音。. P3.7=0. 延遲 t 秒. P3.7=1. 延遲 t 秒. 8051 輸出方波產生. 方波是由相同時間長度的0和1不斷的變化所組成,而0和1的時間加起來就是方波的週期,因此只要改變0、1的時間就可得到各種不同頻率的方波 。. 8051 輸出方波頻率之計算. 下列為之前常用之延遲副程式之延遲計算:. DELAY: MOV I,#T1 ....1 個機械週期 D1:
E N D
單元二 電子琴
8051使喇叭發聲的方法 要使喇叭發聲最簡單的方式就是送一個連續脈波給喇叭,然後喇叭上之線圈和磁鐵間的作用會使紙盆振動而發出聲音。
P3.7=0 延遲t秒 P3.7=1 延遲t秒 8051輸出方波產生 方波是由相同時間長度的0和1不斷的變化所組成,而0和1的時間加起來就是方波的週期,因此只要改變0、1的時間就可得到各種不同頻率的方波 。
8051輸出方波頻率之計算 下列為之前常用之延遲副程式之延遲計算: DELAY: MOV I,#T1 ....1個機械週期 D1: MOV J,#T2 ....1個機械週期 DJNZ J,$ ....2個機械週期 DJNZ I,D1 ....2個機械週期 RET ....2個機械週期 T2×2 [(1+T2×2)+2] ×T1 內迴圈 外迴圈 總延遲= [(1+T2×2)+2] ×T1 +1 +2 2×T1×T2+3×T1+3 單位:機械週期 =
8051的機械週期 CPU內振盪電路會產生執行程式時所需的狀態序列,而每一個狀態序列時由2個振盪週期組成,而執行指令所需的每一個機械週期則是由6個狀態序列所組成(即12個振盪週期),因此若所外接的石英振盪為12MHz,則每一個機械週期即為1/(12M/12)=1uSec。
1 1 t= = 0.5mSec = 500μSec × 2 1K 12 = 1μSec 機械週期= 12M 計算範例(一) 單晶片所使用的XTAL為12MHz,若想要產生一個1KHz的方波,其延遲設計過程如下: 步驟一、先算出1KHz方波的0和1的時間長度t: 步驟二、再算出一個機械週期之時間: 步驟三、決定延遲迴圈中T1及T2的值: 3T1+2T1T2+3= 500 最後假設T1=1,則T2為: 3+2T2=497 =>T2=247 =>3T1+2T1T2=497
計算範例(二) 利用前述之結果,可得下列程式: DELAY: MOV I,#1 D1: MOV J,#247 DJNZ J,$ DJNZ I,D1 RET
8051輸入電路之設計 若要將8051的PROT連接開關做為輸入使用,必需要先將連接開關的接腳用程式設為Hi,接著只要讀取到該接腳為Low時即代表開關有動作,電路連方式如下圖所示: 此點常態為「1」,當開關按下後因開關短路接地而變為「0」 將此接腳以SETB的命令設為「1」
YES 位元=1 跳到指定位址 NO 位元判斷跳躍指令-JB 指令格式: JB 要判斷的位元, 要跳躍的位址(LABEL) 說明: 當所指定要判斷的位元為「1」時會跳躍到指定的程式位址(即LABEL),若為「0」則忽略此一程式,直接執行下一行。
YES 位元=0 跳到指定位址 NO 位元判斷跳躍指令-JNB 指令格式: JNB 要判斷的位元, 要跳躍的位址(LABEL) 說明: 當所指定要判斷的位元為「0」時會跳躍到指定的程式位址(即LABEL),若為「1」則忽略此一程式,直接執行下一行。
NO P1.0=0 YES 當開關動作時執行的程式段 判斷單一開關動作的方法 方法一: X: JB P1.0,X MOV R1,#1 MOV R2,#247 . . 方法二: X: JNB P1.0,Y AJMP X Y: MOV R1,#1 MOV R2,#247 . .
判斷單多個開關動作的方法(一) X: JB P1.0,Y AJMP F1 Y: JB P1.1,Z AJMP F2 Z: . . AJMP X F1: MOV R1,#1 . . AJMP X F2: MOV R1,#5 . . AJMP X YES P1.0=0 功能一 NO YES 功能二 P1.1=0 NO YES 功能N P1.N=0 NO
YES P1.0=0 功能一 NO YES 功能二 P1.1=0 NO YES 功能N P1.N=0 NO 判斷單多個開關動作的方法(二) X: JNB P1.0,F1 JNB P1.1,F2 . . AJMP X F1: MOV R1,#1 . . AJMP X F2: MOV R1,#5 . . AJMP X 此種方式程式較為精簡,但因JNB及JB等指令其跳躍能力最大為256Bytes,若功能段程式過長可能會造成無法跳躍的錯誤
範例程式動作 I EQU 20H J EQU 21H ORG 0 START: MOVR0, #0H DJNZR0,$ MOVSP,#60H 基本設定 No P1.0=0 Yes AGAIN: JB P1.0,AGAIN R1=1 R2=247 MOV R1,#1 MOV R2,#247 P3.7=0 CLR P3.7 延遲 ACALL DELAY SETB P3.7 P3.7=1 ACALL DELAY 延遲 AJMP AGAIN