[芯片] 2、接口技術·實驗二·定時/計數器8253


 

目錄

一、實驗目的和要求

二、實驗原理與背景

三、實驗具體的內容

      3-1、計數器方式0實驗

      3-2、計數器方式3實驗

      3-3、計數器級聯實驗

四、實驗的代碼說明

      4-1、計數器方式0實驗代碼及說明

      4-2、計數器方式3實驗代碼及說明

      4-3、計數器級聯實驗代碼及說明

五、實驗結果的分析

      5-1、計數方式0實驗分析

      5-2、計數方式3實驗分析

      5-3、級聯方式實驗分析

附錄資料


 

一、實驗目的和要求

學會8253芯片和微機接口原理和方法。

掌握8253定時\計數芯片的基本工作原理、工作方式和編程原理。

 

二、實驗原理與背景

intel8253是NMOS工藝制成的可編程計數器/定時器,有幾種芯片型號,外形引腳及功能都是兼容的,只是工作的最高計數速率有所差異,例如8253(2.6MHz),8253-5(5MHz)。下面是它的控制方式字:

                   

                      圖2.1 8253引腳圖 

8253內部有三個計數器,分別稱為計數器0、計數器1和計數器2,他們的機構完全相同。每個計數器的輸入和輸出都決定於設置在控制寄存器中的控制字,互相之間工作完全獨立。每個計數器通過三個引腳和外部聯系,一個為時鍾輸入端CLK,一個為門控信號輸入端GATE,另一個為輸出端OUT。每個計數器內部有一個8位的控制寄存器,還有一個16位的計數初值寄存器CR、一個計數執行部件CE和一個輸出鎖存器OL。

             

                    圖2.2 8253控制方式方式字寄存器

表2.3 6種工作方式比較

方式

功能

輸出波形

輸出波形

0

單次計數

寫入初值后,OUT端變低,經過N+1個CLK后,OUT變高(單次)

軟件觸發的單次負脈沖

1

可編程單穩態觸發器

輸出寬度為N個時鍾周期的負脈沖(單次)

硬件觸發的單次負脈沖

2

頻率發生器

輸出寬度為1個時鍾周期的負脈沖(重復波形)

自動觸發連續的脈沖波

3

方波發生器

N為偶數時占空比為1/2;N為奇數時輸出(N+1)/2個正脈沖,(N-1)/2個負脈沖(重復波形)

自動觸發連續的方波

4

軟件觸發選通

寫入初值后,經過N個時鍾周期,OUT端變低1個時鍾周期(單次)

軟件觸發的單次單拍負脈沖

5

硬件觸發選通

門控觸發后,經過N個時鍾周期,OUT端變低1個時鍾周期(單次)

硬件觸發的單次單拍負脈沖

 

 

 

 

 

 

 

 

 

 

 

 

  

 

這個表總是影響排版,略坑~

 

三、實驗具體的內容

3-1、計數器方式0實驗

將計數器0設置為方式0,計數器初值為N(N≤0FH),用手動開關逐個輸入單脈沖,編程使計數值在屏幕上顯示,並同時用邏輯筆觀察OUT0電平變化(當輸入N+1個脈沖后OUT0變高電平)。

步驟如下:

1)按圖2.1虛線連接電路。

 

        圖3.1  TPC-USB平台計數器方式0實驗連線圖

2)根據流程圖2.2,編程並運行,觀察實驗結果。

         

       圖3.2  TPC-USB平台計數器方式0實驗流程圖

 

3-2、計數器方式3實驗

將計數器0、計數器1分別設置為方式3,計數初值設為1000,用邏輯筆觀察OUT1輸出電平的變化(頻率1Hz)。

步驟如下:

1)按圖2.3連接電路。

              圖3.3  TPC-USB平台計數器方式3實驗連線

2)根據流程圖2.4,編程並運行,觀察實驗結果。

               

             圖3.4  TPC-USB平台計數器方式3實驗流程圖

 

3-3、計數器級聯實驗

將計數器0設置為方式3(方波),計數器1設置為方式2(分頻)。實現計數器0的輸出為方波,計數器1的輸入是計數器0輸出。人機交互界面設計:實現在顯示屏幕上提示輸入計數器0(方波)的參數和計數器1(分頻信號)的參數。如下所示:

    Counter0:____

    Counter1:____

    continue?(y/n)____

實現用鍵盤直接輸入修改程序中方波的參數和分頻信號的參數,以改變方波的寬度,分頻信號的周期和分頻數,不需重新修改源代碼。用示波器觀察計數器0和計數器1的輸出波形及其關系,並在紙上畫出CLK0、OUT0、OUT1的波形。

步驟如下:

1)按圖2.5連接電路。

            

              圖3.5  TPC-USB平台計數器級聯實驗連線

2)根據流程圖2.6,編程並運行,觀察實驗結果。

              

            圖3.6  TPC-USB平台計數器級聯實驗流程圖

編程提示:8253控制寄存器地址   :283H;計數器0地址:280H;計數器1地址:281H;CLK0連接時鍾1MHz。

 

