微机原理与接口技术实验报告

实验一 熟悉汇编语言程序开发过程

一、实验目的

1.熟悉与实验有关的系统软件(如编辑程序、汇编程序、连接程序和调试器等)的使用。

2.在程序调试过程中,学习及掌握调试器CodeView的各种操作命令,掌握程序的调试方法及技巧。

二、实验内容

用查表法求0~9之间某个整数的平方,设该数x及结果y均存放在内存中,在数据段定义一个平方表table。

1.建立源程序asm文件

用Windows的记事本输入以下源程序:

data segment

table db 0,1,4,9,16,25,36,49,64,81

x db ?

y db ?

data ends

code segment

assume cs:code,ds:data

start: mov ax,data

mov ds,ax

lea bx,table

mov al,x

mov ah,0

add bx,ax

mov al,[bx]

mov y,al

mov ah,4ch

int 21h

code ends

end start

2.BUFFER单元有一字节数据,将它拆开,低四位送L单元,高四位送H单元,编写程序实现以上功能,调试通过。

data segnment

buffer db 0f8h

l db ?

h db ?

data ends

code segnment

       assume cs:code,ds:data

start:mov ax,data

      mov ds,ax

      mov al,buffer

      and al,0fh

      mov l,al

      mov al,buffer

      mov cl,4

      shr al,cl

      mov h,al

      mov ah,4ch

int 21h

code ends

     end start

二、实验总结:

 1.用汇编程序masm对源文件汇编产生目标文件obj

masm demo.asm

Microsoft (R) MASM Compatibility Driver

Copyright (R) Microsoft Corp 1991. All rights reserved

Invoking: ML.EXE/I. /Zm /C /Ta demo.asm

Microsoft (R) Macro Assembler Version 6.00

Copyright (R) Microsoft Corp 1981-1991. All rights reserved

Assembling: demo.asm

2.用连接程序link产生执行文件exe

link demo

Microsoft (R) Segmented-Executalle Linker Version 5.13

Copyright (R) Microsoft Corp 1984-1991. All rights reserved

Run File [demo.exe]: ↙

List File [NUL.MAP]: ↙

Libraries [.LIB]: ↙

Definitions File [NUL.DEF]: ↙

LINK: warning L4021: no stack segment

↙表示按Enter键,得到可执行程序demo.exe。

也可用汇编器ML,它可以自动调用LINK。应用命令:

ML demo.asm

依次进行汇编和连接,生成demo.obj和demo.exe。但源文件一定要是扩展名.asm,命令中不能省略扩展名.asm。

注意:用Windows记事本保存的源程序的扩展名若为.txt,使用ML进行汇编和连接前,先要在DOS下,用ren命令将源文件的扩展名改为.asm。

ren demo.txt demo.asm

3.执行程序

只要在DOS命令提示符下键入文件名即可执行程序。

四、总结调试器CodeView调试的方法

用调试器CodeView调试程序

 (1) 进入CodeView

先执行mouse驱动程序,这样进入调试程序后可以使用鼠标操作。

cv demo

此时已将执行程序装入内存,进入CodeView,屏幕显示CodeView的菜单、窗口、帮助/状态条,CodeView能记住上一次运行时打开的窗口,按下Alt_W键将打开 Windows菜单,可选择表示窗口的菜单,以激活相应的窗口。一般同时打开“Source”(源程序)、“Memory”(内存)、“Register”(寄存器)、“Command”(命令)等窗口,必要时,可以同时打开两个“Memory”(Memory 1和Memory2)。

可用CodeView命令进行程序调试。

(2) 在“Source”(源程序) 窗口查看源程序和对应的机器码,注意查看第一条指令mov ax,xxxx (data),xxxx即为当前数据段段地址DS的值。白底行为CS:IP所指的指令行。

(3) 在“Register”(寄存器) 窗口查看或修改各寄存器的值,也可以用寄存器命令R显示或修改。

(4) 在“Memory”(内存)窗口查看数据段的数据,鼠标移至段地址处按左键,光标在该字符下闪烁,键入新的值修改段地址值,使它指向当前DS(源程序窗口查看到的值xxxx),从而查看数据段指定内存单元的值。

