接口技術-8253芯片實驗


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

 參考鏈接:https://www.cnblogs.com/wstong/p/12890547.html


免責聲明!

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



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