接口实验报告


一、实验目的及要求:

目的:通过本次综合实验,使学生综合运用《计算机接口与通信技术》、汇编语言以及电子技术等课程的内容,为以后从事计算机检测与控制工作奠定一定的基础。

要求:

1.主要掌握并行I/O接口芯片8253、8255A、中断控制芯片8259A等可编程器件的使用。

2.学会用汇编语言编写一个较完整的实用程序。

3.了解微机接口应用开发过程:分析需求、设计原理图、编程、调试、撰写报告等。

二、实验内容:

利用《计算机接口与通信技术》课程中所学的主要可编程接口芯片8253、8255A和微机内部的中断控制器8259A设计并实现一个模拟的电子时钟,通过小键盘控制在LED数码管上显示时间。

功能要求:

1.采用8253定时功能进行计时,每秒钟通过8259A向CPU发一次中断请求;

2.用6个LED数码管分别显示时间的分和秒,如0点0分显示为00——00;

3.设计一个小键盘来进行控制:

C键:清除,显示00——00;

G键:启动,开始计时;

D键:停止,时钟显示值保持不变;

E键:终止程序;

P键:设置分、秒的初始值。

三、实验连线:

1.8255A连线

1)将8255A的CS端与218~21F插孔相连

2.8253连线(构成一个方波发生器或分频器)

1)将分频器74LS393的B端与8MHz信号相连

2)将分频器74LS393的A端接 +5V

3)将8253的 CLK0与8MHz分频得到的250KHz信号(74LS393的Q4端)相连

4)将8253的OUT0和CLK1相连

5)将8253的GATE0、GATEl 接+5V

6)将8253的CS插孔接200~207

3.8259A连线

1)8253的OUT1和62芯总线槽IRQ2(B4)连接

4.LED连线

1)将数码显示器左边的CS端(在 U27和U28之间)接210~217

5.总连线图

见附录图1程序连线图

四、程序设计:

1.流程图:

见附录图2程序主流程图、图3键盘识别流程图

2.源程序:

见附录源程序

五、实验方法及步骤:

1.按照实验连线要求完成实验硬件连线

2.运用x86汇编语言知识,进行软件编程,实现各按键功能的汇编程序

1)编辑8255A的程序来实现实验板小键盘的输入识别。

2)编辑8253的程序将定时器0设为模式3(方波发生器),定时器1设为模式2(分频器),定时器0的输出脉冲作为定时器1的时钟输入。

3)编辑8259A的程序,中断请求通过62芯总线的 IRQ2端输入,用8253做中断源,并把8253的OUT1和62芯总线槽IRQ2(B4)连接好。

4)编辑LED的程序,实现7段数码管显示,位选锁存器(PORTBLT)地址为210H,段选锁存器(PORTSEG)地址为211H。

3.在DOS环境下完成软件程序的编译(TASM)、连接(LINK)

1)将编辑好的程序存放在含TASM、LINK可执行文件的目录下。

2)使用TASM *.ASM编译源文件形成*.OBJ。

3)使用LINK *.OBJ连接形成可执行文件*。

4.执行程序可执行文件,在实验板上进行相应的测试操作

1)运行可执行文件*。

2)观察实验板LED显示情况。

3)对C,D,G,E,P及各数字键进行测试。

六、实验结果:

经过对实验结果的分析,总结如下:

1)程序刚启动时LED自动从00--00开始计时

2)使用C键LED显示清零

3)使用P键可逐位设置电子时钟初始时间

4)使用G键可依据设置的初始时间开始计时

5)使用D键电子时钟计时暂停,可用G键继续执行

6)使用E键可退出程序

本次实验所要求的各项功能均经过测试且显示无误。

七、小组分工:

罗江:完成最终实验程序整合及机器调试,程序流程图及操作设计。

刘晨莹:完成最终实验连线及最终实验操作,连线图设计。

梁颖薇:完成4个基础实验程序调试及操作,实验报告整合。

赖宝亮:完成4个基础实验程序整合及连线,实验报告整合。

附录:

连线图

图1  程序连线图

流程图

图2  程序主流程图

图3  键盘识别流程图

源程序

data    segment

        min1    db      0

        min2    db      0

        gap1    db      10

        gap2    db      10

        sec1    db      0

        sec2    db      0

        count   dw      0

        count2  dw      0

        temp    db      0

        temp2   db      ?

        flag    db      1

        flag2   db      0

        code1   db      0

        LED     db      3fh,6,5bh,4fh,66h,6dh,7dh,7,7fh,6fh,40h

        mes2    db      'Press anykey can return to dos!',0ah,0dh,'$'

        table1  db      'cdefba9845673210wxysrpmg'