(5) 在“Memory”(内存)窗口直接修改内存单元的值,只要将光标移到相应字节处,键入新的十六进制值即可,输入变量x(地址应为DS:000a)的值,如送入05。

(6) 程序运行

实验三 循环程序设计

一、实验目的

1.进一步熟悉调试器CodeView的各种操作命令,掌握程序的调试方法及技巧。

2.加深对循环结构的理解。

3.掌握循环结构程序设计和调试的方法。

二、实验内容

1.用计数器控制循环

统计某数据区内负数的个数,设数据区的第一个单元存放数据区内单元数据的个数,从第二个单元开始存放数据,结果存入NUMB单元。为统计数据区内负数的个数,需要逐个判断数据区内的每一个数据,然后将所有数据中凡是符号位为1的数据的个数累加起来,即得数据区内所包含负数的个数。

实验程序如下: DATA SEGMENT

BUFF DB 10,10H,88H,78H,9AH,24H,5H,0D8H,0FAH,38H,9H

NUMB DB ?

DATA ENDS

STACK SEGMENT STACK DW 64 DUP(?) STACK ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACK

START:MOV AX,DATA                   

MOV DS,AX

MOV ES,AX

LEA DI,BUFF

MOV CL,[DI]

XOR CH,CH

MOV BL,CH

INC DI

A1: MOV AL,[DI]

TEST AL,80H

JE A2

INC BL

A2: INC DI

LOOP A1

MOV [DI],BL

MOV AH,4CH

INT 21H

CODE ENDS

END START

3-1 程序流程图

2.按问题的条件控制循环

编制程序,使S=1+2×3+3×4+4×5+?N(N+1),直到N(N+1)项大于200为止,实验程序流程如图3-2所示

程序如下:

code segment

         assume cs:code

start:        mov dx,1

         mov bl,2

a:      mov al,bl

         inc bl

         mul bl

         add dx,ax

         cmp ax,200

         jna a

         mov ah,4ch

         int 21h

code ends

         end  start

三:实验总结:总结循环程序中控制循环的方法

实验十一 存储器接口实验

一、实验目的 1.了解62256 RAM特性。 2.掌握存储器扩展和存储器读/写方法,通过硬件电路的分析,掌握地址译码的方法。 3.熟悉EAT598实验教学系统的基本操作。

二、实验内容

利用62256扩充RAM,地址为00000-07FFFH,编写一个程式,将62256的前十个存储单元依次送入数据0~9,再对其进行读操作校验。

程序如下:

code segment

         assume cs:code

start:        mov ax,0

                   mov ds,ax

                   mov si,0

                   mov cx,10

         a2:   mov [si],al

                   mov ah,[si]

                   cmp al,ah

                     jne a1

                   inc si

                   inc al

                   loop a2 

                   mov bl,0

                   jmp a3

                   a1:   mov bl,0eh

a3:jmp a3

code ends

         end start

三、实验总结

EAT598实验教学系统的9芯仿真机通讯口与PC机的串行口用串行通讯电缆相连,仿真实验板上的拨动开关SB1,拨到下端,切换到88实验模式(后面的硬件接口实验同)。

(1) 打开实验教学系统电源(实验箱右边的开关),将实验箱中央的电源开关切向ON,在PC机桌面上点击LCA88图标,启动LCA88调试软件。

(2) 连机:选择“设置——实验机/仿真机”菜单项,在弹出的对话框中,设置实验机/仿真机加载的段地址和偏移地址。选择“设置——通讯口”菜单项,在弹出的对话框中,选择相应的通讯串口和通讯波特率。点击测试串口按钮,检查通讯口是否可用。当通讯正常,

实验箱的LED显示为AedK- 86。

(3) 程序编辑:选择“文件——新文件”菜单项,将新建一个空的编辑窗口。在编辑窗口中输入程序,输入完毕,选择“文件——另存为”菜单项,把该文件保存为ram.asm。也可以直接选择“文件——打开”菜单项打开该文件。

(4) 汇编和连接:选择“编译——编译并连接”菜单项,将编译并连接当前活动窗口中的源文件,编译结果的信息显示在输出窗口中,可以根据输出窗口中错误信息直接定位到源文件的相应位置。编译连接成功后生成EXE文件。

