**民族大學 03
電子班楊忠學 l
實驗目的:
進一步熟悉
tpc_h
實驗系統是使用,學習運用位址解碼技術和基本介面電路,掌握
8253
的基本工作原理和程式設計方法。
l實驗要求:1.在
tpc_h
實驗系統環境下,設計實現對可程式設計定時
/計時器
8253
的確定解碼,即接到
8253cs
端的訊號是唯一有效的,只能支援四個埠位址。 2.
通過相應的電路連線及初始化程式設計,驗證
8253
的六種工作方式,觀察其輸出現象。(
8253
的位址線、資料線和控制線已與系統連線好,連線電路時,只需考慮cs、
clk、
gate
、out
訊號的連線。)
l實驗內容:
1.硬體電路方案
硬體電路說明:用定時
/計時器
1做分頻器(工作方式2,
3都可以)。對於方式1,
4,其
gate
訊號是脈衝訊號,其他方式的
gate
訊號是高電平,因此定時/
計時器0
,通過開關選擇不同的
gate
訊號。out
訊號:用示波器觀測方式2,
3的輸出波形,用查詢方式查詢其他方式的輸出跳變。 1.
軟體流程以及相關程式
在軟體的設計過程中,考慮軟體執行程式後,能自主選擇當前工作的記時器,又能修改記時器的計數值和工作模式。
我設計了一種在文字模式下定時控制系統:通過控制上下方向鍵設定工作模式,按回車鍵確認;數字鍵0、
1、
2(其它數字鍵無效)設定當前的計時器;按
esc鍵可以退出程式;
f1鍵檢視程式的幫助檔案,其他鍵開始設定頻率,
enter
鍵確認輸入。該系統的預設定時器為
t0,工作方式
mode=0,
頻率frq=1000,t0
的初值通過
value=119800/frq
算得。
程式執行後的介面如下:
選擇0,1
,4,5
工作方式,在計數值為
0,輸出發生跳變後,程式會給予相應的提示(或是重灌計數初值(0,
5)或是給予
gate
觸發訊號(1,
4))。
程式的流程:
1.initial system;
2.get 8253 io port;
3.print menu;
4.get key;
5.switch(key)
6. goto 3 l
實驗結果:
程式經過多次修改除錯之後,執行良好,實驗現象比較明顯。
其中,方式
2和方式
3最容易,只需要選擇好工作方式,輸出波形都很穩定。
clk時鐘訊號和輸出的
out訊號正確顯示。 方式
0和方式
1時,可以看到
out輸出的是乙個穩定的方波,每乙個上公升沿說明計數器工作結束一次。方波的占空比很大,輸入的計數值變高,占空比就降低,方式
1時變化比較明顯。方式
0不需要觸發訊號,
gate
輸入訊號可以暫停計數。而方式
1必須由
gate
輸入訊號觸發才能開始計數,計數中有
gate
輸入訊號則重新計數而不是暫停計數。 方式
4和方式
5時,得到的波形是連續的負脈衝。兩種方式都是只計數一次就停,且計數過程重新給計數值不影響當前計數,計數時
gate
上公升沿到來則計數器重新裝入計數值,重新計數。計數結束後,方式
4要重新給計數值才能再次計數,而方式5只要
gate
又給觸發訊號就能再次工作。 l
實驗小結:
在電路的設計中,因為實驗箱上提供的脈衝頻率太高,不利於觀察定時器的輸出波形,因此選用
8253
的定時器
1作為分頻器,其輸出作為脈衝時鐘供定時器
0選用。
這一次實驗感覺比前兩次要好做,首先是電路的連線比較簡單,不像前兩次那樣要接好多的線。考慮到
8253有3
個計數器,當其中乙個不能用時,可以用另乙個代替,程式設計中允許選擇計數器,所以在電路的連線上,可以用的兩個計數器都連線好了。除了方式
2和方式
3外都用了查詢方式。因此用上了
74ls244。
計數器的
6種工作方式驗證都做完了,從中更深刻地認識
8253
定時計數器的結構和計數原理。對於這
6種不同的工作方式,可以滿足各種軟體和硬體定時計數的要求。
附錄:定時控制系統源**:
#include
#include
#include
#include
#include
unsigned char curr_timer=0; /*current working timer*/
unsigned int curr_frq=100;
unsigned int io_address=0x280;
#define controlwd(i) (curr_timer<<6)|0x30|(i<<1) /*cal the control word*/
unioncount;
void inittimer(int i)
unsigned char selecmenu(void);
/*the function is the special working mode*/
void spec_mode(int i)
/* d0 is connect with out of timerx */
while(!kbhit())
}void main()
count.b=119318.0/curr_frq; /*cal the initvalue*/
switch(mode)
/*end switch*/
} /*if the expection is false,the quit the while*/
}void getfrq() /*modifier frequency*/
if(frq>6553)
break;
}curr_frq=(frq>0)?frq%65536:curr_frq;
gotoxy(60,16);
cprintf("%uhz",curr_frq);
}void help()
unsigned char selecmenu();
clrscr();
for(i=0;i<8;i++)
gotoxy(1,21);
printf("press f1 get help/n");
printf("thank you for using timer system/n");
printf("programme desigend:y.z.x/n");
printf("2006.5/n");
gotoxy(24,14);
cprintf("the current timer is timer%d !",curr_timer); /*40*/
while(flag)
case 27: exit(1);
case 59: help();flag=0;break;
default: getfrq();break;
}gotoxy(20,5+curr_index);
cprintf(" ");
gotoxy(20,5+index);
cprintf("---->");
gotoxy(60,16);
}return index;}
微機介面 可程式設計定時 計數器8253
資料匯流排d0 d7 rd 和wd 分別是讀寫控制引腳 cs 是片選訊號 a1,a0是片內位址選擇引腳。8253的三個計數通道在結構上和功能上完全一樣,每個通道均有兩個輸入引腳clk和gate,乙個輸出訊號引腳out 計數初值暫存器用來寄存計數初值 計數工作單元為16位減1計數器,它的初值是計數初值...
微機介面 可程式設計定時 計數器8253
資料匯流排d0 d7 rd 和wd 分別是讀寫控制引腳 cs 是片選訊號 a1,a0是片內位址選擇引腳。8253的三個計數通道在結構上和功能上完全一樣,每個通道均有兩個輸入引腳clk和gate,乙個輸出訊號引腳out 計數初值暫存器用來寄存計數初值 計數工作單元為16位減1計數器,它的初值是計數初值...
可程式設計定時 計數器應用實驗
了解定時器 計數器 8253 的原理,掌握編制定時器 計數器程式設計方法。設計連線和程式,以1mhz的訊號為時鐘訊號,利用 8253 產生1s的定時控制發光二極體變化。使用者時鐘的1mhz輸出接 8253 的clk1。8253 的gate1接 5v 在實驗箱的左上角和右上角 8253out1接 82...