北邮微机原理与接口技术3.docx
《北邮微机原理与接口技术3.docx》由会员分享,可在线阅读,更多相关《北邮微机原理与接口技术3.docx(29页珍藏版)》请在冰豆网上搜索。
![北邮微机原理与接口技术3.docx](https://file1.bdocx.com/fileroot1/2022-12/16/5ba82d7f-4d63-4785-9b31-f9e5ce1a0a87/5ba82d7f-4d63-4785-9b31-f9e5ce1a0a871.gif)
北邮微机原理与接口技术3
微机原理与接口技术硬件实验报告
目录
3.实验三8253计数器/定时器的应用3
3.1.实验目的3
3.2.实验内容3
3.2.1.连接电路并测试3
3.2.2.音乐播放6
3.2.3.弹琴17
3.3.思考题27
3.4.心得体会27
参考资料28
声明与致谢28
3.实验三8253计数器/定时器的应用
3.1.实验目的
学习掌握8253用作定时器的编程原理。
3.2.实验内容
3.2.1.连接电路并测试
8253的CS接译码器输出Y1(其地址为E820-E827H);8253的OUT接蜂鸣器的BELL端;8253的门控信号GATE接+5V;8253的CLK端接Q7(32KHz);清零复位电路中的T/C端接地(或接RESET端)。
图13电路连接示意(局部)
图14线路连接
在本实验中,只采用定时器0,方式3,只用低字节初始化,故初始化控制字为00010110B,即16H。
它发往控制口E803H。
初值赋给端口E800H。
利用下表,在debug模式下,测试8253与蜂鸣器工作状况。
表4不同音高对应分频数(基频32KHz)
音名
分频数(十六进制)
低音
中音
高音
更高音
甚高音
Do
80
40
20
10
Re
72
39
1C
0E
Mi
66
33
19
Fa
60
30
18
So
55
2B
15
La
4D
26
13
Si
87
44
22
11
CODE(debugmode)
MOVDX,E823
MOVAL,16
OUTDX,AL
MOVDX,E820
MOVAL,80
OUTDX,AL
经检验,蜂鸣器发声正常。
3.2.2.音乐播放
完成一个音乐发生器,通过蜂鸣器放出音乐,并在数码管上显示乐谱。
程序设计:
音乐为巴赫的小步舞曲,只放一遍。
放音乐时,在最左边的数码管上显示播放的音符。
放完音乐或用户敲击键盘时退出程序返回DOS。
返回DOS前,数码管全灭,蜂鸣器静音。
流程图如下:
图15音乐播放流程图
程序源代码:
CODE(minuet.asm)
;FILENAME:
minuet.asm
;AUTHOR:
XIAO,Zhiqing(No.13,Cl.07105)
;DATE:
20091223
;DESCRIPTION:
playmusic
;=============macro=============
;macro:
myOut(WARNING:
itmaychangethevalueofAL)
;it'sstronglyrecommendedthatdatabeAL
myOutMACROportAddr,data
PUSHDX
MOVDX,portAddr
MOVAL,data
OUTDX,AL
POPDX
ENDM
;macro:
myLutOut(WARNING:
itmaychangethevalueofAL)
;it'sstronglyrecommendedthatdatabeAL
myLutOutMACROportAddr,lut,data
PUSHDX
PUSHBX
MOVBX,OFFSETlut
MOVAL,data
XLATlut
MOVDX,portAddr
OUTDX,AL
POPBX
POPDX
ENDM
;macro:
myIn(WARNING:
itmaychangethevalueofAL)
;it'sstronglyrecommendedthatdatabeAL
myInMACROportAddr,data
PUSHDX
MOVDX,portAddr
INAL,DX
MOVdata,AL
POPDX
ENDM
;=============datasegment=============
DataSEGMENT
;SegmentsLookupTable
SegLutDB0EDH,21H,0F4H,0F1H,39H;"01234"
DB0D9H,0DDH,61H,0FDH,0F9H;"56789"
DB7DH,9DH,0CCH,0B5H,0DCH,5CH;"ABCDEF"
DB3DH,8CH;'H'(10H)'L'(11H)
DB00H,10H;''(12H)'-'(13H)
spaceEQU12H
barEQU13H
;Contentindexarraytoprint
ContentDB12H,12H,12H,12H,12H,12H
;Voicetoplay
FreqDB0H
;freq
siFEQU87H;32k/240;0
do0EQU80H;32k/256;1
re0EQU72H;32k/288;2
mi0EQU66H;32k/320;3
fa0EQU60H;32k/341;4
so0EQU55H;32k/384;5
la0EQU4DH;32k/427;6
si0EQU44H;32k/480;7
do1EQU40H;32k/512;8
re1EQU39H;32k/576;9
mi1EQU33H;32k/640;A
fa1EQU30H;32k/682;B
so1EQU2BH;32k/768;C
la1EQU26H;32k/853;D
si1EQU22H;32k/960;E
do2EQU20H;32k/1024;F
re2EQU1CH;
mi2EQU19H;
fa2EQU18H;
so2EQU15H;
la2EQU13H;
si2EQU11H;
do3EQU10H;
re3EQU0EH;
;musicfreqlookuptable
FreqLutDBsiF;(00H)
DBdo0,re0,mi0,fa0,so0,la0,si0;(01H-07H)
DBdo1,re1,mi1,fa1,so1,la1,si1;(08H-0EH)
DBdo2;(0FH)
DBre2,mi2,fa2,so2,la2,si2
DBdo3,re3
;musicdisplaylookuptable
TubeLutDB61H;(00H)
DB21H,0F4H,0F1H,39H,0D9H,0DDH,61H;(01H-07H)
DB21H,0F4H,0F1H,39H,0D9H,0DDH,61H;(08H-0EH)
DB21H;(0FH)
DB0F4H,0F1H,39H,0D9H,0DDH,61H
DB21H,0F4H,0F1H,39H,0D9H,0DDH,61H
;buttonmatrix
buttonPressedDB0;0FFHforpressed,00Hfornot.
buttonRowDB0
buttonColDB0
buttonIndexDB0
buttonEnableDW0000H
labEQU1;1standforXue9,0standforJiao2
IFlab
;Xue9
PortSwEQU0E8E0H
;8255
PortAEQU0E800H
PortBEQU0E801H
PortCEQU0E802H
PortControlEQU0E803H
;8253
Timer0EQU0E820H
Timer1EQU0E821H
Timer2EQU0E822H
TimerControlEQU0E823H
ELSE
;Jiao2
PortSwEQU0EEE0H
;8255
PortAEQU0EE00H
PortBEQU0EE01H
PortCEQU0EE02H
PortControlEQU0EE03H
;8253
Timer0EQU0EE20H
Timer1EQU0EE21H
Timer2EQU0EE22H
TimerControlEQU0EE23H
ENDIF
NotesDB07H+5,07H+1,07H+2,07H+3,07H+4,07H+5,07H+1,07H+1
DB07H+6,07H+4,07H+5,07H+6,07H+7,0EH+1,07H+1,07H+1
DB07H+4,07H+5,07H+4,07H+3,07H+2,07H+3,07H+4,07H+3,07H+2,07H+1
DB00H+7,07H+1,07H+2,07H+3,07H+1,07H+2
DB07H+5,07H+1,07H+2,07H+3,07H+4,07H+5,07H+1,07H+1
DB07H+6,07H+4,07H+5,07H+6,07H+7,0EH+1,07H+1,07H+1
DB07H+4,07H+5,07H+4,07H+3,07H+2,07H+3,07H+4,07H+3,07H+2,07H+1
DB07H+2,07H+3,07H+2,07H+1,00H+7,07H+1
DB0EH+1,07H+7,07H+6,07H+7,07H+3,07H+3
DB07H+6,00H+6,00H+7,07H+1,07H+2,07H+3,07H+3,07H+2,07H+3
DB07H+4,07H+5,07H+4,07H+3,07H+2,07H+3,07H+4,07H+3,07H+2,07H+1
DB07H+2,07H+3,07H+2,07H+1,07H+2,00H+7
DB0EH+1,07H+7,07H+6,07H+7,07H+3,07H+3
DB07H+6,00H+6,00H+7,07H+1,07H+2,07H+3,07H+3,07H+2,07H+3
DB07H+4,07H+5,07H+4,07H+3,07H+2,07H+3,07H+4,07H+3,07H+2,07H+1
DB07H+2,07H+3,07H+2,07H+1,00H+7,07H+1
LengthOfSongEQU$-Notes
DurationDB4,2,2,2,2,4,4,4
DB4,2,2,2,2,4,4,4
DB4,2,2,2,2,4,2,2,2,2
DB4,2,2,2,2,12
DB4,2,2,2,2,4,4,4
DB4,2,2,2,2,4,4,4
DB4,2,2,2,2,4,2,2,2,2
DB4,2,2,2,2,12
DB4,4,4,4,4,4
DB4,2,2,2,2,4,2,2,4
DB4,2,2,2,2,4,2,2,2,2
DB4,2,2,2,2,12
DB4,4,4,4,4,4
DB4,2,2,2,2,4,2,2,4
DB4,2,2,2,2,4,2,2,2,2
DB4,2,2,2,2,12
DataENDS
;=============stacksegment=============
StackSEGMENTSTACK'STACK'
DB100HDUP(?
)
StackENDS
;=============codesegment=============
CodeSEGMENT
ASSUMECS:
Code,DS:
Data,SS:
Stack
MainPROCFAR
PUSHDS
XORAX,AX
PUSHAX
MOVAX,Data
MOVDS,AX
myOutPortControl,80H
;8255:
10000000Bmeans:
;A--mode0,output
;B--mode0,output
;CHigh--output(itwillchangeduringrunning)
;CLow--output(itwillchangeduringrunning)
myOutPortB,01H;showtheleftmostdigit
CALLPlay
myOutPortB,00H
RET
MainENDP
PlayPROC
PUSHSI
XORSI,SI
nextTune:
CALLShowTube
CALLPlayNote
CALLNoteDuration
CALLPlayHush
CALLHushDuration
CALLCheckExit
INCSI
CMPSI,LengthOfSong
JBnextTune
POPSI
RET
PlayENDP
ShowTubePROC
PUSHAX
PUSHBX
PUSHSI
MOVBX,OFFSETNotes
MOVAX,SI
XLATNotes
myLutOutPortA,TubeLut,AL
POPSI
POPBX
POPAX
RET
ShowTubeENDP
PlayNotePROC
PUSHAX
PUSHBX
PUSHSI
MOVBX,OFFSETNotes
MOVAX,SI
XLATNotes
PUSHAX
myOutTimerControl,16H
POPAX
myLutOutTimer0,FreqLut,AL
POPSI
POPBX
POPAX
RET
PlayNoteENDP
NoteDurationPROC
PUSHAX
PUSHBX
PUSHCX
PUSHSI
MOVBX,OFFSETDuration
MOVAX,SI
XLATDuration
XORAH,AH;uselessinstructindeed,sincehighbyteofSIiszero
MOVCX,0100H
MULCX
SUBCX,10H
nextSubNoteDelay:
CALLBasicDelay
DECAX
JNZnextSubNoteDelay
POPSI
POPCX
POPBX
POPAX
RET
NoteDurationENDP
PlayHushPROC
PUSHAX
PUSHBX
PUSHSI
myOutTimerControl,16H
;00:
Timer0
;01:
LowerByteonly
;011:
Mode3
;0:
BinaryCounting
myOutTimer0,1
POPSI
POPBX
POPAX
RET
PlayHushENDP
HushDurationPROC
PUSHAX
PUSHBX
PUSHCX
PUSHSI
MOVCX,10H
nextSubHushDelay:
CALLBasicDelay
JNZnextSubHushDelay
POPSI
POPCX
POPBX
POPAX
RET
HushDurationENDP
BasicDelayPROC
PUSHCX
MOVCX,0080H
myLoopLabel:
PUSHCX
MOVCX,1000H
myLoopLabel2:
DECCX
JNZmyLoopLabel2
POPCX
DECCX
JNZmyLoopLabel
POPCX
RET
BasicDelayENDP
CheckExitPROC
PUSHAX
MOVAH,0BH;checkwhetheruserinputsomethingfromkeyboard
INT21H
ORAL,AL;ifhedoes,thenreturntoDos
JZexitCheckAndQuit
myOutPortA,00H
myOutPortB,00H
CALLPlayHush
MOVAX,4C00H
INT21H
exitCheckAndQuit:
POPAX
RET
CheckExitENDP
CodeENDS
ENDMain
;=============endoffile=============
经过测验,程序运行正常。
3.2.3.弹琴
利用小键盘实现弹琴功能,并显示弹奏的乐谱。
当用户按小键盘时,蜂鸣器发声,数码管显示按下的音符。
否则,蜂鸣器不发声,数码管不显示。
用户按下标准键盘,退出程序,返回DOS。
程序流程图如下:
图16弹琴流程
程序源代码:
CODE(piano.asm)
;FILENAME:
piano.asm
;AUTHOR:
XIAO,Zhiqing(No.13,Cl.07105)
;DATE:
20091223
;DESCRIPTION:
playmusic
;=============macro=============
;macro:
myOut(WARNING:
itmaychangethevalueofAL)
;it'sstronglyrecommendedthatdatabeAL
myOutMACROportAddr,data
PUSHDX
MOVDX,portAddr
MOVAL,data
OUTDX,AL
POPDX
ENDM
;macro:
myLutOut(WARNING:
itmaychangethevalueofAL)
;it'sstronglyrecommendedthatdatabeAL
myLutOutMACROportAddr,lut,data
PUSHDX
PUSHBX
MOVBX,OFFSETlut
MOVAL,data
XLATlut
MOVDX,portAddr
OUTDX,AL
POPBX
POPDX
ENDM
;macro:
myIn(WARNING:
itmaychangethevalueofAL)
;it'sstronglyrecommendedthatdatabeAL
myInMACROportAddr,data
PUSHDX
MOVDX,portAddr
INAL,DX
MOVdata,AL
POPDX
ENDM
;=============datasegment=============
DataSEGMENT
;SegmentsLookupTable
SegLutDB0EDH,21H,0F4H,0F1H,39H;"01234"
DB0D9H,0DDH,61H,0FDH,0F9H;"56789"
DB7DH,9DH,0CCH,0B5H,0DCH,5CH;"ABCDEF"
DB3DH,8CH;'H'(10H)'L'(11H)
DB00H,10H;''(12H)'-'(13H)
spaceEQU12H
barEQU13H
;