(5) 选择“调试——加载调试”菜单项,加载当前活动窗口中的源文件所产生的目标文件到实验教学系统(加载空间从8100:0开始)。“设置——实验机/仿真机”菜单项中若选择了“编译连接成功后自动加载到实验机”,则上步编译连接成功后自动将EXE文件加载到实验教学系统。

 (6) 选择“调试/对话窗口”菜单项,打开一个与AEDK 8688实验教学系统直接对话的窗口,可以使用实验机/仿真机监控命令和实验教学系统对话。显示提示符“#”, 以表示监控程序正等待接收命令进来。

(7) 在“调试”菜单选项中,断点调试、全速运行等功能调试程序。

1) 断点调试

有以下方法来设置断点达到中止程序执行目的:

·执行到光标所在行 热键F4

·按暂停按钮

LCA88ET调试软件提供一次性断点:执行到光标所在行。按热键F4,调试程序继续执行程序代码,直到它到达光标行处。

2) 全速运行 热键F9

(8) 查看结果

移动鼠标到源程序窗中相应的寄存器上,将出现一个提示窗口,显示这寄存器的当前值。

在对话窗口,用DW0000:0000命令显示存储器前80H个单元内容,检查写入是否正确。

实验十三 8255A并行接口实验

一、实验目的 1.学习并掌握8255A的各种工作方式及其应用。 2.学习在接口实验单元上构造实验电路。 3.掌握8255A 工作于中断方式的应用。

二、实验内容

编写程序,使8255A端口B工作在方式0并作为输入口,端口A工作在方式0并作为输出口。

sy13

code segment

         assume cs:code

start: mov  al,82h

       mov dx,213h

       out dx,al

  a1:  mov dx,211h

       in al,dx

       mov dx,210h

       out dx,al

       jmp a1

code ends

         end start

三、记录实验中观察到的现象,并加以解释。

四、实验总结:总结8255A可编程并行接口芯片的编程方法。

实验十五 8253定时器/计数器应用编程

一、实验目的

1.熟悉8253在系统中的典型接法。

2.掌握8253的工作方式及应用编程。

二、实验内容

编程将8253的计数器0设置为方式2(分频),计数器1设置为方式2(分频),计数器2设置为方式3(方波),输出频率为0.5Hz。

code segment

         assume cs:code

start: mov al,35h;计数器0设置

            mov dx,22bh

            out dx,al

            mov al,72h;计0装初值

            mov dx,228h

            out dx,al

            mov al,30h

            out dx,al

          

            mov al,55h

            mov dx,22bh

            out dx,al

            mov al,10h

            mov dx,229h

            out dx,al

          

           

           

            mov al,97h

            mov dx,22bh

            out dx,al

            mov al,10h

            mov dx,22ah

            out dx,al

          a1:jmp a1 

 

code ends

         end start

三、记录实验中观察到的现象,并加以解释。

四、总结8253可编程计数器/定时器芯片的编程方法。

 

第二篇:微机原理及接口技术 实验报告

微机原理及接口技术

实验报告

学    院:   信息工程学院   

专业班级:   通 信  0801   

姓    名:                  

学    号:                   

 

实验一 多位十进制数相加实验

一.实验目的

1.熟悉在PC机上建立、汇编、连接、调试和运行汇编语言程序的过程。

2.掌握数据传送和算术运算指令的用法。

二.实验内容

将两个多位十制数28056,47193相加,并显示加数,被加数,和。要求加数和被加数均以ASCII码形式各自顺序存放在DATAl和DATA2内存单元中,结果送回DATA1处(低位在前,高位在后)。

三.程序流程图

 


流程图: 决策: CX-1=0 N

 


Y

 

四.参考程序

SHOW MACRO B

        MOV   DL,B

        MOV   AH,02H

        INT   21H

        ENDM

DATA    SEGMENT

DATA1   DB  33H,39H,31H,37H,34H

DATA2   DB  36H,35H,30H,38H,32H

DATA3   DB  '__',   0DH,0AH,'$'

