实验1定时与中断接口程序设计
实验1定时与中断接口程序设计
一实验目的
1.了解定时器/计数器 8253、并行 I/O接口 8255A在 PC机中的电路连接方法;
2.学习使用 TURBO C++对 8253、8255进行编程操作;
3.熟悉拦截 PC机中断向量的 TC++编程方法。
二实验内容
1.8253、8255在 PC/XT机中的电路连接介绍
PC机启动后,系统设置的初始状态为:
芯片
有关工作方式
初值
运行情况
通道 0#:方式 3(方波发生器)计数初值:0000H
OUT输出 55ms方波至 8259的 IRQ0
?(1KHz方波)
8253
通道 2#:?(1KHz)
PB0、PB1:方式 0(简单输出)
IRQ0:允许中断
计数初值:?(1190)
8255
8259
控制蜂鸣器发声。0:不发声,1:发声
CPU响应 8号中断
中断类型号: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栏填写您的文件存放目录,
注意目录名不能超过 8个英文字符,且所设目录要事先建立好。如此, TC生成的可执行文
件等将会存放到此工作目录下。
样例如下:
3.输入源程序
以下源程序仅供参考。
#include
#include
#include
<stdio.h>
<dos.h>
//支持标准输入输出,如 printf()。
//支持接口访问、中断向量操作函数
//支持 exit()函数
<STDLIB.H>
#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(nTick ==1) outportb(0x61,my_PB);
//开始鸣叫
else if(nTick ==3)
else if(nTick>18)
outportb(0x61,0x01);
//停止鸣叫,PB1=0, PB0保持为 1
{ // 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);
//结束程序
}
sys_PB=inportb(0x61); //读取 PB口,内容
my_PB=sys_PB|0x03;//将 PB口低 2位(PB0,PB1)置 1
//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);
setvect(0x08,sys_int_08);
//恢复系统的 PB口状态
//恢复系统的中断向量
}
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?
实验目的:具体写要做成什么,期望得出什么结果。不要照抄本指导书。
实验过程:具体写操作的过程,对于源程序,不一定全部写出,但应画出模块图、流程
图。核心代码可写出。特别要写出实验中碰到的问题及分析、解决办法。
实验结果及分析:如实写出结果,对结果进行分析,可进一步提出改进、提高的办法。
感谢您的阅读,如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮。本文欢迎各位转载,但是转载文章之后必须在文章页面中给出作者和原文连接。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架