资源描述
实验1 定时与中断接口程序设计
一 实验目的
1.了解定时器/计数器8253、并行I/O接口8255A在PC机中的电路连接方法;
2.学习使用TURBO C++对8253、8255进行编程操作;
3.熟悉拦截PC机中断向量的TC++ 编程方法。
二 实验内容
1.8253、8255在PC/XT机中的电路连接介绍
D7…D0
IOR
IOW
A0
A1
IO/M
A9…A2
D7…D0
IOR
IOW
A0
A1
IO/M
A9…A2
D7…D0 OUT0
RD GATE0
WR CLK0
A0 OUT1
A1 GATE1
CLK1
OUT2
CS GATE2
CLK0,1,2
D7…D0 OUT0
RD GATE0
WR CLK0
A0 OUT1
A1 GATE1
CLK1
OUT2
CS GATE2
CLK0,1,2
地址译码
地址译码
40H~43H
40H~43H
至8259 IRQ0,中断类型=8
至8259 IRQ0,中断类型=8
+5V
+5V
至8237的DRAM刷新请求
至8237的DRAM刷新请求
+5V
+5V
8088
8088
8253
8253
&
&
放大
放大
PB0
CS PB1
PB0
CS PB1
地址译码
地址译码
60H~63H
60H~63H
8255
8255
1.19MHz
1.19MHz
PC机启动后,系统设置的初始状态为:
芯片
有关工作方式
初值
运行情况
8253
通道0#:方式3(方波发生器)
计数初值:0000H
OUT输出55ms方波至8259的IRQ0
通道2#:?(1KHz)
计数初值:?(1190)
?(1KHz方波)
8255
PB0、PB1:方式0(简单输出)
控制蜂鸣器发声。0:不发声,1:发声
8259
IRQ0:允许中断
中断类型号:8
CPU响应8号中断
表中,8253的通道2#的工作方式和计数初值未知,要求自己设置。
2.程序要求
利用TURBO C++开发环境设计程序,实现如下功能:
(1)程序启动时,要求输入定时时间,以秒为单位。
(2)按秒计时,每秒到达时,在屏幕上显示当前为第几秒,同时蜂鸣器发出短促叫声;
(3)当定时时间到,则显示“Time Up!”,结束程序。
三 实验环境
硬件环境:PC机一台;
软件环境:操作系统不限,TURBO C++3.0。
四 实验步骤
1.建立源文件
启动TURBO C++3.0,建立Timer.CPP。保存到D:\ ×××(学号)\Timer.CPP;
2.设置TC工作目录
选菜单Options/Directories,第1、2栏保持不变,第3、4栏填写您的文件存放目录,OK。如此,TC生成的可执行文件等将会存放到此工作目录下。
样例如下:
3.输入源程序
以下源程序仅供参考。
#include <stdio.h> //支持标准输入输出,如printf()。
#include <dos.h> //支持接口访问、中断向量操作函数
#include <STDLIB.H> //支持exit()函数
#ifdef __cplusplus //定义C++使用的中断函数标识符。若是×××.C程序,则不需要
#define __CPPARGS ...
#else
#define __CPPARGS
#endif
int nTick=0,sec=0,flag=0;
unsigned char sys_PB,my_PB;
void interrupt far (*sys_int_08)(__CPPARGS); //若是×××.C,则函数参数不写
void interrupt far my_int_08(__CPPARGS) //若是×××.C,则函数参数不写
{//8号中断,每55ms中断一次,由8253的0号定时器定时,并向8259 IRQ0申请中断
++nTick;
if(tinck==1) outportb(0x61,my_PB); //开始鸣叫
else if(tinck==3) outportb(0x61,sys_PB); //停止鸣叫
else if(nTick>18)
{ // 1second/55ms 近似等于18
flag=1;
nTick=0;
sec++;
}
sys_int_08(); //调用系统的中断向量
}
//==========================================
void main()
{ unsigned int Time_up;
printf("Please input Up Time(5--30): ");
scanf("%d",&Time_up);
printf("\n");
if(Time_up<5 || Time_up>30)
{ printf("Input Error!");
exit(1); //结束程序
}
outportb(0x63,0x82);//设置8255,PB为输入方式
sys_PB=inportb(0x61); //读取PB口,内容
my_PB=sys_PB|0x03;//将PB口低2位(PB0,PB1)置1
outportb(0x63,0x80);//设置8255,PB为输出方式
//8253通道2,产生1KHz方波,送到扬声器,使扬声器发声
outportb(0x43,0xb6); //CW=10110110 B,通道2,先低字节,再高字节,方式3,二进制
outportb(0x42,0xa6); //low byte,
outportb(0x42,0x04); //high byte,0x04a6=1190,f = 1.19MHz,out=f/1190=1000Hz
sys_int_08=getvect(0x08); //保存系统的中断向量
setvect(0x08,my_int_08); //设置系统向量
while(1)
{ if(flag==1)
{ flag=0;
printf("%d ",sec);
if(sec==Time_up) break;
}
}
printf("Timer Up!\n\n");
outportb(0x61,sys_PB); //恢复系统的PB口状态
setvect(0x08,sys_int_08); //恢复系统的中断向量
}
4.运行程序,再完成如下内容
(1) 8253的通道0在程序中起什么作用?为什么在程序中没有对其进行初始化及赋初值?
(2)修改8253通道0#的初值,使计时精度严格为1秒。
提示:可采用动态初值,即一秒内的每次中断采用不同的初值,使每次中断得到的时间间隔之和为1000ms。55ms的定时=65535×1/1.19MHz
(3)my_int_08()函数什么时候被调用?
(4)将main()函数的最后一句注释掉,再执行,会有什么结果?假定是在纯DOS环境下执行这个程序。
(5)本程序为什么采用DOS环境编写程序,而不采用Windows环境?
六 实验报告
实验报告是科学实验中的重要技术文档,应如实记录实验中发生的现象、处理措施和结果。实验报告的组成一般为:
实验项目名称(要求严格与本指导书一致)、实验日期、场地、采用的软硬件环境,实验者;对于为什么采用此环境,必要时可作出说明。例如,本实验为什么要采用TC,而不采用VC?
实验目的:具体写要做成什么,期望得出什么结果。不要照抄本指导书。
实验过程:具体写操作的过程,对于源程序,不一定全部写出,但应画出模块图、流程图。核心代码可写出。特别要写出实验中碰到的问题及分析、解决办法。
实验结果及分析:如实写出结果,对结果进行分析,可进一步提出改进、提高的办法。
实验1 定时与中断接口程序设计
一 实验目的
1.了解定时器/计数器8253、并行I/O接口8255A在PC机中的电路连接方法;
2.学习使用TURBO C++对8253、8255进行编程操作;
3.熟悉拦截PC机中断向量的TC++ 编程方法。
二 实验内容
1.8253、8255在PC/XT机中的电路连接介绍
D7…D0
IOR
IOW
A0
A1
IO/M
A9…A2
D7…D0
IOR
IOW
A0
A1
IO/M
A9…A2
D7…D0 OUT0
RD GATE0
WR CLK0
A0 OUT1
A1 GATE1
CLK1
OUT2
CS GATE2
CLK0,1,2
D7…D0 OUT0
RD GATE0
WR CLK0
A0 OUT1
A1 GATE1
CLK1
OUT2
CS GATE2
CLK0,1,2
地址译码
地址译码
40H~43H
40H~43H
至8259 IRQ0,中断类型=8
至8259 IRQ0,中断类型=8
+5V
+5V
至8237的DRAM刷新请求
至8237的DRAM刷新请求
+5V
+5V
8088
8088
8253
8253
&
&
放大
放大
PB0
CS PB1
PB0
CS PB1
地址译码
地址译码
60H~63H
60H~63H
8255
8255
1.19MHz
1.19MHz
PC机启动后,系统设置的初始状态为:
芯片
有关工作方式
初值
运行情况
8253
通道0#:方式3(方波发生器)
计数初值:0000H
OUT输出55ms方波至8259的IRQ0
通道2#:?(1KHz)
计数初值:?(1190)
?(1KHz方波)
8255
PB0、PB1:方式0(简单输出)
控制蜂鸣器发声。0:不发声,1:发声
8259
IRQ0:允许中断
中断类型号:8
CPU响应8号中断
表中,8253的通道2#的工作方式和计数初值未知,要求自己设置。
2.程序要求
利用TURBO C++开发环境设计程序,实现如下功能:
(1)程序启动时,要求输入定时时间,以秒为单位。
(2)按秒计时,每秒到达时,在屏幕上显示当前为第几秒,同时蜂鸣器发出短促叫声;
(3)当定时时间到,则显示“Time Up!”,结束程序。
三 实验环境
硬件环境:PC机一台;
软件环境:操作系统不限,TURBO C++3.0。
四 实验步骤
1.建立源文件
启动TURBO C++3.0,建立Timer.CPP。保存到D:\ ×××(学号)\Timer.CPP;
2.设置TC工作目录
选菜单Options/Directories,第1、2栏保持不变,第3、4栏填写您的文件存放目录,OK。如此,TC生成的可执行文件等将会存放到此工作目录下。
样例如下:
3.输入源程序
以下源程序仅供参考。
#include <stdio.h> //支持标准输入输出,如printf()。
#include <dos.h> //支持接口访问、中断向量操作函数
#include <STDLIB.H> //支持exit()函数
#ifdef __cplusplus //定义C++使用的中断函数标识符。若是×××.C程序,则不需要
#define __CPPARGS ...
#else
#define __CPPARGS
#endif
int nTick=0,sec=0,flag=0;
unsigned char sys_PB,my_PB;
void interrupt far (*sys_int_08)(__CPPARGS); //若是×××.C,则函数参数不写
void interrupt far my_int_08(__CPPARGS) //若是×××.C,则函数参数不写
{//8号中断,每55ms中断一次,由8253的0号定时器定时,并向8259 IRQ0申请中断
++nTick;
if(tinck==1) outportb(0x61,my_PB); //开始鸣叫
else if(tinck==3) outportb(0x61,sys_PB); //停止鸣叫
else if(nTick>18)
{ // 1second/55ms 近似等于18
flag=1;
nTick=0;
sec++;
}
sys_int_08(); //调用系统的中断向量
}
//==========================================
void main()
{ unsigned int Time_up;
printf("Please input Up Time(5--30): ");
scanf("%d",&Time_up);
printf("\n");
if(Time_up<5 || Time_up>30)
{ printf("Input Error!");
exit(1); //结束程序
}
outportb(0x63,0x82);//设置8255,PB为输入方式
sys_PB=inportb(0x61); //读取PB口,内容
my_PB=sys_PB|0x03;//将PB口低2位(PB0,PB1)置1
outportb(0x63,0x80);//设置8255,PB为输出方式
//8253通道2,产生1KHz方波,送到扬声器,使扬声器发声
outportb(0x43,0xb6); //CW=10110110 B,通道2,先低字节,再高字节,方式3,二进制
outportb(0x42,0xa6); //low byte,
outportb(0x42,0x04); //high byte,0x04a6=1190,f = 1.19MHz,out=f/1190=1000Hz
sys_int_08=getvect(0x08); //保存系统的中断向量
setvect(0x08,my_int_08); //设置系统向量
while(1)
{ if(flag==1)
{ flag=0;
printf("%d ",sec);
if(sec==Time_up) break;
}
}
printf("Timer Up!\n\n");
outportb(0x61,sys_PB); //恢复系统的PB口状态
setvect(0x08,sys_int_08); //恢复系统的中断向量
}
4.运行程序,再完成如下内容
(1) 8253的通道0在程序中起什么作用?为什么在程序中没有对其进行初始化及赋初值?
(2)修改8253通道0#的初值,使计时精度严格为1秒。
提示:可采用动态初值,即一秒内的每次中断采用不同的初值,使每次中断得到的时间间隔之和为1000ms。55ms的定时=65535×1/1.19MHz
(3)my_int_08()函数什么时候被调用?
(4)将main()函数的最后一句注释掉,再执行,会有什么结果?假定是在纯DOS环境下执行这个程序。
(5)本程序为什么采用DOS环境编写程序,而不采用Windows环境?
六 实验报告
实验报告是科学实验中的重要技术文档,应如实记录实验中发生的现象、处理措施和结果。实验报告的组成一般为:
实验项目名称(要求严格与本指导书一致)、实验日期、场地、采用的软硬件环境,实验者;对于为什么采用此环境,必要时可作出说明。例如,本实验为什么要采用TC,而不采用VC?
实验目的:具体写要做成什么,期望得出什么结果。不要照抄本指导书。
实验过程:具体写操作的过程,对于源程序,不一定全部写出,但应画出模块图、流程图。核心代码可写出。特别要写出实验中碰到的问题及分析、解决办法。
实验结果及分析:如实写出结果,对结果进行分析,可进一步提出改进、提高的办法。
展开阅读全文