




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第十七章定時及音響程序設計17.1概述17.28253/8254可編程定時/計數器17.3時鐘程序設計17.4音響程序設計第十七章定時及音響程序設計17.1概述117.1概述CPU通過接口電路產生時間符合要求的信號的過程,稱為定時。該接口電路稱為定時器。CPU通過接口電路對外部事件的數量進行統計的過程稱為計數。實現計數的接口電路稱為計數器。在微型機里,把定時器和計數器做成一片大規模集成電路,稱為定時器/計數器。17.1概述CPU通過接口電路產生時間符217.1概述輸入脈沖輸出(分頻)
聲音的產生:對輸出方波整形變成正弦波,經放大處理接到揚聲器上,產生不同聲音的波形。若選擇標準輸入脈沖,例1KHz,則當輸入1000個標準輸入脈沖,需要1s,則當計數值為1000時,輸出端每隔1s輸出一個脈沖,實現了定時。17.1概述輸入脈沖輸出(分頻)聲音的產317.1概述實現定時/計數有三種不同的方法:(1)軟件定時:執行一個具有固定延遲時間的循環程序。優點:不需外加硬件,靈活,定時較準確。缺點:在定時過程中CPU不能做任何其它工作。總結:適用于定時時間短的場合。(2)硬件定時:采用中規模TTL或CMOS芯片外家阻容件來實現的。不同的時間間隔主要是通過配接不同的阻容值達到的。優點:不占用CPU時間。缺點:變換定時較難。總結:適用于定時時間間隔固定的場合。(3)可編程的定時:綜合了上述兩種方法的優點,采用固定的硬件,通過編程(寫控制字)實現不同的要求。既不占用CPU的時間,又有靈活性。17.1概述實現定時/計數有三種不同的方417.28253/8254可編程定時/計數器17.2.18253/8254的基本功能和內部結構17.2.28253的工作方式17.2.38253/8254在IBMPC系列機中的應用17.28253/8254可編程定時/計數器17.2.1517.2.18253/8254的基本功能和內部結構(1)8253的基本功能8253有3個獨立的16位計數器。每個計數器的主要功能有:1)按照二進制或二—十進制計數;2)計數速率可高達2MHz;3)可以由程序確定按照6種不同的方式工作;4)所有的輸入輸出都與TTL兼容。17.2.18253/8254的基本功能和內部結構617.2.18253/8254的基本功能和內部結構(2)8253的內部結構8253主要由一個控制寄存器和三個計數器及相應的控制電路所組成。控制寄存器負責對三個計數器設定工作方式。三個計數器的操作是完全獨立的,每個計數器都可以對其時鐘輸入端的始終脈沖按照二進制或二—十進制從預置的初值開始減1計數。當預置的初值減到0時,從OUT輸出端輸出一個脈沖信號。在計數開始和計數的過程中,計數器可以受門控輸入端輸入的門控信號的控制。計數器的初始值必須在開始計數之前,由CPU用輸出指令預置。在計數過程中,CPU隨時可以用輸入指令將任意一個計數器的當前數值讀出,而不必中斷計數器的時鐘輸入,也不會影響計數器的繼續計數。控制寄存器MSBLSB鎖存器0計數器0#0OUT0時鐘0門控0MSBLSB鎖存器1計數器1#0OUT1時鐘1門控1MSBLSB鎖存器2計數器2#0OUT2時鐘2門控217.2.18253/8254的基本功能和內部結構7鎖存器用來保存寫入到計數器的初始值。計數器是16位的,然而,系統只給其分配一個地址,因此只能按字節進行存取,寫入計數值時,要分兩次寫。在我們對計數器進行讀寫時,實際上是讀寫鎖存器的值。因此,當計數到某一時刻時,若想要了解計數器的值,則要先把計數器的值送到鎖存器中,然后再讀寫鎖存器的值。鎖存器用來保存寫入到計數器的初始值。817.2.18253/8254的基本功能和內部結構(3)8253的控制字765432100=二進制,1=BCD碼工作方式000=方式0001=方式1010=方式2011=方式3100=方式4101=方式5讀/寫鎖存器00=鎖存計數器值01=讀/寫MSB10=讀/寫LSB11=先讀/寫LSB,后讀/寫MSB00=編寫通道001=編寫通道110=編寫通道217.2.18253/8254的基本功能和內部結構917.2.28253的工作方式8253有6種工作方式:方式0~方式5。對于每一種工作方式,由時鐘輸入信號CLK確定計數器遞減的速率。門控信號GATE用于允許或禁止計數器計數。計數結束時在輸出線OUT上產生一個信號。無論采用哪一種工作方式,都會遵循下面幾條原則:(1)控制字寫入計數器時,所有的控制邏輯電路立即復位,輸出端OUT進入初始態(高電平或低電平)。(2)計數初值寫入后,要經過一個時鐘上升沿和一個下降沿,計數執行部件才開始計數。(3)在時鐘脈沖CLK的上升沿時,門控信號被采樣。(4)在時鐘脈沖CLK的下降沿時,計數器作減1計數,輸出端OUT的波形也都是在時鐘周期的下降沿時產生電平的變化。17.2.28253的工作方式8253有6種工作1017.2.28253的工作方式
(1)方式0—計數結束時中斷當控制字寫入控制寄存器后,計數器的輸出OUT立即變低,即使未給計數器賦予初值,也未開始計數,只要方式0一確定,輸出就為低。計數值送入計數器且門控信號為高時,計數器開始計數。在計數器開始計數和整個計數過程中,OUT都保持為低,直到計數到0,OUT才變高。時鐘寫計數值=5543210門控OUT停止計數17.2.28253的工作方式(1)方式1117.2.28253的工作方式
方式0的工作特點是:(1)計數器只計一遍。當計數到0時,計數器并不恢復初始值重新開始計數(輸出保持為高),直到CPU又寫入一個新的計數值,輸出立即變低,計數器按照新的數值開始計數。(2)方式0的計數過程可由門控信號控制暫停。當門控信號為低時,計數器暫停計數。門控信號變高后,計數器繼續計數。在計數過程中,GATE信號的變化不影響OUT輸出的狀態。(3)在計數的過程中,可重寫或改變計數值,寫入新的計數值后,計數器將按新的計數值重新開始計數,改變計數值立即有效。17.2.28253的工作方式方式0的工1217.2.28253的工作方式
(2)方式1—可編程的單拍脈沖這種方式是由外部門控脈沖(硬件)觸發啟動定時或計數,使輸出變低,單拍脈沖開始,在經過固定的時間間隔或計數之后,輸出變高,單拍脈沖結束,硬件再次觸發,輸出可再發一個同樣的單拍脈沖。門控信號變低,可停止計數,門控信號變高后,重新開始計數。時鐘寫計數值=554543210門控OUT重新計數17.2.28253的工作方式(2)方式1317.2.28253的工作方式
方式1的工作特點是:(1)寫入控制字后,輸出端OUT立即變低,知道外部門控信號GATE的上升沿啟動之后的CLK下降沿開始計數,OUT變低,并在計數到達0之前一直維持低電平。當計數到0時,OUT變為高電平,并在下一次門控信號觸發啟動后的第一個時鐘脈沖到來之前一直保持高電平。若外部再次觸發啟動,則可在OUT上再次產生一個單拍脈沖。(2)當計數到0后,可再次由外部門控信號GATE的上升沿觸發啟動。(3)即使在計數的過程中,也可用門控脈沖進行再觸發,在再觸發脈沖上升沿之后的一個CLK脈沖的下降沿,計數器將重新開始計數,而不管原來計數到什么地方。在再觸發時,輸出的狀態將保持不變。在任何一次再觸發之后,輸出OUT都將繼續保持低電平。(4)在計數的過程中,CPU可改變計數值,這時候計數過程和輸出都不受影響,計數到0后,輸出為高。若再次觸發計數器,計數器將按新輸入的計數值計數。17.2.28253的工作方式方式1的工1417.2.28253的工作方式
(3)方式2—速率發生器這種方式的功能如同一個N分頻計數器,輸出是輸入時鐘按照N計數值分頻后的一個連續脈沖。如果計數值為N,結果是輸入N個脈沖,輸出一個脈沖。時鐘寫計數值=443210(4)3210(4)3210(4)門控OUT重新計數17.2.28253的工作方式(3)方式1517.2.28253的工作方式
方式2的工作特點是:(1)當CPU輸出控制字后,OUT將為高。在寫入計數值后的下一個CLK開始減1計數。在計數過程中,OUT保持為高。直到計數值減至1時,OUT變為低,保持一個CLK周期,又恢復為高,重新開始計數。(2)不用重新設置計數值,通道能夠連續工作,輸出端送出固定頻率的脈沖。(3)計數過程可以由門控脈沖GATE控制。當GATE變低時就暫停計數,OUT仍保持高電平,在GATE變高后的下一個時鐘脈沖,使計數器恢復初值,重新計數。這種利用門控信號使計數器開始工作(即同步)的方法成為硬件同步。(4)在計數過程中可以改變計數值,這對計數過程沒有影響,但在計數變到1時,輸出變低,過一個CLK周期輸出又變高,計數器將按新的計數值開始計數,可見改變計數值是在下一次有效。17.2.28253的工作方式方式2的工1617.2.28253的工作方式
(4)方式3—方波速率發生器方式3和方式2都是周期性的,但方式3輸出的是對稱的方波。輸入時鐘脈沖與輸出脈沖頻率之比等于加載的計數值。時鐘寫計數值=443210(4)3210(4)3210(4)門控OUT重新計數17.2.28253的工作方式(4)方式1717.2.28253的工作方式
方式3的工作特點是:(1)設置控制字后,OUT將為高。在寫入計數值后的下一個CLK開始減1計數。當計數到一半計數值時,OUT變為低,直到計數值變為0,輸出又為高,再重新開始計數。(2)當計數值N為偶數時,輸出端的高低電平持續時間相等,為完全對稱的方波。當計數值N為奇數時,則輸出端的高電平持續時間比低電平持續時間多一個時鐘周期,即高電平持續(N+1)/2,而低電平持續(N-!)/2,輸出為矩形波,整個輸出周期仍為N個時鐘脈沖周期。(3)GATE信號能使計數過程重新開始,GATE=1時,計數進行;GATE=0時,計數停止。如果在OUT為低期間,GATE變低,則OUT會立即變為高電平,此時計數停止。在GATE又變為高電平后,下一個時鐘脈沖來到時,重新開始計數。(4)若在計數其間寫入一個新的計數值,并不影響現行的計數過程。但是如果在輸入新的計數值后,又受到門控信號上升沿的觸發,就會結束當前輸出的周期,而在下一個時鐘周期時,計數的執行部件按新值開始計數。17.2.28253的工作方式方式3的工1817.2.28253的工作方式
(5)方式4—軟件觸發選通當控制字寫入控制寄存器后輸出開始為高,當設置完計數值后,計數器立即開始計數。當計數到0后,輸出變低,持續一個輸入時鐘周期,然后又恢復為高,計數器停止計數。這種計數也是“一次性有效”,每次計數都要靠這種重新設置計數值進行“軟件觸發”。時鐘寫計數值=5重新計數543210門控OUT停止計數17.2.28253的工作方式(5)方式1917.2.28253的工作方式
方式4的工作特點是:(1)門控信號變低,可暫停計數,門控信號變高后,繼續計數。(2)若在計數過程中改變計數值,新值寫入后的下一個CLK周期開始從新的計數值開始重新計數。通過寫入新的計數值使計數器從頭工作,叫軟件再觸發。17.2.28253的工作方式方式4的工2017.2.28253的工作方式
(6)方式5—硬件觸發選通方式5輸出初始狀態為該。在設置計數值之后,計數器并不立即開始計數,而是要等到門控脈沖的上升沿出現才開始計數,即靠硬件觸發選通計數。。當計數到0時,輸出變低,持續一個輸入時鐘周期,然后又恢復為高,計數器停止計數。下次門控脈沖觸發后才能再重新開始計數。時鐘OUT寫計數值=554543210門控重新計數17.2.28253的工作方式(6)方式2117.2.28253的工作方式
方式5的工作特點是:(1)若在計數過程中使用門控脈沖,則使計數器重新開始計數,但對輸出狀態沒有影響。(2)若在計數過程中改變計數值,只要沒有門控信號的觸發,則當前輸出周期不受影響。當計數到0后,若有新的門控信號出發,見按新的計數值開始計數。如果在寫入了新的計數值后,在未計到0之前,又有新的門控信號觸發,則立即按新的計數值開始計數。17.2.28253的工作方式方式5的工2217.2.28253的工作方式(7)8253各種工作方式小結①幾種方式比較方式2,4,5輸出的波形是一樣的,都是寬度為一個CLK時鐘周期的低有效脈沖。主要區別是:方式2連續不停地計數和輸出;方式4每次都要由程序設置計數值才能計數;方式5不用每次設置,但每次都要由門控脈沖觸發啟動才能計數。即:計到0后,方式2不用觸發,方式4要軟件觸發,方式5要硬件觸發,才能繼續計數。方式1與方式5中的門控脈沖的作用和計數中改變計數值的結果都是相同的,只是輸出波形不同。方式1的輸出信號從開始計數的整個過程都為低,而方式5的輸出從開始計數的整個過程都為高;方式1輸出的低有效脈沖寬度為N個輸入時鐘脈沖的寬度,而方式5輸出的低有效脈沖寬度為一個輸入時鐘脈沖的寬度。②輸出端OUT的初始狀態只有方式0在置入控制字后,OUT立即變低,其它5種方式OUT初始態均為高電平。17.2.28253的工作方式(7)822317.2.28253的工作方式
③啟動計數與重復計數的條件計數值寫入后,并不立即開始工作,需要一定的條件才能開始工作。有些方式計數到0后,則停止工作,要重復計數同樣也需要某些條件。8253啟動計數和重復計數的條件方式 功能 啟動條件 重復條件0 計完最后一個數中斷 寫計數值1硬件再觸發大案拍脈沖外部觸發 外部觸發2速率發生器3 方波速率發生器4軟件觸發選通 寫計數值5硬件觸發選通 外部觸發 外部觸發方式2和方式3是連續工作,輸出是周期性的,不用重復啟動再次觸發,這兩種方式一經寫入計數值,計數器就開始不停頓地工作,直到CPU重新寫入控制字為止。17.2.28253的工作方式③啟動2417.2.28253的工作方式
④門控信號的作用.8253門控信號GATE的作用GATE低或變為低上升沿高禁止計數
禁止計數 立即使OUT為高計數停止立即使OUT為高禁止計數啟動計數下一個CLK脈沖使輸出變低重新裝入計數值啟動計數啟動計數啟動計數進行計數進行計數進行計數方式 改變計數值 0(電平觸發)1(脈沖)2(電平、脈沖)3(電平、脈沖)4(電平)5(脈沖)進行計數立即有效外部觸發后有效計數到1后有效a.外部觸發后有效b.計數到0后有效立即有效外部觸發后有效17.2.28253的工作方式④門控2517.2.28253的工作方式
⑤在計數過程中改變計數值新的計數值何時起作用因方式不同而有差別。在8253的某一計數通道的計數過程中,要讀取它的瞬間計數值,可以利用門控信號GATE使其計數過程暫停,然后分兩次將16的當前計數值讀入CPU;也可以給該通道送去一個鎖存命令,將當前計數值在輸出鎖存器中鎖存,而此時計數照常進行,這時分兩次讀取計數值送往CPU,輸入指令過后,鎖存器解除鎖存。17.2.28253的工作方式⑤在計2617.2.38253/8254在IBMPC系列機中的應用
在IBMPC和PC/XT中,使用的是8253-5。在IBMPC/AT中使用的是8254。8253-5,8254在內部結構及功能上與8253完全一樣,其編程方法也完全一樣,其差別只是最高計數速率不同。8253的最高計數速率是2MHz,8253-5是5MHz,8254為10MHz。在PC系列機上,系統分配給8253/8254的地址是40H~43H,其中43H是控制寄存器的地址,40H、41H、42H分別為計數器0~2的鎖存器地址。8253/8254的三個計數器各有其責,計數器0用于維持系統時鐘;計數器1用于周期性地想DMA發送數據請求信號,供存儲器刷新用;計數器2接到揚聲器用來產生聲音。各計數器的輸入時鐘脈沖頻率均為1.19318MHz。計數器0和計數器1的門控信號輸入端接至高電平,因此永遠開啟。計數器2的門控信號輸入端則由8255A的PB口的第0位控制。系統將計數器1設置為方式2,計數值為18,因此每15μs向DMA發一次請求信號,使DMA進行存儲器刷新。此計數器絕對不可修改,否則將危及存儲器的安全。17.2.38253/8254在IBMPC系列機中的應2717.2.38253/8254在IBMPC系列機中的應用計數器0,11.19318MHz+5VOUT計數器21.19318MHz8255A的PB0OUT計數器0接至8259A的IR0,工作于方式3,每隔固定時間產生一次中斷,用來維持系統日歷時鐘,初始計數值為0(65536),因此輸出脈沖頻率為1.19318MHz/65536=18.2每秒產生18.2次中斷,即每55ms產生一次中斷。計數器1接到DMA上,工作于方式2,計數值為18,因此每15μs向DMA發一次請求信號,使DMA進行存儲器刷新。+5V數據節電器場效應管,記錄1位數據來存儲數據,過一段時間要漏電,每隔一段時間要恢復其狀態。17.2.38253/8254在IBMPC系列機中的應2817.2.38253/8254在IBMPC系列機中的應用計數器21.19318MHz計數器2接到揚聲器用來產生聲音。8255A的PB017.2.38253/8254在IBMPC系列機中的應2917.3時鐘程序設計17.3.1使用8253/8254時鐘1.8253/8254時鐘中斷的使用在系統初始化時,已將8253/8254計數器0設置為方式3,計數值為0000H(相當于65536),所以計數器0的輸出頻率為1.19318MHz/65536=18.2Hz。計數器0的輸出又接至8259A的IR0上,因此系統每秒鐘產生18.2次類型為8的中斷(成為時鐘中斷)。系統就是通過該中斷修改其時間計數值,以維持其日歷時鐘的。另外,該始終中斷還負責在軟盤操作完成之后關掉軟盤驅動器馬達的電源。因此,該時鐘中斷通常情況下是不能修改的,否則將影響日歷時鐘的運行和使系統在完成軟盤操作后不能關掉磁盤驅動器的馬達。為了使擁護能夠使用時鐘中斷,系統中還設置了另外一個中斷INT1CH,該中斷被INT8中斷服務調用,因此它與INT8保持同步,也是每秒執行18.2次,并且在使用INT1CH時,在中斷服務程序結束時也不需要向8259A輸出EOI命令,因為這項工作在INT8中完成了。通常情況下,系統中INT1CH中斷服務程序只有一條指令IRET,即什么也不做。因此,可以修改INT1CH的中斷服務程序的入口地址指向我們自編的程序來完成所需要的工作。系統中每1/18.2s的計數值被INT8的中斷服務程序保存在內存的4個字節中,需要時可通過BIOS中斷INT1AH的0號功能讀出,讀出的計數值是一個32位的數值,表示的是自從0時0分0秒以來的計數值,使用時可通過計算轉換成時分秒的形式。17.3時鐘程序設計17.3.1使用8253/8253017.3時鐘程序設計17.3.1使用8253/8254時鐘例17.1利用INT1CH中斷編寫一個駐留程序,完成每隔大約一秒鐘在屏幕的右下角顯示一個數字的功能。要求數字在0~9之間變化,每隔大約一秒鐘變化一個。編寫一個中斷服務程序取代原INT1CH的服務程序,這樣該程序可被每隔大約1/18.2s啟動執行一次,在該服務程序中需要對中斷次數計數,計數達到18次,即時間過去大約1s時顯示一個數字,并將當前數字加1,以備下次顯示用。在顯示數字之前,要先將當前的光標位置取出保存起來,以備在右上角顯示完數字之后,恢復原光標的位置。另外要解決的一個問題是要將該程序駐留內存,且不允許被其它程序執行時覆蓋,這可采用DOS中斷INT27H完成。執行INT27H之前要求將駐留程序的長度放入DX,程序段前綴的段基址放在CS中。由于編寫.EXE型的駐留程序較麻煩,故通常都將駐留程序編寫成.COM型的。編寫.COM型程序通常需要注意如下幾個問題:(1)程序從100H單元開始,并且其開始必須為程序的入口;(2)程序中只允許有一個段;(3)不允許設置堆棧;(4)不允許有存取段基址的指令存在;(5)程序的長度(包括數據)不能超過64K字節。17.3時鐘程序設計17.3.1使用8253/82531CSEG SEGMENT ORG 100H ASSUME CS:CSEG,DS:NOTHINGBEGIN: JMP MAINCOUNT DB 18CHAR DB ‘0’INT1C PROC DEC COUNT JNZ EXIT MOV COUNT,18 PUSH AX PUSH BX PUSH CX PUSH DX MOV AH,03H MOV BH,0 INT 10H PUSH DX MOV AH,02H MOV DX,004FH INT 10H MOV AL,CHAR MOV AH,0AH MOV CX,1 INT 10H POP DX MOV AH,02H INT 10H INC CHAR CMP CHAR,’9’ JBE OK MOV CHAR,’0’OK: POP DX POP CX POP BX POP AXEXIT: IRETINT1C ENDPMAIN: MOV DX,OFFSETINT1C MOV AX,251CH INT 21HCSEG ENDS END BEGIN匯編語言第17章定時及音響程序設計課件3217.3時鐘程序設計17.3.1使用8253/8254時鐘2.隨機數的產生生成隨機數的一個最方便的辦法就是利用時鐘。前面已經提過每秒鐘產生18.2次的時鐘中斷,對中斷次數計數(時間計數),該計數值是一個32位的數據,保存在內存的4個字節中,可以通過INT1AH的0號功能讀出。讀出之后,CX存放的是其高16位,DX是其低16位。這個計數值是持續變化的,特別是其低16位可以被認為是偽隨機數。由于計數值總是增加而不是隨機改變,所以不能提供一個真正的隨機數。但是,因為計數值以每秒18.2次的速綠政見,它的隨機程度足夠滿足大部分應用了。17.3時鐘程序設計17.3.1使用8253/8253317.3時鐘程序設計17.3.1使用8253/8254時鐘例17.2編寫一個產生0~99范圍內隨機數的子程序。時間計數值的低16位基本上可以作為一個16位的隨機數使用。要產生0~99范圍內的隨機數,可將該計數值除以100,取其余數即可。做除法時還應考慮產生溢出的問題。為了保證不產生溢出,可將16位數據的高2位清0,然后再做除法就安全了。子程序說明文件如下:(1)子程序名:RAND99;(2)子程序功能:產生0~99范圍內的隨機數;(3)入口條件:無;(4)出口條件:AL為產生的隨機數;(5)影響的寄存器:AH,AL,F。RAND99 PROC PUSH CX PUSH DX XOR AH,AH INT 1AH MOV AX,DX AND AX,3FFFH MOV DL,100 DIV DL MOV AL,AH POP DX POP CX RETRAND99 ENDP17.3時鐘程序設計17.3.1使用8253/8253417.3時鐘程序設計17.3.2實時時鐘的使用在IBMPC/AT計算機上擴充了一個實時時鐘,該時鐘在系統斷電后仍能保持運行。BIOS的INT15H和INT1AH中都擴充了對實時時鐘的管理。1.實現延時實現延時,我們可以編一段什么也不做的小程序,讓它反復執行,反復執行的次數就決定了延時的長短。但是這樣編寫出來的程序依賴計算機的運行速度(主頻、CPU類型),其通用性差。為了克服這個缺點,可利用BIOS提供的INT15H的86H號功能來實現。使用該功能時,將延時的時間(微秒數)放入CX:DX聯合組成的32位寄存器中,其中CX中為高16位。雖然該功能要求放入的時間單位是微秒,但替延時精度只能達到毫秒級。例17.3編寫一個程序,在屏幕上每隔一秒顯示一個數字,從0顯示到9之后結束。17.3時鐘程序設計17.3.2實時時鐘的使用35CSEG SEGMENT ORG 100H ASSUME CS:CSEGDELAY: MOV BL,’0’NEXT: MOV DX,4240H MOV CX,000FH MOV AH,86H INT 15H MOV DL,BL MOV AH,2 INT 21H INC BL CMP BL,’9’ JBE NEXT INT 20HCSEG ENDS END DELAYCSEG SEGMENT3617.3時鐘程序設計17.3.2實時時鐘的使用在IBMPC/AT計算機上擴充了一個實時時鐘,該時鐘在系統斷電后仍能保持運行。BIOS的INT15H和INT1AH中都擴充了對實時時鐘的管理。2.實現鬧鐘INT1AH的6號和7號功能允許我們將AT計算機變為一臺多用途的鬧鐘,此時需做如下工作:(1)準備一個中斷服務程序,它完成在達到響鈴時間之后所做的事情。(2)設置中斷服務程序的入口地址。中斷類型為4AH。(3)把響鈴的時間放入CH(時)、CL(分)及DL(秒)中。時間應為BCD碼的形式。(4)使用INT1AH的6號功能來設置響鈴。例17.4編寫一個鬧鐘程序,在下午3點03分30秒響鈴。響鈴后,如果用戶按下[Esc]鍵則停止響鈴。17.3時鐘程序設計17.3.2實時時鐘的使用37CSEG SEGMENT ORG 100H ASSUME CS:CSEGBEGIN: JMP MAINALARM: PUSH AX PUSH BXAGAIN: MOV AX,0E07H INT 10H MOV AH,1 INT 16H JZ AGAIN MOV AH,0 INT 16H CMP AL,16H JNE AGAIN MOV AH,7 INT 1AH POP BX POP AX IRETMAIN: MOV DX,OFFSETALARM MOV AX,254AH INT 21H MOV CX,1503H MOV DH,30H MOV AH,6 INT 1AH MOV DX,OFFSETMAIN INT 27HCSEG ENDS END BEGINCSEG SEGMENT POP BX3817.4音響程序設計17.4.1揚聲器與系統的連接
8255A的PC口(62H)765432108255A的PB口(61H)765432108253計時器2(43H)AND放大器門控OUT由圖可見,在IBMPC系列機上有兩個可以驅動揚聲器的信號。一路是8255A的PB口的第1位的輸出;另一路是8253/8254計數器2的輸出,這可以通過對8253/8254編程使其產生某一頻率的方波加以控制。兩路輸出經過一個與門之后,經驅動器驅動,推動揚聲器發出聲音。由于兩個信號是與的關系,因此,要想使其中一個正常輸出,另一個的輸出必須保持為1狀態。17.4音響程序設計17.4.1揚聲器與系統的連接83917.4音響程序設計17.4.1揚聲器與系統的連接
8253/8254計數器2的輸出在IBMPC,PC/XT和PC/AT機上有所不同。在PC和PC/XT機上,計數器2的輸出分為兩路,一路接至揚聲器產生聲音,另一路接至8255A的PC口第5位,可通過軟件檢測;在PC/AT機上,計數器2的輸出僅接到揚聲器。8255A是一個可編程的通用外設接口,由一個控制寄存器(端口地址為63H)和三個輸入輸出數據寄存器組成。輸入輸出寄存器又成為輸入/輸出端口,名字分別為A口,B口和C口。在IBMPC系列機上,這三個端口的地址分別為60H,61H和62H。在系統初始化時,已將A口和C口設為輸入方式,B口設為輸出方式。17.4音響程序設計17.4.1揚聲器與系統的連接4017.4音響程序設計17.4.2音響程序的設計
1.軟件控制產生聲音可以通過將8255A的PB口的第1位交替置位和復位產生一個方波信號,推動揚聲器發出聲音。PB口交替置位和復位的頻率就是方波的頻率,也就是所產生的聲音的頻率。例17.5編寫一個使揚聲器發出600Hz聲音,并持續2s的子程序。
延遲的時間可用重復執行LOOP指令實現。假設計算機的主頻為4.77MHz,那么其每個時鐘周期為1/4.77μs。600Hz的聲音其半周期為1/1200s,8086/8088CPU執行一條LOOP指令需要17個時鐘周期(即17/4.77μs),所需要的次數為:循環次數=(1/1200)/(17/4.77*10-6) =(4.77*10-6)/(17*1200) ≈233.8由于每個方波的周期為1/600s,要持續2s,只需要控制產生1200個方波即可。17.4音響程序設計17.4.2音響程序的設計41BEEP PROC MOV DX,1200AGAIN:IN AL,61H AND AL,0FEH OR AL,02H OUT 61H,AL MOV CX,233 LOOP $ AND AL,0FDH OUT 61H,AL MOV CX,233 LOOP $ DEC DX JNZ AGAIN RETBEEP ENDPBEEP PROC4217.4音響程序設計17.4.2音響程序的設計
2.對8253/8254編程產生聲音例17.6編寫一個子程序,用8253產生指定頻率的聲音并持續指定的時間。
要產生指定頻率的聲音,可將8253的計數器2設置為方式3,根據聲音的頻率計算出8253所需的計數值并送入8253計數器2即可。使聲音持續一定時間,可采用通過8255A的PC5檢測8253計數器2的輸出,并對其方波的周期進行計數來實現,延時的時間與輸出方波周期(頻率的倒數)和周期個數之間的關系如下:持續時間=方波的周期×輸出方波的個數通過8255A的PB1,我們還可以控制8253的計數器2,使其只輸出方波,但不使揚聲器發聲,以達到僅延時的目的。17.4音響程序設計17.4.2音響程序的設計4317.4音響程序設計17.4.2音響程序的設計
2.對8253/8254編程產生聲音例17.6編寫一個子程序,用8253產生指定頻率的聲音并持續指定的時間。子程序說明文件:(1)子程序名:SOUND;(2)子程序功能:啟動8253計數器2產生指定頻率的聲音 并持續指定的時間;(3)入口條件:DX=產生方波的頻率; AX=持續(延時)的時間(ms);(4)出口條件:無;(5)受影響的寄存器:AX,DX,F。17.4音響程序設計17.4.2音響程序的設計44SOUND PROC PUSH CX PUSH SI MOV SI,DX MUL DX MOV CX,1000 DIV CX MOV AX,CX MOV AL,10110110B OUT 43H,AL MOV DX,0012H MOV AX,34DCH DIV SI OUT 42H,AL MOV AL,AH OUT 42H,AL IN AL,61H AND AL,11111100B OR AL,BL OUT 61H,ALZERO: IN AL,62H TEST AL,00100000B JZ ZEROONE: IN AL,62H TEST AL,00100000B JNZ ONE LOOP ZERO POP SI POP CX RETSOUND ENDPSOUND PROC IN AL,61H4517.4音響程序設計17.4.2音響程序的設計
2.對8253/8254編程產生聲音例17.7利用例17.6的子程序編制模擬電話振鈴聲音的程序。
電話鈴聲一般由兩個頻率的聲音組成,一個為600Hz,另一個為1500Hz,兩個聲音交替產生,各持續0.03s,交替30次之后,停頓2s,然后再重復。重復數次之后停止。17.4音響程序設計17.4.2音響程序的設計46CSEG SEGMENT ASSUMECS:CSEGRING PROC FAR PUSH DS XOR AX,AX PUSH AX MOV BP,8AGAIN: MOV CX,30NEXT: MOV DX,600 MOV AX,30 MOV BL,3 CALL SOUND MOV DX,1500 MOV AX,30 CALL SOUND LOOP NEXT MOV DX,100 MOV BL,1 MOV AX,2000 CALL SOUND DEC BP JNZ AGAIN RETRING ENDPCSEG ENDS END RINGCSEG SEGMENT MOV DX,1004717.4音響程序設計17.4.2音響程序的設計
3.音樂的產生例17.7利用例17.6的子程序編制模擬電話振鈴聲音的程序。
電話鈴聲一般由兩個頻率的聲音組成,一個為600Hz,另一個為1500Hz,兩個聲音交替產生,各持續0.03s,交替30次之后,停頓2s,然后再重復。重復數次之后停止。17.4音響程序設計17.4.2音響程序的設計48第十七章定時及音響程序設計17.1概述17.28253/8254可編程定時/計數器17.3時鐘程序設計17.4音響程序設計第十七章定時及音響程序設計17.1概述4917.1概述CPU通過接口電路產生時間符合要求的信號的過程,稱為定時。該接口電路稱為定時器。CPU通過接口電路對外部事件的數量進行統計的過程稱為計數。實現計數的接口電路稱為計數器。在微型機里,把定時器和計數器做成一片大規模集成電路,稱為定時器/計數器。17.1概述CPU通過接口電路產生時間符5017.1概述輸入脈沖輸出(分頻)
聲音的產生:對輸出方波整形變成正弦波,經放大處理接到揚聲器上,產生不同聲音的波形。若選擇標準輸入脈沖,例1KHz,則當輸入1000個標準輸入脈沖,需要1s,則當計數值為1000時,輸出端每隔1s輸出一個脈沖,實現了定時。17.1概述輸入脈沖輸出(分頻)聲音的產5117.1概述實現定時/計數有三種不同的方法:(1)軟件定時:執行一個具有固定延遲時間的循環程序。優點:不需外加硬件,靈活,定時較準確。缺點:在定時過程中CPU不能做任何其它工作。總結:適用于定時時間短的場合。(2)硬件定時:采用中規模TTL或CMOS芯片外家阻容件來實現的。不同的時間間隔主要是通過配接不同的阻容值達到的。優點:不占用CPU時間。缺點:變換定時較難。總結:適用于定時時間間隔固定的場合。(3)可編程的定時:綜合了上述兩種方法的優點,采用固定的硬件,通過編程(寫控制字)實現不同的要求。既不占用CPU的時間,又有靈活性。17.1概述實現定時/計數有三種不同的方5217.28253/8254可編程定時/計數器17.2.18253/8254的基本功能和內部結構17.2.28253的工作方式17.2.38253/8254在IBMPC系列機中的應用17.28253/8254可編程定時/計數器17.2.15317.2.18253/8254的基本功能和內部結構(1)8253的基本功能8253有3個獨立的16位計數器。每個計數器的主要功能有:1)按照二進制或二—十進制計數;2)計數速率可高達2MHz;3)可以由程序確定按照6種不同的方式工作;4)所有的輸入輸出都與TTL兼容。17.2.18253/8254的基本功能和內部結構5417.2.18253/8254的基本功能和內部結構(2)8253的內部結構8253主要由一個控制寄存器和三個計數器及相應的控制電路所組成。控制寄存器負責對三個計數器設定工作方式。三個計數器的操作是完全獨立的,每個計數器都可以對其時鐘輸入端的始終脈沖按照二進制或二—十進制從預置的初值開始減1計數。當預置的初值減到0時,從OUT輸出端輸出一個脈沖信號。在計數開始和計數的過程中,計數器可以受門控輸入端輸入的門控信號的控制。計數器的初始值必須在開始計數之前,由CPU用輸出指令預置。在計數過程中,CPU隨時可以用輸入指令將任意一個計數器的當前數值讀出,而不必中斷計數器的時鐘輸入,也不會影響計數器的繼續計數。控制寄存器MSBLSB鎖存器0計數器0#0OUT0時鐘0門控0MSBLSB鎖存器1計數器1#0OUT1時鐘1門控1MSBLSB鎖存器2計數器2#0OUT2時鐘2門控217.2.18253/8254的基本功能和內部結構55鎖存器用來保存寫入到計數器的初始值。計數器是16位的,然而,系統只給其分配一個地址,因此只能按字節進行存取,寫入計數值時,要分兩次寫。在我們對計數器進行讀寫時,實際上是讀寫鎖存器的值。因此,當計數到某一時刻時,若想要了解計數器的值,則要先把計數器的值送到鎖存器中,然后再讀寫鎖存器的值。鎖存器用來保存寫入到計數器的初始值。5617.2.18253/8254的基本功能和內部結構(3)8253的控制字765432100=二進制,1=BCD碼工作方式000=方式0001=方式1010=方式2011=方式3100=方式4101=方式5讀/寫鎖存器00=鎖存計數器值01=讀/寫MSB10=讀/寫LSB11=先讀/寫LSB,后讀/寫MSB00=編寫通道001=編寫通道110=編寫通道217.2.18253/8254的基本功能和內部結構5717.2.28253的工作方式8253有6種工作方式:方式0~方式5。對于每一種工作方式,由時鐘輸入信號CLK確定計數器遞減的速率。門控信號GATE用于允許或禁止計數器計數。計數結束時在輸出線OUT上產生一個信號。無論采用哪一種工作方式,都會遵循下面幾條原則:(1)控制字寫入計數器時,所有的控制邏輯電路立即復位,輸出端OUT進入初始態(高電平或低電平)。(2)計數初值寫入后,要經過一個時鐘上升沿和一個下降沿,計數執行部件才開始計數。(3)在時鐘脈沖CLK的上升沿時,門控信號被采樣。(4)在時鐘脈沖CLK的下降沿時,計數器作減1計數,輸出端OUT的波形也都是在時鐘周期的下降沿時產生電平的變化。17.2.28253的工作方式8253有6種工作5817.2.28253的工作方式
(1)方式0—計數結束時中斷當控制字寫入控制寄存器后,計數器的輸出OUT立即變低,即使未給計數器賦予初值,也未開始計數,只要方式0一確定,輸出就為低。計數值送入計數器且門控信號為高時,計數器開始計數。在計數器開始計數和整個計數過程中,OUT都保持為低,直到計數到0,OUT才變高。時鐘寫計數值=5543210門控OUT停止計數17.2.28253的工作方式(1)方式5917.2.28253的工作方式
方式0的工作特點是:(1)計數器只計一遍。當計數到0時,計數器并不恢復初始值重新開始計數(輸出保持為高),直到CPU又寫入一個新的計數值,輸出立即變低,計數器按照新的數值開始計數。(2)方式0的計數過程可由門控信號控制暫停。當門控信號為低時,計數器暫停計數。門控信號變高后,計數器繼續計數。在計數過程中,GATE信號的變化不影響OUT輸出的狀態。(3)在計數的過程中,可重寫或改變計數值,寫入新的計數值后,計數器將按新的計數值重新開始計數,改變計數值立即有效。17.2.28253的工作方式方式0的工6017.2.28253的工作方式
(2)方式1—可編程的單拍脈沖這種方式是由外部門控脈沖(硬件)觸發啟動定時或計數,使輸出變低,單拍脈沖開始,在經過固定的時間間隔或計數之后,輸出變高,單拍脈沖結束,硬件再次觸發,輸出可再發一個同樣的單拍脈沖。門控信號變低,可停止計數,門控信號變高后,重新開始計數。時鐘寫計數值=554543210門控OUT重新計數17.2.28253的工作方式(2)方式6117.2.28253的工作方式
方式1的工作特點是:(1)寫入控制字后,輸出端OUT立即變低,知道外部門控信號GATE的上升沿啟動之后的CLK下降沿開始計數,OUT變低,并在計數到達0之前一直維持低電平。當計數到0時,OUT變為高電平,并在下一次門控信號觸發啟動后的第一個時鐘脈沖到來之前一直保持高電平。若外部再次觸發啟動,則可在OUT上再次產生一個單拍脈沖。(2)當計數到0后,可再次由外部門控信號GATE的上升沿觸發啟動。(3)即使在計數的過程中,也可用門控脈沖進行再觸發,在再觸發脈沖上升沿之后的一個CLK脈沖的下降沿,計數器將重新開始計數,而不管原來計數到什么地方。在再觸發時,輸出的狀態將保持不變。在任何一次再觸發之后,輸出OUT都將繼續保持低電平。(4)在計數的過程中,CPU可改變計數值,這時候計數過程和輸出都不受影響,計數到0后,輸出為高。若再次觸發計數器,計數器將按新輸入的計數值計數。17.2.28253的工作方式方式1的工6217.2.28253的工作方式
(3)方式2—速率發生器這種方式的功能如同一個N分頻計數器,輸出是輸入時鐘按照N計數值分頻后的一個連續脈沖。如果計數值為N,結果是輸入N個脈沖,輸出一個脈沖。時鐘寫計數值=443210(4)3210(4)3210(4)門控OUT重新計數17.2.28253的工作方式(3)方式6317.2.28253的工作方式
方式2的工作特點是:(1)當CPU輸出控制字后,OUT將為高。在寫入計數值后的下一個CLK開始減1計數。在計數過程中,OUT保持為高。直到計數值減至1時,OUT變為低,保持一個CLK周期,又恢復為高,重新開始計數。(2)不用重新設置計數值,通道能夠連續工作,輸出端送出固定頻率的脈沖。(3)計數過程可以由門控脈沖GATE控制。當GATE變低時就暫停計數,OUT仍保持高電平,在GATE變高后的下一個時鐘脈沖,使計數器恢復初值,重新計數。這種利用門控信號使計數器開始工作(即同步)的方法成為硬件同步。(4)在計數過程中可以改變計數值,這對計數過程沒有影響,但在計數變到1時,輸出變低,過一個CLK周期輸出又變高,計數器將按新的計數值開始計數,可見改變計數值是在下一次有效。17.2.28253的工作方式方式2的工6417.2.28253的工作方式
(4)方式3—方波速率發生器方式3和方式2都是周期性的,但方式3輸出的是對稱的方波。輸入時鐘脈沖與輸出脈沖頻率之比等于加載的計數值。時鐘寫計數值=443210(4)3210(4)3210(4)門控OUT重新計數17.2.28253的工作方式(4)方式6517.2.28253的工作方式
方式3的工作特點是:(1)設置控制字后,OUT將為高。在寫入計數值后的下一個CLK開始減1計數。當計數到一半計數值時,OUT變為低,直到計數值變為0,輸出又為高,再重新開始計數。(2)當計數值N為偶數時,輸出端的高低電平持續時間相等,為完全對稱的方波。當計數值N為奇數時,則輸出端的高電平持續時間比低電平持續時間多一個時鐘周期,即高電平持續(N+1)/2,而低電平持續(N-!)/2,輸出為矩形波,整個輸出周期仍為N個時鐘脈沖周期。(3)GATE信號能使計數過程重新開始,GATE=1時,計數進行;GATE=0時,計數停止。如果在OUT為低期間,GATE變低,則OUT會立即變為高電平,此時計數停止。在GATE又變為高電平后,下一個時鐘脈沖來到時,重新開始計數。(4)若在計數其間寫入一個新的計數值,并不影響現行的計數過程。但是如果在輸入新的計數值后,又受到門控信號上升沿的觸發,就會結束當前輸出的周期,而在下一個時鐘周期時,計數的執行部件按新值開始計數。17.2.28253的工作方式方式3的工6617.2.28253的工作方式
(5)方式4—軟件觸發選通當控制字寫入控制寄存器后輸出開始為高,當設置完計數值后,計數器立即開始計數。當計數到0后,輸出變低,持續一個輸入時鐘周期,然后又恢復為高,計數器停止計數。這種計數也是“一次性有效”,每次計數都要靠這種重新設置計數值進行“軟件觸發”。時鐘寫計數值=5重新計數543210門控OUT停止計數17.2.28253的工作方式(5)方式6717.2.28253的工作方式
方式4的工作特點是:(1)門控信號變低,可暫停計數,門控信號變高后,繼續計數。(2)若在計數過程中改變計數值,新值寫入后的下一個CLK周期開始從新的計數值開始重新計數。通過寫入新的計數值使計數器從頭工作,叫軟件再觸發。17.2.28253的工作方式方式4的工6817.2.28253的工作方式
(6)方式5—硬件觸發選通方式5輸出初始狀態為該。在設置計數值之后,計數器并不立即開始計數,而是要等到門控脈沖的上升沿出現才開始計數,即靠硬件觸發選通計數。。當計數到0時,輸出變低,持續一個輸入時鐘周期,然后又恢復為高,計數器停止計數。下次門控脈沖觸發后才能再重新開始計數。時鐘OUT寫計數值=554543210門控重新計數17.2.28253的工作方式(6)方式6917.2.28253的工作方式
方式5的工作特點是:(1)若在計數過程中使用門控脈沖,則使計數器重新開始計數,但對輸出狀態沒有影響。(2)若在計數過程中改變計數值,只要沒有門控信號的觸發,則當前輸出周期不受影響。當計數到0后,若有新的門控信號出發,見按新的計數值開始計數。如果在寫入了新的計數值后,在未計到0之前,又有新的門控信號觸發,則立即按新的計數值開始計數。17.2.28253的工作方式方式5的工7017.2.28253的工作方式(7)8253各種工作方式小結①幾種方式比較方式2,4,5輸出的波形是一樣的,都是寬度為一個CLK時鐘周期的低有效脈沖。主要區別是:方式2連續不停地計數和輸出;方式4每次都要由程序設置計數值才能計數;方式5不用每次設置,但每次都要由門控脈沖觸發啟動才能計數。即:計到0后,方式2不用觸發,方式4要軟件觸發,方式5要硬件觸發,才能繼續計數。方式1與方式5中的門控脈沖的作用和計數中改變計數值的結果都是相同的,只是輸出波形不同。方式1的輸出信號從開始計數的整個過程都為低,而方式5的輸出從開始計數的整個過程都為高;方式1輸出的低有效脈沖寬度為N個輸入時鐘脈沖的寬度,而方式5輸出的低有效脈沖寬度為一個輸入時鐘脈沖的寬度。②輸出端OUT的初始狀態只有方式0在置入控制字后,OUT立即變低,其它5種方式OUT初始態均為高電平。17.2.28253的工作方式(7)827117.2.28253的工作方式
③啟動計數與重復計數的條件計數值寫入后,并不立即開始工作,需要一定的條件才能開始工作。有些方式計數到0后,則停止工作,要重復計數同樣也需要某些條件。8253啟動計數和重復計數的條件方式 功能 啟動條件 重復條件0 計完最后一個數中斷 寫計數值1硬件再觸發大案拍脈沖外部觸發 外部觸發2速率發生器3 方波速率發生器4軟件觸發選通 寫計數值5硬件觸發選通 外部觸發 外部觸發方式2和方式3是連續工作,輸出是周期性的,不用重復啟動再次觸發,這兩種方式一經寫入計數值,計數器就開始不停頓地工作,直到CPU重新寫入控制字為止。17.2.28253的工作方式③啟動7217.2.28253的工作方式
④門控信號的作用.8253門控信號GATE的作用GATE低或變為低上升沿高禁止計數
禁止計數 立即使OUT為高計數停止立即使OUT為高禁止計數啟動計數下一個CLK脈沖使輸出變低重新裝入計數值啟動計數啟動計數啟動計數進行計數進行計數進行計數方式 改變計數值 0(電平觸發)1(脈沖)2(電平、脈沖)3(電平、脈沖)4(電平)5(脈沖)進行計數立即有效外部觸發后有效計數到1后有效a.外部觸發后有效b.計數到0后有效立即有效外部觸發后有效17.2.28253的工作方式④門控7317.2.28253的工作方式
⑤在計數過程中改變計數值新的計數值何時起作用因方式不同而有差別。在8253的某一計數通道的計數過程中,要讀取它的瞬間計數值,可以利用門控信號GATE使其計數過程暫停,然后分兩次將16的當前計數值讀入CPU;也可以給該通道送去一個鎖存命令,將當前計數值在輸出鎖存器中鎖存,而此時計數照常進行,這時分兩次讀取計數值送往CPU,輸入指令過后,鎖存器解除鎖存。17.2.28253的工作方式⑤在計7417.2.38253/8254在IBMPC系列機中的應用
在IBMPC和PC/XT中,使用的是8253-5。在IBMPC/AT中使用的是8254。8253-5,8254在內部結構及功能上與8253完全一樣,其編程方法也完全一樣,其差別只是最高計數速率不同。8253的最高計數速率是2MHz,8253-5是5MHz,8254為10MHz。在PC系列機上,系統分配給8253/8254的地址是40H~43H,其中43H是控制寄存器的地址,40H、41H、42H分別為計數器0~2的鎖存器地址。8253/8254的三個計數器各有其責,計數器0用于維持系統時鐘;計數器1用于周期性地想DMA發送數據請求信號,供存儲器刷新用;計數器2接到揚聲器用來產生聲音。各計數器的輸入時鐘脈沖頻率均為1.19318MHz。計數器0和計數器1的門控信號輸入端接至高電平,因此永遠開啟。計數器2的門控信號輸入端則由8255A的PB口的第0位控制。系統將計數器1設置為方式2,計數值為18,因此每15μs向DMA發一次請求信號,使DMA進行存儲器刷新。此計數器絕對不可修改,否則將危及存儲器的安全。17.2.38253/8254在IBMPC系列機中的應7517.2.38253/8254在IBMPC系列機中的應用計數器0,11.19318MHz+5VOUT計數器21.19318MHz8255A的PB0OUT計數器0接至8259A的IR0,工作于方式3,每隔固定時間產生一次中斷,用來維持系統日歷時鐘,初始計數值為0(65536),因此輸出脈沖頻率為1.19318MHz/65536=18.2每秒產生18.2次中斷,即每55ms產生一次中斷。計數器1接到DMA上,工作于方式2,計數值為18,因此每15μs向DMA發一次請求信號,使DMA進行存儲器刷新。+5V數據節電器場效應管,記錄1位數據來存儲數據,過一段時間要漏電,每隔一段時間要恢復其狀態。17.2.38253/8254在IBMPC系列機中的應7617.2.38253/8254在IBMPC系列機中的應用計數器21.19318MHz計數器2接到揚聲器用來產生聲音。8255A的PB017.2.38253/8254在IBMPC系列機中的應7717.3時鐘程序設計17.3.1使用8253/8254時鐘1.8253/8254時鐘中斷的使用在系統初始化時,已將8253/8254計數器0設置為方式3,計數值為0000H(相當于65536),所以計數器0的輸出頻率為1.19318MHz/65536=18.2Hz。計數器0的輸出又接至8259A的IR0上,因此系統每秒鐘產生18.2次類型為8的中斷(成為時鐘中斷)。系統就是通過該中斷修改其時間計數值,以維持其日歷時鐘的。另外,該始終中斷還負責在軟盤操作完成之后關掉軟盤驅動器馬達的電源。因此,該時鐘中斷通常情況下是不能修改的,否則將影響日歷時鐘的運行和使系統在完成軟盤操作后不能關掉磁盤驅動器的馬達。為了使擁護能夠使用時鐘中斷,系統中還設置了另外一個中斷INT1CH,該中斷被INT8中斷服務調用,因此它與INT8保持同步,也是每秒執行18.2次,并且在使用INT1CH時,在中斷服務程序結束時也不需要向8259A輸出EOI命令,因為這項工作在INT8中完成了。通常情況下,系統中INT1CH中斷服務程序只有一條指令IRET,即什么也不做。因此,可以修改INT1CH的中斷服務程序的入口地址指向我們自編的程序來完成所需要的工作。系統中每1/18.2s的計數值被INT8的中斷服務程序保存在內存的4個字節中,需要時可通過BIOS中斷INT1AH的0號功能讀出,讀出的計數值是一個32位的數值,表示的是自從0時0分0秒以來的計數值,使用時可通過計算轉換成時分秒的形式。17.3時鐘程序設計17.3.1使用8253/8257817.3時鐘程序設計17.3.1使用8253/8254時鐘例17.1利用INT1CH中斷編寫一個駐留程序,完成每隔大約一秒鐘在屏幕的右下角顯示一個數字的功能。要求數字在0~9之間變化,每隔大約一秒鐘變化一個。編寫一個中斷服務程序取代原INT1CH的服務程序,這樣該程序可被每隔大約1/18.2s啟動執行一次,在該服務程序中需要對中斷次數計數,計數達到18次,即時間過去大約1s時顯示一個數字,并將當前數字加1,以備下次顯示用。在顯示數字之前,要先將當前的光標位置取出保存起來,以備在右上角顯示完數字之后,恢復原光標的位置。另外要解決的一個問題是要將該程序駐留內存,且不允許被其它程序執行時覆蓋,這可采用DOS中斷INT27H完成。執行INT27H之前要求將駐留程序的長度放入DX,程序段前綴的段基址放在CS中。由于編寫.EXE型的駐留程序較麻煩,故通常都將駐留程序編寫成.COM型的。編寫.COM型程序通常需要注意如下幾個問題:(1)程序從100H單元開始,并且其開始必須為程序的入口;(2)程序中只允許有一個段;(3)不允許設置堆棧;(4)不允許有存取段基址的指令存在;(5)程序的長度(包括數據)不能超過64K字節。17.3時鐘程序設計17.3.1使用8253/82579CSEG SEGMENT ORG 100H ASSUME CS:CSEG,DS:NOTHINGBEGIN: JMP MAINCOUNT DB 18CHAR DB ‘0’INT1C PROC DEC COUNT JNZ EXIT MOV COUNT,18 PUSH AX PUSH BX PUSH CX PUSH DX MOV AH,03H MOV BH,0 INT 10H PUSH DX MOV AH,02H MOV DX,004FH INT 10H MOV AL,CHAR MOV AH,0AH MOV CX,1 INT 10H POP DX MOV AH,02H INT 10H INC CHAR CMP CHAR,’9’ JBE OK MOV CHAR,’0’OK: POP DX POP CX POP BX POP AXEXIT: IRETINT1C ENDPMAIN: MOV DX,OFFSETINT1C MOV AX,251CH INT 21HCSEG ENDS END BEGIN匯編語言第17章定時及音響程序設計課件8017.3時鐘程序設計17.3.1使用8253/8254時鐘2.隨機數的產生生成隨機數的一個最方便的辦法就是利用時鐘。前面已經提過每秒鐘產生18.2次的時鐘中斷,對中斷次數計數(時間計數),該計數值是一個32位的數據,保存在內存的4個字節中,可以通過INT1AH的0號功能讀出。讀出之
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年花藝師考試的活動執行力試題及答案
- 纖維素纖維復合材料的設計與制造考核試卷
- 殘疾人康復醫學基礎知識考核試卷
- 糕點店市場營銷策略與實踐考核試卷
- 小型河道攔水堰施工方案
- 筆的制造業市場趨勢預測與規劃考核試卷
- 2025年證券從業資格證考試多種解法試題及答案
- 箱包企業社會責任實踐與報告考核試卷
- 注冊會計師考試案例分析技巧與策略試題及答案
- 項目計劃的制定與調整考題及答案
- 【安踏體育跨國并購亞瑪芬體育的財務績效探究12000字(論文)】
- 2024年中考語文名著閱讀《經典常談》知識梳理+專項訓練解析版
- 【涪陵榨菜產品成本控制問題及完善措施分析9600字】
- 土方工程轉讓合同范本2024年
- 終止合作意向書
- 動力電池技術協議模版
- 喝懂一杯中國茶智慧樹知到期末考試答案章節答案2024年江西財經大學
- 2024北京西城區高三一模英語試題及答案
- (正式版)HGT 6276-2024 雙酚F型環氧樹脂
- 第9課 改變世界的工業革命(課件)
- 2024年中小學“書香校園”讀書節活動方案
評論
0/150
提交評論