彙編實驗四——揚聲器程序設計

一、實驗要求

  1. 通過8253和8255使揚聲器發聲
  2. 編寫電子琴程序,要求程序能響應三個鍵,每個鍵對應不同頻率的聲音,按下發聲,鬆開靜音。

二、實現原理

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)兩隻老虎琴譜
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章