DATA    ENDS

STACK   SEGMENT  STACK

STA     DB 20 DUP (?)

TOP     EQU LENGTH  STA

STACK   ENDS

CODE    SEGMENT

ASSUME  CS:CODE,DS:DATA,SS:STACK,ES:DATA

START:  MOV AX,DATA

        MOV DS,AX

        MOV AX,STACK

        MOV SS,AX

        MOV AX,TOP

        MOV SP,AX

        MOV SI,OFFSET DATA2

        MOV BX,05

        SHOW 20H

        CALL DISPL

        SHOW 0DH

        SHOW 0AH

        MOV SI,OFFSET DATA1

        MOV BX,05

        SHOW 2BH

        CALL DISPL

        SHOW 0DH

        SHOW 0AH

        MOV  CL,7

S1:     SHOW 2DH

        LOOP S1

        SHOW 0DH

        SHOW 0AH

        MOV SI,OFFSET DATA1

        MOV DI,OFFSET DATA2

        CALL ADDA

        MOV SI,OFFSET DATA1

        MOV BX,05

        SHOW 20H

        CALL DISPL

        MOV AX,4C00H

        INT 21H

DISPL   PROC  NEAR

DS1:    SHOW [SI+BX-1]

        DEC BX

        JNZ DS1

        RET

DISPL   ENDP

ADDA    PROC  NEAR

        MOV DX,SI

        MOV BP,DI

        MOV BX,05

AD1:    SUB  BYTE PTR [SI+BX-1],30H

        SUB  BYTE PTR [DI+BX-1],30H

        DEC  BX

        JNZ  AD1

        MOV SI,DX

        MOV  DI,BP

        MOV  CX,05

        CLC

AD2:    MOV AL,[SI]

        MOV BL,[DI]

        ADC AL,BL

        AAA

        MOV [SI],AL

        INC SI

        INC DI

        LOOP AD2

        MOV SI,DX

        MOV DI,BP

        MOV BX,05

AD3:    ADD BYTE PTR [SI+BX-1],30H

        ADD BYTE PTR [DI+BX-1],30H

        DEC BX

        JNZ AD3

        RET

ADDA    ENDP

CODE    ENDS

        END   START

四.实验过程

进入DOS环境,进入E盘MASM子目录,键入:

E: 回车

CD: MASM 回车

EDIT *.ASM 回车(*为程序名)

打开编辑窗口将汇编语言源程序输入

对源程序进行汇编链接,执行并调试可执行文件

六.思考题

    不改变数据段DATA1DATA2的内容,如何将加数与被加数分别由2805647193变成6508239174,并且相加

答:源程序不变将

    DATA1   DB  33H,39H,31H,37H,34H

    DATA2   DB  36H,35H,30H,38H,32H

后加上

    DATA4   DB  37H,34H,31H,39H,33H

DATA5  DB  32H,38H,30H,35H,36H

并将全部DATA1和DATA2全部改成DATA4和DATA5

就可以实现

七、实验感想:

     通过本实验,基本学会了数据传送和算术运算指令的用法,熟悉了DOS环境,并且对微机原理及接口技术这门课程有了更深的了解和认识。

实验二 统计数据个数实验

一.实验目的

    掌握将多位十六进制数转换成多位十进制数ASCII码的方法

二.实验内容  

    统计内存数组中大于0和小于0的元素个数,并将统计结果分别存放在LRESULT和HRESULT变量中,并显示个数

三.程序流程图

   流程图: 可选过程: 开始


Y

 

流程图: 决策: CL-1=0?              N

 

                                     Y

 

流程图: 可选过程: 结束 

四.参考程序

