实验三、82C54定时器、计数器实验

时间:2026-01-22

物理学,接口技术(第二版,艾德才),实验 实验三、82C54定时器、计数器实验

接口技术实验指导书

实验三 8253定时器/计数器实验

一、 实验目的和内容

1. 掌握8253定时器/计数器芯片的工作原理 2. 完成8253定时器/计数器的编程实验 二、实验电路及说明

实验电路如图8所示 地址为10H

8253的三个计数器全部开放,J53上有OUT0、GATE0CLK0、OUT1、GATE1、CLK1、OUT2、GATE2、CLEK2。它们可与任何I/O相连。在我公司提供的实验箱上的D部分有各种频率时钟信号。下面提供一例,供参考,学生可根据要求自行调换频率。

如图8所示

三、实验器材

奔腾微机一台、SXL-100(PCI)接口实验仪一套、示波器一台 四、硬件实验步骤

本实验在板上由J与D部分组成,有短路块结合跳线一种方式。

物理学,接口技术(第二版,艾德才),实验 实验三、82C54定时器、计数器实验

五、程序框图

六.程序代码

#include <stdio.h> #include <dos.h> #include “PCIcard.h”

unsigned long int ic82530=0x20,ic82531=0x21,ic8253type=0x23; unsigned long int ic8255a=0x0,ic8255b=0x1,ic8255type=0x3; int buffer1[10]={0x0c0,0x0f9,0x0a4,0x0b0,0x99,

0x92,0x82,0x0f8,0x80,0x98};

int dis1[4]={0,0,0,0};

void main(void) {

int err,rt1=0,count1=0,flagm=1,flag1=0; void plus1(); void mydisp1(); int mypckey();

err=findPCIcard(); if (err!=0) {

printf("The PCI card isn't found!!!\n"); flagm=0; }

err=getPCIbase0();

iobase0=iobase0&0xfffc;

//从PCI配置空间读入的与地址空间有关的数据其bit 0位为1, printf("IOBase0=%xH\n",iobase0); //表明此空间为IO空间参与PCI总线地址译码 err=getPCIbase1();

物理学,接口技术(第二版,艾德才),实验 实验三、82C54定时器、计数器实验

iobase1=iobase1&0xfffc;

printf("IOBase1=%xH\n",iobase1); err=getPCImembase1(); err=getPCImembase0();

membase0=membase0+membase1<<16; //左移16位,将高位地址变换成双字中的高位字

printf("MEMBase0=%lxH\n",membase0); err=getPCIIRQ();

printf("PCI IRQ = %d\n",err);

ic82530=ic82530+iobase1; //获取8253 T0 T1 控制寄存器的地址 ic82531=ic82531+iobase1;

ic8253type=ic8253type+iobase1;

ic8255a=ic8255a+iobase1; //获取8255 A、B口和控制寄存器的地址 ic8255b=ic8255b+iobase1;

ic8255type=ic8255type+iobase1;

printf("Press e to exit:\n"); //显示提示字符

outportb(ic8255type,0x80); //初始化8255

outportb(ic8255a,0x0ff); outportb(ic8255b,0x0ff);

// 将8253的定时器0初始化为工作方式3,

//采用二进制先读写低8位,在读写高8位,

//写入时间常数,值为0X0FFF

//写入时间常数

//将8253的定时器1初始化为工作方式3,

//采用二进制只读写低8位, 写入时间常数,值为8

//主循环

{

outportb(ic8253type,0x4F); rt1=inportb(ic82531); if (rt1==2) //判断是否计数到2 { if (flag1==0) //判断是否计过2

{

flag1=1; //若是则置标志位 count1=count1+1; //count1加1

if (count1==2) //判断是否计过两次2

物理学,接口技术(第二版,艾德才),实验 实验三、82C54定时器、计数器实验

{ count1=0; //若是则清count1 plus1(); //调加1子程序

} } } else

flag1=0; //若rt1不为2,则清flag1 mydisp1(); //调显示子程序

flagm=mypckey(); }while (flagm==1);

} // main() end

int mypckey() {

int pckey1();

int flagk,judge; judge=pckey1(); if (judge=='e') flagk=0; else

flagk=1; return (flagk); }

int pckey1() {

union REGS regs; regs.h.ah=0x6; regs.h.dl=0x0ff;

int86(0x21,&regs,&regs); return(regs.h.al); }

void plus1() {

int i;

dis1[0]=dis1[0]+1; for (i=0;i<=2;i++) { if (dis1[i]>=10) {

//调扫描键盘子程序 //扫描键盘子程序 //调用int 21H中断 //加1子程序

物理学,接口技术(第二版,艾德才),实验 实验三、82C54定时器、计数器实验

dis1[i]=dis1[i]-10; dis1[i+1]=dis1[i+1]+1; } }

if (dis1[3]>=10) dis1[3]=0; return; }

void mydisp1() //显示子程序 {

void delay1();

int i,a1,a2=0x0fe; for (i=0;i<=3;i++) { outportb(ic8255a,0x0ff); a1=buffer1[dis1[i]]; outportb(ic8255a,a1); outportb(ic8255b,a2); a2=a2<<1; a2=a2|0x1; delay1(); }

return; }

void delay1() //延时子程序

{

int i,j,a=0;

for (i=1;i<=50;i++) { for (j=1;j<=1000;j++) { a=a+0; } }

return; }

六、思考题 (1)、 不更改硬件连接,程序只修改定时器的工作方式,但要完成同样功能,定时器还能初始化为哪几种工作方式? (2)、加长delay1()的延时时间对显示效果有什么影响? 为什么? (3)、源程序中空白(6)解释这个函数的作用? 在当前程序中有没有必要?为什么? 什么情况有必要?

(4)Gate0,Gate1为什么要接VCC?悬空会有什么情况发生?为什么?

…… 此处隐藏:1100字,全部文档内容请下载后查看。喜欢就下载吧 ……
实验三、82C54定时器、计数器实验.doc 将本文的Word文档下载到电脑

    精彩图片

    热门精选

    大家正在看

    × 游客快捷下载通道(下载后可以自由复制和排版)

    限时特价:4.9 元/份 原价:20元

    支付方式:

    开通VIP包月会员 特价:19元/月

    注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
    微信:fanwen365 QQ:370150219