北航微机原理实验(源程序)-教师手册

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

目录
第一章:汇编基础与硬件基础 (2)
实验二TPC2300A集成开发环境 (2)
内容1.2.2 分段存储结构和数据变量的定义 (2)
内容1.2.3 汇编程序设计---数据串操作 (3)
内容1.2.4 汇编程序设计--循环和分支程序 (3)
内容1.2.5 汇编程序设计---子程序及其调用 (4)
内容1.2.6 汇编程序设计--DOS中断调用 (5)
实验三TPC-2003A接口箱系统硬件及逻辑电路 (6)
内容1.3.2 I/O译码电路 (6)
第二章基础实验 (7)
实验一8253接口芯片基础 (7)
内容2.1.1 8253用于手动脉冲计 (7)
内容2.1.2 8253用于分频 (8)
实验二8255接口芯片基础 (9)
内容2.2.1 8255作为基本输入输出 (9)
内容2.2.2 8255方式0的应用-红绿灯控制 (9)
内容2.2.3 8255对8253GATE的控制 (11)
内容2.2.4: 手动脉冲计数输出显示 (13)
第三章综合实验 (14)
实验一AD/DA接口芯片基础 (14)
内容3.1.1:ADC0809的数据采集功能 (14)
内容3.1.2:DAC0832的波形输出功能 (15)
实验一8253/8255综合实验 (16)
内容3.2.1: 继电器控制 (16)
内容3.2.2: 自动计数输出显示 (18)
内容3.2.3 直流电机转速显示与计算 (19)
实验三8253/8255/DAC0832综合实验 (23)
内容3.3.1:直流电机转速控制 (23)
内容3.3.2:直流电机测速 (25)
实验四8255综合实验 (28)
内容3.4.1:步进电机控制 (28)
第一章:汇编基础与硬件基础
;* *;
实验二 TPC2300A集成开发环境
;* *;
内容1.2.2 分段存储结构和数据变量的定义
;******************************************;
;* *;
;* 编写程序统计字符串str的字符个数, *;
;*存于counts单元。

字符串以“$”为结束符, *;
;* 长度小于255个字符。

*;
;* *;
;* Create Data: 26/06/2009 YHB *;
;* Prog ID: 1-2-2.asm *;
;******************************************;
mydata segment
str db 'assemble language$'
counts db ?
mydata ends
mycode segment
assumecs:code,ds:data
start: mov ax,data
mov ds, ax
mov cl,0
mov bx, offset str
next: cmp [bx] '$'
jz exit
inc cl
inc bx
jmp next
exit: mov counts,cl ;存储字符的个数
mov ah,4ch
int21h
mycode ends
end start
;******end of program 1-2-2.asm**************
内容1.2.3 汇编程序设计---数据串操作
;************************************************;
;;* *;
;* 将buffa开始的连续字节单元数 *;
;* 传送到buffb开始的连续字操作数单元 *;
;* (不考虑数据块的重叠) *;
;* *;
;* Create Data: 26/06/2009 YHB *;
;* Prog ID: 1-2-3.asm *;
;************************************************;
data segment
bufa dw 0234h,2345h,987fh
dw 0c234h,0012h,1234h,7890h
bufb dw 7dup(?)
data ends
code segment
assume cs:code,ds:data
mov ax,data
mov ds, ax
mov si,offset bufa
mov di,offset bufb
mov cx,14
next: mov ax,[si]
mov [di],ax
inc si
inc di
loop next ;循环传送,直到传送完
mov ah,4ch
int 21h
code ends
end start
;**********end of progme 1-2-3.asm***************;
内容1.2.4 汇编程序设计--循环和分支程序
;************************************************;
;* 在字节存储单元d1、d2和d3中存有三个 *;
;*不相等无符号数,由大到小排列后存于d1、d2、d2,*;
;* 注意使用无符号数比较时的转移指令。

*;
;* Create Data: 26/06/2009 YHB *;
;* Prog ID: 1-2-4.asm *;
;************************************************;
data segment
d1 db 30h
d2 db 0e2h
d3 db 80h
data ends
code segment
assume cs:code,ds:data
start: mov ax,data
mov ds,ax
mov al,d1
mov bl,d2
mov cl,d3
cmp al,bl
ja lpl
xchg al,bl
lpl: cmp al,cl
ja lp2
xchg al,cl
lp2: cmp bl,cl
ja lp3
xchg bl,cl
lp3: mov d1,al
mov d2,bl
mov d3,cl
mov ah,4ch
int 21h
code ends
end start
;**********end of program 1-2-4.asm*************;
内容1.2.5 汇编程序设计---子程序及其调用
;* *************************************************;
;* 计算3个带符号数的绝对值之和,三个数长度为 *;
;* 字类型,要求用子程序计算绝对值,用主程序实现 *;
;* 累加;整理实验结果。

