實驗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("\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?

實驗目的:具體寫要做成什么,期望得出什么結果。不要照抄本指導書。

實驗過程:具體寫操作的過程,對於源程序,不一定全部寫出,但應畫出模塊圖、流程

圖。核心代碼可寫出。特別要寫出實驗中碰到的問題及分析、解決辦法。

實驗結果及分析:如實寫出結果,對結果進行分析,可進一步提出改進、提高的辦法。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM