微机实验报告

时间:2024.3.31

微机原理与接口技术

实验报告

校徽

姓名:张楠乔

学号:  10213030  

班级:自动化1004

指导教师:周永华

实验一交通灯控制实验

一、实验目的

       通过并行接口8255实现十字路口交通灯的模拟控制,进一步掌握对并行口的使用。

二、实验内容

       实验内容,如图1连接电路,L7、L6、L5作为南北路口的交通灯与PC7、PC6、PC5相连,L2、L1、L0作为东西路口的交通灯与PC2、PC1、PC0相连,编程使六个灯按交通灯变化规律亮灭。

图1 连接图

要求:

十字路口交通灯的变化规律要求:

(1)南北路口的绿灯、东西路口的红灯同时亮30秒左右。

(2)南北路口的黄灯闪烁若干次,同时东西路口的红灯继续亮。

(3)南北路口的红灯、东西路口的绿灯同时亮30秒左右。

(4)南北路口的红灯继续亮、同时东西路口的黄灯亮闪烁若干次。

(5)转(1)重复。

三、实验流程图

图2 流程图

四、试验程序:

data segment

  pc equ 0c40ah

  pd equ 0c40bh

data ends

stack1 segment stack

  dw 100Hdup(?)

stack1 ends

code segment

  assume cs:code,ds:data,ss:stack1

start:    mov dx,data

          mov ds,dx      ;初始化

          mov al,80h

          mov dx,pd

          out dx,al

    s:    mov al,24h

          mov dx,pc

          out dx,al

          call delay3    ;南北绿灯亮、东西红灯亮3秒

          mov cx,6

   y1:    mov al,44h

          out dx,al

          call delay1

          mov al,04h

          out dx,al

          call delay1

          loop y1       ;南北绿灯灭,南北黄灯闪,东西红灯亮

          mov al,81h

          out dx,al

          call delay3   ;东西红灯灭,南北红灯、东西绿灯亮3秒

          mov cx,6

   y2:    mov al,82h

          out dx,al

          call delay1

          mov al,80h

          out dx,al

          call delay1

          loop y2      ;东西绿灯灭,东西黄灯闪,南北红灯亮

          mov dl,0ffh

          mov ah,6

          int 21h

          jz s

          mov ah,4ch

          int 21h      ;查询是否有键按下

delay3 proc            ;延时3秒子程序

          push cx

          push ax

          mov cx,0afffh

t1:       mov ax,0ffffh

t2:       dec ax

          jnz t2

          loop t1

          pop ax

          pop cx

          ret

delay3 endp

delay1 proc        ;延时半秒子程序

          push cx

          push ax

          mov cx,1d55h

t3:       mov ax,0ffffh

t4:       dec ax

          jnz t4

          loop t3

          pop ax

          pop cx

          ret

delay1 endp

code ends

          end start

五、实验步骤

(1)将PC总线接口卡插在任意扩展槽中(已接好)。

(2)用50芯线扁平电缆线连接接口卡和实验台。

(3)如图1所示连接线路。

(4)打开实验箱电源,启动TCP-2003实验系统软件环境。

(5)测试8255、LED和串口是否完好。

六、实验现象:

南北路口的绿灯、东西路口的红灯同时亮3秒左右,然后南北路口的黄灯闪烁若干次,东西路口的红灯继续亮,接着南北路口的红灯、东西路口的绿灯同时亮3秒左右,然后南北路口的红灯继续亮、同时东西路口的黄灯亮闪烁若干次。如此循环。结果与实验要求相符。

七、实验心得

本实验的重要一部分就是延时子程序,编写程序时候要根据流程图,这样就从一定程度上简化了实验,还有就是实验的调试过程,一定要细心又有耐心

实验二可编程定时器/计数器(1)

一、实验目的

掌握8253的基本工作原理和编程方法

二、实验内容

1、按电路图虚线连接电路,将计数器0设置为方式0,计数器初值N(N≤0FH),用手动逐个输入单脉冲,编程使计数值在屏幕上显示,并同时用逻辑笔观察OUT0电平变化(当输入N+1个脉冲后OUT0变高电平)。

实验电路图:

三、试验流程图

四、实验程序:

CODE SEGMENT

ASSUME CS:CODE

START:

     MOV DX,0EC03H

     MOV AL,10H       ;设置计数器0工作方式0

     OUT DX,AL

     MOV DX,0EC00H

     MOV AL,03H       ;设置N为3(可更改设置)

     OUT DX,AL

