實驗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?
實驗目的:具體寫要做成什麼,期望得出什麼結果。不要照抄本指導書。
實驗過程:具體寫操作的過程,對于源程式,不一定全部寫出,但應畫出子產品圖、流程
圖。核心代碼可寫出。特别要寫出實驗中碰到的問題及分析、解決辦法。
實驗結果及分析:如實寫出結果,對結果進行分析,可進一步提出改進、提高的辦法。