DATA  SEGMENT

  ARY   DB  1,3,-1,2,6,-9,-5,7,8,1,3,8,-6,8,-9,-7,2,4,-3,-3

        DB  -4,7,7,8,3,1,3,6,8,5,5,6,4,5,7,-4,2,4,5,-7,5,4

        DB  2,5,7,8,8,8,7,6,-5,4,3,2,1,-1,2,2,3,-4,5,6,7

        N=$-ARY

  LRESULT   DW  0

  HRESULT   DW  0

  TJJG      DB   'STATISTICS RESULT:',0DH,0AH,'$'

  DATA      ENDS

  CODE      SEGMENT

            ASSUME   CS:CODE,DS:DATA

  START:    MOV  AX,DATA

  MOV       DS, AX

  MOV       ES, AX

  SHOW      MACRO  B

            PUSH   DX

            PUSH   AX

            MOV    AH,02H

            INT    21H

            POP    AX

            POP    DX

            ENDM

            XOR    CX,CX

            MOV    CX,N

            LEA    SI,ARY

  LOP:      MOV    AL,[SI]

            CMP    AL,0

            JNS    PLUS

            INC    LRESULT

            JMP    CONT

  PLUS:     INC    HRESULT

  CONT:     INC    SI

            LOOP   LOP

            LEA    DX,TJJG

            MOV    AH,09H

            INT    21H

            SHOW   '+'

            MOV    AX,HRESULT

            CALL   DISPL

            SHOW   0DH

            SHOW   0AH

            SHOW   '-'

            MOV    AX,LRESULT

            CALL   DISPL

            MOV    AX,4C00H

            INT    21H

  DISPL     PROC

            PUSH   DX

            PUSH   AX

            MOV    CX,10

            MOV    DX,00H

            MOV    BX,00H

            DIV    CX

            MOV    BX,DX

            ADD    AL,30H

  DISPL1:   MOV    DL,AL

            MOV    AH,02H

            INT    21H

            MOV    DL,BL

            ADD    DL,30H

            MOV    AH,02H

            INT    21H

            POP    AX

            POP    DX

            RET

  DISPL     ENDP

  CODE      ENDS

            END   START

五.实验过程

     进入E盘的MASM子目录,打开编辑窗口将汇编语言源程序输入,对源程序进行汇编链接,执行并调试可执行文件

六.思考题

   试分析程序中语句“MOV CX,N”执行后,赋给CX寄存器的值是多少?

答:赋给CX的值是63

七、实验感想

通过本实验,基本学会了数据传送和算术运算指令的用法及将多位十六进制数转换为多位十进制数ASCII码得方法,熟悉了DOS环境,并且对微机原理及接口技术这门课程有了更深的了解和认识。

实验三 直流电机测速实验

一. 实验目的

1.掌握8254的工作原理和编程方法

2.了解光电开关的使用方法,掌握用光电传感器测量电机转速的方法

. 实验内容

    光电测速的基本电路由光电传感器、计数器和定时器组成。测量时在被测电机主轴上固定一个圆盘,圆盘的边缘上打上小孔。传感器的红外发射端和接收端装在圆盘的两测,电机带动圆盘转到有孔的位置时,红外光通过,红外接收管导通,输出低电平。红外光被挡住时接收管截止,输出高电平。用计数器记录在一定时间内传感器发出的脉冲个数就可以计算出电机转速。

. 线路连接

    接线方法:8254计数器/定时器0和2作为定时器,确定测速时间,定时器0的CLK0接1MHZ脉冲频率,OUT0作为定时器2的输入,与CLK2相连,输出OUT2与8255的PA0端相连。GATE0、GATE2均接+5V,8254计数器/定时器1作为计数器,输入CLK1与直流电机计数端相连,GATE1与8255的PC0相连。电机DJ端与+5V~0V模拟开关SW1相连。

. 编程提示

8254计数器/定时器1作为计数器,记录脉冲个数,计数器/定时器0和2作为定时器,组成10~60秒定时器,测量脉冲个数,算出电机每分钟的转速并显示在屏幕上。

8255的PA0根据OUT2的开始和结束时间,通过PC0向8254计数器/定时器1发出开始和停止计数信号。

五. 流程图

 

. 参考程序

DATA     SEGMENT

IOPORT   EQU 0D880H-0280H

IO8255K  EQU IOPORT+283H

IO8255A  EQU IOPORT+280H

IO8255C  EQU IOPORT+282H

IO8254K  EQU IOPORT+28BH

IO82542  EQU IOPORT+28AH

IO82541  EQU IOPORT+289H

IO82540  EQU IOPORT+288H

MESS     DB  'STRIKEANY KEY,RETURN TO DOS!',0AH,0DH,'$'

