8253芯片實驗
寫在前面:
之前做過一個8255的實驗,但是對匯編語言真心摸不着頭腦,基礎沒打好,打代碼都痛苦N倍!
實驗內容:
通過8253芯片通道0和通道2級連,clk0輸入時鍾信號100khz,使out2每隔1s,通過不可屏蔽引腳NMI產生中斷,依次輪流點亮8盞LED燈。
在公布實驗代碼前,請允許我卑微的介紹本次實驗必不可少的基礎知識!
1、計數器的3個引腳
- CLK時鍾輸入信號
• 在計數過程中,此引腳上每輸入一個時鍾信號(下降沿),計數器的計數值減1
• GATE門控輸入信號
• 控制計數器工作,可分成電平控制和上升沿控制兩種類型
• OUT計數器輸出信號
• 當一次計數過程結束(計數值減為0),OUT引腳上將產生一個輸出信號
2、確定計數初始值:
$f_{clk0}$=100khz;因此$T_{clk0}$=$\frac{1}{f_{clk0}}$=$\frac{1}{100khz}$=$10^{-5}$
其中,有這個公式$T_{out}=T_{clk}*N$,因此我們觀察一下8253

從圖可知,Tout0=Tclk2,因此
$T_{out2}=T_{clk2}*N_{2}=T_{out0}*N_{2}=T_{clk0}*N_{0}*N_{2}=1s$,
$N_{0}*N_{2}=10^{5}$,在滿足等式成立情況下,給N0,N2任意取值皆可。
3、8253的其中2種工作方式:當計數器的計數初值已經確定時,計數器就開始工作
-
- 方式0:當計數初值為4時,在做了4個$T_{clk}$時,它就結束了任務,並產生中斷。

-
- 方式3:初始化計數初值為4后,就一直工作下去。

4、地址
-
- 74HC154的地址

Y0=IO0,Y1=IO1,Y2=IO2;

結合上表,可知IO2的信號是DCBA=0010,從而得出$A_{12}A_{11}A_{10}A_{9}$=0010;
-
- 8253的地址
我們觀察上面的8253的圖,可以知道地址線$A_{1}A_{2}$分別接在8253的$A_{0}A_{1}$
我們從下圖可以得知,當$A_{0}A_{1}$=00時,為讀寫計數器0;當$A_{0}A_{1}$=10時為讀寫計數器2;
從而推出對應的$A_{1}A_{2}$的值。

具體如下:
計數器0地址:$A_{2}A_{1}$=00;
計數器1地址:$A_{2}A_{1}$=01;
計數器2地址:$A_{2}A_{1}$=10;
控制字地址:$A_{2}A_{1}$=11;
因此我們可以得出20位8253的地址,我們設置其他地址線為0,則
計數器0端口地址:$A_{2}A_{1}$=0000 0000 0100 0000 0000B=400H
計數器1端口地址:$A_{2}A_{1}$=0000 0000 0100 0000 0010B=402H
計數器2端口地址:$A_{2}A_{1}$=0000 0000 0100 0000 0100B=404H
控制端口地址:$A_{2}A_{1}$=0000 0000 0100 0000 0110B=406H
-
- 燈的地址
觀察以上74HC273的電路圖,我們可以發現,IO1和A0接入或非門,查詢上表,可得IO1=0001,即$A_{12}A_{11}A_{10}A_{9}$=0001;
或非門只有當輸入全為0時才為1,所以取地址線$A_{0}$=0,同樣的,設置其他地址為0,則燈的地址為0000 0000 0010 0000 0000B=200H
代碼如下:
1 DATA SEGMENT 2 ;燈的地址及初始狀態 3 LIGHT_ADD EQU 200H;燈的地址 4 LIGHT_STATUS DB 11111110B; 有8個燈,0開1關,通過循環左移ROL實現燈狀態變化 5 ;8253的地址 6 PORT0 EQU 400H; 計數器0端口地址 7 PORT2 EQU 404H; 計數器2端口地址 8 PORT3 EQU 406H; 控制端口地址 9 10 ;控制方式字 11 CONTROL0 EQU 00010110B;計數器0 只讀寫低字節,方式3,二進制 12 CONTROL2 EQU 10110000B;計數器2 先讀寫低字節后讀寫高字節,方式0,二進制 13 DATA ENDS 14 15 CODE SEGMENT 16 ASSUME CS:CODE,DS:DATA 17 BEGIN: 18 MOV AX,DATA 19 MOV DS,AX 20 21 ;設置2號中斷向量 22 NMI_INIT: 23 PUSH ES 24 XOR AX,AX 25 MOV AL,02H 26 XOR AH,AH 27 SHL AX,1 28 SHL AX,1 29 MOV SI,AX 30 MOV AX,OFFSET NMI_SERVICE 31 MOV ES:[SI],AX 32 INC SI 33 INC SI 34 MOV BX,CS 35 MOV ES:[SI],BX 36 POP ES 37 38 39 ; 8253通道0初始化 40 ; 寫入方式控制字 41 MOV DX,PORT3 42 MOV AL,CONTROL0 43 OUT DX,AL 44 ; 計數器0寫入計數初值 45 MOV DX,PORT0 46 MOV AL,11001000B; 設定N0=200 47 OUT DX,AL 48 49 ; 8253通道2初始化 50 ; 寫入方式控制字 51 MOV DX,PORT3 52 MOV AL,CONTROL2 53 OUT DX,AL 54 ; 計數器2寫入計數初值 55 MOV DX,PORT2 56 MOV AX,0000000111110100B; 設定N2=500 57 OUT DX,AL; 寫入低字節計數初值 58 MOV AL,AH; 將高字節的數值賦值給低字節 59 OUT DX,AL; 寫入高字節計數初值 60 61 ;點亮第一個LED燈 62 MOV DX,LIGHT_ADD 63 MOV AL,LIGHT_STATUS 64 OUT DX,AL 65 66 ;等待中斷 67 JMP $ 68 69 ; 程序退出 70 MOV AH,4CH 71 INT 21H 72 73 ;中斷服務程序 74 NMI_SERVICE PROC FAR 75 ;點亮下一個LED 76 MOV DX,LIGHT_ADD 77 MOV AL,LIGHT_STATUS 78 ROL AL,1; 循環左移 79 OUT DX,AL 80 MOV LIGHT_STATUS,AL; 更新LIGHT_STATUS的值 81 82 ; 通道2送計數初值,再次啟動計數 83 ; 8253通道2初始化 84 ; 寫入方式控制字 85 MOV DX,PORT3 86 MOV AL,CONTROL2 87 OUT DX,AL 88 89 MOV DX,PORT2 90 MOV AX,0000000111110100B; 91 OUT DX,AL; 寫入低字節計數初值 92 MOV AL,AH; 93 OUT DX,AL; 寫入高字節計數初值 94 95 IRET; 中斷返回 96 NMI_SERVICE ENDP 97 98 CODE ENDS 99 END BEGIN
