• 实验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#的工作方式和计数初值未知,要求自己设置。

    wps9

    image

    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

    wps11wps12

    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(" ");

    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! ");

    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?

    实验目的:具体写要做成什么,期望得出什么结果。不要照抄本指导书。

    实验过程:具体写操作的过程,对于源程序,不一定全部写出,但应画出模块图、流程

    图。核心代码可写出。特别要写出实验中碰到的问题及分析、解决办法。

    实验结果及分析:如实写出结果,对结果进行分析,可进一步提出改进、提高的办法。

  • 相关阅读:
    xmlHttp.js.rar 没啥说的。。各浏览器都支持的纯ajax!
    实用正则表达式(实用篇) [转]
    Jquery的好书[pdf,新书]
    xml 中的冒号 读取问题的解决
    给一个DataTable 添加一列,来保存计算出来的结果。。
    悟透JavaScript(转) 超级精华
    当前标识符读写权限
    ie浏览器开机自动启动且全屏
    SQL Server ErrorLog 错误日志(如果数据库所占空间变大)
    利用Git hub创建博客
  • 原文地址:https://www.cnblogs.com/dgwblog/p/12757820.html
Copyright © 2020-2023  润新知