COU      DB  0

COU1     DB  0

COUNT1   DB  0

COUNT2   DB  0

COUNT3   DB  0

COUNT4   DB  0

DATA     ENDS

CODE     SEGMENT

ASSUME   CS:CODE, DS:DATA

START:   MOV AX,DATA

         MOV DS,AX

         MOV DX,OFFSET MESS

         MOV AH,09H

         INT 21H

         MOV DX,IO8254K

         MOV AL,36H

         OUT DX,AL

         MOV DX,IO82540

         MOV AX,50000

         OUT DX,AL

         NOP

         NOP

         MOV AL,AH

         OUT DX,AL

         MOV DX,IO8255K

         MOV AL,90H

         OUT DX,AL

         MOV DX,IO8255C

         MOV AL,00

         OUT DX,AL

LL:      MOV AH,01H

         INT 16H

         JNZ QUIT1

         MOV DX,IO8254K

         MOV AL,70H

         OUT DX,AL

         MOV DX,IO82541

         MOV AL,0FFH

         OUT DX,AL

         NOP

         NOP

         OUT DX,AL

         MOV DX,IO8254K

         MOV AL,90H

         OUT DX,AL

         MOV DX,IO82542

         MOV AL,100

         OUT DX,AL

         MOV DX,IO8255C

         MOV AL,01H

         OUT DX,AL

         JMP A0

QUIT1:   JMP QUIT

A0:      MOV DX,IO8255A

A1:      IN  AL,DX

         AND AL,01H

         JZ  A1

         MOV DX,IO8255C

         MOV AL,00H

         OUT DX,AL

         MOV DX,IO8254K

         MOV AL,70H

         OUT DX,AL

         MOV DX,IO82541

         IN  AL,DX

         MOV BL,AL

         IN  AL,DX

         MOV BH,AL

         MOV AX,0FFFFH

         SUB AX,BX

         CALL DISP

         MOV DL,0DH

         MOV AH,02

         INT 21H

         MOV DL,0AH

         MOV AH,02

         INT 21H

         JMP LL

DISP     PROC NEAR

         MOV DX,0000H

         MOV CX,03E8H

         DIV CX

         MOV COUNT1,AL

         MOV AX,DX

         MOV CL,64H

         DIV CL

         MOV COUNT2,AL

         MOV AL,AH

         MOV AH,00H

         MOV CL,10

         DIV CL

         MOV COUNT3,AL

         MOV COUNT4,AH

         MOV AL,COUNT1

         CALL DISP1

         MOV AL,COUNT2

         CALL DISP1

         MOV AL,COUNT3

         CALL DISP1

         MOV AL,COUNT4

         CALL DISP1

         RET

DISP     ENDP

DISP1    PROC NEAR

         AND  AL,0FH

         CMP  AL,09H

         JLE  NUM

         ADD  AL,07H

NUM:     ADD  AL,30H

         MOV  DL,AL

         MOV  AH,02

         INT  21H

         RET

DISP1    ENDP

QUIT:    MOV  AH,4CH

         INT  21H

CODE     ENDS

         END  START

七. 实验结果

八. 思考题

   关闭电机后,为什么8254计数不为0

答:关闭电机后,但主机未断电,计数值锁存在锁存器中,所以读数会一直为锁存器的值,8254计数不会显示0

九.实验感想

通过本实验,基本掌握了8254的工作原理和编程方法,了解了光电开关,掌握了用光电传感器测量电机转速的方法。同时,也进一步提高了自己实践动手的能力,熟悉了DOS环境,并且对微机原理及接口技术这门课程有了更深的了解和认识。

实验四 十字路口红绿灯闪烁实验

一.实验目的

     通过对红、绿、黄灯的控制,熟练掌握8255A接口芯片的编程方法。

二.实验内容

 对8255A接口芯片进行编程,使红,黄,绿发光二极管按照十字路口交通灯的形式点亮或熄灭。

.线路连接

    

                

 

     发光二极管共8个,其中两组绿,黄,红灯用6个,L2、L3、L4为一组,L5、L6、L7为一组;实验台连接如图4.3所示。高电平“1”时,点亮。