L1:  MOV DX,0EC00H

     IN AL ,DX        ;读计数器0的计数值

     AND AL,0FH       ;屏蔽高四位

     CMP AL,09H

     JLE L2          

     ADD AL ,07H

L2:  ADD AL, 30H      ;判断大小并将其变为ASCII码

     MOV DL ,AL

     MOV AH,02H

     INT 21H          ;2号功能显示计数值

     MOV DL,0DH       ;回到本行最前面

     MOV AH,02H

     INT 21H

     MOV DL,0FFH

     MOV AH,06H

     INT 21H          ;6号功能输入任意字符

     JZ L1            ;无键按下,执行L1循环

     MOV AH,4CH       ;

     INT 21H

 CODE ENDS            ;结束

  END START

五、实验结果及分析:

程序运行之后逻辑笔代表低电平的绿灯亮,当按下脉冲按键后,屏幕上会显示数字3,每按一下按键数字就会减1,直到为0,且同时指示灯由绿灯变成红灯。

计数脉冲由CLK端输入,计数初值写入16位计数初值寄存器,并加载到16位减‘1’计数执行部件。方式0计数工程中,OUT一直保持低电平,直到计数达‘0’,OUT输出由低电平变为高电平。

可编程定时器/计数器(2

一、实验目的

掌握8253的基本工作原理和编程方法

二、实验内容

按图连接电路,将计数器0、计数器1分别设置为方式3,计数初值设为1000,用逻辑笔观察OUT1输出电平的变化(频率为1Hz)

电路图:

 

三、实验流程图:

四、实验程序:

CODE SEGMENT

ASSUME CS:CODE

START: MOV AL,36H       ;计数器0为工作方式3,先读低字节再读高字节

      MOV DX,0EC03H

      OUT DX,AL

      MOV AX,1000      ;设置计数初值

      MOV DX,0EC00H

      OUT DX,AL

      MOV AL,AH

      OUT DX,AL        ;送计数初值至计数器0

      MOV AL,76H       ;计数器1工作方式3

      MOV DX,0EC03H

      OUT DX,AL

      MOV DX,0EC01H

      MOV AX,1000      ;设置计数初值

      OUT DX,AL

      MOV AL,AH

      OUT DX,AL

      MOV AH,4CH      ;返回操作系统

      INT 21H

CODE ENDS

  END START

五、实验结果

计数器0输入1MHz作为时钟,工作在方式3方波发生器,计数初值为1000,输出1000Hz的方波,此方波做为计数器1的时钟接入,而计数器1也工作在方式3方波发生器,输出1Hz的方波,用逻辑笔观察看到的现象为红、绿灯不停交替闪烁。

实验三中断实验

一、 实验目的

1、掌握PC机中断处理系统的基本原理

2、学会编写中断服务程序

二、 实验原理与内容

1、实验原理

PC机用户可使用的硬件中断只有可屏蔽中断由8259中断控制器管理中断控制器用于接收外部的中断请求信号经过优先级判别等处理后向CPU发出可屏蔽中断请求 IBMPC、PC/XT机内有一片8259中断控制器对外可以提供8个中断源

中断源中断类型号 中断功能IRQ0 08H 时钟

IRQ1 09H 键盘

IRQ2 0AH 保留

IRQ3 OBH 串行口2

IRQ4 0CH 串行口1

IRQ5 0DH 硬盘

IRQ6 0EH 软盘

IRQ7 0FH 并行打印机

8个中断源的中断请求信号线IRQ0 IRQ7在主机的62线ISA总线插座中可以引出系统已设定中断请求信号为边沿触发普通结束方式对于PC/AT及286以上微机内又扩展了一片8259中断控制 IRQ2用于两片8259之间级连对外可以提供16个中断源

中断源 中断类型号 中断功能 IRQ8 070H 实时时钟

IRQ9 071H 用户中断

IRQ10 072H 保留

IRQ11 O73H 保留

IRQ12 074H 保留

IRQ13 075H 协处理器

IRQ14 076H 硬盘

IRQ15 077H 保留

PCI总线中的中断线只有四根 INTA# INTB# INTC# INTD# 它们需要通过P&P的设置来和某一根中断相连接才能进行中断申请

 

2、实验内容

实验电路如图5-8 直接用手动产单脉冲作为中断请求信号只需连接一根导线要求每按一次开关产生一次中断在屏幕上显示一次 TPC pci card Interrupt 中断10次后程序退出

编程提示:

1. 由于9054的驱动程序影响直写9054芯片的控制寄存器, 中断实验需要在纯DOS的环境中才能正常运行。

2. 由于TPC卡使用PCI总线, 所以分配的中断号每台微机可能都不同,编程时需要了解当前的微机使用那个中断号并进行设置。获取方法是在纯DOS环境中,运行一个读PCI配置空间的程序“PORTR.EXE”,该程序能够获得本机TPC板卡或所有PCI板卡的硬件资源,如IO、内存、中断占用情况。然后根据获得的中断请求号码来修改程序中的中断向量、中断掩码的参数,并重新编译链接后即可。

3. 由于TPC卡使用9054芯片连接微机,所以在编程使用微机中断前需要使能9054的中断功能代码如下:

mov dx,ioport_cent+68h ;设置 tpc 卡中9054芯片io口,使能中断

inax,dx

or ax,0900h

outdx,ax

其中IOPORT_CENT是9054芯片寄存器组的I/O起始地址 ,每台微机可能都不同, 编程时 需要了解当前的微机使用哪段并进行设置,获取方法请参看汇编程序使用方法的介绍。+68H的偏移是关于中断使能的寄存器地址 设置含义如下:

三、实验流程图

四、实验程序

;386以上微机适用

;纯dos下才能使用

;tasm4.1或以上编译

data segment

int_vect EQU 071H ;中断0-7的向量为:08h-0fh,中断8-15的向量为:70h-77h

irq_mask_2_7 equ 011111011b ;中断掩码,中断0-7时从低至高相应位为零,中断8-15时第2位为零

irq_mask_9_15 equ 011111101b ;中断0-7时全一,中断8-15时从低至高相应位为零

ioport_centequ 0d800h ;tpc卡中9054芯片的io地址

csregdw ?

ipregdw ? ;旧中断向量保存空间

irq_timesdw 00h ;中断计数

msg1db 0dh,0ah,'TPC pci card Interrupt',0dh,0ah,'$'

msg2db 0dh,0ah,'Press any key to exit!',0dh,0ah,'$'

msg3db 0dh,0ah,'Press DMC to interrupt 10 times and exit!',0dh,0ah,'$'

data ends

stacks segment

db 100 dup (?)

stacks ends

code segment

assumecs:code,ds:data,ss:stacks,es:data

start:

;Enable Local Interrupt Input

.386

cli

movax,data

movds,ax

moves,ax

movax,stacks

movss,ax

mov dx,ioport_cent+68h ;设置tpc卡中9054芯片io口,使能中断

inax,dx

or ax,0900h

outdx,ax

moval,int_vect ;保存原中断向量

mov ah,35h

int 21h

movax,es

movcsreg,ax

movipreg,bx

movax,cs ;设置新中断向量

movds,ax

movdx,offsetint_proc

moval,int_vect

mov ah,25h

int 21h

in al, 21h ;设置中断掩码

and al, irq_mask_2_7

out 21h, al

inal, 0a1h

and al, irq_mask_9_15

out 0a1h, al

movax,data

movds,ax

movdx,offset msg2

mov ah,09h

int 21h

movdx,offset msg3

mov ah,09h

int 21h

mov irq_times,0ah

sti

loop1:

cmp irq_times,0 ;等待中断并判断中断10次后退出

jz exit

mov ah,1

int 16h

jnz exit ;按任意键退出

jmp loop1

exit: cli

movbl, irq_mask_2_7 ;恢复中断掩码

notbl

inal, 21h

or al, bl

out 21h, al

movbl, irq_mask_9_15

notbl

inal, 0a1h

or al, bl

out 0a1h, al

movdx,ipreg ;恢复原中断向量

movax,csreg

movds,ax

mov ah,25h

moval,int_vect

int 21h

mov dx,ioport_cent+68h ;设置tpc卡中9054芯片io口,关闭中断

inax,dx

and ax,0f7ffh

outdx,ax

mov ax,4c00h

int 21h

int_proc proc far ;中断处理程序

cli

push ax

push dx

push ds

decirq_times

movax,data ;Interrupt to do

movds,ax

movdx,offset msg1

mov ah,09h

int 21h

mov al,20h ;Send EOI

out 0a0h,al

out 20h,al

pop ds

pop dx

pop ax

sti

iret

int_procendp

code ends

end start

五、实验现象

每按下一次中断按钮,产生中断并在电脑屏幕上显示一次中断信息,当中断十次后,则结束程序,回到DOS界面。

;386以上微机适用

;纯dos下才能使用

;tasm4.1或以上编译

;*********************;

;*       中断        *;

;*********************;

data segment

 int_vect EQU 073H             ;中断0-7的向量为:08h-0fh,中断8-15的向量为:70h-77h

 irq_mask_2_7 equ 11111011b    ;中断掩码,中断0-7时从低至高相应位为零,中断8-15时第2位为零

 irq_mask_9_15 equ 11110111b   ;中断0-7时全一,中断8-15时从低至高相应位为零

 ioport_cent equ 0E800h ;tpc 卡中9054芯片的io地址

 csreg  dw      ?

 ipreg  dw      ?       ;旧中断向量保存空间

 irq_times      dw      00h     ;中断计数

 msg1    db      0dh,0ah,'TPC pci card Interrupt',0dh,0ah,'$'

 msg2    db      0dh,0ah,'Press any key to exit!',0dh,0ah,'$'

 msg3    db      0dh,0ah,'Press DMC to interrupt 10 times and exit!',0dh,0ah,'$'

data ends

stack segment stack

    db 100 dup (?)

stack ends

code segment

    assume cs:code,ds:data,ss:stack,es:data

start:

;Enable Local Interrupt Input

.386

    cli

    mov ax,data

    mov ds,ax

    mov es,ax

    mov ax,stack

    mov ss,ax

    mov dx,ioport_cent+68h  ;设置 tpc 卡中9054芯片io口,使能中断

    in ax,dx

    or ax,0900h

    out dx,ax

    mov al,int_vect         ;调用35号功能,保存原中断向量int_vect

    mov ah,35h

    int 21h

    mov ax,es

    mov csreg,ax                 

    mov ipreg,bx             ;ipreg csreg是旧中断向量保存空间

    mov ax,seg int_proc            ;调用25号功能设置新中断向量

    mov ds,ax                       ;中断服务程序的的段基址送DX

    mov dx,offset int_proc          ;中断服务程序的的偏移地址送DX

    mov al,int_vect

    mov ah,25h

    int 21h

    in      al, 21h                   ;设置中断掩码

    and     al, irq_mask_2_7           ;主片端口地址21H,D2允许中断11111011b

    out     21h, al

    in      al, 0a1h

    and     al, irq_mask_9_15          ;从片端口地址A1H,D3允许中断11110111b

    out     0a1h, al

    mov ax,data

    mov ds,ax

    mov dx,offset msg2      

    mov ah,09h                        ;09号功能显示'Press any key to exit!'

    int 21h

    mov dx,offset msg3                ;显示'Press DMC to interrupt 10 times and exit!'

    mov ah,09h   

    int 21h      

    mov irq_times,0ah

    sti                              ;允许可屏蔽中断请求进入         

loop1:

    cmp irq_times,0         ;等待中断并判断中断10次后退出

    jz exit

    mov ah,1                ;BIOS功能调用int 16h ah=01H检测字符是否准备好

    int 16h                 ;ZF=0,表示无字符可接收,ZF=1,表示有字符可接收

    jnz exit                ;按任意键退出IF=1

    jmp loop1

exit:   cli

    mov     bl, irq_mask_2_7        ;恢复中断掩码

    not     bl

    in      al, 21h

    or      al, bl               

    out     21h, al

    mov     bl, irq_mask_9_15

    not     bl

    in      al, 0a1h

    or      al, bl

    out     0a1h, al

    mov dx,ipreg                    ;恢复原中断向量int_vect

    mov ax,csreg

    mov ds,ax

    mov ah,25h

    mov al,int_vect

    int 21h

    mov dx,ioport_cent+68h          ;设置 tpc 卡中9054芯片io口,关闭中断

    in  ax,dx

    and ax,0f7ffh

    out dx,ax

    mov ax,4c00h                    ;返回操作系统

    int 21h

int_proc proc far

   

    push ax

    push dx

    push ds

    dec irq_times

    mov ax,data             ;Interrupt to do

    mov ds,ax

    mov dx,offset msg1

    mov ah,09h

    int 21h

    mov al,20h              ;Send EOI

    out 0a0h,al

    out 20h,al

    pop ds

    pop dx

    pop ax

    sti                    ;开中断

    iret

int_proc endp

code ends

    end start

六、实验心得

中断实验相对来说是比较难的一次实验,它要求在纯DOS界面下执行,因此得用DOS命令调用程序,并进行编译链接执行。这就增加了本来已经熟悉的实验软件操作的难度。在实验中,需注意以下几个问题:

1.  要装入新的中断前需将该处原中断取出保存,当用完后还需再次把原中断装入,以防止原中断内容被覆盖或者发生改变。

2.  在本次实验中还需将用到的仪器先使能,否则无法正常工作。

3.  中断需要用的堆栈段,因此必须定义足够的堆栈段。

实验四模/数转换器

一、实验目的

了解模/数转换的基本原理,掌握ADC0809的使用方法。

二、实验内容

实验电路原理图如图5-5。通过实验台左下角电位器RW1输出0~5V直流电压送入ADC0809通道0(IN0), 编程采集IN0输入的电压,在屏幕上显示出转换后的数据(用16进制数)

5-5 模数转换电路

三、实验提示

1. ADC0809的IN0口地址为298H,IN1口地址为299H。

2. IN0单极性输入电压与转换后数字的关系为:

NUU256iREF=

其中Ui为输入电压,UREF为参考电压,这里参考电压为PC的机+5V电源。

3. 一次A/D转换的程序可以为

MOV DX, 口地址;启动转换

OUT DX, AL

;延时

IN AL,DX ;读取转换结果放在AL中

四、实验流程图


五、实验程序

STACK1 SEGMENT PARA STACK

  DW 100 DUP(?)

STACK1 ENDS

CODE SEGMENT

ASSUME CS:CODE,SS:STACK1

START:MOV DX,0C418H         ;ADC0809地址为0C410H

      MOV AL,0              ;向其地址写入0,启动ADC0809进行模数转换

      OUT DX,AL

      MOV CX,0FFFH         ;延时,使ADC0809完成转换

   T1:MOV DI,0FFFFH

   T2:DEC DI

      JNZ T2

      LOOP T1

      IN AL,DX              ;将转换结果读进来

      MOV BL,AL             ;将数据的高,低位存入BL位存入AL

      AND AL,11110000B

      AND BL,00001111B

      MOV CL,4

      SHR AL,CL

      CMP AL,0AH            ;比较AL的值与0AH的大小

      JAE L0                ;若大于等于0   AH转L0

      ADD AL,30H            ;若小于0AH加30H转换成它的ASCII码

      JMP L1

   L0:ADD AL,37H            ;大于0AH时加37H转换成它的ASCII码

   L1:CMP BL,0AH            ;比较BL的值与0AH的大小

      JAE L2                ;若大于等于0AH转L2

      ADD BL,30H            ;若小于0AH加30H转换成它的ASCII码

      JMP L3

   L2:ADD BL,37H

   L3:MOV DL,AL             ;2号功能调用,显示高位

      MOV AH,02H

      INT 21H

      MOV DL,BL             ;显示低位

      MOV AH,02H

      INT 21H

      MOV DL,13             ;回车

      MOV AH,02H

      INT 21H

      MOV DL,10             ;换行

      MOV AH,02H

      INT 21H

      MOV DL,0FFH           ;按任意键退出

      MOV AH,06H

      INT 21H

      JZ START

      MOV AH,4CH

      INT 21H

CODE ENDS

 END START

六、实验现象

调节滑动变阻器,屏幕上显示的数值(00~FF)随着电阻的改变而改变,并且是整屏幕显示。

七、实验心得

本次实验是将电压值经过AD后把模拟量变化为了数字量,使得表示更精确了,也方便于读数。启动转换后需要等待一段时间,以防还没有转换好就读出结果,造成错误。输出结果要求用16进制显示,因此还需将结果转换为对应的ASCII码。

实验五串行通信

一、   实验目的

1、 掌握串行接口芯片8250的基本原理和编程方法

2、 熟悉PC机串行的基本连接方法

3、 进一步了解串行通信的基本原理

二、   实验内容

1、 PC机RS-232串口自发自收

2、 自发自收实验:将RS232C的DB9的电缆插头第2脚和第3脚短接,然后编程实现。

3、 2台PC的串行通信:用 RS232C的DB9的电缆(交叉线)将两台机器连接,然后编程实现收发数据。

三、 硬件连接

四、实验程序

1-单机通信(自发自收)

CODE SEGMENT           

    ASSUME CS:CODE

START:  MOV AL,10000000B    ;8250初始化,设DLAB=1

    MOV DX,3FBH

    OUT DX,AL

    MOV AX,30H      ;写入除数低字节

    MOV DX,3F8H

    OUT DX,AL

    MOV AL,AH       ;写入除数高字节

    MOV DX,3F9H

    OUT DX,AL

    MOV AL,00001010B    ;7位数据,1位停止,奇校验

    MOV DX,3FBH

    OUT DX,AL       ;写入线路控制寄存器

    MOV AL,00010000B    ;自检控制

    MOV DX,3FCH

    OUT DX,AL       ;写入Modem控制寄存器

    MOV AL,0

    MOV DX,3F9H

    OUT DX,AL       ;写中断允许寄存器,屏蔽中断

WAIT_FOR:

    MOV DX,3FDH     ;读线路状态寄存器

    IN AL,DX

    TEST AL,00011110B   ;出错否

    JNZ ERROR       ;出错,转ERROR

    TEST AL,00000001B   ;接收数据就绪否

    JNZ RECEIVE     ;就绪,转接受

    TEST AL,00100000B   ;发送寄存器空否,不空,返回等待

    JZ WAIT_FOR

    MOV AH,1

    INT 21H         ;读键盘

    MOV DX,3F8H     ;发送

    OUT DX,AL

    JMP WAIT_FOR        ;返回等待

RECEIVE:

       PUSH CX

       PUSH AX

       MOV CX,02000H

   T1: MOV AX,0FFFFH

   T2: DEC AX

       JNZ T2

       LOOP T1    ;延时程序

    MOV DX,3F8H     ;读接收数据

    IN AL,DX

    AND AL,01111111B    ;保留7位数据

    CMP AL,03H      ;是Ctrl+C?

    JNZ CHAR

    MOV AH,4CH      ;返回DOS

    INT 21H

CHAR:   PUSH AX

    MOV DL,AL

    MOV AH,2H       ;显示接收字符

    INT 21H

    POP AX

    JMP WAIT_FOR        ;返回等待

ERROR:  MOV DX,3FDH     ;出错则清除线路状态寄存器

    IN AL,DX

    MOV DL,'?'      ;显示'?'

    MOV AH,02H

    INT 21H

    JMP WAIT_FOR

CODE ENDS

    END START  

2-双机通信

发送程序:

CODE SEGMENT

    ASSUME CS:CODE

START:  MOV AL,80H      ;8250初始化,设DLAB=1

    MOV DX,3FBH

    OUT DX,AL

    MOV AX,0030H

    MOV DX,3F8H

    OUT DX,AL       ;写入除数低字节

    MOV AL,AH

    MOV DX,3F9H

    OUT DX,AL       ;写入除数高字节

    MOV AL,0AH      ;7位数据,1位停止,奇校验

    MOV DX,3FBH

    OUT DX,AL       ;写入线路控制寄存器

    MOV AL,03H      ;数据终端就绪,请求发送数据

    MOV DX,3FCH

    OUT DX,AL       ;写入Modem控制寄存器

    MOV AL,0

    MOV DX,3F9H

    OUT DX,AL       ;写中断允许寄存器,屏蔽中断

WAIT_FOR:

    MOV DX,3FDH     ;读线路状态寄存器

    IN AL,DX

   

    TEST AL,00100000B   ;发送寄存器空否,不空,返回等待

    JZ WAIT_FOR

SEND:   MOV AH,1

    INT 21H        

    CMP AL,21H     

    JZ EXIT        

    MOV DX,3F8H     ;读键盘,若是'!',返回DOS,若不是,则发送

    OUT DX,AL

    JMP WAIT_FOR        ;返回等待

EXIT:   MOV AX,4C00H

    INT 21H

CODE ENDS

    END START

接收程序:

CODE SEGMENT           

    ASSUME CS:CODE

START:  MOV AL,80H      ;8250初始化,设DLAB=1

    MOV DX,3FBH

    OUT DX,AL

    MOV AX,0030H

    MOV DX,3F8H

    OUT DX,AL       ;写入除数低字节

    MOV AL,AH

    MOV DX,3F9H

    OUT DX,AL       ;写入除数高字节

    MOV AL,0AH      ;7位数据,1位停止,奇校验

    MOV DX,3FBH

    OUT DX,AL       ;写入线路控制寄存器

    MOV AL,03H      ;数据终端就绪,请求发送数据

    MOV DX,3FCH

    OUT DX,AL       ;写入Modem控制寄存器

    MOV AL,0

    MOV DX,3F9H

    OUT DX,AL       ;写中断允许寄存器,屏蔽中断

WAIT_FOR:

    MOV DX,3FDH     ;读线路状态寄存器

    IN AL,DX

   

    TEST AL,00000001B   ;接收数据就绪否

    JNZ RECEIVE     ;转接收

   

    JMP WAIT_FOR        ;返回等待

RECEIVE:

    MOV DX,3F8H     ;读接收数据

    IN AL,DX

    AND AL,01111111B    ;保留7位数据

    CMP AL,21H      ;是'!'?

    JNZ CHAR

    MOV AX,4C00H        ;返回DOS

    INT 21H

CHAR:   PUSH AX

    MOV DL,AL

    MOV AH,2        ;显示接收字符

    INT 21H

    POP AX

    JMP WAIT_FOR        ;返回等待

CODE ENDS

    END START

五、  实验现象及分析:

自发自收:当把2口和3口用跳线连上时,输入带屏幕显示字符后,屏幕上会出现两个相同的字符,当把跳线拔出,屏幕上显示一个字符。

双机通信:发送机发出一个字符,接收机屏幕上会显示该字符。当发送字符为“!”时,程序停止运行

六、  实验心得:

老师提供了本实验的程序文件,所以难度相对较低,只需读懂程序即可。

实验六抢答器

一、实验目的

1、了解微机化竞赛抢答器的基本原理。

2、进一步学习使用并行接口。

二、实验内容

下图为竞赛抢答器(模拟)的原理图,逻辑开关K0~K7代表竞赛抢答按钮0~7号,当某个逻辑电平开关置“1”时,相当某组抢答按钮按下。在七段数码管上将其组号(0~7)显示出来,并使喇叭响一下。从键盘上按空格键开始下一轮抢答,按其它键程序退出。

三、编程分析

1、设置8255为C口输入、A口输出,读取C口数据,若为0表示无人抢答,若不为0则有人抢答。根据读取数据可判断其组号。从键盘上按空格键开始下一轮抢答,按其它键程序退出。

2、计算组号的算法:

  组号=C口数据连续除以2得到商为零的除法运算次数

      MOV AH,0

      MOV DL,2

      MOV CL,0

JISUAN: DIV DL

      INC CL

      CMP AL,0

      JNZ JISUAN

      DEC CL

  MOV AL,CL

3、响铃的DOS功能调用:

MOV DL, 7 ; 响铃ASCII码为07

MOV AH ,2

             INT 21H

四、程序设计流程图

五、汇编语言程序:

DATA SEGMENT

   LIST DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H 

DATA ENDS

STACK1 SEGMENT STACK

   K DW 200 DUP(?)

STACK1 ENDS

CODE SEGMENT

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

START:

       MOV AX,DATA                ;初始化数据

       MOV DS,AX

        MOV AX,STACK1

        MOV SS,AX

        MOV DX,0C40BH              ;初始化8255,设定C口输入、A口输出

       MOV AL,10001001B

       OUT DX,AL

BIN:   MOV DX,0C408H              ;清除A口,消除影响

        MOV AL,0

       OUT DX,AL

L1:    MOV DX,0C40AH                  ;读入C口

       IN AL,DX

       CMP AL,0                   ;与0比较,为零则循环等待

       JZ L1   

      

        MOV DL,0

CNT:   SHR AL,1              ;逻辑判断抢答组号

       JZ OP

       INC DL

       JMP CNT

OP:

       MOV AL,DL

       MOV BX,OFFSET LIST

       XLAT               ;查表指令,计算物理地址

       MOV DX,0C408H

       OUT DX,AL                  ;A口输出    

RING:

       MOV DL,7                   ;ASCII码为07,响铃

       MOV AH,2

       INT 21H 

L2:

       MOV AH,08H

       INT 21H

       CMP AL,20H                 ;检测空格键下一轮抢答

       JZ BIN

        MOV AH,4CH

       INT 21H

CODE ENDS

  END START

六、实验现象及分析

初始状态为数码管全亮。拨下任一开关后,铃响,同时数码管显示该组的组号。按空格键,恢复到初始状态。

七、实验心得:

组号的计算跟显示是个难点,首先是计算,要用到移位、循环、比较,显示则要用到查表,所以看似简单的抢答器程序设计其实并不简单,因为覆盖的知识点较多,但是,经过前几次的实验,这几方面都已经经受多次考验了,总体上也不算难。

实验总结

通过微机实验,我不仅熟悉了试验箱和这个软件平台,同时,也进一步巩固了课本所学知识,并且更深刻的了解到8255 、8259等芯片的用途及初始化,编程注意事项等。在做实验的过程中,我也注意到了一些课堂上不曾留意的小细节,弥补了自己学习中的不足。


更多相关推荐:
微机实验报告

微机实验报告实验名称KeilC的使用与汇编语言上机操作一任务要求实验目的熟悉KeilC环境通过在KeilC环境下调试字节拆分合并程序数据块清零程序加法程序掌握汇编语言程序的调试方法加深对BCD码ASCII码堆栈...

微机实验报告~最新

实验一DEBUG的启动及其基本命令的使用一实验目的掌握DEBUG的基本命令及其功能二实验操作步骤6设堆栈指针SP20xxHAX3000HBX5000H请仿照例程的格式编一程序段将AX和BX的内容进行交换请用堆栈...

微机实验报告

实验一汇编语言上机操作训练比较字符串一实验目的1学习程序设计的基本方法和技能2熟练掌握汇编语言设计编写调试和运行二实验内容和要求1汇编语言程序上机操作方法编写一程序比较两个字符串STRING1和STRING2所...

东南大学微机实验报告(二)

姓名专业评定成绩东南大学实验报告实验二汇编语言程序设计学号实验室审阅教师1微机实验及课程设计实验目的进一步熟悉汇编语言的编辑宏汇编链接和运行的基本概念熟练掌握动态调试程序TDDEBUG的常用指令和窗口功能学会用...

微机原理实验报告

微机原理与应用课程实验报告实验分工报告人同组人实验时间20xx1210课程设计一题目要求1在数据段首址为0100H开始的内存区1按从大到小的顺序顺次存入二进制数150共16个字节的数据2将上述源区内容传送到目的...

微机原理实验报告

微机原理实验报告实验一两个多位十进制数相加的实验一实验目的学习数据传送和算术运算指令的用法熟悉在PC机上建立汇编链接调试和运行汇编语言程序的过程二实验内容将两个多位十进制数相加要求被加数和加数均以ASCII码形...

工业用微型计算机实验报告

工业用微型计算机实验报告地市郑州市准考证号01221400426姓名孟志威学科专业机械制造与自动化指导教师课题名称工业用微型计算机河南省高等教育自学考试20xx年4月20日1实验一8255动态LED数码显示实验...

电子科技大学微机实验报告(含思考题)河畔下的哈】实验6

实验六基于ARM的键盘及数码管驱动实验1掌握键盘及数码管驱动原理2掌握ZLG7290芯片的使用方法3掌握I2C总线的协议标准4掌握Linux下键盘驱动的实现方法编写测试程序控制键盘和数码管1了解ARM9处理器结...

微机原理及应用实验报告

微机原理及应用实验报告班级姓名学号中南大学机电工程学院精密测控实验室实验二软件程序设计1实验目的1掌握MCS51单片机指令系统及用汇编语言编程技巧2了解和熟悉用MCS51单片机仿真开发机调试程序的方法2实验内容...

华工微机实验报告

微机系统与接口实验电子与信息学院电类联合班何俊实验二将ASCII码表示的十进制数转换为二进制数1将ASCII码表示的十进制数转换为二进制数DATASEGMENTORG3500HNUM1DB5DUP0ORG351...

微机实验报告

微机原理与与接口技术实验报告学院应用物理与材料学院专业电子信息技术光电工程班级学号11060439学生姓名庞建富实验日期指导老师成绩评定五邑大学计算机学院制表1实验一一实验名称系统认识实验二实验目的1掌握TD系...

微机原理实验报告

计算机学院微机接口实验报告实验一汇编语言程序设计实验一实验目的熟悉汇编语言程序设计及TDPITE80X86实验环境的使用二实验设备PC机一台TDPITE实验装置或TDPITC实验装置一套三实验内容在数据段定义1...

微机实验报告(32篇)