目錄
一、實驗目的和要求
二、實驗原理與背景
三、實驗具體的內容
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控制方式方式字寄存器
方式 |
功能 |
輸出波形 |
輸出波形 |
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