收藏 分销(赏)

定时与中断接口程序设计.doc

上传人:仙人****88 文档编号:9463649 上传时间:2025-03-27 格式:DOC 页数:9 大小:76.60KB 下载积分:10 金币
下载 相关 举报
定时与中断接口程序设计.doc_第1页
第1页 / 共9页
定时与中断接口程序设计.doc_第2页
第2页 / 共9页


点击查看更多>>
资源描述
实验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? 实验目的:具体写要做成什么,期望得出什么结果。不要照抄本指导书。 实验过程:具体写操作的过程,对于源程序,不一定全部写出,但应画出模块图、流程图。核心代码可写出。特别要写出实验中碰到的问题及分析、解决办法。 实验结果及分析:如实写出结果,对结果进行分析,可进一步提出改进、提高的办法。
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 教育专区 > 小学其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:4009-655-100  投诉/维权电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服