*;
;* Create Data: 26/06/2009 YHB *;
;* Prog ID: 1-2-5.asm *;
;************************************************;
mydata segment
data dw -20h, 34h, 21h,23a5h,1200h
absm dw 0
mydata ends
mycode segment
assume cs:mycode, ds:mydata
start: mov ax,mydata
mov ds,ax
mov si, offset data
mov cx, 5
xor bx,bx
rept: mov ax,[si]
call subabs
add bx,ax
inc si
inc si
loop rept
mov absm,bx ;绝对值之和
mov ah,4ch
int 21h
subabs proc near
and al, al
jns bck
neg al
bck: ret
subabs endp
mycode ends
end start
;**********end of program 1-2-5.asm**************;
内容1.2.6 汇编程序设计--DOS中断调用
;************************************************;
;* 利用DOS中断6号功能调用,在屏幕上显示字符A~Z *;
;* *;
;* Create Data: 26/06/2009 YHB *;
;* Prog ID: 1-2-6.asm *;
;************************************************;
code segment
assume cs:code
start: mov dl,'A'
mov cx,26
next: mov ah,06h ;DOS调用,功能好06,dl中为在屏幕上显示的字符 int 21h
inc dl ;下一个字符ASCII
loop next ;显示下一个字符
mov ah,4ch
int 21h
code ends
end start
;**********end of program 1-2-6.asm*************;
实验三 TPC-2003A接口箱系统硬件及逻辑电路
内容1.3.2 I/O译码电路
;************************************************;
;;* Create Data: 26/06/2009 YHB *;
;* Prog ID: 1-3-2.asm *;
;************************************************;
ioport equ 0ec00h-0280h; 0ec00h替换为本机基地址
outport1 equ ioport+2a0h
outport2 equ ioport+2a8h
code segment
assume cs:code
start: mov dx,outport1
out dx,al
call delay ;调延时子程序
mov dx,outport2
out dx,al
call delay ;调延时子程序
mov ah,1 ;bios中断调用,判断有无键入字符,
int 16h
je start ;zf=1无键入,转start继续,zf=0有键入,结束
mov ah,4ch
int 21h
delay proc near ;延时子程序
mov bx,2000 ;修改计数值可改变LED亮灭频率
lll: mov cx,0
ll: loop ll
dec bx
jne lll
ret
delay endp
code ends
end start
;**********end of program 1-3-2.asm*************;
第二章基础实验
实验一 8253接口芯片基础
内容2.1.1 8253用于手动脉冲计
; ;************************************************;
*; Create Data: 26/06/2009 YHB *;
;* Prog ID: 2-1-1.asm *;
;************************************************;
ioport equ 0d400h-0280h ; 0ec00h替换为本机基地址
io53ctl equ ioport+283h
io53_0 equ ioport+280h
code segment
assume cs:code
start: mov al,14h ;设置8253通道0为工作方式2,二进制计数
mov dx,io53ctl ;8253 控制口端口
out dx,al ;送控制字
mov dx,io53_0 ;计数器0端口
mov al,0fh ;设计数初值0FH (0aQ)
out dx,al ;送计数初值
lll: in al,dx ;读计数初值
call disp ;调显示子程序
push dx ;保护端口值,防止中断调用破坏
mov ah,06h ;6号中断,
mov dl,0ffh ;表示该功能调用是输入,如果dl不是0ffh,表示把dl中的asciia码输出 int 21h
pop dx
jz lll ;循环显示
mov ah,4ch ;退出
int 21h
disp proc near ;显示子程序
push dx ;dx为端口地址,先保存起来,防止后面调用中断功能时使用dl寄存器时破坏dx值 and al,0fh ;首先取低四位,al值是读取的计数器的当前计数值
mov dl,al
cmp dl,9 ;判断当前计数值是否<=9
jle num ;若为'0'-'9',其ASCII码值为计数值加30H,0+30h=30h
add dl,7 ;否为'A'-'F',其ASCII码值为计数值加37H, A+37h=41h
num: add dl,30h
mov ah,02h ;中断功能号02,显示ASCII值为dl的字符
int 21h
mov dl,0dh ;显示回车符
int 21h
mov dl,0ah ;显示换行符
int 21h
pop dx
ret ;子程序返回
disp endp
code ends
end start
;**********end of program 2-1-1.asm*************;
内容2.1.2 8253用于分频
; ;**************************************************;
;* 用1MHz的频率源,输出1Hz的频率, *;
;* 用示波器或者逻辑笔观察 *;
;* *;
;* Create Data: 26/06/2009 YHB *;
;* Prog ID: 2-1-2.asm *;
;************************************************;
ioport equ 0ec00h-0280h ;0ec00h替换为本机基地址
io8253a equ ioport+280h
io8253b equ ioport+281h
io8253d equ ioport+283h
code segment
assume cs:code
start: mov dx,io8253d ;向8253写控制字
mov al,36h ;使0通道为工作方式3
out dx,al ;写入控制字
mov ax,1000 ;写入循环计数初值1000
mov dx,io8253a
out dx,al ;先写入低字节
mov al,ah
out dx,al ;后写入高字节
mov dx,io8253d
mov al,76h ;设8253通道1工作方式2
out dx,al ;写入控制字
mov ax,1000 ;写入循环计数初值1000
mov dx,io8253b
out dx,al ;先写低字节
mov al,ah
out dx,al ;后写高字节
mov ah,4ch ;程序退出
int 21h
code ends
end start
;;**********end of program 2-1-2.asm*************;实验二 8255接口芯片基础
内容2.2.1 8255作为基本输入输出
;************************************************;
;* *;
;* 端口设置: C口输入,A口输出 *; ;* *;
;* Create Data: 26/06/2009 YHB *;
;* Prog ID: 2-2-1.asm *;
;************************************************; ioport equ 0d400h-0280h ;0d400h替换为本机基地址
io55a equ ioport+288h
io55ctl equ ioport+28bh
io55c equ ioport+28ah
code segment
assume cs:code
start: mov dx,io55ctl ;设8255为C口输入,A口输出 mov al,8bh
out dx,al ;送入控制字
inout: mov dx,io55c ;从C口输入一数据
in al,dx
mov dx,io55a ;从A口输出刚才自C口
out dx,al ;所输入的数据
mov dl,0ffh ;判断是否有按键,dos中断功能06h
mov ah,06h
int 21h
jz inout ;若无,则继续自C口输入,A口输出;zf=1表示无键按下
mov ah,4ch ;否则返回DOS
int 21h
code ends
end start
;;**********end of program 2-2-1.asm*************;
内容2.2.2 8255方式0的应用-红绿灯控制
;************************************************;
;*;* *;
;* 十字路口红绿灯模拟 *;
;* 端口各灯的设置: *;
;* L7红 L6黄 L5绿 0 0 L2红 L1黄 L0绿 *;
;* L7L6L5 模拟南北向,L2L1L0模拟东西向 *;
;* *;
;* Create Data: 26/06/2009 YHB *;
;* Prog ID: 2-2-2.asm *;
;************************************************;
data segment
ioport equ 0ec00h-0280h ;0ec00h替换为本机基地址
io55a equ ioport+288h
io55b equ ioport+289h
io55c equ ioport+28ah
io55ctl equ ioport+28bh
traffctl db 24h,44h,81h,82h
msg db 0dh,0ah, 'check L7 L6 L5 and L2 L1 L0 ', 0dh,0ah,'press any ken to stop program',0ah,0dh,'$' data ends
code segment
assume cs:code,ds:data
start: mov ax,data
mov ds,ax
mov dx,offset msg ;屏幕上显示提示信息
mov ah,09h ;中断功能号09h
int 21h
ctn: mov dx,io55ctl
mov al,90h
out dx,al ;设置8255为C口输出
mov dx,io55c
mov al,traffctl
out dx,al ;南北绿灯,东西红灯,L7~L0 =24h
call delay
mov al,traffctl+1 ;南北黄灯,东西红灯,L7~L0 =44h
out dx,al
call delay
mov al,traffctl+2 ;南北红灯,东西绿灯,L7~L0 =81h
out dx,al
call delay
mov al,traffctl+3 ;南北红灯,东西黄灯,L7~L0 =82h
out dx,al
call delay
push dx
mov ah,06h
mov dl,0ffh
int 21h
pop dx
jz ctn ;没有键按下,继续循环
exit: mov ah,4ch
int 21h
delay proc near ;延时子程序,采用寄存器自减实现
mov cx,0ffffh
cxdown: mov si,0ffffh
sidown: dec si
jnz sidown
loop cxdown
ret
delay endp
code ends
end start
;;**********end of program 2-2-2.asm*************;
内容2.2.3 8255对8253GATE的控制
;********************************************************;
;* 8255对8253计数器门控 *; ; create 06/07/2009 by YHB *;
; program ID: 2-2-3.asm *;
;*********************************************************; ioport equ 0ec00h-0280h
io55ctl equ ioport+28bh ;8255控制口
io55a equ ioport+288h ;8255 A口
io55c equ ioport+28ah ;8255C
io53ctl equ ioport+283h ;8253控制
io53_2 equ ioport+282h ;8253计数器2
io53_1 equ ioport+281h ;8253计数器1
io53_0 equ ioport+280h ;8253计数器0
data segment
mess db 'Press any key to exit the program',0aH,0dH,'$'
led db 3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh,77h,7ch,39h,5eh,79h,71h
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,io55ctl ;8255,方式0,A口输出,C口高四位输入,C口低四位输出 mov al,88h
out dx,al
mov dx,io53ctl
mov al,36h ;计数器0,方式3,先读写低8位,再读写高8位
out dx,al ;送控制端口
mov dx,io53_0
mov ax,10000 ;输入时钟1MHZ,计数初值50000,输出时钟周期50ms
out dx,al
nop
nop
mov al,ah
out dx,al
mov dx,io53ctl
mov al,54h ;计数器1,方式2,只读写低8位
out dx,al ;送控制端口
mov dx,io53_1
mov al,100 ;输入CLK1接OUT0,计数初值100
out dx,al ;送初值
mov dx,io53ctl
mov al,94h ;计数器2,方式2,只读写低8位
out dx,al
mov dx,io53_2
mov al,0fh ;计数初值
out dx,al
ctn: mov dx,io53_2;读当前计数值并显示
call leddisp
mov ah,01h ;判断有无键按下
int 16h
jnz stp ;zf=0,有键按下,返回,zf=1,无键按下,继续程序 mov dx,io55c
in al,dx ;读C口状态
and al,80h ;判断PC7是否为1
jnz seth ; 如为1,转seth,
mov dx,io55c
mov al,0h ;否者,设置PC0为低电平
out dx,al
jmp ctn
seth: mov dx,io55c ;设置PC0为高电平
mov al,0ffh
out dx,al
jmp ctn
stp: mov ah,4ch ;退出程序,返回DOS
int 21h
leddisp proc near
push dx
in al,dx ;读当前计数值
mov bx,offset led ;bx为数码表的起始地址
xlat ;求出相应的段码代表的LED数字,存于al
mov dx,io55a ;从8255的A口输出
out dx,al
pop dx
ret
leddisp endp
code ends
end start
;****************end of program 2-2-3.asm******************************;
内容2.2.4: 手动脉冲计数输出显示
************************************************;
;* *;
;* 输入为脉冲发生器,在LED上输出F~0的计数值 *;
;* *;
;* Create Data: 26/06/2009 YHB *;
;* Prog ID: 2-2-3.asm *;
;************************************************;
data segment
ioport equ 0ec00h-0280h ;0ec00h由本机接口卡实际基地址代替
io55a equ ioport+288h
io55b equ ioport+289h
io55c equ ioport+28ah
io55ctl equ ioport+28bh
io53_0 equ ioport+280h
io53_1 equ ioport+281h
io53_2 equ ioport+282h
io53ctl equ ioport+283h
led db 3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh,77h,7ch,39h,5eh,79h,71h
mesg db 0dh,0ah,'check led for timing value, press any key to stop program',0dh,0ah,'$' data ends
code segment
assume cs:code,ds:data
start: mov ax,data
mov ds,ax
mov dx,io55ctl ;使8255的A口为输出方式
mov ax,80h
out dx,al
mov dx,io55a ;LED清屏
mov al,0
out dx,al
mov dx,offset mesg ;屏幕上显示提示
mov ah,09h
int 21h
mov dx,io53ctl ;向8253写控制字
mov al,14h ;使0通道为工作方式2,二进制计数
out dx,al
mov al,0fh ;计数初值
mov dx,io53_0
out dx,al
ctn: call leddisp ;调LED显示子程序
push dx ;保存8253-2通道端口地址
mov ah,06h
mov dl,0ffh
int 21h
pop dx
jz ctn ;没有键按下时,继续循环
mov ah,4ch ;有键按下,退出
int 21h
leddisp proc near
push dx
in al,dx ;读当前计数值
mov bx,offset led ;bx为数码表的起始地址
xlat ;求出相应的段码代表的LED数字,存于al
mov dx,io55a ;从8255的A口输出
out dx,al
pop dx
ret
leddisp endp
code ends
end start
;;**********end of program 2-2-3.asm*************;第三章综合实验
实验一 AD/DA接口芯片基础
内容3.1.1:ADC0809的数据采集功能
;************************************************;
;* *;
;* ADC0809的数据采集功能 *;
;* *;
;* Create Data: 26/06/2009 YHB *; ;* Prog ID: 3-1-1.asm *; ;************************************************; ioport equ 0ec00h-0280h ;0ec00h替换为本机基地址io0809a equ ioport+298h
code segment
assume cs:code
start: mov dx,io0809a ;启动A/D转换器out dx,al
mov cx,0ffh ;延时
delay: mov si,0ffh ;选择显示刷新速率
delay1: dec si
jnz delay1
loop delay
in al,dx ;从A/D转换器输入数据
mov bl,al ;将AL保存到BL
mov cl,4
shr al,cl ;将AL右移四位
;bios 中断调用。

相关文档
最新文档