data    ends

code    segment

        assume cs:code,ds:data

start:

        mov     ax,     data

        mov     ds,     ax

        cli                  ;interrupt off

        mov     temp,   0

        mov     dx,     0dc03h

        mov     al,     36h

        out     dx,     al

        mov     dx,     0dc00h

        mov     al,     8

        out     dx,     al

        mov     al,     0

        out     dx,     al

        mov     dx,     0dc03h

        mov     al,     74h

        out     dx,     al

        mov     dx,     0dc01h

        mov     al,     160

        out     dx,     al

        mov     al,     0

        out     dx,     al

        ;counter0 and counter1 initialization 100*50--250 000/5 000

        ;50 interruptions per second

        mov     ah,     35h

        mov     al,     72h

        int     21h

        push    es

        push    bx  ;store former interrupt vector

        push    ds

        mov     dx,     seg     interrup

        mov     ds,     dx

        lea     dx,     interrup

        mov     ah,     25h

        mov     al,     72h

        int     21h     ;new interrupt vector

        pop     ds

        in      al,     21h;master 8259 interrupt enable

        and     al,     11111011b

                ;       76543210

        out     21h,    al

        in      al,     0a1h

        and     al,     11111011b

                ;       76543210

        out     0a1h,   al

        ;slavery 8259 interrupt enable

        lea     dx,     mes2

        mov     ah,     9

        int     21h

        mov     dx,     0d468h

        in      ax,     dx

        or      ax,     0900h

        out     dx,     ax

        ;9054 interrupt enable

        ;interrupt enable

agn:

        in      al,     21h

        or      al,     100b

        out     21h,    al

        mov     code1,  0

        mov     dx,     0dc1bh

        mov     al,     10000010b

        ;pa:out,pb:in   76543210

        out     dx,     al

        mov     al,     0

        mov     dl,     18h

        out     dx,     al

        inc     dx

        in      al,     dx

        ;read   port B

        and     al,     7

        cmp     al,     7

        jz      yzj

        call    mother

yzj:    in      al,     21h

        and     al,     11111011b

        out     21h,    al

        cmp     flag2,  1

        jz      outside

        mov     cx,     1000

yzj2:  

        mov     ah,     1

        int     16h

        loop    yzj2

        jz      agn

outside:

        mov     dx,     0d468h

        in      ax,     dx

        and     ax,     0f6ffh

        out     dx,     ax

        ;9054 interrupt disable

        in      al,     21h

        or      al,     100b

        out     21h,    al

        ;master 8259 interrupt disable

        in      al,     0a1h

        or      al,     100b

        out     0a1h,   al

        ;slavery 8259 interrupt disable

        pop     dx

        pop     ds

        mov     al,     72h

        mov     ah,     25h

        int     21h

        mov     ax,     4c00h

        int     21h

;缺省执行子程序

mother  proc

        mov     cx,     3

agn2:   shr     al,     1

        jnc     out1

        add     code1,  8

        loop    agn2

out1:

        mov     dx,     0dc1bh

        mov     al,     10010000b

        ;pb:out,pa:in,  76543210

        out     dx,     al

        mov     dx,     0dc18h

        in      al,     dx

        ;read   port    A

        cmp     al,     0ffh

        jz      exit

        mov     cx,     8

agn3:   shr     al,     1

        jnc     out2

        inc     code1

        loop    agn3

out2:

        mov     bx,     offset  table1

        mov     al,     code1

        xlat

        call    father

exit:   ret

mother  endp

;按键判断子程序

father  proc

        cmp     al,     'c'

        jnz     mm1

        call    wifec

        jmp     exit1

mm1:    cmp     al,     'g'

        jnz     mm2

        call    wifeg

        jmp     exit1

mm2:    cmp     al,     'd'

        jnz     mm3

        call    wifed

        jmp     exit1

mm3:    cmp     al,     'e'

        jnz     mm4

        call    wifee

        jmp     exit1

mm4:    cmp     al,     'p'

        jnz     exit1

        call    wifep

exit1:  ret

father  endp

;清空子程序

wifec   proc

        mov     min1,   0

        mov     min2,   0

        mov     sec1,   0

        mov     sec2,   0

        mov     flag,   0

        ret

wifec   endp

;继续执行子程序

wifeg   proc

        mov     flag,   1

        ret

wifeg   endp

;中断暂停子程序

wifed   proc

        mov     flag,   0

        ret

wifed   endp

;退出子程序

wifee   proc

        mov     flag2,  1

        ret

wifee   endp

;时间设置子程序

wifep   proc

        mov     dx,     0dc10h

        mov     al,     1

        mov     temp2,  al

        out     dx,     al

