北邮微机原理硬件实验 实验报告Word格式.docx
- 文档编号:17830571
- 上传时间:2022-12-11
- 格式:DOCX
- 页数:21
- 大小:775.83KB
北邮微机原理硬件实验 实验报告Word格式.docx
《北邮微机原理硬件实验 实验报告Word格式.docx》由会员分享,可在线阅读,更多相关《北邮微机原理硬件实验 实验报告Word格式.docx(21页珍藏版)》请在冰豆网上搜索。
三、实验步骤
这里仅简要叙述利用EDIT工具编写汇编写跑马灯程序的步骤。
编写:
C>
EDIT文件名.asm
编译:
MASM文件名.asm
连接:
LINK文件名.obj
运行:
文件名.exe
或用Debug进行调试。
四、程序流程图
图1.4.1程序流程图
五、源代码
CODESEGMENT
ASSUMECS:
CODE
START:
MOVAH,0FEH;
将初始灯设为右起第1灯亮
LOOP0:
MOVDX,0EEE0H;
将I/O端口地址设为EEE0
INAL,DX;
从端口读入数据,提取拨码开关右起第3位状态
ANDAL,20H
CMPAL,20H
JNZSTOP;
若状态为‘0’,则保持位置不变,暂停
提取拨码开关右起第2位状态
ANDAL,40H
CMPAL,40H
JNZFAN;
若状态为‘0’,则右移亮灯位置
ROLAH,1;
左移亮灯位置
STOP:
JMPDISP
FAN:
RORAH,1
DISP:
MOVAL,AH
OUTDX,AL;
输出到端口,亮灯
MOVCX,8000H;
外循环次数
MOVBX,8000H;
内循环次数
LOOP1:
DECBX
JNZLOOP1;
内循环,BX减少到0
MOVBH,80H;
重设内循环次数80H次
INAL,DX
ANDAL,10H
CMPAL,10H;
提取拨码开关右起第4位状态
JNZS;
若为‘1’,则设置内循环次数为10H次
MOVBH,10H
S:
LOOPLOOP1;
外循环,CX减少到0
ANDAL,80H
CMPAL,80H;
提取拨码开关右起第1位状态
JNZLOOP0;
若为‘0’,则继续显示,否则结束程序
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
六、思考题
通过实验说明用debug中的a命令录入实验中给出的小程序中,有些语句可以不写出“h”字符的原因。
答:
主要是出于数据辨认的角度。
凡是十六进制数据都是要加H的,而地址则不用。
这是由于编译时所能识别的数据有很多种,为了保证编译正常进行,必须要告诉编译器数据的类型。
地址只有默认的16进制形式,不需指定类型就能完成正确的编译,所以无须加H。
而在DEBUG环境下,它的默认数据格式就是十六进制的,所以就不需要写出“H”字符;
否则通不过编译。
七、实验结果和心得体会
这次实验是我们第一次微原硬件实验,之前的一次软件实验让我们熟悉了DOS界面下的操作,由于间隔时间较长,这次我们又重新熟悉了一遍。
并且,与软件实验不同,硬件实验是通过编程的方式作用于硬件实验板上,为此,我们首先熟悉了一下实验板,编写了一些简单的小程序控制实验板。
在熟悉了I/O端口之后,我们开始编写跑马灯程序。
并且能够通过拨码开关的选择,控制工作模式、速度、反向、暂停等功能。
这次实验的要点是对I/O接口译码电路的理解以及使用,我们通过测试,理解了地址与端口的对应情况,进而才能编写出跑马灯程序。
通过本次实验,我们掌握了地址译码电路的设计方法和实现原理,加深了对硬件的I/O接口技术的理解。
实验中出现的一些问题,也成为我们调试程序的宝贵经验,为后续的实验打下了基础。
8255A并行接口应用
八、实验目的
1.掌握8255A的功能及方式0、1的实现。
2.熟悉8255A与CPU的接口,以及传输数据的工作原理及编程方法。
3.了解七段数码管显示数字的原理。
4.掌握同时显示多位数字的技术。
九、实验内容及要求
在实验一的基础上学习PIO芯片(8255)编程应用,熟悉平台的主要内容。
CS用Y0(EE00H)。
(一)简要说明:
在方式0(输入/输出)下,以A口为输出口,B口为输出口,A口接六个共阴极数码管的八位段码,高电平点亮数码管的某一段,B口接数码管的位选(即要使哪个数码管亮),高电平选中某一位数码管点亮。
8255A中A端口地址E800H
B端口地址E801H
C端口地址E802H
控制地址E803H
八段数码管的显示规律及数码管的位选规律自己查找,可用实验一中,学过的I、O令来做。
(二)6位数码管静态显示
在数码管电路上静态地显示6位学号,当主机键盘按下任意键时,停止显示,返回
提示:
该电路6个数码管的同名阳极段已经复接,当段选寄存器寄存了一个字型之后,6个数码管都有可能显示出相同的数字。
如果要使6个数码管“同时”显示不同字,必须采用扫描显示的方法,通过选位寄存器选择某一位数码管,显示其数字(对应为1),然后关闭此数码管,再选择下一位数码管进行显示;
如果在一秒钟内,每一位管都能显示30次以上,则人眼看到的是几位数码管同时在显示。
实验证明,在扫描显示过程中,每一位显示延迟1ms是最佳选择。
(三)6位数码管动态显示
要求在数码管电路1-6位数码管上按图2.2.1所示的规律,动态显示字符串HELLO,当主机键盘按下任意键时结束。
图2.2.1字符串动态显示示意图
①本实验应在上面实验的基础上完成。
②在数据段,按下列规律设置12个字型码:
MESGDB0,0,0,0,0,0,3DH,0DCH,8CH,8CH,0EDH,0
POINTDWMESG
……
POINT单元存放MESG单元的有效地址,程序取出POINT单元的内容→BX,然后用BX地址取数送数码管电路,扫描显示6个字符。
每过0.5s将POINT单元的内容加1,再将POINT单元的内容→BX,……。
POINT单元内容加1,使字符串显示的首地址向高地址移动一个单元,从而使6位字符串向“左”移动一位,实现动态显示。
③动态显示的速度可控制(快或慢),利用实验一读入端口的功能。
一十、实验步骤
编写和调试步骤同实验一,不再赘述。
一十一、程序流程图
图2.4.1数码管静态显示程序流程图
图2.4.1数码管动态显示程序流程图
一十二、源代码
6位数码管静态显示:
DATASEGMENT
SHOWDB0F4H,21H,0EDH,0DDH,39H,0DDH;
210646
COUNTEQU$-SHOW
SLDB?
DATAENDS
CODESEGMENT
CODE,DS:
DATA
MOVAX,DATA;
segdata
MOVDS,AX
NEXT:
MOVCX,COUNT;
显示个数,为6
LEABX,SHOW;
MOVBX,OFFSETSHOW
MOVSL,01H;
第一个点亮位置
MOVAL,80H
MOVDX,0EE03H;
设置输出端口
OUTDX,AL;
设置标志位为‘1’,A、B口为输出
AGAIN:
MOVAL,SL
MOVDX,0EE01H;
B口输出数码管选通位置
OUTDX,AL
MOVAL,[BX]
MOVDX,0EE00H;
A口输出数据段数据到数码管
MOVAL,00H
MOVDX,0EE00H
清除显示,防止程序结束残留显示
INCBX;
显示下一个数字
SHLSL,1;
Sl左移依次向左选通数码管
LOOPAGAIN;
循环此过程COUNT次
MOVAH,0BH
INT21H;
若键盘有输入则跳出程序
ORAL,AL
JZNEXT
6位数码管动态显示:
DATASEGMENT
MESGDB0,0,0,0,0,0,3DH,0DCH,8CH,8CH,0EDH,0
DATAENDS
STACKSEGMENTSTACK'
STACK'
DB100DUP(0)
STACKENDS
ASSUMEDS:
DATA,CS:
CODE,SS:
STACK
MAINPROCFAR
MOVAX,DATA
MOVDS,AX
MOVES,AX
MOVAL,80H
MOVDX,0E803H;
OUTDX,AL
MOVBX,OFFSETMESG
MOVCX,07H
LOP7:
MOVDX,0EEE0H;
从拨码开关左起3位读入数据到DX
INCAL
ANDAL,07H
XORAH,AH
MOVDX,AX;
DX为外循环次数,控制静态显示时间
CALLDISP
DECDX
JNZLOOP0;
显示当前状态直至DX=0
BX决定显示哪6个数据
LOOPLOP7;
重新读取拨码开关到DX
JMPSTART;
当7种状态都结束后重新开始
MAINENDP
DISPPROCNEAR
PUSHCX
PUSHDX
PUSHAX
MOVBP,0044H;
控制一次外循环显示时间
LOPX:
XORSI,SI
MOVCX,06H
设置端口为A口
MOVAH,01H;
第一次选通最右数码管
LOP6:
MOVAL,MESG[BX+SI]
显示数据到数码管
MOVAL,AH
设置端口为B口
选通数码管
重新设置端口为A口
ROLAH,1;
选择下一个数码管
INCSI;
选择下一个数据
CALLDELAY
CALLKEY;
检验按键是否有输入
LOOPLOP6
DECBP
JNZLOPX;
循环,保持静态显示
POPAX
POPDX
POPCX
RET
DISPENDP
KEYPROCNEAR;
检测键盘输入
JZGOON;
没有键盘输入则继续显示
有任意输入则清空显示,跳出程序
MOVAL,0H
MOVAH,4CH
GOON:
RET
KEYENDP
DELAYPROC
PUSHCX
MOVAX,0002H;
外层循环
LOPD:
MOVCX,0H
LOOP$;
内层循环
DECAX
JNZLOPD
RET
DELAYENDP
ENDMAIN
一十三、实验结果和心得体会
这次实验是利用8255芯片进行并口接口的应用。
由于数码管一次只能显示一个,所以我们采用扫描显示的方法,把间隔时间调短,使人眼感觉好像所有数码管同时显示一样。
我们首先利用位选控制哪个数码管亮,之后通过段选哪个数码管显示什么。
并且设置数码管静态显示出学号后六位“210646”。
随后的动态显示也是一样,通过首地址移动,使6位字符串向“左”移动一位,实现动态显示出“HELLO”。
我觉得这次实验最重要的是实现静态显示和动态显示的一种思想——扫描的思想——通过快速扫描可以让人产生所有数码管同时显示的感觉。
并且,本次实验的编程难度也有所提高,对于我们起到了一定的锻炼作用。
8253计数器/定时器的应用
一十四、实验目的
学习掌握8253用作定时器的编程原理。
一十五、实验内容及要求
完成一个音乐发生器,通过蜂鸣器放出音乐,并在数码管上显示乐谱。
音符频率对照
音符
1
2
3
4
5
6
7
1·
频率(Hz)
256
288
320
341
384
426.6
480
512
一十六、8253定时器
I8253和I8254都是可编程计数器,它们的引脚兼容,功能与使用方法相同。
I8254是I8253的改进型。
1.微机系统定时器和实验箱定时器
(1)微机系统使用的8254,其3个通道均有固定的用途:
0号计数器为系统时钟源,每隔55ms向系统主8259IR0提一次中断请求;
1号计数器用于动态存储器的定时刷新控制;
2号计数器为系统的发声源。
用户在使用微机系统的时候,可以使用0号和2号计数器,但不能改变对1号计数器的初始化。
(2)实验箱上的8253,其数据线D7—D0,地址线A1、A0和控制线RD、WR通过总线驱动卡和微机系统的三总线相连。
除此之外,三个计数器的引出段和片选端都是悬空的,这意味着实验箱上的8253的三个计数器都归用户使用,你可以单独使用其中的一个计数器,也可以串联使用其中的2个或3个计数器。
(3)8253计数器的输入信号,其频率不能超过2MHz,否则长时间使用,芯片过热,容易烧毁。
2.8253初始化
使用8253前,要进行初始化编程。
初始化编程的步骤是:
①向控制寄存器端口写入控制字对使用的计数器规定其使用方式等。
②向使用的计数器端口写入计数初值。
3.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。
编程提示:
1.8253控制端口地址为EE23H
定时器0地址为EE20H
定时器1地址为EE21H
定时器2地址为EE22H
2.定时器可工作在方式3下。
一十八、实验连接图
8253定时器连接如图3.5.1所示,蜂鸣器电路、时钟预分频电路连接如图3.5.2和3.5.3所示。
图3.5.18253定时器连接图
图3.5.2蜂鸣器电路
图3.5.3时钟预分频电路
一十九、程序流程图
图3.6.1程序流程图
二十、源代码
DATASEGMENT;
数据段
SONGDB7DH,7DH,53H,53H,4BH,4BH,53H
DB5EH,5EH,64H,64H,6FH,6FH,7DH
DB53H,53H,5EH,5EH,64H,64H,6FH
DB7DH,7DH,53H,53H,4BH,4BH,53H
DB5EH,5EH,64H,64H,6FH,6FH,7DH;
音乐音符
CONTEQU$-SONG
NUMDB21H,21H,0D9H,0D9H,0DDH,0DDH,0D9H
DB39H,39H,0F1H,0F1H,0F4H,0F4H,21H
DB0D9H,0D9H,39H,39H,0F1H,0F1H,0F4H
DB21H,21H,0D9H,0D9H,0DDH,0DDH,0D9H
DB39H,39H,0F1H,0F1H,0F4H,0F4H,21H;
数码管字符
STACKSEGMENT
DB100DUP(?
)
STACKENDS
ASSUMECS:
CODE,DS:
DATA,SS:
STACK
MOVAX,DATA
MOVDS,AX
MOVSI,OFFSETSONG;
SI存储音乐音符
MOVDI,OFFSETNUM;
DI存储数码管字符
MOVCX,CONT
CMPBX,0
JNZCONTN
MOVBX,07H
CONTN:
MOVDX,0EE23H;
8253控制字
MOVAL,16H;
0号计数器,只读写低8位,工作方式3,2进制
OUTDX,AL
MOVDX,0EE20H
MOVAL,[SI]
OUTDX,AL;
蜂鸣器响
MOVDX,0EE03H;
8255控制字
MOVAL,10001001B;
方式3工作
MOVDX,0EE01H;
数码管位选
MOVAL,01H
MOVDX,0EE00H;
数码管显示
MOVAL,[DI]
数码管显示音符
CALLDELAY
DECBX
JNZNEXT
CALLDELAY;
延时控制节奏
INCDI
INCSI
MOVAH,0BH;
INT21H
ORAL,AL
JNZENDLAST
LOOPLOOP1;
播完设定的歌曲
JMPSTART;
重复播放
ENDLAST:
MOVDX,0EE00H;
关闭数码管显示
MOVAL,0
OUTDX,AL
MOVDX,0EE20H;
关闭蜂鸣器
MOVAL,0
OUTDX,AL
MOVAX,4C00H;
退出主程序
INT21H
DELAYPROCNEAR;
延时子程序
PUSHCX
PUSHBX
MOVCX,100FH
MOVBX,0FFFFH
LOOP2:
NOP;
外层循环,循环次数100FH
LOOP3:
DECBX;
内层循环,循环次数为0FFFFH
JNZLOOP3
LOOPLOOP2
POPBX
POPCX
RET
DELAYENDP;
一共延100FH*0FFFFH次
CODEENDS
ENDSTART
二十一、思考题
写出8253计数初值、输入频率和输出频率的关系。
输出频率=输入频率/8253计数初值。
二十二、实验结果和心得体会
这次实验学习的是8253计数器的相关知识。
首先我们学习了8253计数器,了解了8253计数器的各种使用方法和工作方式。
并且根据指导书上的音阶频率对应表,通过公式换算出了各个音阶对应的计数初值进行编程。
在音乐选择方面,我们选择了《小星星》,因为这首曲子通篇只有六个音阶,而且都在给定的音阶之内,比较符合要求。
我们的思路比较直接,不同的计数初值对应不同的音调,以此来编写程序。
总体来说,程序比较简单,只要按要求写入计数器的控制字和初值即可,只是在写入的时候要注意控制字写入同一个端口。
这个实验相比于以前的实验更加具有趣味性,有点像我们之前做过的数字电路实验,只不过这里用到的是汇编语言从最底层进行操作。
通过改变分频比,我们还可以实现音调的变化(升降调)。
通过本实验,我们了解了8253的各种工作方式的特点及相关应用,如函数发生器、计数器等。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 北邮微机原理硬件实验 实验报告 微机 原理 硬件 实验 报告