四.流程图

五.参考程序

DATA     SEGMENT

IOPORT   EQU 0D880H-280H

IO8255C  EQU IOPORT+282H

IO8255T  EQU IOPORT+283H

PB       DB  ?

MESS     DB 'ENTER ANY KEY CAN EXIT TO DOS!',0DH,0AH,'$'

DATA     ENDS

STACK    SEGMENT STACK

STA      DW  50 DUP(?)

TOP      EQU LENGTHSTA

STACK    ENDS

CODE     SEGMENT

         ASSUME CS:CODE,DS:DATA,SS:STACK

START:   MOV AX,DATA

         MOV DS,AX

         MOV ES,AX

         MOV AH,09H

         MOV DX,OFFSET MESS

         INT 21H

         MOV DX,IO8255T

         MOV AL,81H

         OUT DX,AL

         MOV DX,IO8255C

         IN  AL,DX

         MOV PB,AL

         MOV DX,IO8255T

         MOV AL,80H

         OUT DX,AL

         MOV DX,IO8255C

         MOV AL,PB

         OR  AL,0CH

         OUT DX,AL

         MOV AL,30H

         OUT DX,AL

         CALL  DELAY10

   LLL:  MOV DX,IO8255C

         MOV AL,12H

         OUT DX,AL

         CALL DELAY10

         CALL DELAY10

         CALL DELAY10

         CALL DELAY10

         MOV AL,10H

         OUT DX,AL

         MOV CX,0040H

  TTT:   MOV AL,0CH

         OUT DX,AL

         PUSH CX

         MOV CX,80H

  LOP1:  CALL DELAY1

         LOOP LOP1

         MOV AL,00H

         OUT DX,AL

         MOV CX,80H

  LOP2:  CALL DELAY1

         LOOP LOP2

         POP CX

         LOOP TTT

         MOV AL,30H

         OUT DX,AL

         CALL DELAY10

         MOV AL,21H

         OUT DX,AL

         CALL DELAY10

         CALL DELAY10

         CALL DELAY10

         CALL DELAY10

         MOV AL,20H

         OUT DX,AL

         MOV CX,0040H

   GGG:  MOV AL,0CH

         OUT DX,AL

         PUSH CX

         MOV CX,80H

   LOP3: CALL DELAY1

         LOOP LOP3

         MOV AL,00H

         OUT DX,AL

         MOV CX,80H

   LOP4: CALL DELAY1

         LOOP LOP4

         POP CX

         LOOP GGG

         MOV AL,30H

         OUT DX,AL

         CALL DELAY10

         MOV AH,06H

         MOV DL,0FFH

         INT 21H

         JNZ PPP

         JMP LLL

   PPP:  MOV AX,4C00H

         INT 21H

  DELAY1 PROC NEAR

         PUSH CX

         MOV CX,0FFFFH

   CCC:  LOOP CCC

         POP CX

         RET

  DELAY1 ENDP

 DELAY10 PROC NEAR

         PUSH AX

         PUSH CX

         MOV CX,0F00H

   UUU:  CALL DELAY1

         LOOP UUU

         POP CX

         POP AX+*+*

         RET

 DELAY10 ENDP

   CODE  ENDS

         END START

六.实验结果

1、汇编成功

2、 经测试灯是按照指定规律变化

七.实验现象

      红黄绿变化的规律为:两个路口红灯全亮;南北路口绿灯亮,东西路口红灯亮;南北路口绿灯灭,东西路口红灯亮;两个路口黄灯闪烁;两个路口红灯全亮;东西路口绿灯亮,南北路口红灯亮;东西路口绿灯灭,南北路口红灯亮;两个路口黄灯闪烁;依次从头到尾循环出现

八.思考题:程序中红,绿,黄灯点亮和熄灭的延时时间是如何设定的?

     答:通过用延时子程序CALL  DELAY  10的次数来设定

九.实验感想

 通过本实验,基本掌握了8255A接口芯片的编程方法,熟悉了DOS环境,同时,也进一步提高了自己的实践动手能力,并且对微机原理及接口技术这门课程有了更深的了解和认识。

相关推荐