一、實驗要求
- 通過8253和8255使揚聲器發聲
- 編寫電子琴程序,要求程序能響應三個鍵,每個鍵對應不同頻率的聲音,按下發聲,鬆開靜音。
二、實現原理
8255的地址爲:60H~63H;PB端口地址爲61H,控制口爲63H
8253的地址爲:40H~43H;通道2地址42H,控制口地址43H
1、發聲原理
人能聽到的聲音頻率範圍爲20Hz~20000Hz。但是人耳最敏感聲音頻率範圍是1000Hz-----3000Hz之間的聲音。
揚聲器可以產生不同頻率、不同振幅的震動,振幅決定了音量,頻率決定了音色、品質,本次實驗就是改變電流輸出頻率從而發聲。
2、8253計算初值
PC的揚聲器以計數器2爲核心。計數器8255的CLK2的輸入頻率爲1.193182 MHz,工作於方式3,改變計數器初值可以由得到不同頻率的方波輸出。
fCLK頻率:1.1931816*1000000=0012 34DE H
若要使揚聲器輸出600Hz頻率信號,則8253計數初值爲1983
若要使揚聲器輸出1000Hz頻率信號,則8253計數初值爲1193
對於600 Hz, N=計數初值=11931816/600=1983
對於1000 Hz,N=計數初值=11931816/1000=1193
改變8253的輸出頻率,即可改變揚聲器輸出聲頻信號頻率。
3、8255控制開關
揚聲器受8255A芯片B口的兩個輸出端線控制,8255工作於方式0輸出。
PB0=1,即GATE2=1,計數器2正常計數
PB1=1,打開輸出控制門,揚聲器工作
三、代碼及解釋
1、任務一
(1)按下 a 鍵時:對8253定時器初始化,設置通道2,方式3;然後用該計數器,計數當輸出1000Hz時的計數次數,以產生1000Hz頻率的方波,並從42H(OUT2)端口輸出。即該子程序功能爲:初始化定時器,設置計數初值,並輸出1KHz頻率信號。
(2)按下 b 鍵時:使PB1=1,輸出高電平,驅動揚聲器,以開啓揚聲器。
(3)按下 c 鍵時:使PB1=0,關閉揚聲器的驅動,使揚聲器無法工作。
(4)按下 d 鍵時:使PB0=1,輸出高電平,驅動8253定時器,以開啓定時器。
(5)按下 e 鍵時:使PB0=0,關閉定時器驅動電壓,使定時器無法工作。
(6)按下 ESC 鍵時:退出整個程序,回到DOS。
ASSUME CS:seg2,DS:seg1
seg1 SEGMENT
pstart DB 'Program start.',0DH,0AH,'$' ;0D回車,0A換行
pend DB 'Program will end when input',27H,'ESC',27H,'.',0DH,0AH,'$'
sec DB 10
seg1 ENDS
seg2 SEGMENT
start: MOV AX,seg1
MOV DS,AX
MOV DX,OFFSET pstart
MOV AH,09H
INT 21H
MOV DX,OFFSET pend
MOV AH,09H
INT 21H
;--------------鍵盤控制-------------------
wait1: MOV AH,01H ;輸入一個字符=AL,DOS系統功能調用
INT 21H
CMP AL,1BH ;是否ESC鍵
JE keyESC
CMP AL,'a' ;是a鍵?
JE keya ;a鍵處理,初始化定時器8253
CMP AL,'b'
JE keyb ;b開啓揚聲器
CMP AL,'c'
JE keyc ;c關啓揚聲器
CMP AL,'d'
JE keyd ;d啓動定時器
CMP AL,'e'
JE keye ;e停止定時器
JMP wait1
;-----‘a’鍵處理,定時器8253通道2初始化,將頻率轉爲計數初值--------
keya: MOV AL,10110110B ;設定時器工作方式,方式3
OUT 43H,AL ;送8253的控制端口43H
MOV DX,0012H ;輸入頻率送DX,AX
MOV AX,34DEH
MOV DI,1000 ;將頻率1000Hz轉換爲計數初值
DIV DI ;計數初值在AX中
OUT 42H,AL ;計數初值送定時器2,即送42H端口
MOV AL,AH
OUT 42H,AL ;輸出頻率爲1000HZ信號
JMP wait1
;------‘b’鍵處理,並行接口8255,揚聲器開啓控制--------------
keyb: IN AL,61H ;讀8255PB口
OR AL,00000010B ;並行接口8255,使得PB1=1
OUT 61H,AL ;置PB1=1,開揚聲器
JMP wait1
;------‘c’鍵處理,揚聲器關閉控制----------------------------
keyc: IN AL,61H
AND AL,11111101B ;並行接口8255,PB1=0,關揚聲器
OUT 61H,AL
JMP wait1
;-------‘d’鍵處理,定時器開啓控制---------------------------
keyd: IN AL,61H
OR AL,00000001B ;並行接口8255,啓動定時器2,GATE=PB0=1
OUT 61H,AL
JMP wait1
;------‘e’鍵處理,定時器關閉控制----------------------------
keye: IN AL,61H
AND AL,11111110B ;並行接口8255,停止定時器2,GATE=PB0=0
OUT 61H,AL
JMP wait1
;------‘ESC’鍵處理,退出系統--------------------------------
keyESC: MOV AH,4CH
INT 21H
seg2 ENDS
END start
2、任務二
要求程序能響應三個鍵,每個鍵對應不同頻率的聲音,按下發聲,鬆開靜音。
(1)需要三種頻率對應三個按鍵
(2)按下發聲,鬆開靜音:需要判斷按鍵情況,持續按下、按一下、沒按,可以短暫延時再次查看按鍵情況,如果延時後按鍵還有輸入說明按鍵持續按下,否則說明只按了一下。
其實寫兩個延時程序更好(本人偷懶不想改)
發聲應該延時長,人聽到纔不會因爲太短而變聲
檢測按鍵狀態應該延時短,電腦響應纔不會延時(明明沒按了,但是還是在響應)
爲了更正式,可以改成兩個延時程序
爲什麼又七個按鍵,因爲網上有現成的且對應簡單的七個音階,稍微修改了下,如果只要三個可以自己去掉一些就可以了。
ASSUME DS:DATA,SS:STACK,CS:CODE
DATA SEGMENT
pstart DB 'Program start.',0DH,0AH,'$' ;0D回車,0A換行
pend DB 'Program will end when input',27H,'ESC',27H,'.',0DH,0AH,'$'
sec DB ?
TABLE DW 262 ;k1 發 do 的音,261.6HZ
DW 294 ;k2 發 re 的音,293.6HZ
DW 330 ;k3 發 mi 的音,329.6HZ
DW 349 ;k4 發 fa 的音,349.2HZ
DW 392 ;k5 發 sol 的音,392HZ
DW 440 ;k6 發 la 的音,440HZ
DW 494 ;k7 發 si 的音,493.8HZ
DATA ENDS
STACK SEGMENT PARA STACK 'STACK'
STA DB 48 DUP(?)
TOP EQU LENGTH STA
STACK ENDS
CODE SEGMENT
;--------------初始化-------------------
start: MOV AX,DATA
MOV DS,AX
MOV DX,OFFSET pstart
MOV AH,09H ;功能號09H,顯示字符串
INT 21H
MOV DX,OFFSET pend
MOV AH,09H
INT 21H
MOV AX,STACK
MOV SS,AX
MOV AX,TOP
MOV SP,AX
;--------------鍵盤控制-------------------
key: MOV AH,01H ;功能號01H,鍵盤輸入並回顯
INT 21H
CMP AL,1BH ;ASCII表,1BH 是 ESC
JE keyESC
CMP AL,'1' ;分別對應 7 個音階
JE key1
CMP AL,'2'
JE key2
CMP AL,'3'
JE key3
CMP AL,'4'
JE key4
CMP AL,'5'
JE key5
CMP AL,'6'
JE key6
CMP AL,'7'
JE key7
;--------------是否持續按下-----------------
always: MOV AH,0BH ;功能號0BH,檢測鍵盤狀態
INT 21H
AND AL,0FFH ;無按鍵按下 AL=00,有按鍵按下 AL=FF
CALL delay ;調用延時,判斷按鍵是否持續按下
JNZ always ;是就繼續發聲
IN AL,61H
AND AL,11111100B ;否就關閉,PB1=PB0=0
OUT 61H,AL
JMP key
;--------------按鍵選擇-------------------
keyESC: MOV AH,4CH
INT 21H
key1: MOV BX,TABLE ;TABLE對應頻率
JMP TOSOUND
key2: MOV BX,TABLE+2
JMP TOSOUND
key3: MOV BX,TABLE+4
JMP TOSOUND
key4: MOV BX,TABLE+6
JMP TOSOUND
key5: MOV BX,TABLE+8
JMP TOSOUND
key6: MOV BX,TABLE+10
JMP TOSOUND
key7: MOV BX,TABLE+12
JMP TOSOUND
;--------------計算初值-------------------
TOSOUND:MOV DX,0012H
MOV AX,34DEH
DIV BX ;計算初值
CALL SOUND ;調用發音子程序
CALL delay ;調用延時
JMP always ;跳轉判斷按鍵是否持續按下
;--------------發聲程序-------------------
SOUND PROC NEAR
PUSH AX
MOV AL,10110110B ;設定時器工作方式,方式3
OUT 43H,AL ;送8253的控制端口43H
POP AX
OUT 42H,AL ;計數初值送低8位定時器2,即送42H端口
MOV AL,AH
OUT 42H,AL ;計數初值送高8位定時器2,即送42H端口
IN AL,61H
OR AL,00000011B ;打開揚聲器,PB1=PB0=1
OUT 61H,AL
RET
SOUND ENDP
;--------------延時程序-------------------
delay PROC NEAR
PUSH CX
PUSH AX
MOV AX,100H
for1: MOV CX,0FFFH
for2: LOOP for2
DEC AX
JNZ for1
POP AX
POP CX
RET
delay ENDP
CODE ENDS
END start
四、結果
1、揚聲器發聲
a 是初始化
b 是揚聲器開啓
c 是揚聲器關閉
d 是定時器開啓
e 是定時器關閉
所以發聲輸入 abd
即可,不發聲輸入 ce
其中之一就可以了。
2、電子琴程序
(1)隨便亂打
(2)兩隻老虎琴譜