实验报告.doc
《实验报告.doc》由会员分享,可在线阅读,更多相关《实验报告.doc(14页珍藏版)》请在冰豆网上搜索。
微机原理与接口技术
实验报告
学号:
4091030
姓名:
贤会利
提交日期:
成绩:
东北大学秦皇岛分校
实验1可编程定时器/计时器(8253)
定时器
一、实验目的
掌握8253的基本工作原理和编程方法。
二、实验内容
按图16虚线连接电路,将计数器0设置为方式0,计数器初值为N(N≤0FH),用手动逐个输入单脉冲,编程使计数值在屏幕上显示,并同时用逻辑笔观察OUT0电平变化(当输入N+1个脉冲后OUT0变高电平)。
三、编程提示
8253控制寄存器地址 283H
计数器0地址 280H
计数器1地址 281H
CLK0连接时钟 1MHZ
四.实验原理图
五.实验流程图
六.原程序代码
;*************************;
;*8253方式0计数器实验*;
;*************************;
io8253a equ283h-0280h
io8253b equ280h-0280h
io_port_addre equ0cf8h ;32位配置地址端口
io_port_data equ0cfch ;32位配置数据端口
io_plx_id equ0540610b5h ;TPC卡设备及厂商ID
datasegment
io_9054base_addressdb4DUP(0) ;TPC卡9054芯片I/O基地址暂存空间
io_base_addressdb4DUP(0) ;TPC卡I/O基地址暂存空间
memory_base_addressdb4DUP(0) ;TPC卡MEMORY基地址暂存空间
interrupt_linedb2DUP(0) ;TPC卡中断号暂存空间
pcicardnotfind db0dh,0ah,'TPCpcicardnotfindoraddress/interrupterror!
!
!
',0dh,0ah,'$'
io9054baseaddressdb0dh,0ah,'TPCpcicard9054ChipI/OBaseAddress:
','$'
iobaseaddress db0dh,0ah,'TPCpcicardI/OBaseAddress:
','$'
memorybaseaddress db0dh,0ah,'TPCpcicardMemoryBaseAddress:
','$'
intnumber db0dh,0ah,'TPCpcicardInterruptLine:
','$'
enter_return db0dh,0ah,'$'
dataends
stackssegment
db100dup(?
)
stacksends
codesegment
assumecs:
code,ds:
data,SS:
STACKS,es:
data
.386
start:
movax,data
movds,ax
moves,ax
movax,stacks
movss,ax
callfindtpc1 ;查找TPC卡资源并显示
moval,14h;设置8253通道0为工作方式2,二进制计数
movdx,wordptrio_base_address
adddx,io8253a
outdx,al
movdx,wordptrio_base_address
adddx,io8253b;送计数初值为0FH
moval,0fh
outdx,al
lll:
inal,dx;读计数初值
calldisp;调显示子程序
pushdx
movah,06h
movdl,0ffh
int21h
popdx
jzlll
movah,4ch;退出
int21h
dispprocnear;显示子程序
pushdx
andal,0fh;首先取低四位
movdl,al
cmpdl,9;判断是否<=9
jlenum;若是则为'0'-'9',ASCII码加30H
adddl,7;否则为'A'-'F',ASCII码加37H
num:
adddl,30h
movah,02h;显示
int21h
movdl,0dh;加回车符
int21h
movdl,0ah;加换行符
int21h
popdx
ret;子程序返回
dispendp
findtpc1procnear ;查找TPC卡资源并显示
pushad
pushfd
movebx,080000000h
findtpc1_next:
addebx,100h
cmpebx,081000000h
jnzfindtpc1_continue
movdx,offsetpcicardnotfind ;显示未找到tpc卡提示信息
movah,09h
int21h
movah,4ch
int21h ;退出
findtpc1_continue:
movdx,io_port_addre
moveax,ebx
outdx,eax ;写地址口
movdx,io_port_data
ineax,dx ;读数据口
cmpeax,io_plx_id
jnzfindtpc1_next ;检查是否发现tpc卡
movdx,io_port_addre
moveax,ebx
addeax,14h
outdx,eax ;写地址口
movdx,io_port_data
ineax,dx ;读数据口
movdwordptrio_9054base_address,eax
andeax,1
jzfindtpc1_next ;检查是否为i/o基址信息
moveax,dwordptrio_9054base_address
andeax,0fffffffeh
movdwordptrio_9054base_address,eax;去除i/o指示位并保存
movdx,io_port_addre
moveax,ebx
addeax,18h
outdx,eax ;写地址口
movdx,io_port_data
ineax,dx ;读数据口
movdwordptrio_base_address,eax
andeax,1
jzfindtpc1_next ;检查是否为i/o基址信息
moveax,dwordptrio_base_address
andeax,0fffffffeh
movdwordptrio_base_address,eax ;去除i/o指示位并保存
movdx,io_port_addre
moveax,ebx
addeax,1ch
outdx,eax ;写地址口
movdx,io_port_data
ineax,dx ;读数据口
movdwordptrmemory_base_address,eax
andeax,1h
jnzfindtpc1_next ;检查是否为memory基址信息
moveax,dwordptrmemory_base_address
andeax,0fffffff0h
movdwordptrmemory_base_address,eax ;去除memory指示位并保存
movdx,io_port_addre
moveax,ebx
addeax,3ch
outdx,eax ;写地址口
movdx,io_port_data
ineax,dx ;读数据口
andeax,0ffh
movwordptrinterrupt_line,ax ;去除interrupt其它指示位并保存
movdx,offsetio9054baseaddress ;显示i/o提示信息
movah,09h
int21h
movax,wordptrio_9054base_address
callfindtpc1_disp ;显示i/o基地址
movdx,offsetiobaseaddress ;显示i/o提示信息
movah,09h
int21h
movax,wordptrio_base_address
callfindtpc1_disp ;显示i/o基地址
movdx,offsetmemorybaseaddress ;显示memory提示信息
movah,09h
int21h
movax,wordptrmemory_base_address+2
callfindtpc1_disp ;显示memory基地址高16位
movax,wordptrmemory_base_address
shrax,16
callfindtpc1_disp ;显示memory基地址低16位
movdx,offsetintnumber ;显示interrupt提示信息
movah,09h
int21h
movax,wordptrinterrupt_line
callfindtpc1_disp ;显示interrupt号
movdx,offsetenter_return ;加回车符,换行符
movah,09h
int21h
popfd
popad
ret
findtpc1endp
findtpc1_dispprocnear ;显示子程序
pushdx
pushcx
pushbx
movcx,4
movbx,16
findtpc1_disp_loop1:
pushax
pushcx
subbx,4
movcx,bx
shrax,cl
andal,0fh ;首先取低四位
movdl,al
cmpdl,9 ;判断是否<=9
jlefindtpc1_disp_num ;若是则为'0'-'9',ASCII码加30H
adddl,7 ;否则为'A'-'F',ASCII码加37H
findtpc1_disp_num:
adddl,30h
movah,02h ;显示
int21h
popcx