北邮微机原理硬件实验报告
微机原理硬件实验报告
信息与通信工程学院
微机原理硬件实验报告
姓 名: 李星辰 班 级: 2013211105班 学 号: 2013210133 班内序号: 12号 日 期: 2014 年 1 月 10 日
目 录
一、I/O地址译码 + 简单并行接口(第一次实验课)
1.1 实验目的………………………………………………………………………………………………………….3 1.2 实验原理及内容………………………………………………………………………………..…………….3 1.3 硬件连接图与软件程序流程图……………………………………………………………………….6 1.4 程序源代码及注释…………………………………………………………………………………….…….8 1.5 实验结果及思考题…………………………………………………………………………………….…….9 1.6 实验总结………………………………………………………………………………………………….………9 1.7 实验收获与心得体会……………………………………………………………………………………..10 二、七段数码管 & 键盘显示控制实验(第二次实验课)
2.1 实验目的…………………………………………………………………………………………………..…….11 2.2 实验原理及内容……………………………………………………………………………………….…….11 2.3 硬件连接图与软件程序流程图……………………………………………………..……………….15 2.4 程序源代码及注释………………………………………………………………………………………….15 2.5 实验结果及思考题………………………………………………………………………………………….17 2.6 实验总结…………………………………………………………………………………………..…………….17 2.7 实验收获与心得体会……………………………………………………………..……………………….27 三、可编程器件8253(第三次实验课)
3.1 实验目的………………………………………………………………………………………………………….18 3.2 实验原理及内容……………………………………………………………………………………..……….18 3.3 硬件连接图与软件程序流程图……………………………………………………………………….20 3.4 程序源代码及注释………………………………………………………………………………….……….21 3.5 实验结果及思考题……………………………………………………………….………………………….26 3.6 实验总结………………………………………………………………………………………………………….26 3.7 实验收获与心得体会…………………………………………………………………..………………….26 四、串行通讯器件8251(第四次实验课)
4.1 实验目的………………………………………………………………………………………………………….27 4.2 实验原理及内容…………………………………………………………………………………..………….27 4.3 硬件连接图与软件程序流程图……………………………………………………………………….28 4.4 程序源代码及注释………………………………………………………………………………….……….29 4.5 实验结果及思考题…………………………………………………………………….…………………….31 4.6 实验总结………………………………………………………………………………………………………….31 4.7 实验收获与心得体会…………………………………………………………………..………………….32
I/O地址译码 + 简单并行接口(第一次实验课)
一、实验目的
I/O地址译码:掌握I/O地址译码电路的工作原理;
简单并行接口:掌握简单并行接口的工作原理及使用方法
二、实验原理及内容
1、实验原理 【IO 地址译码】
(1)实验电路原理图及说明
如下图(右侧74LS74为D 触发器,左侧为74LS138为地址译码器) 。
图1-1
I/O地址译码原理图
(2)I/O口的设置:
要使译码器正常工作,使能端EI 端(管脚4)必须为低电平,根据硬件连接则可以推出A9~A6的电平为1010,A5~A3决定选通地址,A2~A0(已经在实验箱内和其他模块地址线接好) 可表示8地址。例如,当A9~A0的电平为1010000XXX (即280H~287H,其中X 表示任意值)时,Y0地址被选中,输出一个负脉冲。
综上可得,输出端Y0~Y7在实验台上“I/O地址“输出端引出,每个输出端包含8个地址,Y0:280H ~287H ,Y1:288H ~28FH ,……当CPU 执行I/O指令且地址在280H ~2BFH 范围内,译码器选中,必有一根译码线输出负脉冲。
例如:执行下面两条指令
MOV DX,2A0H
OUT DX,AL (或IN AL,DX )
Y4输出一个负脉冲,执行下面两条指令
MOV DX,2A8H
OUT DX,AL (或IN AL,DX )
Y5输出一个负脉冲。
具体AL 中的值是多少对本实验来说并没有影响,因为只要朝地址里进行读写操作(IN/OUT),不管值是多少,相应的地址端口总会被选中。即执行(OUT DX,AL )后,DX 所指向的地址会被选中,相应端口输出负脉冲。
如果该地址所指向的外设可以进行读写操作,如后面实验用到的8253的计数器,则会通过实验箱内部已经连好的数据总线D7~D0将AL 的数值写入计数器。即地址总线用来选中相应的外设使其使能,然后数据总线用来传输数据(没有使能的外设不接收数据)。
本实验用到了输出端口Y4和Y5,地址分别为2A0~2A7、2A8~2AF。 (3)D 触发器:
Y4接D 触发器的CLK 时钟端,Y5接D 触发器的清零端,输出端Q 接LED 灯L7。 当Y4被选通后,输出负脉冲送出时钟信号触发D 触发器,使输出Q=D,由于数据端
始终接+5V电压,使输出端为高电平,使L7亮。
当Y5被选通后,输出负脉冲送出清零信号触发D 触发器,使D 触发器复位,输出端为低电平,使L7灭。 (4)亮灭控制:
通过CPU 执行I/O口命令,循环交替选通Y4和Y5输出负脉冲,控制触发器交替输出高、低电平,通过软件延时实现灯亮灭的时间间隔控制。
【简单并行接口】: (1)实验电路:
如图1-2,图中74LS273为八D 触发器,8个D 输入端分别接数据总线D0~D7,8个Q 输出端接LED 显示电路L0~L7。74LS32为“或门”。
图1-2
简单并行接口原理图
(2)实验流程原理分析:
从键盘输入字符,将字符的ASCII 码从地址端口2A8H(Y5)输出。8位数据经8位数据总线D0~D7送至八D 触发器74LS273的8个D 输入端。而Y5的选通同时触发74LS273,
使暂存的字符ASCII 码从 8个Q 输出,而8个Q 端连接LED 显示电路L0~L7将产生相应变化,并保持,直至下个字符输入。
输出数据需要3条指令: MOV MOV OUT
AL, 数据 DX,2A8H DX,AL
输入数据需要2条指令: MOV IN
DX,2ADH AL,DX
2、实验内容 【IO 地址译码】
利用负脉冲控制L7闪烁发光(亮、灭、亮、灭、……),时间间隔通过软件延时实现。 【简单并行接口】
编程从键盘输入一个字符或数字,将其ASCII 码通过这个输出接口输出,根据8个发二极管发光情况验证正确性。
三.硬件接线图及软件程序流程图
【IO 地址译码】
1、硬件连接图:如图1-1 硬件接线:
I/O地址-Y4 接 D触发器-CLK 时钟端 I/O地址-Y5 接 D触发器-CD 清零端
+5V 接 D触发器-D 数据端 接 D触发器-SD 端 D 触发器-Q 输出端 接 LED 灯-L7
微机原理硬件实验报告
2、软件程序流程图:如图1-3
图1-3 I/O地址译码软件程序流程图
【简单并行接口】 1、硬件连接图:如图1-2
2、软件程序流程图:如图1-2
图2-2 简单并行接口软件程序流程图
四.程序源代码及注释
【IO 地址译码】
DATA SEGMENT DATA ENDS
STACK SEGMENT STACK 'STACK' DB 100 DUP(?) STACK ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK ; 定义代码段
DELAY PROC NEAR ; 延时子程序 MOV BX,500H LOOP2: MOV CX,0FFFFH WAIT1: LOOP WAIT1 DEC BX
JNZ LOOP2 RET DELAY ENDP
;L7闪烁
START : MOV DX,2A0H ; 选通Y4,灯亮 OUT DX,AL CALL DELAY ; 延时
MOV DX,2A8H ; 选通Y5,灯灭 OUT DX,AL CALL DELAY ; 延时
JMP START ; 灯循环闪烁
CODE ENDS END START
【简单并行接口】
DATA SEGMENT DATA ENDS
STACK S EGMENT STACK 'STACK' D B 100 DUP(?) STACK E NDS CODE SEGMENT
A SSUME CS:CODE,DS:DATA,SS:STACK
START: MOV AH,1 ; 键盘输入 I NT 21H
C MP AL,1BH ; 判断是否为ESC 键 J Z EXIT
M OV DX,2A8H
O UT DX,AL ; 输出 J MP START ; 返回DOS
EXIT: MOV DX,2A8H MOV AL,0
OUT DX,AL ; 所有灯灭 MOV AX,4C00H I NT 21H
CODE ENDS E ND START
五.实验结果
【IO 地址译码】
L7闪烁,循环一亮一灭一亮一灭,实验结果符合实验内容要求。 【简单并行接口】 从键盘输入字符或数字,若不是Esc 键,则二极管显示其ASCII 码情况,若按下ESC , 则返回dos ,且各LED 灯灭。
六.实验总结
1、注意汇编程序的写法规范,养成良好的编程风格(比如用英文大写)。 2、搞清楚地址线和数据线之间的关系(地址用A9~A0,数据用D7~D0,加
起来一共16根线构成8086的总线)。 3、要搞清楚3-8译码器和D 触发器的工作原理。 4、电脑开机注意要安装板子的驱动。
5、实验中要明白ASCII 码的对应输出命令如何写,通过1功能调用将键盘
输入进行存储读入,然后添加对ECS 键使程序终止的命令能够以掌握简单并行接口的实现。
七.实验收获与心得体会
收获:
1、第一次把汇编程序下到板子上跑,感觉挺信新鲜的。 2、和同学交流程序的过程中,学到了很多种延时程序的写法。
3、学会了地址的计算方法,弄懂了地址线和数据线之间的关系,搞清楚了
CPU 是如何与多个外设进行通信的。
4、复习掌握了3-8译码器和D 触发器的工作原理。
5、遇到了电脑无法识别实验箱板子的问题,重新安装驱动之后解决问题。 6、掌握了解简单并行接口的工作原理及使用方法。
7、对DOS 功能调用和IN/OUT指令能够较为熟练掌握,尤其对IN/OUT指令
有了更深的理解。
体会:
磨刀不误砍柴工,与其死读圣贤书不如拿板子跑一跑。经过这次实验,我对于微机原理课上留下的很多疑问(如地址线与数据线与总线的关系,CPU 与多个外设的通信等)都迎刃而解。
对于高级语言编程也有了更深的理解。高级语言是建立在汇编语言之上的,是对汇编语言的一个封装,其执行过程要先经编译器编译之后中间会转成汇编语言,然后就是汇编语言转换成机器码。
区别高级语言的关键,看的是编译器而不是语言语。比如C 语言和java 语言,虽然很多地方语法很像,但它们经过自己的编译器编译之后,同样的一条语句编译成的汇编语言是不同的,于是就存在一个编程语言效率的问题。底层程序,像工业流程控制,一般都用标准C 来编写正是因为C 的效率比较高。
其实要说起语言的执行效率,还是汇编语言来的实在。用C 和汇编分别编写一个简单的加法程序,汇编一共只要几行就能搞定,C 的话,虽然源代码也只有几行,但经编译器编译生成的汇编却会有几百行几千行的样子,效率的差距体现非常明显。
理论上所有的程序都能用汇编直接编写,但对于大工程,这样的开发,尽管最后的效率会很高,但开发周期实在是吓人,封装成高级语言用起来则方便的多,大大缩减了开发周期。
七段数码管(第二次实验课)
一、实验目的
掌握数码管显示数字的原理
二、实验原理及内容
1、实验原理 (1)实验电路:
如图2-1所示实验原理图,8255为可编程并行接口芯片。
图2-1
(2)数码管显示:
实验台上的七段数码管为共阴型,段码采用同相驱动,输入端加高电平, 选中的数码管亮,位码加反相驱动器,位码输入端高电平选中。七段数码管的字型代码表如下图2-2:
简单并行接口原理图
图2-2
七段数码管字型码表示意图
(3)8255控制原理:
关于8255地址的计算:
CPU 的A0~A1在实验箱内部已经和8255的地址线A0和A1连好了,依次表示4个地址(00~A口,01~B口,10~C口和11~控制口)。8255的CS 线连了I/O的Y1口。即当地址为1010001XXX (即288H~28BH)时,8255被片选选中使能。所以,当地址为1010000X00时(即288H 或28CH ,因为A3没用到可取任意值),A 口被选中。即A 口、B 口、C 口和控制口的地址分别为288H (或28CH ),289H (或28DH ),28AH (或28EH ),28BH (或28FH )
假如实验箱内部是A1和A2连了8255的A0和A1,则A 口、B 口、C 口和控制口的地址分别为288H (或289H ),28AH (或28BH ),28CH (或28DH ),28EH (或28FH )。
关于8255数据的写入:
如实验一中所说,此时CPU 的8位数据线D0~D7在实验箱内部已经和8255的8位数据线D0和D7连好了,当选定某一地址(如A 口),朝这个地址写数据时,数据就经这8根线送到8255的数据寄存器然后根据工作方式的不同进行不同方式的A 口输出。
8255的工作方式
一片8255内部有3个端口,A 口可以工作在方式0、方式1或方式2,B 口可以工作在方式0、方式1,C 口可以工作在方式0。
方式0是基本型输入/输出。这种方式和外设交换数据时,8255端口与外设之间不使用联络线。
方式1为选通型输入/输出。用这种方式和外界交换数据时,端口和外设之间要有联络信号。
方式2是双向数据传送,仅A 口有这项功能。当A 口工作在方式2时,B 口仍可以工作在方式0或方式1,但此时B 口方式1只能用查询方式与CPU 交换信息。
工作方式选择字
8255工作方式选择字共8位(如图2-3),存放在8255控制寄存器中。最高位D7为标志位,D7=1表示控制寄存器中存放的是工作方式选择字,D7=0表示控制寄存器中存放的是C 口置位/复位控制字。
图2-3
C 口置/复位控制字
8255的C 口可进行位操作,即:可对8255C 口的每一位进行置位或清零操作,该操作是通过设置C 口置/复位字实现的(图2-3)。C 口置/复位字共8位,各位含义如下:
图2-3
8255A 的控制信号与传输动作的对应关系(如图2-4)
图2-4
命令字与初始化编程
8255有两个命令字,即方式选择控制字和C 口置0/置1控制字,初始化编程的步骤是: ① 向8255控制寄存器写入“方式选择控制字”,从而预置端口的工作方式。
② 当端口预置为方式1或方式2时,再向控制寄存器写入“C口置0/置1控制字”。这一操作的主要目的是使相应端口的中断允许触发器置0,从而禁止中断,或者使相应端口的中断允许触发器置1,从而允许端口提出中断请求。
(注意:“C口置0/置1控制字”虽然是对C 口进行操作,但是该控制字是命令字,所以要写入控制寄存器,而不是写入C 口控制寄存器。)
实验中8255对外设的控制
8255有三个数据端口A 、B 、C ,本实验用到A 口输出段码和C 口输出位码。段码控制显示字符,位码控制显示位置。实验台上共有四个七段数码管,用以显示学号后四位(0133)。每个数码管对应自己的位码(8255的C0~C4)和一个段码(8255的A 口) 。循环点亮并延时,但延时足够短时,使三个数据口A 、B 、C 都工作在基本输出方式。其中A 、B 、C 及控制口对应地址依次为288H 、289H 、28AH 、28BH 。
2、实验内容
静态显示:按图3-1连接好电路,将8255的A 口PA0~PA7分别与七段数码管的段码驱动输入端a ~dp 相连,位码驱动输入端S0、S1 、S2、S3接PC0、PC1、PC2、PC3,编程在数码管显示自己的学号的后四位。
我的学号后四位为0133,即使得程序运行后在数码管上显示0133。
微机原理硬件实验报告
三.硬件接线图及软件程序流程图
1、硬件连接图:如图3-1 硬件接线:
PA7-PA0/8255 接 dp-a/LED数码管 PC3-PC0/8255 接 S3-S0/LED数码管 CS 、8255 接 Y1/IO地址
2、软件程序流程图:如图3-3
图3-3 七段数码管软件程序流程图
四.程序源代码及注释
DATA SEGMENT DATA ENDS
STACK SEGMENT STACK 'STACK' DB 100 DUP(?) STACK ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK
START:MOV AX,DATA MOV DS,AX
MOV DX,28BH ; 写控制端口,10100 01011,8255控制寄存器端口地址
MOV AL,80H ;初始化8255,设置A 为输出口,1 00 0 0 00 0,工作方式为方式0 OUT DX,AL
LOOP1: MOV DX,28AH MOV AL,00H OUT DX,AL MOV DX,288H MOV AL, 4FH
OUT DX,AL
MOV DX,28AH MOV AL,01H OUT DX,AL
MOV DX,28AH MOV AL,00H OUT DX,AL
MOV DX,288H MOV AL,4FH OUT DX,AL MOV DX,28AH MOV AL,02H OUT DX,AL MOV DX,28AH MOV AL,00H OUT DX,AL MOV DX,288H MOV AL, 06H OUT DX,AL MOV DX,28AH MOV AL,04H OUT DX,AL
MOV DX,28AH MOV AL,00H OUT DX,AL MOV DX,288H ; 写入C 口,10100 01010 ; 写入C 口,C 口是位码,写入0使得数码管熄灭 ; 写入A 口,10100 01000 ;A 口是段码,显示3 ; 写入C 口,10100 01010 ; 熄灭数码管 ;A 口显示3 ; 写入C 口,10100 01010 ; 熄灭数码管 ;A 口显示1 ; 写入C 口,10100 01010 ; 熄灭数码管 ;A 口显示0
MOV AL,3FH OUT DX,AL MOV DX,28AH
MOV AL,08H ; 写入C 口,10100 01010 OUT DX,AL
MOV DX,28AH ; 熄灭数码管 MOV AL,00H OUT DX,AL
MOV AH,01H INT 16H
JNZ EXIT ;ZF=0说明有按键输入,故退出 JMP LOOP1
EXIT: MOV AX,4C00H INT 21H
CODE ENDS END START
五.实验结果
数码管显示本人学号的后四位:0133
六.实验总结
实验中最重要的部分就是了解8255的控制,如何写控制端口,如何设置分配三个口的
作用,本次试验只用了A 口和C 口,一个控制段码,一个一个控制位码,实验中还要了解数码管显示电路的基本特点和工作方式,及通过扫描的方式一位一位分别显示,因此会用到通过写位码熄灭,再分别设置对应的位码显示对应的数字位码传递到C 口。
七.实验收获与心得体会
这次实验一方面掌握了可编程并行接口8355的工作方式及其控制和初始化,并且另一方面掌握了数码显示数字的基本原理和方法。能够自主编出相应的程序,并且有足够的信心去写,基本上不会出现什么错误,能够很好的实现实验要求,就是在于A 、C 工作方式的设定和各自位码、段码控制的分配上在最初出现问题,但后来经过与同学的商讨及请教老师得到很好的解决。和优秀的同学比起来还是有差距,选做实验做到一半没有做出来。
微机原理硬件实验报告
可编程定时器/计数器(8253/8254) 第三次实验
一、实验目的
学习掌握8253用作定时器的编程原理。
二、实验原理及内容
1、实验原理 (1)实验电路:
本实验主要用到两个芯片。
一个是可编程计数器8253(实验板上用到的是8254) ,8253和8254均为可编程计数器,它们的引脚兼容,功能和使用方法相同,8254是8253的改进型,其电路图如图3-1所示。
图3-1
可编程计数器8253电路接口图
另外一个芯片是可编程并行接口芯片8255,该芯片是上一个次试验中专门使用过,其电路图如图2-1所示。
(2)音乐播放原理:
播放音乐是通过喇叭或是蜂鸣器通过获得的音符的特定频率产生并播放。
控制频率的量即为计数器初值。将8253设置成工作方式3,则会根据计数初值输出相应频率的方波,以此方波来时蜂鸣器/扬声器发声。由于本次实验内部时钟为1MHz ,而根据音符频率对照表,因此需要产生对应频率的音符需要用到可编程计数器8253进行计数分频,利用公式: 计数值n =
f 时钟f 音符
=
1MHz f 音符
,即可以计算出七种不同音符对应的计数器计数值,
音符频率对照表及计数值表如下表3-2所示。
微机原理硬件实验报告
表3-2
(3)可编程计数器8253:
音符频率对照表及计数值表
8253的初始化:
使用8253前,要进行初始化编程,初始化的步骤是:先向控制寄存器端口写入控制字规定其使用方式等,再向使用的计数器端口写入计数初值。
8253的控制字:
如下表4-3所示:
计数器分频:
本次实验通过8253(8254)计数器将1MHz 的时钟信号进行分频,采用工作方式3,计数器开始计数后,当计数到初值的一半时,OUT 变为低电平,直到计到0,OUT 又变为高电平,并重新开始计数,OUT 输出为方波。通过计数值改变输出波形即对应着相应的频率输出,从而使喇叭发出相对应的声音。
(4)乐谱显示:
用到七段数码管显示,原理同上一个实验。 2、实验内容
完成一个音乐发生器,通过喇叭或蜂鸣器放出音乐,并在数码管上显示乐谱。 本次试验我选择的是歌曲《青春修炼手册》,乐谱为:1155665 4433221 5544332 5544332 1155665 4433221 。
微机原理硬件实验报告
三.硬件接线图及软件程序流程图
1、硬件连接图:如图3-1、图2-1所示
硬件接线:
PA7-PA0/8255 接 dp-a/LED数码管 PC3-PC0/8255 接 S3-S0/LED数码管 CS 、8255 接 Y1/IO地址 GATE0 /8254 接 +5V CLK0 /8254 接 1M时钟 OUT0 /8254 接 喇叭
CS /8254 接 Y0 /IO 地址
2、软件程序流程图:如图3-4所示
图3-4 可编程定时器/计数器(8253/8254)播放音乐软件程序流程图
四.程序源代码及注释
DATA SEGMENT
BUF DB '[***********][***********]433221';《青春修炼手册》乐谱 LEN EQU $-BUF ; 乐谱长度 DATA ENDS
STACK SEGMENT DB 100 DUP(?) STACK ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK DELAY PROC ; 延时子程序 PUSH CX
MOV CX,0FFFFH
L: MOV AX,100 ; 嵌套循环,总循环长度为 AX*CX WA: DEC AX JNZ WA LOOP L POP CX RET
DELAY ENDP
START:
MOV AX,DATA MOV DS,AX
MOV AL,80H ;工作方式为0
MOV DX,28BH ;8255控制寄存器端口地址28BH OUT DX,AL ; 8255 初始化 MOV DX,283H
MOV AL,00111110B ;计数器0,11先读低再读高位,111方式3,0二进制表示 OUT DX,AL ; 8254 初始化
BEGIN:
MOV BX,OFFSET BUF ;载入音谱 MOV CX,LEN PRO:
MOV AL,[BX] ; 载入音符
ADD BX,1 ; 指针指向下一个音符 CMP AL,31H ;对应的ASCII 码 JZ DD1 CMP AL,32H JZ RR2
CMP AL,33H JZ MM3 CMP AL,34H JZ FF4 CMP AL,35H JZ SS5 CMP AL,36H JZ LL6 CMP AL,37H JZ SSII7 CMP AL,38H JZ DDOO8
PRO2: LOOP PRO JMP FIN
DD1: JMP DO ;256-3906-0F42 RR2: JMP RE ;288-3472-0D90 MM3: JMP MI ;320-3125-0C34 FF4: JMP FA ;341-2932-0B74 SS5: JMP SO ;384-2604-0A2C LL6: JMP LA ;426.6-2344-0928 SSII7: JMP SII ;480-2083-0824
DDOO8: JMP DOO ;512-1953-07A2 DO:
MOV DX,280H ; 计数器0的地址 MOV AL,42H ; 低 8 位 OUT DX,AL MOV AL,0FH ; 高 8 位 OUT DX,AL MOV DX,28AH MOV AL,00H
OUT DX,AL ; 熄灭数码管,使得数码管清零 MOV DX,288H MOV AL,06H
OUT DX,AL ; 给数码管送出1的段码:06H MOV DX,28AH MOV AL,01H
OUT DX,AL ; 给数码管送出位码(最低位显示) CALL DELAY ;
JMP PRO2 ; 准备接收下一个音符 RE:
MOV DX,280H ; 计数器0的地址 MOV AL,90H ; 低 8 位 OUT DX,AL
MOV AL,0DH ; 高 8 位 OUT DX,AL MOV DX,28AH MOV AL,00H OUT DX,AL MOV DX,288H MOV AL,5BH OUT DX,AL ; 给数码管送出1的段码:5BH MOV DX,28AH MOV AL,01H
OUT DX,AL ; 给数码管送出位码(最低位显示) CALL DELAY
JMP PRO2 ; 准备接收下一个音符 MI:
MOV DX,280H ; 计数器0的地址 MOV AL,34H ; 初始值低 8 位 OUT DX,AL
MOV AL,0CH ;高 8 位 OUT DX,AL MOV DX,28AH MOV AL,00H OUT DX,AL
MOV DX,288H ; 给数码管送出2的段码 MOV AL,4FH OUT DX,AL ; 给数码管送出1的段码:4FH MOV DX,28AH MOV AL,01H
OUT DX,AL ; 给数码管送出位码(最低位显示) CALL DELAY
JMP PRO2 ; 准备接收下一个音符 FA:
MOV DX,280H ; 计数器0的地址 MOV AL,74H ; 初始值低 8 位 OUT DX,AL
MOV AL,0BH ; 高 8 位 OUT DX,AL MOV DX,28AH MOV AL,00H OUT DX,AL
MOV DX,288H ; 给数码管送出3的段码 MOV AL,66H OUT DX,AL ; 给数码管送出1的段码:66H MOV DX,28AH MOV AL,01H
OUT DX,AL ; 给数码管送出位码(最低位显示) CALL DELAY
JMP PRO2 ; 准备接收下一个音符 SO:
MOV DX,280H MOV AL,2CH OUT DX,AL
MOV AL,0AH OUT DX,AL MOV DX,28AH MOV AL,00H OUT DX,AL
MOV DX,288H MOV AL,6DH OUT DX,AL MOV DX,28AH MOV AL,01H
OUT DX,AL CALL DELAY
JMP PRO2 N9:
JMP BEGIN LA:
MOV DX,280H MOV AL,28H OUT DX,AL MOV AL,09H OUT DX,AL MOV DX,28AH MOV AL,00H OUT DX,AL
MOV DX,288H MOV AL,7DH OUT DX,AL MOV DX,28AH MOV AL,01H
OUT DX,AL ; 计数器0的地址 ; 初始值低 8 位 ; 高 8 位 ; 给数码管送出4的段码 ; 给数码管送出1的段码:6DH ; 给数码管送出位码(最低位显示) ; 准备接收下一个音符 ; 代码跳转中转处 ; 计数器0的地址 ; 初始值低 8 位
; 高 8 位 ; 给数码管送出5的段码 ; 给数码管送出1的段码:7DH ; 给数码管送出位码(最低位显示)
JMP PRO2 ; 准备接收下一个音符 SII:
MOV DX,280H ; 计数器0的地址 MOV AL,24H ; 初始值低 8 位 OUT DX,AL
MOV AL,08H ; 高 8 位 OUT DX,AL MOV DX,28AH MOV AL,00H OUT DX,AL
MOV DX,288H MOV AL,07H OUT DX,AL MOV DX,28AH MOV AL,01H
OUT DX,AL CALL DELAY
JMP PRO2
DOO:
MOV DX,280H MOV AL,0A2H OUT DX,AL
MOV AL,07H OUT DX,AL MOV DX,28AH MOV AL,00H OUT DX,AL
MOV DX,288H MOV AL,75H OUT DX,AL MOV DX,28AH MOV AL,01H
OUT DX,AL CALL DELAY
JMP PRO2 FIN:
MOV DX,280H MOV AL,0DH OUT DX,AL
MOV AL,00H ; 给数码管送出6的段码 ; 给数码管送出1的段码:07H ; 给数码管送出位码(最低位显示) ; 准备接收下一个音符 ; 计数器0的地址 ; 初始值低 8 位 ; 高 8 位 ; 给数码管送出7的段码 ; 给数码管送出位码(最低位显示) ; 准备接收下一个音符 ; 乐谱播完,进入静音状态,设置初值; 发出超声波(人耳听不到),低8位 ; 高8位
MOV AH,01H ; 调用1号DOS 功能,等待键盘输入 INT 21H
CMP AL,1BH ; 是否输入"ESC"
JNZ N9 ; 是则退出,否则进行下一次播放 MOV AH ; 程序结束,返回 DOS 界面 INT 21H CODE ENDS END START
五.实验结果
(1)实验结果:成功播放音乐:青春修炼手册,同时数码管显示对应的乐谱。 (2)思考题:
问:写出8253计数初值,输入频率和输出频率的关系: 答:输出频率 = 输入频率/8253计数初值
六.实验总结
本次试验既用到上一次实验的可编程并行接口,又用到新的芯片作为计数器分频用,
对此需要考虑到8253/8254的使用及其控制字的写入以及工作方式的选择,同时对于特定频率下的计数选择以及数码管位码段码的选择都在上一次的实验中也有所操作,因此本次显得熟练一些,但对于两者结合使用还是有些生疏。
七.实验收获与心得体会
这次实验的主要收获是熟悉了可编程定时器/计数器8253/8254的使用。可以利用8253/8254工作于方式三来产生相应频率的方波,送给喇叭后发出相应的音。结合上一次七段数码管的显示,本次主要是在于7个音符的频率对应的计数选择和设置,而只要完成一个音符,其他音符均可以直接模仿完成。本次试验几个循环指令的跳转以及最后曲谱终止的编写都在之前有出过一点问题,不过都通过编写很好的解决了。
串行通讯8251(第四次实验)
一、实验目的
1、了解串行通讯的基本原理。
2、掌握串行接口芯片8251的工作原理和编程方法。
二、实验原理及内容
1、实验原理 (1)实验电路:
如图4-1,图中左侧8253为计数器,右侧8251为串行通讯接口芯片。
图4-1
串行通讯电路原理图
(2)8253可编程计数器:
本实验用到8253计数器的改进版8254计数器,主要用于产生8251的发送和接收时钟,即TxCLK 和RxCLK 两个时钟输入端。
(3)8251串行通讯芯片:
8251A 为可编程串行通信接口,其异步方式控制字如下图4-2所示:
图4-2
8251异步传送方式控制字示意图
本次实验的方式控制字为(0101 1010),含义为:异步方式、1停止位、数据位字符长度7位,奇校验,校验允许,波特率因子16 。
(4)8253、8254计数器产生发送接收时钟:
̅̅̅̅̅̅̅̅和接收8253/8254通过计数将1MHz 时钟信号分频得到8251的发送器时钟信号̅TxCLK ̅̅̅̅̅̅̅̅̅,实验中̅̅̅̅̅̅̅̅̅=RxCLK ̅̅̅̅̅̅̅̅̅ 。8253/8254的计数初值=时钟频率/(波特率×波器时钟信号RxCLK TxCLK 特率因子) 。本实验中,时钟频率为1MHz ,波特率选1200 ,波特率因子为16, 则计数器初值为52 。
2、实验内容
将内存制定区域内存放的一批数据通过 8251A 的
TxD 发送出去,然后从RxD 接收回来, 并在数码管上显示出来。 实现自发自收。
三.硬件接线图及软件程序流程图
1、硬件连接图:如4-1 硬件接线:
CLK0 /8254 接 1M 时钟 GATE0 /8254 接 +5V
0UT0 /8254 接 TX/RXCLK /8251 CS /8254 接 Y0 /IO 地址 CS /8251 接 Y7 /IO 地址 RXD /8251 接 TXD /8251
2、软件程序流程图:如图4-3
图4-3 串行通讯软件程序流程图
四.程序源代码及注释
DATA SEGMENT
STRING DB 'play a key on the keyboard:',0DH,0AH,'$' DATA ENDS
CODE SEGMENT ASSUME CS:CODE START:
MOV AH,09H
MOV DX,SEG STRING MOV DS,DX
MOV DX,OFFSET STRING
INT 21H ;09号功能调用输出初始字符串
MOV DX,283H ;8253初始化 MOV AL,1EH OUT DX,AL
MOV DX,280H ; 使用计数器0,计数初值52 MOV AL,34H OUT DX,AL
MOV DX,2B9H ;8251初始化, 控制端口 MOV AL,40H ; 内部复位命令 (01000000) OUT DX,AL ; 系统复位 NOP
MOV AL,5AH ; 工作方式控制字(0101 1010)异步方式:1停止位、数据位字符长度7位,奇校验,波特率因子16 0110 1010 OUT DX,AL NOP
MOV AL,37H ; 命令控制字(00110111) OUT DX,AL NOP
TxRDY:
MOV DX,2B9H ; 读入状态字 IN AL,DX
SHR AL,1 ; 逻辑右移一位入CF JC INPUT ; 判断TxRDY JMP TxRDY
INPUT:
MOV AH,1H ;1号功能调用读入键盘输入字符 INT 21H
CMP AL,1BH ; 判断输入是否为"ESC" JZ ENDD
INC AL ; 输入字符ASCII 码+1 MOV DX,2B8H ; 送到数据端 OUT DX,AL
RxRDY:
MOV DX,2B9H
IN AL,DX
SHR AL,1
SHR AL,1 ;RxRDY 逻辑右移一位入CF
JC OUTPUT ; 判断RxRDY
JMP RxRDY
OUTPUT:
MOV DX,2B8H
IN AL,DX ; 接收ASCII 码
MOV AH,02H
MOV DL,AL
INT 21H ;02号功能调用,显示字符
JMP TxRDY ; 循环检测
ENDD:
MOV AH,4CH ; 若键盘输入为ESC ,返回DOS
INT 21H
CODE ENDS
END START
五.实验结果
(1)实验结果:
完成自发自收的功能:键盘输入字符后,其ASCII 码加一发送,本机接收后在屏幕显示加一后的字符,按ESC 退出。
(2)实验思考题:
问:在实验中,你如何确定RxC ,TxC 的值,写出计算公式。
答:RxC=TxC=8253输出时钟频率=8251波特率*波特率因子。
六.实验总结
通过这次实验,我对8251有了更好的理解, 尤其是对于其接收和发送的功能有了很深的了解。由于8251芯片的工作原理在理论课上刚刚讲过,所以编写起来十分熟悉。我了解了其初始化是要有先后顺序的,即要先复位,再通过写入工作方式控制字,再写入命令控制字,紧接着需要根据接收和发送的要求,相应的读取状态控制字,实现发送和接收,按照先前老师提示过的,在每一次芯片控制字初始化后都加入延时,等待芯片响应,保证系统稳定工作。在判断TxRDY 和RxRDY 是否准备好时,本次实验中我采用的是将对应位逻辑右移入CF 中,再用JC 判断跳转。
七.实验收获与心得体会
通过这连续几周的微原硬件实验,我在微机原理硬件和软件结合方面有了很深的学习,从最初的只是编写小段代码实现基本的IO 地址译码,到简单并行接口,到七段数码管,再到可编程计数器,最后是串行通讯。我觉得每一次实验都是相互贯通的,循序渐进,用到的芯片也越来越多,由原先的单一芯片到后来几个芯片合在一起用,但是由于每节课都能进行编写调试测试验收,所以有了很好的经验,并且每次都能很好的将上一次的结合起来,虽然也遇到不少问题,但是都是在老师同学的帮助下得到很好的解决。这使得我对微机原理书本知识也有了进一步的理解和提升。谢谢老师。