syq1:   call    readkey

        cmp     al,     '6'

        jl      syq2

        call    error

        jmp     syq1

syq2:   sub     al,     30h

        mov     min1,   al

        mov     dx,     0dc10h

        mov     al,     2

        mov     temp2,  al

        out     dx,     al

syq3:   call    readkey

        cmp     al,     ':'

        jl      syq4

        call    error

        jmp     syq3

syq4:   sub     al,     30h

        mov     min2,   al

        mov     dx,     0dc10h

        mov     al,     16

        mov     temp2,  al

        out     dx,     al

syq5:   call    readkey

        cmp     al,     '6'

        jl      syq6

        call    error

        jmp     syq5

syq6:   sub     al,     30h

        mov     sec1,    al

        mov     dx,     0dc10h

        mov     al,     32

        mov     temp2,  al

        out     dx,     al

syq7:   call    readkey

        cmp     al,     ':'

        jl      syq8

        call    error

        jmp     syq7

syq8:   sub     al,     30h

        mov     sec2,   al

        mov     flag,   0

        ret

wifep   endp

;出错子程序

error   proc

        push    ax

        push    bx

        push    cx

        push    dx

        mov     dx,     0dc11h

        mov     al,     11111111b

        out     dx,     al

        mov     dx,     0dc10h

        mov     al,     0ffh

        out     dx,     al

        mov     cx,     6

uuu:    call    delay2

        loop    uuu

        mov     al,     temp2

        out     dx,     al

        pop     dx

        pop     cx

        pop     bx

        pop     ax

        ret

error   endp

;读实验板小键盘子程序

readkey proc

begin1: mov     code1,  0

        mov     dx,     0dc1bh

        mov     al,     10000010b

                       ;76543210

        out     dx,     al

agn11:  mov     dx,     0dc19h

        in      al,     dx

        ;read   port b

        and     al,     7

        cmp     al,     7

        jz      agn11

        mov     cx,     3

agn22:  shr     al,     1

        jnc     out11

        add     code1,  8

        loop    agn22

out11:

        mov     dx,     0dc1bh

        mov     al,     90h

        ;pb:out,pa:in

        out     dx,     al

        mov     dx,     0dc18h

        in      al,      dx

        ;read   port A

        cmp     al,     0ffh

        jz      begin1

        mov     cx,     8

agn33:  shr     al,     1

        jnc     out22

        inc     code1

        loop    agn33

out22:

        mov     bx,     offset  table1

        mov     al,     code1

        mov     code1,  0

        xlat

        mov     cx,     5

agn66:  call    delay2

        loop    agn66

        ret

readkey endp

;parameter:al

;ASCII of The Charater pressed in the key board

;读小键盘延时子程序

delay2  proc

        push    ax

        push    bx

        push    cx

        push    dx

        mov     ah,     2ch

        int     21h

        mov     bl,     dl

agn55:  int     21h

        cmp     bl,     dl

        jz      agn55

        pop     dx

        pop     cx

        pop     bx

        pop     ax

        ret

delay2  endp

;中断子程序

interrup        proc    far

        push    ax

        push    bx

        push    cx

        push    dx

        push    si

        push    di

        push    bp

        push    ds

        push    es

        mov     ax,     data

        mov     ds,     ax

        mov     si,     1

        mov     ch,     0

        mov     cl,     temp

        mov     di,     cx

        inc     cx

agn1:   rol     si,     1

        loop    agn1

        ror     si,     1

        mov     cx,     si

        mov     al,     cl

        mov     dx,     0dc10h

        out     dx,     al

        mov     bl,     temp

        mov     bh,     0

        mov     di,     bx

        mov     al,     [di]

        lea     bx,     led

        xlat

        mov     dx,     0dc11h

        out     dx,     al

chg:

        inc     temp

        cmp     temp,   6

        jnz     kkk

        mov     temp,   0

kkk:

        cmp     flag,   0

        jz      quit

        inc     count

        cmp     count,  1000

        jl      quit

        mov     count,  0

        inc     sec2

        cmp     sec2,   10

        jl      quit

        mov     sec2,   0

        inc     sec1

        cmp     sec1,   6

        jl      quit

        mov     sec1,   0

        inc     min2

        cmp     min2,   10

        jl      quit

        mov     min2,   0

        inc     min1

        cmp     min1,   6

        jl      quit

        mov     min1,   0

quit:

        pop     es

        pop     ds

        pop     bp

        pop     di

        pop     si

        pop     dx

        pop     cx

        pop     bx

        pop     ax

        mov     al,     20h

        out     0a0h,   al

        out     20h,    al

        iret

interrup        endp

code    ends

        end     start

相关推荐