微原硬件实验三8253计数器定时器的实际应用.docx
《微原硬件实验三8253计数器定时器的实际应用.docx》由会员分享,可在线阅读,更多相关《微原硬件实验三8253计数器定时器的实际应用.docx(14页珍藏版)》请在冰豆网上搜索。
微原硬件实验三8253计数器定时器的实际应用
专业:
信息工程
学生姓名:
×××
学号:
×××
指导教师:
××
完成时间:
2013年11月29日
实验三:
8253计数器/定时器的应用
北京邮电大学微机原理硬件实验报告
一、实验目的3矚慫润厲钐瘗睞枥庑赖。
二、实验原理及内容3聞創沟燴鐺險爱氇谴净。
1、实验原理3残骛楼諍锩瀨濟溆塹籟。
①8253定时器介绍3酽锕极額閉镇桧猪訣锥。
②8253初始化3彈贸摄尔霁毙攬砖卤庑。
③8253控制字3謀荞抟箧飆鐸怼类蒋薔。
④注意事项4厦礴恳蹒骈時盡继價骚。
2、实验内容4茕桢广鳓鯡选块网羈泪。
①基本功能4鹅娅尽損鹌惨歷茏鴛賴。
②拓展功能5籟丛妈羥为贍偾蛏练淨。
三、硬件连接图及程序流程图5預頌圣鉉儐歲龈讶骅籴。
1、硬件连接图5渗釤呛俨匀谔鱉调硯錦。
①8253定时器5铙誅卧泻噦圣骋贶頂廡。
②数码管6擁締凤袜备訊顎轮烂蔷。
③译码器7贓熱俣阃歲匱阊邺镓騷。
④扬声器7坛摶乡囂忏蒌鍥铃氈淚。
⑤分频器8蜡變黲癟報伥铉锚鈰赘。
2、程序流程图9買鲷鴯譖昙膚遙闫撷凄。
四、源程序10綾镝鯛駕櫬鹕踪韦辚糴。
五、实验结果12驅踬髏彦浃绥譎饴憂锦。
六、实验总结13猫虿驢绘燈鮒诛髅貺庑。
1、都是不认真听课惹的祸13锹籁饗迳琐筆襖鸥娅薔。
2、难听的曲子13構氽頑黉碩饨荠龈话骛。
七、实验收获与心得体会13輒峄陽檉簖疖網儂號泶。
八、思考题13尧侧閆繭絳闕绚勵蜆贅。
1、实验目的
1、进一步熟悉汇编语言;
2、学习掌握8253用作定时器的编程原理。
2、实验原理及内容
1、实验原理
①8253定时器介绍
Ⅰ、微机系统使用的8254,其3个通道均有固定的用途:
0号计数器为系统时钟源,每隔55ms向系统主8259IR0提一次中断请求;1号计数器用于动态存储器的定时刷新控制;2号计数器为系统的发声源。
用户在使用微机系统的时候,可以使用0号和2号计数器,但不能改变对1号计数器的初始化。
识饒鎂錕缢灩筧嚌俨淒。
Ⅱ、实验箱上的8253,其数据线D7—D0,地址线A1、A0和控制线RD、WR通过总线驱动卡和微机系统的三总线相连。
除此之外,三个计数器的引出段和片选端都是悬空的,这意味着实验箱上的8253的三个计数器都归用户使用,你可以单独使用其中的一个计数器,也可以串联使用其中的2个或3个计数器。
凍鈹鋨劳臘锴痫婦胫籴。
Ⅲ、8253计数器的输入信号,其频率不能超过2MHz,否则长时间使用,芯片过热,容易烧毁
②8253初始化
使用8253前,要进行初始化编程。
初始化编程的步骤是:
①向控制寄存器端口写入控制字对使用的计数器规定其使用方式等。
②向使用的计数器端口写入计数初值。
③8253控制字
图一:
8253控制字
说明:
D7D6=00:
使用0号计数器
D7D6=01:
使用1号计数器
D7D6=10:
使用2号计数器
D7D6=11:
无效
D5D4=00:
锁存当前计数值
D5D4=01:
只写低8位(高8位为0),读出时只读低8位
D5D4=10:
只写高8位(低8位为0),读出时只读高8位
D5D4=11:
先读/写低8位,后读/写高8位计数值
D3D2D1=000:
选择方式0
D3D2D1=001:
选择方式1
D3D2D1=X10:
选择方式2
D3D2D1=X11:
选择方式3
D3D2D1=100:
选择方式4
D3D2D1=101:
选择方式5
D0=0:
计数初值为二进制
D0=1:
计数初值为BCD码数
④注意事项
测试:
在Debug状态下,用“O”命令测试8353的发生功能,3组通道工作是否正常。
电路连接:
8253的CS接译码器输出Y1其地址为EE20-EE27H
8253的OUT接蜂鸣器的BELL端
8253的门控信号GATE接+5V
8253的CLK端接Q7(32KHz)清零复位电路中的T/C端接地(或接RESET端)
注意:
由于8253计数速率应小于2MHz,CLK0的输入信号必须由8MHz经393分频到小于2MHz后使用。
393分频之后,Q0输出为4MHz,Q1输出为2MHz……Q7输出32KHz。
恥諤銪灭萦欢煬鞏鹜錦。
编程提示:
8253控制端口地址为E823H
定时器0地址为E820H
定时器1地址为E821H
定时器2地址为E822H
定时器可工作在方式3下
2、实验内容
①基本功能
完成一个音乐发生器,通过蜂鸣器放出音乐,并在数码管上显示乐谱。
图二:
音符频率对照表
②拓展功能
利用小键盘实现弹琴功能,并显示弹奏的乐谱。
3、硬件连接图及程序流程图
1、硬件连接图
①8253定时器
图三:
8253定时器
②数码管
图四:
数码管
③译码器
图五:
译码器
④扬声器
图六:
扬声器
⑤分频器
图七:
分频器
2、程序流程图
图八:
程序流程图
4、源程序
;doremifasolasido
;7d6f645e534b433e
datasegment;数据段
songdb7dh,7dh,6fh,7dh,5eh,64h
db7dh,7dh,6fh,7dh,53h,5eh
db7dh,7dh,3eh,4bh,5eh,64h,6fh
db43h,43h,4bh,5eh,53h,5eh;音乐音符
countequ$-song
numdb21h,21h,0f4h,21h,39h,0f1h
db21h,21h,0f4h,21h,0d9h,39h
db21h,21h,0fdh,0ddh,39h,0f1h,0f4h
db61h,61h,0ddh,39h,0d9h,39h;数码管字符
aequ0e800h;A端口地址,数码管段选
bequ0e801h;B端口地址,数码管位选
cequ0e803h;8255A控制字地址
controlequ0e823h;8253控制字地址
clk0equ0e820h;定时器0地址
dataends
stacksegmentstack'stack'
db100dup(?
)
stackends
codesegment
assumecs:
code,ds:
data,ss:
stack
start:
movax,data
movds,ax
movsi,offsetsong;将音符数据首地址偏移量赋给si
movdi,offsetnum;将数码管字符数据首地址偏移量赋给di
movdx,control
moval,16h
outdx,al;设置8253控制字
movdx,c;将8255A控制字地址赋给dx
moval,80h
outdx,al;设置8255控制字
loop1:
movcx,count;将音符个数赋给cx,用于计数,此处$=42鯊腎鑰诎褳鉀沩懼統庫。
loop2:
movdx,clk0;将定时器0地址赋给dx
moval,[si];将音符数据赋给al
outdx,al;?
?
?
蜂鸣器响,是否会一直发声?
?
movdx,b;数码管位选地址赋给dx
moval,01h
outdx,al;最左边数码管亮
movdx,a;数码管段选地址赋给dx
moval,[di]
outdx,al;数码管显示数据[di]
callfarptrdelay;延时
movdx,clk0;将定时器0地址赋给dx
moval,0;将音符数据赋给al
outdx,al;?
?
?
蜂鸣器响,是否会一直发声?
?
movdx,b;数码管位选地址赋给dx
moval,01h
outdx,al;最左边数码管亮
movdx,a;数码管段选地址赋给dx
moval,[di]
outdx,al;数码管显示数据[di]
callfarptrdelay2
incdi
incsi
movah,0bh;检测键盘按键
int21h
cmpal,0ffh
jzstop
deccx
jzloop1
jnzloop2
stop:
movah,4ch
int21h
delayprocfar;延时子程序
pushcx;入栈保护
pushax
pushbx
movcx,0ffffh;2的8次方=65536;0ffffh
loop3:
nop;CPU空操作
movbx,0f5eh;cx*bx可以控制分频为1000Hz;5f5eh硕癘鄴颃诌攆檸攜驤蔹。
loop4:
decbx;?
?
?
?
?
内层循环是否需要空操作
jnzloop4;当dx>0时,继续减一
looploop3;当cx>0时,继续空操作
popbx;出栈恢复
popax
popcx
ret
delayendp
delay2procfar;延时子程序
pushcx;入栈保护
pushax
pushbx
movcx,0ffffh;2的8次方=65536;0ffffh
loop5:
nop;CPU空操作
movbx,055eh;cx*bx可以控制分频为1000Hz;5f5eh阌擻輳嬪諫迁择楨秘騖。
loop6:
decbx;?
?
?
?
?
内层循环是否需要空操作
jnzloop6;当dx>0时,继续减一
looploop5;当cx>0时,继续空操作
popbx;出栈恢复
popax
popcx
ret
delay2endp
codeends
endstart
5、实验结果
完成基本要求。
蜂鸣器按照生日快乐歌的简谱:
“112143,112154,1116432,776454”演奏,最左边的数码管实时的显示该音符。
音符与音符之间的间隔与音符本身的长度相等。
最后键盘按键触发程序终止,数码管全灭,蜂鸣器不发声。
氬嚕躑竄贸恳彈瀘颔澩。
没有完成提高要求。
6、实验总结
1、都是不认真听课惹的祸
有一次我们运行程序发现错误,但是单步调试却始终发现不了错误。
纠结了许久之后终于发现原来是端口地址写错了!
因为指导书上的地址是错误的,而上课的时候又没有认真听老师讲课,导致我们浪费了这么多时间……釷鹆資贏車贖孙滅獅赘。
2、难听的曲子
在程序测试伊始,我们为方便起见,设计的是每个音符之间没有停顿,结果发现一旦两个相同音符连在一起,那么根本听不出来两个音符的味道,到了无法忍受的地步。
于是,我们修改了程序,在每个音符演奏完之后再次调用延时子程序,给予扬声器一个与音符同等时间长度的不发声时间,其实现效果良好。
怂阐譜鯪迳導嘯畫長凉。
7、实验收获与心得体会
此次实验是最后一次微原硬件实验,是我们第一次在课堂上完成实验,当然,也是唯一一次了。
在程序的调试过程中,渐渐发现了自身存在的许多问题。
比如有一次发现程序不执行循环,对程序进行单步调制之后才发现,原来仅仅是一个数字写错了,到时条件转移到错误的地方,程序出错。
由此可见,编程时马虎不得的事情,对细节的注重是每一个合格的程序员的必修课。
谚辞調担鈧谄动禪泻類。
八、思考题
问:
写出8253计数初值、输入频率和输出频率的关系。
答:
输出频率=输入频率/计数初值