四、實驗的代碼說明

4-1、計數器方式0實驗代碼及說明

 1 CODE SEGMENT        ;段定義開始(CODE段)
 2     ASSUME  CS:CODE ;規定CODE為代碼段
 3 START:MOV AL,10H    ;設置控制字00010000(計數器0,方式0,寫兩個字節,二進制計數)
 4       MOV DX,283H   ;把控制寄存器地址放在DX寄存器中
 5       OUT DX,AL     ;將AL的值送入DX端口
 6       MOV DX,280H   ;把計數器0地址放在DX寄存器中
 7       MOV AL,0FH    ;將0FH存入AL寄存器
 8       OUT DX,AL     ;將此時AL的值送入DX端口
 9 LP1:  IN AL,DX      ;從DX端口讀入8位,放在AL寄存器中
10       CALL DISP     ;調用DISP
11       PUSH DX       ;將DX內容保存到堆棧段
12       MOV AH,06H    ;將06H存入AH,為了下句調用21中斷
13       MOV DL,0FFH   ;將0FFH存入DL
14       INT 21H       ;調用21中斷
15       POP DX        ;將DX的內容推出棧段
16       JZ LP1        ;如果DX的內容是0,就跳轉到LP1
17       MOV AH,4CH    ;將4CH存入AH,為了下句調用21中斷
18       INT 21H       ;調用21中斷
19 DISP PROC NEAR      ;定義一個名為DISP的子程序
20       PUSH DX       ;把DX的內容保存到堆棧段中
21       AND AL,0FH    ;將AL寄存器的內容與0FH進行"與"運算,再把結果存入AL中
22       MOV DL,AL     ;將AL的值送入DL寄存器
23       CMP DL,9      ;比較DL中的值與9的大小
24       JLE NUM       ;如果DL的值小於或等於9時,則跳轉到NUM
25       ADD DL,7      ;將DL的值與7進行相加后,再送入DL中
26 NUM:  ADD DL,30H    ;將DL的值與30H進行相加后,再送入DL中
27       MOV AH,02H    ;將02H存入AH
28       INT 21H       ;調用DOS21中斷
29       MOV DL,0DH    ;結合"MOV AH,02H"就是說輸出0DH
30       INT 21H       ;調用中斷指令
31       MOV DL,0AH    ;結合"MOV AH,02H"就是說輸出0AH
32       INT 21H       ;調用DOS21中斷
33 
34       POP DX        ;將DX的內容推出棧段
35       RET           ;子程序在功能完成后返回調用程序繼續執行
36       DISP ENDP     ;子程序結束
37       CODE ENDS     ;代碼段結束
38       END START     ;程序結束 

4-2、計數器方式3實驗代碼及說明

 1 CODE SEGMENT       ;段定義開始(CODE段)
 2     ASSUME CS:CODE ;規定CODE為代碼段
 3 START:MOV DX,283H  ;把控制寄存器地址放在DX寄存器中 
 4       MOV AL,36H   ;設置控制字00110110(計數器0,方式3,寫兩個字節,二進制計數)
 5       OUT DX,AL    ;將AL的值送入DX端口
 6       MOV AX,1000H ;該語句是立即尋址方式,就是把1000H這個數賦給AX
 7       MOV DX,280H  ;把計數器0地址放在DX寄存器中
 8       OUT DX,AL    ;將AL的值送入DX端口
 9       MOV AL,AH    ;將AX的高8位存入AL寄存器中
10       OUT DX,AL    ;將此時AL的值送入DX端口
11       MOV DX,283H  ;把端口地址放在DX寄存器中
12       MOV AL,76H   ;設置控制字01110110(計數器1,方式3,寫兩個字節,二進制計數)
13       OUT DX,AL    ;將AL的值送入DX端口
14       MOV AX,1000H ;把1000H賦給AX
15       MOV DX,281H  ;把端口地址放在DX寄存器中 
16       OUT DX,AL    ;將AX的低8位送入DX端口
17       MOV AL,AH    ;將AX的高8位存入AL寄存器中
18       OUT DX,AL    ;將AL的值送入DX端口
19       MOV AH,4CH   ;將4CH存入AH
20       INT 21H      ;調用DOS21中斷
21 CODE ENDS          ;代碼段結束
22      END START     ;程序結束 

