实验三、82C54定时器、计数器实验
时间:2026-01-22
时间: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,®s,®s); 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字,全部文档内容请下载后查看。喜欢就下载吧 ……上一篇:住院病历评分标准
下一篇:基础工程试卷A-带答案