8253概述
8253芯片是可編程計(jì)數(shù)器/定時(shí)器。這種芯片外形引腳都是兼容性的。8253內(nèi)部有三個(gè)計(jì)數(shù)器,分別稱為計(jì)數(shù)器0、計(jì)數(shù)器1和計(jì)數(shù)器2,他們的機(jī)構(gòu)完全相同。
每個(gè)計(jì)數(shù)器的輸入和輸出都決定于設(shè)置在控制寄存器中的控制字,互相之間工作完全獨(dú)立。每個(gè)計(jì)數(shù)器通過三個(gè)引腳和外部聯(lián)系,一個(gè)為時(shí)鐘輸入端CLK,一個(gè)為門控信號(hào)輸入端GATE,另一個(gè)為輸出端OUT。每個(gè)計(jì)數(shù)器內(nèi)部有一個(gè)8位的控制寄存器,還有一個(gè)16位的計(jì)數(shù)初值寄存器CR、一個(gè)計(jì)數(shù)執(zhí)行部件CE和一個(gè)輸出鎖存器OL。
8253各通道的工作方式
8253中各通道可有6種可供選擇的工作方式, 以完成定時(shí)、計(jì)數(shù)或脈沖發(fā)生器等多種功能。8253的各種工作方式如下:
1.方式0:計(jì)數(shù)結(jié)束則中斷
工作方式0被稱為計(jì)數(shù)結(jié)束中斷方式。當(dāng)任一通道被定義為工作方式0時(shí), OUTi輸出為低電平;若門控信號(hào)GATE為高電平,當(dāng)CPU利用輸出指令向該通道寫入計(jì)數(shù)值WR#有效時(shí),OUTi仍保持低電平,然后計(jì)數(shù)器開始減“1”計(jì)數(shù), 直到計(jì)數(shù)值為“0”,此刻OUTi將輸出由低電平向高電平跳變,可用它向CPU發(fā)出中斷請(qǐng)求,OUTi端輸出的高電平一直維持到下次再寫入計(jì)數(shù)值為止。
在工作方式0情況下,門控信號(hào)GATE用來控制減“1”計(jì)數(shù)操作是否進(jìn)行。當(dāng)GATE=1時(shí),允許減“1”計(jì)數(shù);GATE=0時(shí),禁止減“1”計(jì)數(shù); 計(jì)數(shù)值將保持GATE有效時(shí)的數(shù)值不變, 待GATE重新有效后,減“1”計(jì)數(shù)繼續(xù)進(jìn)行。
顯然,利用工作方式0既可完成計(jì)數(shù)功能, 也可完成定時(shí)功能。當(dāng)用作計(jì)數(shù)器時(shí),應(yīng)將要求計(jì)數(shù)的次數(shù)預(yù)置到計(jì)數(shù)器中,將要求計(jì)數(shù)的事件以脈沖方式從CLKi端輸入, 由它對(duì)計(jì)數(shù)器進(jìn)行減“1”計(jì)數(shù),直到計(jì)數(shù)值為0,此刻OUTi輸出正跳變, 表示計(jì)數(shù)次數(shù)到。當(dāng)用作定時(shí)器時(shí),應(yīng)把根據(jù)要求定時(shí)的時(shí)間和CLKi的周期計(jì)算出定時(shí)系數(shù),預(yù)置到計(jì)數(shù)器中。從CLKi,輸入的應(yīng)是一定頻率的時(shí)鐘脈沖,由它對(duì)計(jì)數(shù)器進(jìn)行減“1”計(jì)數(shù), 定時(shí)時(shí)間從寫入計(jì)數(shù)值開始,到計(jì)數(shù)值計(jì)到“0”為止,這時(shí)OUTi輸出正跳變,表示定時(shí)時(shí)間到。
有一點(diǎn)需要說明,任一通道工作在方式0情況下, 計(jì)數(shù)器初值一次有效,經(jīng)過一次計(jì)數(shù)或定時(shí)后如果需要繼續(xù)完成計(jì)數(shù)或定時(shí)功能,必須重新寫入計(jì)數(shù)器的初值。
2.方式1:?jiǎn)蚊}沖發(fā)生器
工作方式1被稱作可編程單脈沖發(fā)生器。進(jìn)入這種工作方式, CPU裝入計(jì)數(shù)值n后OUTi輸出高電平, 不管此時(shí)的GATE輸入是高電平還是低電平, 都不開始減“1”計(jì)數(shù),必須等到GATE由低電平向高電平跳變形成一個(gè)上升沿后,計(jì)數(shù)過程才會(huì)開始。與此同時(shí),OUTi輸出由高電平向低電平跳變,形成了輸出單脈沖的前沿,待計(jì)數(shù)值計(jì)到“0”, OUTi輸出由低電平向高電平跳變,形成輸出單脈沖的后沿, 因此,由方式l所能輸出單脈沖的寬度為CLKi周期的n倍。
如果在減“1”計(jì)數(shù)過程中, GATE由高電平跳變?yōu)榈碗姾酰@并不影響計(jì)數(shù)過程,仍繼續(xù)計(jì)數(shù);但若重新遇到GATE的上升沿,則從初值開始重新計(jì)數(shù), 其效果會(huì)使輸出的單脈沖加寬,如教材圖9-22(b)中的第2個(gè)單脈沖。
這種工作方式下,計(jì)數(shù)值也是一次有效,每輸入一次計(jì)數(shù)值,只產(chǎn)生一個(gè)負(fù)極性單脈沖。
3.方式2:速率波發(fā)生器
工作方式2被稱作速率波發(fā)生器。進(jìn)入這種工作方式, OUTi輸出高電平,裝入計(jì)數(shù)值n后如果GATE為高電平,則立即開始計(jì)數(shù),OUTi保持為高電平不變; 待計(jì)數(shù)值減到“1”和“0”之間, OUTi將輸出寬度為一個(gè)CLKi周期的負(fù)脈沖,計(jì)數(shù)值為“0”時(shí),自動(dòng)重新裝入計(jì)數(shù)初值n,實(shí)現(xiàn)循環(huán)計(jì)數(shù),OUTi將輸出一定頻率的負(fù)脈沖序列, 其脈沖寬度固定為一個(gè)CLKi周期, 重復(fù)周期為CLKi周期的n倍。
如果在減“1”計(jì)數(shù)過程中,GATE變?yōu)闊o效(輸入0電平),則暫停減“1”計(jì)數(shù),待GATE恢復(fù)有效后,從初值n開始重新計(jì)數(shù)。這樣會(huì)改變輸出脈沖的速率。
如果在操作過程中要求改變輸出脈沖的速率,CPU可在任何時(shí)候,重新寫入新的計(jì)數(shù)值, 它不會(huì)影響正在進(jìn)行的減“1”計(jì)數(shù)過程,而是從下一個(gè)計(jì)數(shù)操作用期開始按新的計(jì)數(shù)值改變輸出脈沖的速率。
4.方式3:方波發(fā)生器
工作方式3被稱作方波發(fā)生器。任一通道工作在方式3, 只在計(jì)數(shù)值n為偶數(shù),則可輸出重復(fù)周期為n、占空比為1:1的方波。
進(jìn)入工作方式3,OUTi輸出低電平, 裝入計(jì)數(shù)值后,OUTi立即跳變?yōu)楦唠娖健H绻?dāng)GATE為高電平, 則立即開始減“1”計(jì)數(shù),OUTi保持為高電平,若n為偶數(shù),則當(dāng)計(jì)數(shù)值減到n/2時(shí),OUTi跳變?yōu)榈碗娖剑恢北3值接?jì)數(shù)值為“0”,系統(tǒng)才自動(dòng)重新置入計(jì)數(shù)值n,實(shí)現(xiàn)循環(huán)計(jì)數(shù)。這時(shí)OUTi端輸出的周期為n×CLKi周期,占空比為1:1的方波序列; 若n為奇數(shù), 則OUTi端輸出周期為n×CLKi周期,占空比為((n+1)/2)/((n-1)/2)的近似方波序列。
如果在操作過程中, GATE變?yōu)闊o效,則暫停減“1”計(jì)數(shù)過程,直到GATE再次有效,重新從初值n開始減“l(fā)”計(jì)數(shù)。
如果要求改變輸出方波的速率, 則CPU可在任何時(shí)候重新裝入新的計(jì)數(shù)初值n,并從下一個(gè)計(jì)數(shù)操作周期開始改變輸出方波的速率。
5.方式4:軟件觸發(fā)方式計(jì)數(shù)
工作方式4被稱作軟件觸發(fā)方式。進(jìn)入工作方式4,OUTi輸出高電平。 裝入計(jì)數(shù)值n后, 如果GATE為高電平,則立即開始減“1”計(jì)數(shù),直到計(jì)數(shù)值減到“0”為止,OUTi輸出寬度為一個(gè)CLKi周期的負(fù)脈沖。由軟件裝入的計(jì)數(shù)值只有一次有效,如果要繼續(xù)操作, 必須重新置入計(jì)數(shù)初值n。如果在操作的過程中,GATE變?yōu)闊o效,則停止減“1”計(jì)數(shù), 到GATE再次有效時(shí),重新從初值開始減“1”計(jì)數(shù)。
顯然,利用這種工作方式可以完成定時(shí)功能,定時(shí)時(shí)間從裝入計(jì)數(shù)值n開始,則OUTi輸出負(fù)脈沖(表示定時(shí)時(shí)間到),其定時(shí)時(shí)間=n×CLK周期。 這種工作方式也可完成計(jì)數(shù)功能,它要求計(jì)數(shù)的事件以脈沖的方式從CLKi輸入,將計(jì)數(shù)次數(shù)作為計(jì)數(shù)初值裝入后,由CLKi端輸入的計(jì)數(shù)脈沖進(jìn)行減“1”計(jì)數(shù),直到計(jì)數(shù)值為“0”,由OUTt端輸出負(fù)脈沖(表示計(jì)數(shù)次數(shù)到)。 當(dāng)然也可利用OUTj向CFU發(fā)出中斷請(qǐng)求。 因此工作方式4與工作方式0很相似,只是方式0在OUTi端輸出正階躍信號(hào)、方式4在OUTi端輸出負(fù)脈沖信號(hào)。
6.方式5:硬件觸發(fā)方式計(jì)數(shù)
工作方式5被稱為硬件觸發(fā)方式。進(jìn)入工作方式5, OUTi輸出高電平, 硬件觸發(fā)信號(hào)由GATE端引入。 因此,開始時(shí)GATE應(yīng)輸入為0, 裝入計(jì)數(shù)初值n后,減“1”計(jì)數(shù)并不工作,一定要等到硬件觸發(fā)信號(hào)由GATE端引入一個(gè)正階躍信號(hào),減“1”計(jì)數(shù)才會(huì)開始,待計(jì)數(shù)值計(jì)到“0”, OUTi將輸出負(fù)脈沖,其寬度固定為一個(gè)CLKi周期,表示定時(shí)時(shí)間到或計(jì)數(shù)次數(shù)到。
這種工作方式下,當(dāng)計(jì)數(shù)值計(jì)到“0”后, 系統(tǒng)將自動(dòng)重新裝入計(jì)數(shù)值n,但并不開始計(jì)數(shù), 一定要等到由GATE端引入的正跳沿,才會(huì)開始進(jìn)行減“1”計(jì)數(shù), 因此這是一種完全由GATE端引入的觸發(fā)信號(hào)控制下的計(jì)數(shù)或定時(shí)功能。如果由CLKi輸入的是一定頻率的時(shí)鐘脈沖,那么可完成定時(shí)功能,定時(shí)時(shí)間從GATE上升沿開始,到OUTi端輸出負(fù)脈沖結(jié)束。如果從CLKi端輸入的是要求計(jì)數(shù)的事件,則可完成計(jì)數(shù)功能,計(jì)數(shù)過程從GATE上升沿開始,到OUTi輸出負(fù)脈沖結(jié)束。GATE可由外部電路或控制現(xiàn)場(chǎng)產(chǎn)生,故硬件觸發(fā)方式由此而得名。
如果需要改變計(jì)數(shù)初值, CPU可在任何時(shí)候用輸出指令裝入新的計(jì)數(shù)初值m,它將不影響正在進(jìn)行的操作過程, 而是到下一個(gè)計(jì)數(shù)操作周期才會(huì)按新的計(jì)數(shù)值進(jìn)行操作。
從上述各工作方式可看出,GATE作為各通道的門控信號(hào),對(duì)于各種不同的工作方式,它所起的作用各不相同。在8253的應(yīng)用中,必須正確使用GATE信號(hào),才能保證各通道的正常操作。
8253初始化編程
8253初始化要求:
(1 )對(duì)每個(gè)計(jì)數(shù)器,控制字必須寫在計(jì)數(shù)值之前。這是因?yàn)橛?jì)數(shù)器的讀/寫格式由它的控制字決定。
(2 )計(jì)數(shù)值必須按控制字所規(guī)定的格式寫入。若控制字規(guī)定只寫8位,只需寫入一-次(8位)計(jì)數(shù)值即可(規(guī)定寫低8位則高8位自動(dòng)置0,規(guī)定寫高8位則低8位自動(dòng)置0) ;規(guī)定寫16位時(shí)必須寫兩次,先寫低8位,后寫高8位。當(dāng)初值為0時(shí),也要分兩寫入,因在二進(jìn)制計(jì)數(shù)時(shí),“0” 標(biāo)65336 ,在BCD碼計(jì)數(shù)時(shí)“0”表示10000=104.
(3)對(duì)所有方式計(jì)數(shù)器都可以在計(jì)數(shù)過程中或計(jì)數(shù)結(jié)束后改變計(jì)數(shù)值,重寫計(jì)數(shù)值也必須遵守控制字所規(guī)定的格式,并且不會(huì)改變當(dāng)前計(jì)數(shù)器的工作方式。
(4 )計(jì)數(shù)值不能直接寫到減1計(jì)數(shù)器中,而只能寫入計(jì)數(shù)值寄存器中,并由寫操作之后的下一個(gè)CLK脈沖將計(jì)數(shù)值寄存器的內(nèi)容裝入減1計(jì)數(shù)器開始計(jì)數(shù)。
(5 )初始化編程必須明確各個(gè)計(jì)數(shù)器的控制字和計(jì)數(shù)值不是寫到同一個(gè)地址單元。各個(gè)計(jì)數(shù)器的控制字各自獨(dú)立確定,但它們都寫入同一一個(gè)端[ ]地址(控制字寄存器)中,各個(gè)計(jì)數(shù)器的計(jì)數(shù)值則根據(jù)需要獨(dú)立確定并寫入各自計(jì)數(shù)器的相應(yīng)寄存器中。
例1:設(shè)8086系統(tǒng)中8253的三個(gè)計(jì)數(shù)器的端[ ]地址為060H , 062H和064H,控制口地址為066H ,要求計(jì)數(shù)器0為方式1,按BCD計(jì)數(shù);計(jì)數(shù)初值為1800D,計(jì)數(shù)器1為方式0,按二進(jìn)制計(jì)數(shù);計(jì)數(shù)初值為1234H,計(jì)數(shù)器2為方式3,按二進(jìn)制計(jì)數(shù);當(dāng)計(jì)數(shù)初值為065H時(shí),試分別寫出計(jì)數(shù)器0,1,2的初始化程序。
計(jì)數(shù)器0的初始化:
計(jì)數(shù)0的控制字: 00100011B=23H
MOVAL, 23H ;計(jì)數(shù)器0的控制字
OUT 066H,AL ;控制字寫入8253的控制器
MOVAL, 18H ;取計(jì)數(shù)初值的高8位,低8位00可不送
OUT 060H , AL ;計(jì)數(shù)初值送計(jì)數(shù)器0端[ ]
計(jì)數(shù)器1和初始化:
計(jì)數(shù)器1的控制字: 0110000B=70H
MOVAL, 70H ;計(jì)數(shù)器的控制字:方式0,送高8位和低8位,二進(jìn)制計(jì)數(shù)
OUT 066H ,AL ;控制字寫入8253的控制器
MOV AL, 034H ;取計(jì)數(shù)初值的低8位
OUT 062H ,AL ;計(jì)數(shù)初值的低8位,寫入計(jì)數(shù)器1端口]
MOVAL, 12H ;取計(jì)數(shù)初值的高8位
OUT 062H ,AL ;計(jì)數(shù)初值的高8位寫入計(jì)數(shù)器1端D 1
計(jì)數(shù)器2的初始化:
計(jì)數(shù)器2的控制字: 10010110B=96H
MOV AL,96H ; 計(jì)數(shù)器2的控制字96H:方式3,只送低8位,二進(jìn)制計(jì)數(shù)
OUT 066H , AL ;控制字寫入8253的控制口
MOV AL, 056H ;計(jì)數(shù)初值的低8位
OUT064H,AL;計(jì)數(shù)初值的低8位寫入計(jì)數(shù)器2的端口
例2:要求讀出計(jì)數(shù)器2的當(dāng)前計(jì)數(shù)值,并檢查是否為全“1”。
8253在讀取計(jì)數(shù)器的當(dāng)前計(jì)數(shù)值時(shí),必須分兩步進(jìn)行。首先發(fā)一鎖存命令 (即控制字中RL1RL0=00 ) ,將當(dāng)前計(jì)數(shù)值鎖存到輸出鎖存器中。第二步執(zhí)行讀操作 ,即用IN指令將鎖存器中內(nèi)容讀入CPU。
假設(shè)計(jì)數(shù)初值只有低8位,設(shè)其程序段如下(控制[ ]地址為066H,計(jì)數(shù)器2的[ ]地址為064H) :
KEEP : MOV AL, 80H ;計(jì)數(shù)器2的鎖存命令
OUT 066H , AL ;鎖存命令寫入控制寄存器
IN AL, 064H ;讀輸出鎖存器中的當(dāng)前計(jì)數(shù)值(從計(jì)數(shù)器2端口讀)
CMP AL, OFFH ; 比較當(dāng)前計(jì)數(shù)值是否為全“1”
JME KEEP ;非全“1”繼續(xù)讀
HLT ;為全“1”暫停
8253的應(yīng)用舉例
例1:將8253的計(jì)數(shù)器1作為5ms定時(shí)器,設(shè)輸入時(shí)鐘頻率為200kHz,試編寫8253的初始化程序。
(1)計(jì)數(shù)初值N計(jì)算
已知輸入時(shí)鐘CLK頻率為200kHz,則時(shí)鐘周期為T=1/f=1/200kHz=5μs,于是計(jì)數(shù)初值N為:N=5ms/T=5ms/5μs=1000。
(2)確定控制字
按題意選計(jì)數(shù)器1,按BCD碼計(jì)數(shù),工作于方式0,由于計(jì)數(shù)初值N=1000,控制字D5D4應(yīng)為11,于是8253的控制字 為:01110001B=71H。
(3)選擇8253各端口地址
設(shè)計(jì)數(shù)器1的端口地址為3F82H,控制口地址為3F86H。
(4)初始化程序如下
MOV AL,71H ;控制字
MOV DX,3F68H ;控制口地址
OUT DX,AL ;控制字送8253控制寄存器
MOV DX,3F82H ;計(jì)數(shù)器1端口地址
MOV AL,00 ;將計(jì)數(shù)初值N=1000的低8位寫入計(jì)數(shù)器1
OUT DX,AL
MOV AL,10 ;將N的高8位寫入計(jì)數(shù)器1
OUT DX,AL
例2:以8086為CPU的某微機(jī)系統(tǒng)中使用了一塊8253芯片,其通道端口地址為308H, 30AH,30CH,控制口地址為30EH,3個(gè)通道使用同一輸入時(shí)鐘,頻率為2MHz,要求完成如下功能:
利用計(jì)數(shù)器0采用硬件觸發(fā),輸出寬度等于時(shí)鐘周期的單脈沖,定時(shí)常數(shù)為36H;
利用計(jì)數(shù)器1輸出頻率為2kHz的對(duì)稱方波;
利用計(jì)數(shù)器2產(chǎn)生寬度為0.6ms的單脈沖,
試設(shè)計(jì)該定時(shí)系統(tǒng)硬件電路和初始化程序。
(1)硬件電路設(shè)計(jì)
硬件電路設(shè)計(jì)主要是地址譯碼電路設(shè)計(jì)及時(shí)8253與CPU間的連接。根據(jù)給定的端口地址可知,地址總線低位部分的 A9~A0分別為:A9A8=11,A7~A4=0000,A3A2A1=100~111,A0=0,由它們經(jīng)譯碼器譯碼產(chǎn)生8253的片選信號(hào), 8253的數(shù)據(jù)線D7~D0必須與系統(tǒng)數(shù)據(jù)總線的低8位相連,8253的端口的選擇信號(hào)A1A0應(yīng)連系統(tǒng)地址的A2A1。根據(jù)上 述要求,譯碼器應(yīng)選3-8譯碼器74LS138。該譯碼器有3個(gè)代碼輸入端(C,B,A),輸入3位代碼決定譯碼信號(hào)從 Y0~Y7中哪一個(gè)輸出,本例中顯然應(yīng)以Y2輸出。
(2)初始化編程
根據(jù)題意要求,對(duì)3個(gè)通道的工作方式,計(jì)數(shù)初值確定如下:
由CLK0~CLK2=2MHz可得,時(shí)鐘周期T=1/f=1/2MHz=0.5μs。
選計(jì)數(shù)器0:選擇方式5,門控信號(hào)GATE應(yīng)接一正跳變信號(hào),OUT端當(dāng)計(jì)數(shù)為0時(shí)產(chǎn)生一個(gè)寬度等于時(shí)鐘周期的單脈 沖。計(jì)數(shù)系數(shù)為36,用BCD計(jì)數(shù)。所以,計(jì)數(shù)器0的控制字應(yīng)為00011011B=1BH。
選計(jì)數(shù)器1:選擇方式3,GATE按+5V,CLK1=2MHz輸出方波頻率為2kHz,所以,計(jì)數(shù)常數(shù)N1=2MHz/2kHz=1000,采用 BCD計(jì)數(shù),于是計(jì)數(shù)器1的控制字為:01110111B=77H。
選計(jì)數(shù)器2:選擇方式1,以構(gòu)成一個(gè)單穩(wěn)態(tài)電路,輸出脈沖寬度由計(jì)數(shù)常數(shù)N2決定,計(jì)數(shù)常數(shù)N2=600μs/0. 5μs=1200,采用BCD計(jì)數(shù),于是計(jì)數(shù)器2的控制字為:10110011B=B3H。
根據(jù)以上分析可得3個(gè)計(jì)數(shù)通道的初始化程序如下。
計(jì)數(shù)通道0的初始化程序:
MOV DX,30EH ;8253的控制口地址
MOV AL,1BH ;計(jì)數(shù)通道0的控制字,低8位,方式5,BCD計(jì)數(shù)
OUT DX,AL ;控制字寫入控制口
MOV DX,308H ;計(jì)數(shù)器0的端口地址
MOV AL,036H ;計(jì)數(shù)初值的低8位
OUT DX,AL ;低字節(jié)寫入計(jì)數(shù)器0端口
計(jì)數(shù)通道1的初始化程序:
MOV DX,30EH ;8253的控制口地址
MOV AL,77H ;計(jì)數(shù)通道1的控制字,先寫低字節(jié),后寫高字節(jié),方式3,BCD計(jì)數(shù)
OUT DX,AL ;控制字寫入控制口
MOV DX,30AH ;計(jì)數(shù)通道1的端口地址
MOV AL,00H ;計(jì)數(shù)初值的低字節(jié)
OUT DX,AL ;低字節(jié)寫入計(jì)數(shù)通道1
MOV AL,10D ;計(jì)數(shù)初值的高字節(jié)
OUT DX,AL ;高字節(jié)寫入計(jì)數(shù)通道1
計(jì)數(shù)通道2的初始化程序
MOV DX,30EH ;8253的控制口地址
MOV AL,B3H ;計(jì)數(shù)通道2的控制字,先寫低字節(jié),后寫高字節(jié),方式1,BCD計(jì)數(shù)
OUT DX,AL ;控制字寫入控制口
MOV DX,30CH ;計(jì)數(shù)通道的端口地址
MOV AL,00H ;計(jì)數(shù)初值的低字節(jié)
OUT DX,AL ;低字節(jié)寫入計(jì)數(shù)通道
MOV AL,12D ;計(jì)數(shù)初值的高字節(jié)
OUT DX,AL ;高字節(jié)寫入計(jì)數(shù)通道2
計(jì)數(shù)通道2初始化程序:
MOV AL,B0H ;計(jì)數(shù)通道2的控制字
OUT 05FH,AL ;控制字寫入控制器
MOV AL,068H ;計(jì)數(shù)初值的低8位
OUT 05DH,AL ;計(jì)數(shù)初值的低8位寫入計(jì)數(shù)通道2
評(píng)論