4-3、計數器級聯實驗代碼及說明

 

  1 data segment 
  2 mesg1 db 13,10,'Counter0:','$' 
  3 mesg2 db 13,10,'Counter1:','$' 
  4 mesg3 db 13,10,'Continue?(Y/N)','$'
  5 mesg4   db   13,10,13,10,'Thank You!',13,10,'$' 
  6 errorm db 13,10,'Input Error!','$' 
  7 Counter0 dw 0 
  8 Counter1 dw 0
  9 data ends 
 10 code segment 
 11 assume cs:code,ds:data 
 12 main proc far 
 13 start: 
 14 mov dx,data 
 15 mov ds,dx 
 16 do: sub bx,bx 
 17 sub ax,ax 
 18 mov Counter0,0 
 19 mov Counter1,0 ;init 
 20 l1: 
 21 mov dx,offset mesg1 
 22 mov ah,09h 
 23 int 21h 
 24 rd1 : ;read Counter0 
 25 mov al,0 ;判斷有無輸入 
 26 mov ah,01 ;read a char 
 27 int 21h 
 28 cmp al,0 
 29 jz rd1 
 30 cmp al,13 ;if enter 
 31 je fdone1 
 32 jmp tdone1 
 33 fdone1: jmp done1 
 34 tdone1: cmp al,10 
 35 je fdone1 
 36 cmp al,'0' ;if input<0 or input>9 error 
 37 jb error 
 38 cmp al,'9' 
 39 ja error 
 40 push ax 
 41 mov ax,10 
 42 mul Counter0 
 43 mov Counter0,ax ;Counter0=counter*10 
 44 pop ax 
 45 sub bx,bx 
 46 mov bl,al 
 47 sub bl,30h 
 48 add Counter0,bx ;counter=counter+input 
 49 jmp rd1 
 50 error: 
 51 mov dx,offset errorm 
 52 mov ah,09h
 53 int 21h 
 54 mov dl,7 
 55 mov ah,2 
 56 int 21h 
 57 jmp done3 
 58 tr: ;for jmp do 
 59 mov dl,al 
 60 mov ah,02h 
 61 int 21h 
 62 mov dl,10 
 63 int 21h 
 64 mov dl,13 
 65 int 21h 
 66 jmp do 
 67 l2: 
 68 mov dx,offset mesg2 
 69 mov ah,09h 
 70 int 21h 
 71 rd2: 
 72 mov al,0 ;判斷有無輸入 
 73 mov ah,01 ;read Counter1 
 74 int 21h 
 75 cmp al,0 
 76 jz rd2 
 77 cmp al,13 ;if enter 
 78 je fdone2 
 79 cmp al,10 
 80 je fdone2 
 81 jmp tdone2 
 82 fdone2: jmp done2 
 83 tdone2: 
 84 cmp al,10 
 85 je fdone2 
 86 cmp al,'0' 
 87 jb error 
 88 cmp al,'9' 
 89 ja error 
 90 push ax 
 91 mov ax,10 
 92 mul Counter1 
 93 mov Counter1,ax ;Counter1=Counter1*10 
 94 pop ax 
 95 sub bx,bx 
 96 mov bl,al
 97 sub bl,30h ;bh=0 
 98 add Counter1,bx ;Counter1=Counter1+input 
 99 jmp rd2 
100 done1: 
101 jmp l2 
102 done2: 
103 jmp out8253 ;after enter two counters 
104 ; set 8253 and do it 
105 done3: 
106 mov dx,offset mesg3 
107 mov ah,09h 
108 int 21h 
109 l3: mov ah,07h 
110 int 21h 
111 cmp al,'Y' 
112 je tr 
113 cmp al,'y' 
114 je tr 
115 cmp al,'N' 
116 je quit 
117 cmp al,'n' 
118 je quit 
119 mov dl,7 
120 mov ah,02h 
121 int 21h 
122 jmp l3 
123 out8253: ;work code 
124 mov al,00110110b
125 mov dx,283h 
126 out dx,al 
127 mov ax, Counter0 
128 mov dx,280h 
129 out dx,al 
130 mov al,ah 
131 out dx,al 
132 mov al,01110110b 
133 mov dx,283h 
134 out dx,al 
135 mov ax,Counter1 
136 mov dx,281h 
137 out dx,al 
138 mov al,ah 
139 out dx,al 
140 mov cx,2801 
141 delay: loop delay 
142 jmp done3 
143 quit: ;return to DOS 
144 mov dx,offset mesg4 
145 mov ah,9 
146 int 21h 
147 mov ax,4c00h 
148 int 21h 
149 main endp 
150 code ends 
151 end start

 

五、實驗結果的分析

5-1、計數方式0實驗分析

我們將計數器0設置為方式0,計數器初值為N=15,用R-S單脈沖觸發器手動逐個輸入單脈沖,編程使計數值在屏幕上顯示,並同使用邏輯筆觀察OUT0的電平變化(當輸入16個脈沖后OUT0變低電平),電腦的console窗口中逐漸減1輸出,最后為0。

5-2、計數方式3實驗分析

將計數器0、計數器1分別設置為方式3,計數初值設為1000,用邏輯筆觀察OUT1輸出電平的變化為1Hz。

5-3、級聯方式實驗分析

其實就是在實驗計數方式3的基礎上將計數初值設計成可以自己設置的情況。當Counter0= Countet1=1000時和上一個實驗一樣。

 

附錄資料

 

本文鏈接: http://www.cnblogs.com/zjutlitao/p/4172325.html

更多精彩:http://www.cnblogs.com/zjutlitao/p/4125085.html 

文檔下載:http://pan.baidu.com/s/1i3rFx57

 

 

                                   


免責聲明!

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



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