微机原理硬件实验
I/O地址译码
&
简单并行接口
班级:
姓名:
学号:
一 实验目的
实验一:掌握I/O地址译码电路的工作原理。
实验二:掌握简单并行接口的工作原理及使用方法。
二、实验原理和内容
实验一:
1、实验电路如图4-1-1所示,其中74LS74为D触发器,可直接使用实验台上数字电路实验区的D触发器,74LS138为地址译码器。译码输出端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输出一个负脉冲。
图4-1-1
利用这个负脉冲控制L7闪烁发光(亮、灭、亮、灭、……),时间间隔通过软件延时实现。
2、接线: Y4/IO地址 接 CLK/D触发器
Y5/IO地址 接 CD/D触发器
D/D触发器 接 SD/D角发器 接 +5V
Q/D触发器 接 L7(LED灯)或 逻辑笔
实验二:
1、按下面图4-2-1简单并行输出接口电路图连接线路(74LS273插通用插座,74LS32用实验台上的“或门”)。74LS273为八D触发器,8个D输入端分别接数据总线D0~D7,8个Q输出端接LED显示电路L0~L7。
2、编程从键盘输入一个字符或数字,将其ASCⅡ码通过这个输出接口输出,根据8个发光二极管发光情况验证正确性。
图4-2-1
3、接线:
按图4-2-1接线(图中虚线为实验所需接线,74LS32为实验台逻辑或门)
三 硬件接线图及软件程序流程图
1硬件接线图
实验一:
实验二:
2软件程序流程图
实验一:
实验二:
四 源程序
实验一:
DATA SEGMENT
DATA ENDS
STACK SEGMENT STACK 'STACK'
DB 100H DUP(?)
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK
;延时子程序
DELAY1 PROC NEAR
MOV BX,500H
PUSH CX
LOOP2: MOV CX,0FFFH
WAIT1: LOOP WAIT1
DEC BX
JNZ LOOP2
POP CX
RET
DELAY1 ENDP
;L7闪烁
START: MOV CX,0FFFFH
LOOP1: MOV DX,2A0H ;灯亮
OUT DX,AL
CALL DELAY1
MOV DX,2A8H ;灯灭
OUT DX,AL
CALL DELAY1
LOOP LOOP1 ;循环闪烁
CODE ENDS
END START
实验二:
DATA SEGMENT
DATA ENDS
STACK SEGMENT STACK 'STACK'
DB 100 DUP(?)
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK
START: MOV AH,1 ;键盘输入
INT 21H
CMP AL,27 ;判断是否为ESC键
JZ EXIT
MOV DX,2A8H
OUT DX,AL ;输出
JMP START
;返回DOS
EXIT: MOV DX,2A8H
MOV AL,0
OUT DX,AL ;所有灯灭
MOV AX,4C00H
INT 21H
CODE ENDS
END START
五 实验结果
实验一:L7闪烁
实验二:从键盘输入字符或数字,若不是Esc键,则二极管显示其ASCII码情况,若按下ESC,则返回dos,且各LED灯灭。
六:实验总结
1主要问题是对题目中所给的硬件接线图不是很理解,如第二个实验中或门的作用。向老师请教后明白了硬件接线图的原理,做实验就容易许多。
2在第一个实验中起先对AL进行了赋值,后来发现是没必要的,不对AL赋值对产生负脉冲无影响,后来删掉了相应的赋值语句,精简了代码。
七 实验收获与心得体会
这是第一次接触微原硬件实验,实验板比小学期单片机实验更丰富,但也会导致刚开始的时候不知道该把线接在哪。在明白了硬件接法,将自己的代码反映在硬件上时,觉得非常有趣。之前一直以为微原实验不如C++等高级语言编程有趣,现在看来丝毫不逊色。且通过自己动手实验,使我对理论课所学知识有了更好的理解。期待通过这几次微原实验能让我收获更多知识。
微机原理硬件实验
可编程并行接口8255
&
七段数码管
&
键盘显示控制实验
班级:
姓名:
学号:
一 实验目的
实验三:通过实验,掌握8255工作于方式0以及设置A口为输出口,C口为输入口的方法。
实验四:掌握数码管显示数字的原理。
实验五:掌握8255控制键盘及显示电路的基本功能及编程方法。 掌握一般键盘和显示电路的工作原理。
二 实验原理和内容
实验三:
1、实验电路见硬件连接图,8255C口接逻辑电平开关K0~K7,A口接LED显示电路L0~L7。
2、编程从8255C口输入数据,再从A口输出。
实验四:
静态显示:按下图连接好电路,将8255的A口PA0~PA7分别与七段数码管的段码驱动输入端a~dp相连,位码驱动输入端S0、S1 、S2、S3接PC0、PC1、PC2、PC3,编程在数码管显示自己的学号的后四位。
实验五:
编程:使得在小键盘上每按一个健,4位数码管上显示出相应字符。
三 硬件接线图及软件程序流程图
1硬件接线图
实验三:
实验四:
2软件程序流程图
实验三:(引用讲义上已给出的图)
实验四:
(引用讲义上已给出的图)
实验五:
四 源程序
实验三
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 ;8255初始化,10001001,C口输入,A口输出
MOV AL,89H
OUT DX,AL
LOOP1: MOV DX,28AH ;C口输入
IN AL,DX
MOV DX,288H ;A口输出
OUT DX,AL
MOV AH,01H
INT 16H
JNZ EXIT ;ZF=0说明有按键输入,故退出
JMP LOOP1
EXIT: MOV AX,4C00H
INT 21H
CODE ENDS
END START
实验四
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 ;8255控制寄存器端口地址28BH
MOV AL,80H ;工作方式为0
OUT DX,AL ;初始化8255
DIGITAL:MOV DX,28AH ;熄灭数码管
MOV AL,00H
OUT DX,AL
MOV DX,288H ;A口显示5
MOV AL,6DH
OUT DX,AL
MOV DX,28AH ;C口00000001(位码)
MOV AL,01H
OUT DX,AL
MOV DX,28AH ;熄灭数码管
MOV AL,00H
OUT DX,AL
MOV DX,288H ;A口显示2
MOV AL,5BH
OUT DX,AL
MOV DX,28AH ;C口00000010(位码)
MOV AL,02H
OUT DX,AL
MOV DX,28AH ;熄灭数码管
MOV AL,00H
OUT DX,AL
MOV DX,288H ;A口显示6
MOV AL,7DH
OUT DX,AL
MOV DX,28AH
MOV AL,04H ;C口00000100(位码)
OUT DX,AL
MOV DX,28AH ;熄灭数码管
MOV AL,00H
OUT DX,AL
MOV DX,288H ;A口显示0
MOV AL,3FH
OUT DX,AL
MOV DX,28AH
MOV AL,08H ;C口00001000(位码)
OUT DX,AL
MOV DX,28AH ;熄灭数码管
MOV AL,00H
OUT DX,AL
MOV AH,01H
INT 16H
JNZ EXIT ;ZF=0说明有按键输入,故退出
JMP DIGITAL
EXIT: MOV AX,4C00H
INT 21H
CODE ENDS
END START
实验五
DATA SEGMENT
TABLE DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH,39H,5EH,79H,71H ;数码管显示 0123456789ABCDEF
NUM DB 70H,0B0H,0D0H,0E0H ;用于扫描键盘 70H=01110000,0B0H=10110000,0D0H=11010000,0E0H=11100000
DATA ENDS
STACK SEGMENT STACK 'STACK'
DB 100 DUP(?)
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK
;延时子程序
DELAY PROC NEAR
PUSH CX
MOV CX,100H
WAIT1: LOOP WAIT1
POP CX
RET
DELAY ENDP
;获取键盘的输入数字的子程序,通过BX寄存器传递
KEY PROC NEAR
PUSH AX ;保护现场
PUSH CX
PUSH DX
MOV CX,00H ;从第一行开始扫描
CHECK: MOV DX,28AH ;C口地址给DX
MOV BX,OFFSET NUM
ADD BX,CX
MOV AL,[BX]
OUT DX,AL
;防抖
IN AL,DX ;判断是否有键盘按下
MOV AH,AL
CALL DELAY
IN AL,DX
CMP AL,AH
JNZ CHECK ;不相等说明为抖动,重新检测
;判断按下的列
AND AL,0FH
CMP AL,0FH
JZ NEXT ;这一行的所有列都没有按下的则跳到下一行扫描
CMP AL,0EH
JZ NEXT1
CMP AL,0DH
JZ NEXT2
CMP AL,0BH
JZ NEXT3
MOV BX,00H
JMP GOT
NEXT: INC CX ;修改变量扫描下一行
CMP CX,04H
JNZ JUMP1
MOV CX,00H
JUMP1: JMP CHECK
NEXT1: MOV BX,03H
JMP GOT
NEXT2: MOV BX,02H
JMP GOT
NEXT3: MOV BX,01H
;计算按下键盘的数值
GOT: MOV AL,CL
MOV DL,04H
MUL DL
ADD BL,AL ;此时BX中所存即为对应的偏移量
POP DX ;恢复现场
POP CX
POP AX
RET
KEY ENDP
;主程序
START: MOV AX,DATA
MOV DS,AX
MOV DX,28BH ;8255初始化
MOV AL,81H ;C口输入
OUT DX,AL
MOV DX,289H ;B口位选数码管
MOV AL,01H
OUT DX,AL
;扫描键盘
LOOP1: CALL KEY
;数码管显示字符
MOV AX,BX
MOV BX,OFFSET TABLE
ADD BX,AX ;此时BX即为对应的地址
MOV AL,[BX]
CMP BX,OFFSET TABLE ;按下的为0则退出
JZ EXIT
MOV DX,288H ;A口输出
OUT DX,AL
MOV DX,28AH ;C口输入
IN AL,DX
;检测键盘是否弹起
MOV AH,AL
LOOP2: CALL DELAY
IN AL,DX
CMP AL,AH
JZ LOOP2
JMP LOOP1
;返回DOS
EXIT: MOV AL,00H
MOV DX,288H ;A口输出
OUT DX,AL
MOV AX,4C00H
INT 21H
CODE ENDS
END START
五 实验结果
实验三:拨动K0~K7,对应的L0~L7亮,有按键输入则退出。
实验四:数码管显示学号的后四位:0625。有按键输入则退出。
实验五:按小键盘1~F则数码管显示对应的字符,按下0则结束。
六:实验总结
本次实验课做了三个实验,每个实验也都变换了端口重新操作以加深理解,觉得比第一次做的更熟练。本次实验遇到问题的主要是实验五,键盘扫描及防抖程序较为复杂,需要考虑很多。在添加按小键盘0则退出时起初代码位置不对导致有逻辑错误,修改了两次才正确。
七 实验收获与心得体会
这次实验觉得和小学期的单片机实验有很多的想通之处。小学期使用的键盘扫描方法就是行扫描法,所以这次对扫描方法的理解更轻松一些。通过这次实验,我对8255的应用有了更深的了解。这次实验我更加注意了代码优化,每个实验都添加了退出的代码,觉得更可靠。实验三和四相对来说更容易,几乎是静态的,而实验五由于一直随着按键而变化所以需要考虑多种情况和变化,增加了难度,这也提高了我编程时考虑多种情况的意识,相信对我以后的编程也有很多的好处。
微机原理硬件实验
可编程定时器/计数器
(8253/8254)
班级:
姓名:
学号:
一、 实验目的
学习掌握8253用作定时器的编程原理;
二、 实验原理和内容
1.完成一个音乐发生器,通过喇叭或蜂鸣器放出音乐,并在数码管上显示乐谱。
2.扩展部分:利用小键盘实现弹琴功能,并显示弹奏的乐谱。
注意:8253输入频率应小于2MHz。
三 硬件接线图及软件程序流程图
1 硬件接线图
2 软件程序流程图
四 源程序
DATA SEGMENT
FENPIN DW 0001H,3906,3472,3125,2932,2604,2344,2083,1953;分频比1(do)-i(do)
DIGITAL DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH;数码管
MUSIC DB 0,1,2,3,1,1,2,3,1,0,3,4,5,0,3,4,5,0,5,6,5,4,3,1,0,5,6,5,4,3,1,0,1,5,1,0,1,5,1,0 ;存放播放的乐曲音符0是空拍
NUM DB 00H,070H,0B0H,0D0H,0E0H ;检测键盘输入
DATA ENDS
STACK SEGMENT STACK 'STACK'
DB 100 DUP(?)
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK
;延时子程序
DELAY PROC NEAR
PUSH CX
MOV CX,100H
WAIT0: LOOP WAIT0
POP CX
RET
DELAY ENDP
;延时子程序2
DELAY1 PROC NEAR
PUSH CX
MOV CX,0FFFFH
WAIT1: LOOP WAIT1
POP CX
RET
DELAY1 ENDP
;获取键盘输入值的子程序
KEY PROC NEAR
PUSH AX ;保护现场
PUSH CX
PUSH DX
MOV CX,01H
CHECK: MOV DX,28AH ;C口地址给DX
MOV BX,OFFSET NUM
ADD BX,CX
MOV AL,[BX]
OUT DX,AL
;防抖
IN AL,DX ;判断是否有键盘按下
MOV AH,AL
CALL DELAY
IN AL,DX
CMP AL,AH
JNZ CHECK ;不相等说明为抖动,重新检测
;判断按下的列
AND AL,0FH
CMP AL,0FH
JZ NEXT
CMP AL,0EH
JZ NEXT1
CMP AL,0DH
JZ NEXT2
CMP AL,0BH
JZ NEXT3
MOV BX,01H
JMP GOT
NEXT: INC CX ;修改变量扫描下一行
CMP CX,05H
JNZ JUMP1
MOV CX,01H
JUMP1: JMP CHECK
NEXT1: MOV BX,04H
JMP GOT
NEXT2: MOV BX,03H
JMP GOT
NEXT3: MOV BX,02H
;计算按下键盘的数值
GOT: SUB CX,01H
MOV AL,CL
MOV DL,04H
MUL DL
ADD BL,AL
SUB BL,01H ;此时BX中所存即为对应的偏移量
POP DX ;恢复现场
POP CX
POP AX
RET
KEY ENDP
;主程序
START: MOV AX,DATA
MOV DS,AX
;8253初始化
MOV DX,283H
MOV AL,36H
OUT DX,AL
;8255初始化
MOV DX,28BH
MOV AL,81H ;C口输入
OUT DX,AL
MOV DX,289H ;B口位选数码管
MOV AL,01H
OUT DX,AL
;扫描键盘
LOOP1: CALL KEY
CMP BX,0 ;按0播放音乐
JZ PLAY0
CMP BX,9 ;按9退出
JZ EXIT
;按1~8发出对应音
MOV CX,BX
MOV BX,OFFSET DIGITAL ;数码管显示音符
ADD BX,CX
MOV AL,[BX]
MOV DX,288H ;A口输出
OUT DX,AL
;播放该音符
MOV BX,OFFSET FENPIN
MOV AX,CX
ADD AX,AX
ADD BX,AX
;计数,先低八位后高八位
MOV AX,[BX]
MOV DX,280H
OUT DX,AL
MOV AL,AH
OUT DX,AL
CALL DELAY1
CALL DELAY1
MOV DX,28AH ;C口输入
IN AL,DX
;检测键盘是否弹起
MOV AH,AL
LOOP2: CALL DELAY
IN AL,DX
CMP AL,AH
JZ LOOP2
;初始化8253,停止播放音乐
MOV AX,0H
MOV DX,283H
MOV AL,36H
OUT DX,AL
JMP LOOP1
;播放音乐
PLAY0: MOV CX,01H
PLAY: PUSH CX
;读取音符,存于CX中
MOV BX,OFFSET MUSIC
ADD BX,CX
MOV AL,[BX]
MOV CL,AL
MOV CH,0H
;数码管显示
MOV BX,OFFSET DIGITAL
ADD BX,CX
MOV AL,[BX]
MOV DX,288H
OUT DX,AL
;播放该乐符
MOV BX,OFFSET FENPIN
MOV AX,CX
ADD AX,AX
ADD BX,AX
;计数,先低八位后高八位
MOV AX,[BX]
MOV DX,280H
OUT DX,AL
MOV AL,AH
OUT DX,AL
POP CX
;延时,持续播放
MOV AX,90H
LOOP3: CALL DELAY1
DEC AX
JNZ LOOP3
;乐曲未结束时,CX加1
INC CX
CMP CX,28H;共40个音符
JNZ JUM
JMP LOOP1
JUM: JMP PLAY
EXIT: MOV AL,0
MOV DX,288H
OUT DX,AL
MOV AX,4C00H
INT 21H
CODE ENDS
END START
五 实验结果
按小键盘的0时,播放预置音乐《两只老虎》,同时数码管显示相应的音符;
按小键盘的1~8时,分别发出do,re,mi,fa,so,la,si,高音do,数码管显示按下的音符;
按小键盘的9时,熄灭数码管,回到dos
六:实验总结
由于小学期单片机实验做的就是电子琴,原理上比较熟悉,所以这次实验比较容易。在调试时,主要是调整延时以使音乐播放更准确。延时程序是保证本次实验成功的关键。在弹奏时,发声时长即为按键时长,按键弹起时停止播放音乐(但为保证按键很短时发声不至于太急促,仍在此处加入了一点延时)。
七 实验收获与心得体会
这次实验的主要收获是熟悉了可编程定时器/计数器的使用。可以利用8253/8254工作于方式三来产生相应频率的方波,送给喇叭后发出相应的音。这次实验也使我对查表调用的使用更得心应手。本实验只使用了0~9,后面的键没有应用。在以后如果有机会进一步完善,可以给其他键赋予功能,如播放更多音乐、使数码管显示更丰富等等。在本次实验调试时主要是调整延时,这使我更加体会到了延时的重要性,看似不起眼的几行代码在整个电子琴程序中起到了很重要的作用,可以检测防抖时使用,可以调整音乐时使用等等。在程序中,真的是失之毫厘差之千里。以后的编程中我也会注意每一个细节,使程序更加优化。
八 思考题
写出8253计数初值,输入频率和输出频率的关系:
答:输出频率 = 输入频率/8253计数初值
微机原理硬件实验
串行通讯8251
班级:
姓名:
学号:
一、实验目的
1、了解串行通讯的基本原理。
2、掌握串行接口芯片8251的工作原理和编程方法。
二、实验原理和内容
基础功能:
1、按图4-16-1连接好电路,(8251插通用插座)其中8254计数器用于产生8251的发送和接收时钟,TXD和RXD连在一起。
2、编程: 从键盘输入一个字符,将其ASCII码加 1 后发送出去,再接收回来在屏幕上显示,(或将内存制定区域内存放的一批数据通过8251A的TXD发送出去,然后从RXD接收回来,并在屏幕上或数码管上显示出来。)实现自发自收。
扩展功能:
双机通信,将发送端用小键盘发送数据,接收端用数码管显示接收的数据。
三、硬件接线图及软件程序流程图
1硬件接线图(引用讲义上的流程图)
2软件程序流程图(引用讲义上的流程图)
四 源程序
1单机通信:
DATA SEGMENT
STRING DB 'TRANSLATE ','$'
STRING1 DB 'RECEIVE ','$'
STRING2 DB 0DH,0AH,'$'
DATA ENDS
STACK SEGMENT STACK 'SATCK'
DB 100 DUP(?)
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK
;延时子程序
DELAY PROC NEAR
PUSH CX
MOV CX,100H
WAIT0: LOOP WAIT0
POP CX
RET
DELAY ENDP
START: MOV AX,DATA
MOV DS,AX
;8254初始化
MOV DX,283H
MOV AL,16H ;计数器0,只读低字节,方式0,二进制
OUT DX,AL
CALL DELAY
MOV DX,280H ;计数器0,初值为52
MOV AL,34H
OUT DX,AL
CALL DELAY
;8251初始化
MOV DX,2B9H ;控制端口
MOV AL,40H ;内部复位命令
OUT DX,AL
NOP
CALL DELAY
MOV AL,5EH ;方式控制字
OUT DX,AL
MOV AL,37H ;命令控制字
OUT DX,AL
CALL DELAY
;发送数据
GOON: MOV DX,2B9H ;读状态字
IN AL,DX
TEST AL,01H
JZ GOON
;显示提示语句
MOV AH,09H
MOV DX,OFFSET STRING
INT 21H
MOV AH,01H
INT 21H
;检测是否为ESC键
CMP AL,1BH
JZ EXIT
INC AL;加1
MOV DX,2B8H
OUT DX,AL
;接收数据
RECEIVE: MOV DX,2B9H
IN AL,DX
TEST AL,02H
JZ RECEIVE
;显示提示语句
MOV AH,09H
MOV DX,OFFSET STRING2
INT 21H
MOV AH,09H
MOV DX,OFFSET STRING1
INT 21H
MOV DX,2B8H
IN AL,DX
MOV DL,AL
MOV AH,02H ;显示接收的数据
INT 21H
MOV AH,09H
MOV DX,OFFSET STRING2
INT 21H
JMP GOON
EXIT: MOV AX,4C00H
INT 21H
CODE ENDS
END START
双机通信
DATA SEGMENT
STRING DB 'Please put in a word',0DH,0AH,'$'
TABLE DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH,39H,5EH,79H,71H,00H ;数码管显示
NUM DB 70H,0B0H,0D0H,0E0H
DATA ENDS
STACK SEGMENT STACK 'SATCK'
DB 100 DUP(?)
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK
;延时子程序
DELAY PROC NEAR
PUSH CX
MOV CX,100H
WAIT0: LOOP WAIT0
POP CX
RET
DELAY ENDP
;延时子程序2
DELAY1 PROC NEAR
PUSH CX
PUSH BX
MOV BX,250
LP2: MOV CX,0FFFFH
LP1: LOOP LP1
DEC BX
JNZ LP2
POP BX
POP CX
RET
DELAY1 ENDP
input PROC NEAR
LOOP1: MOV DX,28AH
mov al,01111111b
out dx,al
in al,dx
and al,00001111b
cmp al,00000111b
jz case0
CMP AL,00001011B
JZ CASE1
CMP AL,00001101B
JZ CASE2
CMP AL,00001110B
JZ CASE3
mov al,10111111b
out dx,al
in al,dx
and al,00001111b
cmp al,00000111b
jz case4
CMP AL,00001011B
JZ CASE5
CMP AL,00001101B
JZ CASE6
CMP AL,00001110B
JZ CASE7
mov al,11011111b
out dx,al
in al,dx
and al,00001111b
cmp al,00000111b
jz case8
CMP AL,00001011B
JZ CASE9
CMP AL,00001101B
JZ CASE10
CMP AL,00001110B
JZ CASE11
mov al,11101111b
out dx,al
in al,dx
and al,00001111b
cmp al,00000111b
jz case12
CMP AL,00001011B
JZ CASE13
CMP AL,00001101B
JZ CASE14
CMP AL,00001110B
JZ CASE15
MOV AL,16
JMP OUTINPUT
;根据判断的按键状态,给al赋相应的偏移值
CASE0:MOV AL,0
JMP OUTINPUT
CASE1:MOV AL,1
JMP OUTINPUT
CASE2:MOV AL,2
JMP OUTINPUT
CASE3:MOV AL,3
JMP OUTINPUT
CASE4:MOV AL,4
JMP OUTINPUT
CASE5:MOV AL,5
JMP OUTinput
CASE6:MOV AL,6
JMP OUTINPUT
CASE7:MOV AL,7
JMP OUTINPUT
CASE8:MOV AL,8
JMP OUTINPUT
CASE9:MOV AL,9
JMP OUTINPUT
CASE10:MOV AL,10
JMP OUTINPUT
CASE11:MOV AL,11
JMP OUTINPUT
CASE12:MOV AL,12
JMP OUTINPUT
CASE13:MOV AL,13
JMP OUTINPUT
CASE14:MOV AL,14
JMP OUTINPUT
CASE15:MOV AL,15
OUTINPUT:RET
input ENDP
;主程序
START: MOV AX,DATA
MOV DS,AX
;8255初始化
MOV DX,28BH
MOV AL,81H;C口输入
OUT DX,AL
CALL DELAY
MOV DX,289H;B口位选数码管
MOV AL,01H
OUT DX,AL
CALL DELAY
;8254初始化
MOV DX,283H
MOV AL,16H
OUT DX,AL
CALL DELAY
MOV DX,280H
MOV AL,34H
OUT DX,AL
CALL DELAY
;8251初始化
MOV DX,2B9H
MOV AL,40H
OUT DX,AL
NOP
CALL DELAY
MOV AL,5EH
OUT DX,AL
MOV AL,37H
OUT DX,AL
CALL DELAY
;显示提示语句
MOV AH,09H
MOV DX,OFFSET STRING
INT 21H
;发送数据
GOON: MOV DX,2B9H ;读状态字
IN AL,DX
TEST AL,01H
JZ RECEIVE
CALL input
CMP AL,16
JZ CHUSHI
INC AL ;加1
MOV DX,2B8H
OUT DX,AL
CALL DELAY
JMP RECEIVE
CHUSHI: MOV AL,16
MOV DX,2B8H
OUT DX,AL
CALL DELAY
JMP RECEIVE
;接收数据
RECEIVE: MOV DX,2B9H ;读状态字
IN AL,DX
TEST AL,02H
JZ GOON
MOV DX,2B8H
IN AL,DX
;数码管显示
MOV AH,0
MOV BX,OFFSET TABLE
ADD BX,AX
MOV AL,[BX]
MOV DX,288H;A口输出
OUT DX,AL
CALL DELAY1
JMP GOON
CODE ENDS
END START
五 实验结果
自发自收:键盘输入字符后,加一发送,本机接收后在屏幕显示加一后的字符,按ESC退出。
拓展功能:小键盘输入,接收端数码管显示加1后的结果,可双机通信,支持连续发送。
六 实验总结
在编程时,由于使用的芯片较多,所以在编程顺序上发生了一定的混乱,有一些考虑不周导致的问题。本次实验除了8251A的发送接收外,大多数的知识在之前的实验中有了一定的基础,比如键盘扫描程序等,可以直接从之前的实验中移植过来,但怎样正确地控制好各个芯片有序工作是这个实验的重点。
在单机通信时,起初输入字符后没有反应,后来在每个控制字后添加了延时程序,显示正常。
双机调试花了许多时间,之前是发送后必须接收方按键后数码管才能显示,后来采取的措施是将原本的小键盘扫描程序中循环扫描改成只扫描一次。这样程序可以不断执行GOON和 RECEIVE,不需要接收方再按一次键即可实现连续通信,数码管实时显示。在发现问题解决问题的过程中还有很多细节问题的改动,在此不再细说。每一次改动都能感觉到代码有了优化,直到最终出现正确的效果。
七 实验收获与心得体会
通过这次实验,我对8251A有了更好的理解。本实验中不止使用了8251,还使用了其他芯片,使我对各芯片的综合使用能力有了一定的提高。在之前课上学习8251A理论知识时,我对这个芯片没有很理解,只知道是串行可编程接口,甚至对某些部分的理解是错误的,经过了自己的实际体验才对之有了较多的理解,明白了它的使用原理。
这次的单机通信很简单,在进行了双机通信后才对8251双机通信的握手问题有了更好的了解。同时感觉到知识的交流很重要,在实验室时,开始时遇到问题就是自己去修改代码,始终没有找到问题的根源,在与老师和做成功的同学交流后才找到问题并最终修改成功。本实验代码中的键盘扫描程序使用了张煜昊的,因为自己的扫描程序解决不了这个问题,只有根本改变算法才行。
通过这四次的微原硬件实验,我的收获很大。虽然通过小学期对汇编语言有了一定的了解,但微原课本中的好多知识都是全新的,不自己去编程、调试很难能够真正去了解这其中的原理。
八 思考题
在实验中,你如何确定RxC,TxC的值,写出计算公式
答:RxC=TxC=8253输出时钟频率=8251波特率*波特率因子