1、微机系统与接口实验报告56 东南大学微机系统与接口实验报告实验五 8253计数器/定时器实验六 8255并行输入输出姓 名: 学 号: 专 业: 电强化 实 验 室: 计算机硬件技术 实验时间: 2015年05月 05 日 报告时间: 2015年05月12日评定成绩: 审阅教师: 实验五8253 计数器/定时器一. 实验目的1.掌握计数器/定时器8253的基本工作原理和编程应用方法;2.了解掌握8253的计数器/定时器典型应用方法。 注:实验四的中断实验上次已经完成二.实验内容(1)计次计数器:将计数器0设置为方式2,计数器初值为N(N0FH),用手动逐个输入单脉冲,编程使计数值在屏幕上显示,
2、并同时用逻辑笔观察OUT0电平变化。(2)定时器与级联:将计数器0、计数器1分别设置为方式3,计数初值设为1000,用逻辑笔观察OUT1输出电平的变化(频率1HZ)。(3)选做:使用PC微机内8253驱动声音接口IBM-PC机扬声器发声驱动系统如图所示。由机内的8255I/O接口的PB0控制8253通道2的定时计数;PB1来控制扬声器的接通和断开,以此来发声。8255PB口地址为61H;8253通道2口地址为42H,控制口为43H。编程使扬声器发出12345671 (对应的频率分别为262、294、330、347、392、440、494、523Hz)的数字乐声。三.基本实验原理(1)计次计数器
3、:实验接线图如下: 程序设计流程图:参考程序:ioport equ 0B800H-0280H io8253a equ ioport+283H io8253b equ ioport+280Hstacks segment stack db 100 dup (?) stacks ends code segment assume cs:code,ss:stacks main proc far start: mov ax,stacks mov ss,ax mov al,14h ;设置8253通道0为工作方式0,二进制计数 mov dx,io8253a out dx,al mov dx,io8253b ;
4、送计数初值为0FH mov al,0fh out dx,alZZZ:in al,dx ; 读计数初值 call disp ; 调显示子程序 push dx mov ah,06h mov dl,0ffh int 21h pop dx jz ZZZ mov ah,4ch ; 退出 int 21h main endp disp proc near ;显示子程序 push dx and al,0fh ; 首先取低四位 mov dl,al cmp dl,9 ;判断是否=9 jle num ;若是则为0-9,ASCII码加30H add dl,7 ;否则为A-F,ASCII码加37H num:add dl
5、,30h mov ah,02h ;显示 int 21h mov dl,0dh ;加回车符 int 21h mov dl,0ah ;加换行符 int 21h pop dx ret ;子程序返回 disp endp code ends end start(2)定时器与级联:实验接线图如下: 程序设计框图如下:参考程序:ioport equ 0b800h-0280h io8253a equ ioport+280h ;0地址 io8253b equ ioport+281h ;1地址io8253c equ ioport+283h ;控制 stacks segment stack db 100 dup (
6、?) stacks ends code segment assume cs:code,ss:stacks main proc far start: mov ax,stacks mov ss,ax mov dx,io8253c ;向8253写控制字 mov al,36h ;使0通道为工作方式3,0011 0110 out dx,al mov ax,1000 ;写入循环计数初值1000,注意是AX mov dx,io8253a out dx,al ;先写入低字节 mov al,ah out dx,al ;后写入高字节 mov dx,io8253c mov al,76h ;设8253通道1工作方式3
7、,0111 0110 out dx,almov ax,1000 ;写入循环计数初值1000 mov dx,io8253b out dx,al ;先写低字节 mov al,ahout dx,al ;后写高字节 mov ah,4ch ;程序退出int 21h main endp code ends end start(3)选做:IBM PC机内扬声器接线原理图如图所示:参考程序:dseg segment freq dw 262,294,330,349,392,440,494,523 ;扬声器发声各频率值 tim dw 400dseg endssseg segment stack dw 256 du
8、p(?)sseg endscseg segmentmain proc far assume cs:cseg,ds:dsegstart: mov ax,dseg mov ds,ax mov si,0again: mov di,freqsi mov bx,tim call gen add si,2 cmp si,16 jnz again mov AX,4C00h int 21h main endpgen proc near mov al,0b6h ;设置8253通道2方式3二进制计数 out 43h,al mov dx,12h mov ax,12928 ; DX AX=896*533h=18*65
9、536+12928=1.19M div di out 42h,al ;8253通道2口设置初值 mov al,ah out 42h,al in al,61h ;读8255PB口 mov ah,al or al,3 out 61h,alwait1: mov cx,0hdelay: mov ax,10 ;延时子程序delay2: nop nop dec ax jnz delay2 loop delay dec bx jnz wait1 mov al,ah out 61h,al retgen endpcseg endsend start三. 方案实现与测试实验步骤:1.正确接线后,先用I/O命令方式
10、初始化,检查计数器状态是否正常,再调试程序,具体如下:(1)运行TPC集成环境或portr程序,测试卡地址;运行点阵演示程序(正常后继续)。系统如果不稳定,可用MS-DOS方式编程运行。 (2)8253计数器0方式0:Gate0-+5V, TD/Debug下单步 O c403 14 (初始化方式字), O C400 10;(初值), CLK-按键或连续脉冲输入后 I C400, 检查计数变化;编程运行;(3)8253定时器0,1方式3,级联接线:TD/Debug下单步 O c403 36 (CH0方式字), O C400 E8; O C400 03; (1000初值低/高8位), O c403
11、 76 (CH1方式字), O C401 E8; O C401 03; (1000初值),I C400,IC401 观察计数变化。2.计次计数器实验现象:手动逐个输入单脉冲之后,计数值从F减至1,然后在out0输出一个高电平,再输入单脉冲,out0保持高电平不变。(不知道该怎么拍照片就没拍,只拍了实验连线图,望老师见谅)连线图如下:3.定时器与级联实验现象:给计数器0接入1MHZ的CLK信号,计数器0为方式2,在计满1000后在out0输出一个低电平给计数器1的CLK信号;计数器1为方式3,形成一个方波发生器,最终输出OUT1接至LED灯观察,频率在两次分频之后变成1HZ,将out1连至LED
12、灯,可以发现LED灯亮灭的频率为1HZ。连线图如下:4.选做实验现象:PC机内内部扬声器发出“1 2 3 4 5 6 7 8 9 1”的乐音,十分正常四.分析与总结在实验之前,只是通过在理论课上的学习了解了8253计数器芯片的内部结构,工作原理和初始化编程等理论上的知识。而通过本实验,我熟悉了8253的接口逻辑和内部结构、工作原理、了解8253的6种工作方式。首先我们按照实验指导书上的教程完成了以工作方式0下的计数程序。在此程序下,计数器不能够循环工作,out0输出一个高电平之后不能变回低电平,但如果更改程序代码将工作方式调整为工作方式1,计数器就可以循环工作,可以看到逻辑笔的逻辑电平可以循环
13、点亮。第二个实验定时器的级联让我理解了如何将一个固有的1MHZ的频率通过两次分频变成1HZ频率的信号,这需要选择正确的8253的工作方式才能完成。最后,还编写了程序来使计数器产生一定频率的信号来使扬声器产生一定的频率的声音信号,产生17的声音。这次实验进行的比较顺利。实验六 8255并行输入输出一.实验目的与内容实验目的:1)掌握8255方式0的工作原理及使用方法,利用直接输入输出进行控制显示;2)掌握8段数码管的动态刷新显示控制;3)分析掌握8255工作方式时的使用及编程,进一步掌握中断处理程序的编写。实验内容:(1)8255方式0:简单输入输出实验电路如图3.7-1,8255C口输入接逻辑
14、电平开关K0K7,编程A口输出接LED显示电路L0L7;用指令从C口输入数据,再从A口输出。(2)编程将A口L0-L7控制成流水灯,流水间隔时间由软件产生;流水方向由K0键在线控制,随时可切换;流水间隔时间也可由K4K7键编码控制,如0000对应停止,0001对应1秒,1111对应15秒,大键盘输入ESC键退出。(3)8段数码管静态显示:按图3.7-2连接好电路,将8255的A口PA0PA6分别与七段数码管的段码驱动输入端a相连,位码驱动输入端S1接+5V(选中),S0、dp接地(关闭)。编程从键盘输入一位十进制数字(09),在七段数码管上显示出来。(4)8段数码管动态显示:按图3.7-3连接
15、好电路,七段数码管段码连接不变,位码驱动输入端S1、S0接8255C口的PC1、PC0。编程在两个数码管上显示“56”。(注意字符变换之间应使段位全灭,避免显示“影子”)二.基本实验原理1.实验电路图如下:程序设计流程框图:参考程序:ioport equ 0b800h-0280h ;tpc卡中设备的io地址io8255a equ ioport+288h ;8255A口地址 io8255b equ ioport+28bh ;8255控制寄存器端口地址io8255c equ ioport+28ah ;8255C口地址stacks segment stack db 100 dup (?)stacks
16、 endscode segment assume cs:code,ss:stacksmain proc farstart: mov ax,stacks mov ss,ax mov dx,io8255b ;设8255为C口输入,A口输出 mov al,8bh out dx,alinout: mov dx,io8255c ;从C口输入一数据 in al,dx mov dx,io8255a ;从A口输出刚才自C口 out dx,al ;所输入的数据 mov dl,0ffh ;判断是否有按键 mov ah,06h int 21h jz inout ;若无,则继续自C口输入,A口输出 mov ah,4c
17、h ;否则返回DOS int 21hmain endpcode ends end start2.电路连线图与1相同参考程序:data segmentioport equ 0b800h-0280hio8255a equ ioport+288hio8255b equ ioport+28bhio8255c equ ioport+28ahdata endsstacks segment stack db 100 dup (?)stacks endscode segment assume cs:code,ds:data,ss:stacksstart: mov ax,stacks mov ss,ax mov
18、 dx,io8255b ;设8255为C口输入,A口输出 mov al,8bh out dx,alinout: mov cl,01h mov dx,io8255c ;从C口输入一数据 in al,dx test al,01 jne right ;k0为高电平时向右 jmp left ;k0为低电平时向左 right: mov dx,io8255c ;从C口输入一数据 in al,dx and al,11110000b ;判断高四位 cmp al,00h ;判断延时,ah=00时停止,ah=10时延时移动显示 je right mov al,cl call delay1 rol cl,1 mov
19、 dx,io8255c ;从C口输入一数据 in al,dx test al,01 jne right ;k0为高电平时向右 jmp left left: mov dx,io8255c ;从C口输入一数据 in al,dx and al,11110000b ;判断高四位 cmp al,00h ;判断延时,ah=00时停止,ah=10时延时移动显示 je left mov al,cl call delay1 ror cl,1 mov dx,io8255c ;从C口输入一数据 in al,dx test al,01 jne right ;k0为高电平时向右 jmp left delay1 proc
20、 near mov dx,io8255a ;从A口输出刚才自C口 out dx,al ;所输入的数据 call delay mov al,0 out dx,al call delay retdelay1 endpDELAY PROC NEAR ;延迟子程序 push cx push bx mov bx,0fffhcc: mov cx,0ffffhccc: loop ccc dec bx jnz cc pop bx pop cx retDELAY ENDPcode ends end start3.电路连线图如下:参考程序:data segmentioport equ 0b800h-0280hio
21、8255a equ ioport+288hio8255b equ ioport+28bhled db 3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fhmesg1 db 0dh,0ah,Input a num (0-9h):,0dh,0ah,$data endsstacks segment stack db 100 dup (?)stacks endscode segment assume cs:code,ds:data,ss:stacksstart: mov ax,stacks mov ss,ax mov ax,data mov ds,ax mov dx,io82
22、55b ;使8255的A口为输出方式 mov ax,80h out dx,alsss: mov dx,offset mesg1 ;显示提示信息 mov ah,09h int 21h mov ah,01 ;从键盘接收字符 int 21h cmp al,0 ;是否小于0 jl exit ;若是则退出 cmp al,9 ;是否大于9 jg exit ;若是则退出 sub al,30h ;将所得字符的ASCII码减30H mov bx,offset led ;bx为数码表的起始地址 xlat ;求出相应的段码 mov dx,io8255a ;从8255的A口输出 out dx,al jmp sss ;
23、转SSSexit: mov ah,4ch ;返回DOS int 21hcode endsend start4.电路连线图如下:程序设计流程如下:参考程序:data segmentioport equ 0b800h-0280h ;tpc卡中设备的io地址io8255a equ ioport+28ah ;8255C口地址io8255b equ ioport+28bh ;8255控制寄存器端口地址io8255c equ ioport+288h ;8255A口地址led db 3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh ;段码buffer1 db 5,6 ;存放要显
24、示的个位和十位bz dw ? ;位码data endsstacks segment stack db 100 dup (?)stacks endscode segment assume cs:code,ds:data,ss:stacksstart: mov ax,stacks mov ss,ax mov ax,data mov ds,ax mov dx,io8255b ;将8255设为A口输出 mov al,80h out dx,al mov di,offset buffer1 ;设di为显示缓冲区loop2: mov bh,02lll: mov byte ptr bz,bh push di
25、dec di add di, bz mov bl,di ;bl为要显示的数 pop di mov al,0 mov dx,io8255a out dx,al mov bh,0 mov si,offset led ;置led数码表偏移地址为SI add si,bx ;求出对应的led数码 mov al,byte ptr si mov dx,io8255c ;自8255A的口输出 out dx,al mov al,byte ptr bz ;使相应的数码管亮 mov dx,io8255a out dx,al mov cx,3000delay: loop delay ;延时 mov bh,byte p
26、tr bz shr bh,1 jnz lll mov dx,0ffh mov ah,06 int 21h je loop2 ;有键按下则退出 mov dx,io8255a mov al,0 ;关掉数码管显示 out dx,al mov ah,4ch ;返回 int 21hcode ends end start三.方案实现与测试1.实验现象:按实验原理中的电路连接好电路,若打开开关K0,则L0亮;若打开开关K1,则 L1亮;其余开关与LED灯的对应关系相同。此简单输入输出程序就是将8255A口读入的数据原封不动的从C口输出。2.实验现象:开关K0可以控制流水灯的方向,K0为高电平是流水灯向右,反
27、之向左。K4-K7为0000时流水灯停止,否则流水灯运行。3.实验现象:运行程序后显示“Input a num (0-9h):”,键盘中输入一个数字后数码管显示该数字实验现象及连线截图如下:4.实验现象:运行程序后数码管显示“56”四.选做与探索1.编程实现递增00-99计数器程序如下:data segmentioport equ 0b800h-0280hio8255a equ ioport+28ahio8255b equ ioport+28bhio8255c equ ioport+288hled db 3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh ;段码bu
28、ffer1 db 0,0 ;存放要显示的十位和个位bz dw ? ;位码data endsstacks segment stack db 100 dup (?)stacks endscode segment assume cs:code,ds:data,ss:stacksstart: mov ax,stacks mov ss,ax mov ax,data mov ds,ax mov dx,io8255b ;将8255设为A口输出 mov al,80h out dx,al mov di,offset buffer1 ;设di为显示缓冲区loop1: mov cx,0300h ;循环次数loop2
29、: mov bh,02lll: mov byte ptr bz,bh push di dec di add di, bz mov bl,di ;bl为要显示的数 pop di mov bh,0 mov si,offset led ;置led数码表偏移地址为SI add si,bx ;求出对应的led数码 mov al,byte ptr si mov dx,io8255c ;自8255A的口输出 out dx,al mov al,byte ptr bz ;使相应的数码管亮 mov dx,io8255a out dx,al push cx mov cx,0ffffh ;如果显示过快,可更改cx值为最大0ffffhdelay: loop delay mov cx,0ffffhxx: loop xx mov cx,0ffffhyx: loop yx mov cx,0ffffhy: loop y mov cx,0ffffhl: loop l ;延时 pop cx mov bh,byte ptr bz shr bh,1 jnz lll loop loo
copyright@ 2008-2023 冰点文库 网站版权所有
经营许可证编号:鄂ICP备19020893号-2