微機原理—可編程計數器/定時器8253概念詳解

目錄

    • 前言
    • 【1】定時處理方法
      • 1、定時的方法:
      • 2、定時和計數器
    • 【2】8253計數/定時器
      • 1、特點:
      • 2、芯片引腳以及電路:
      • 3、連接方式:
      • 4、工作原理:
      • 5、寄存器配置
        • a、初始化操作(三個通道單獨初始化)
        • b、讀出命令
        • c、GATE的作用
        • d、工作方式配置
          • [1]方式0 計數結束中斷
          • [2]方式1 可編程單穩脈沖
          • [3]方式2 頻率發生器(分頻器)
          • [4]方式3 方波輸出(周期性方波輸出)
          • [5]方式4 軟件觸發選通
          • [6]方式5 硬件觸發選通
          • 特點總結
    • 【3】8253計數/定時器與系統總線的接法
      • 與最小系統相連
      • 與最大系統相連
      • 與PC機相連
    • 總結

前言

定時器可以理解為一個特殊的中斷。計數器和定時器其實只是功能上的不同以及度量單位的不同,定時器里面肯定是有計數的。

【1】定時處理方法

1、定時的方法:

1、軟件定時方式(不是很準確,會被其他中斷打斷計數過程)
■CPU干預
■指令執行時間作間隔
2、不可編程的硬件定時方式(就像保險絲熔斷一樣,并不是由程序控制的)
■方式固定
■硬件設定參數
3、可編程的硬件定時方式
■程序設定、程序控制
■中斷.

2、定時和計數器

區別:對不同信號的計數
定時器:對時鐘信號進行計數,所計數的脈沖具有周期性
計數器:對外部脈沖進行計數,所計數的脈沖周期性、非周期性都可能呈現。
計數和及時本質是相同的,他們都是對一個輸入脈沖進行計數,如果輸入脈沖的頻率一定,那么記錄脈沖的個數與所需的時間是一一對應的關系。例如輸入脈沖頻率為2Mhz,那么計數2x10 6

也就是1秒

【2】8253計數/定時器

1、特點:

1、可編程(工作方式/計數值)
2、三個獨立的計數器通道
3、對初值進行減1計數
4、二進制/BCD計數初值
5、計數對象的最高頻率為2MHz

2、芯片引腳以及電路:

由引腳可以看出,數據位是8位的,也就是說不能超過255;如果計數值超過255要分兩次寫。
讀寫控制電路以及三個計數器通道:

CLK(輸入時鐘)
OUT(輸出時鐘)
GATE(控制門):高電平有效,是計數器的開關
訪問8253的信號由兩組產生:
1、從十六根總線拿出兩個接A0、A1 ,進行端口尋址:00:通道0、01:通道1、10:通道2、11:控制寄存器
2、CS可以拿另外14根(部分或者全部)外加一些邏輯電路構成CS片選信號

3、連接方式:

連接方式
注意,控制寄存器是不可以讀的

4、工作原理:

控制寄存器:決定工作模式(定時還是計數)
狀態寄存器:決定工作狀態
初值寄存器:計數的初值
計數輸出寄存器:CPU從中讀當前的計數值
計數器:執行計數操作,CPU不能訪問
寄存器
圖
工作原理:對CLK信號進行減1處理
首先,CPU把控制字寫入控制寄存器,計數初始值寫入初值寄存器。
計數從初值開始,每當CLK信號出現一次,計數值減1,當計數值減到0,從OUT段輸出規定的信號。
CLK信號出現,計數器是否減1,由門控制信號GATE決定。
CLK是計數輸入信號,計數器對CLK端出現的脈沖個數進行計數:
CLK端可以輸入外部事件
CLK端可以介入固定頻率的時鐘信號,從而實現計時。
OUT信號在計數結束時發生變化:
可將OUT作為外部設備的控制信號
可將OUT作為向CPU申請中斷的信號
CPU可以從計數寄存器獨處當前計數值,讀前應向控制寄存器發出鎖存信號
定時/計數器初值的計算:
定時時間=時鐘脈沖周期 x 預置的計數初值
定時頻率=時鐘脈沖頻率 / 預置的計數初值

5、寄存器配置

控制寄存器

a、初始化操作(三個通道單獨初始化)

1、寫入控制字
選擇計數通道
設置工作方式
初值的訪問方式
確定初值的數制(二進制/BCD)
計數器清零、OUT初始化
2、寫入初值
例題1:設三個計數器的CR/OI端口地址為70H、71H、72H,控制寄存器端口地址73H。計數器0,工作模式2,CR/OL僅 使用低8位,=初值為100,計數值使用二進制
分析:
1、根據要求配置控制寄存器:0001 x100,這里x我們認為是0,所以配置字為14H
2、計數值100轉為16進制:64H

MOV AL, 14H
OUT 73H, AL
MOV AL, 64H
OUT 70H, AL

例題2:例:設三個計數器的CR/OL端口地址為70H、71H、72H,控制寄存器端口地址73H。計數器1,工作模式1, CR/OL使用16位,
初值為1234,計數值使用BCD

分析:
1、根據要求配置控制寄存器:0111 0011,所以配置字為73H
2、計數值1234H,為16位,而輸出一次只能是8位,所以,分高低位分批次輸出

MOV AL, 73H
OUT 73H, AL
MOV AX, 1234H	;此時是BCD碼的形式,所以是1234
OUT 71H, AL
MOV AL, AH
OUT 71H, AL

b、讀出命令

步驟:
1、發出鎖存命令,使當前計數值鎖存在OL中,而CE會繼續計數
2、用IN語句讀OL,獲得當前計數值
例題:設三個計數器的CR/OL端口地址為70H、71H、72H,控制寄存器端口地址73H。讀出計數器0的當前計數值,放在BX中
分析:
1、根據要求配置控制寄存器:0000 0000,0H
2、讀出的值分為兩次傳出,先低位后高位

MOV AL, 0H
OUT 73H, AL
IN AL, 70H	;從OL讀取低位字節
MOV BL, AL	
IN AL, 70H	;從OL讀取高位字節
MOV BH, AL 	;此時BX的內容就是計數器當前的計數值

c、GATE的作用

1

d、工作方式配置

在具體學習6種工作方式之前(第一次看是有點暈的),我先找了幾篇博客,了解一下大致特點以及6種方式的區別。
8253的六種工作方式
8253與8255的工作方式
硬件觸發什么意思?:觸發與否與gate門的狀態有關。

[1]方式0 計數結束中斷

計數器寫完計數值時,開始計數(軟件觸發),相應的輸出信號OUT就開始變成低電平。當計數器減到零時,OUT立即輸出高電平。
門控信號高電平時,計數器工作;為低電平時,計數器停止工作,計數值保持不變。
在計數器工作期間,如果重新寫入新的計數值,計數器將按新寫入的計數值重新工作。方式0

例題:向8253的A1A0= 11B的地址寫入0011 0000B,則表示計數器0設置成方式0,并且采用16位時常數,假設時常數為1500,則計數器0的初始化程序段如下:

MOV DX,COUNTD;	寫入8253的方式控制字
MOV AL,0011 0000B
OUT DX,AL;
MOV DX,COUNTA;	計數器0置入時常數
MOV AX,1500
OUT DX,AL
XCHG AL,AH
OUT DX,AL
[2]方式1 可編程單穩脈沖

寫入計數初值后,計數器開始工作。門控信號GATE上升沿有效,才開始工作(硬件觸發),使輸出OUT變成低電平,直到計數器減到0后,輸出才變高電平。
在計數器工作期間,當GATE又出現一個上升沿時,計數器重新裝入原計數初值并重新開始計數。
如果工作期間對計數器寫入新的計數初值,則要等到當前的計數值記滿回零且門控信號再次出現上升沿后,才按新寫入的計數初值開始工作。
方式1

例題:向8253的A1A0= 11B的地址寫入0101 0010B,則表示計數器1設置成方式1,并且采用低8位時常數,假設時常數為15,則計數器1的初始化程序段如下:

MOV DX,COUNTD;	寫入8253的方式控制字
MOV AL,0101 0010B
OUT DX,AL;
MOV DX,COUNTA;	計數器1置入時常數
MOV AX,15
OUT DX,AL
[3]方式2 頻率發生器(分頻器)

方式2是一種具有自動裝入時間常數(計數初值N)的N分頻器。
特點:一次設置計數初值,計數器可自動重復進行減“1”操作,減“1”計數回“0”,可以輸出端輸出一負脈沖信號。
寫入計數初值后,GATE為高開始工作,計數器為0時,OUT輸出一個時鐘脈寬的負脈沖后自動回復高電平;同時自動重新裝入原計數初值,反復計數。
如果工作期間對計數器寫入新的計數初值,則要等到當前的計數值記滿回零后,才按新寫入的計數初值開始工作。
在計數器工作期間,當GATE為低則停止計數,待GATE恢復后計數器重新裝入原計數初值并重新開始計數。
方式2

例題:向8253的A1A0= 11B的地址寫入1001 0100B,則表示計數器2設置成方式2,并且采用低8位時常數,假設時常數為13,則計數器1的初始化程序段如下:

MOV DX,COUNTD;	寫入8253的方式控制字
MOV AL,1001 0100B
OUT DX,AL;
MOV DX,COUNTC;	計數器2置入時常數
MOV AX,13
OUT DX,AL

這樣在OUT2端就產生了CLK2的13分頻信號,若是通過邏輯電路實現起來比較麻煩

[4]方式3 方波輸出(周期性方波輸出)

方式3工作方式與方式2基本相同,也具有自動裝入時間常數(計數初值)的功能。
不同之處在于:工作在3方式,引腳OUT輸出的不是一個時鐘周期的負脈沖,而是占空比為1:1或近似1:1的方波。當計數值為偶數時,輸出在前一半的計數過程中為高電平,在后一半的計數過程中為低電平;為奇數時高電平比低電平寬一個時鐘脈沖。
方式3

例題:向8253的A1A0= 11B的地址寫入0011 0110B,則表示計數器0設置成方式3,并且采用16位時常數,假設時常數為2000,則計數器0的初始化程序段如下:

MOV DX,COUNTD;	寫入方式控制字
MOV AL.0011 0110B
OUT DX,AL
MOV DX,COUNTA;	計數器置入時常數
MOV AX,2000
OUT DX,AL
XCHG AL,AH
OUT DX,AL

這樣在OUT0端就產生了CLK0的2000分頻方波信號

[5]方式4 軟件觸發選通

此方式設定后,輸出OUT就開始變為高電平,GATE為高時,當寫完計數值后開始計數。當計數器減到零后,OUT輸出一個寬度為一個時鐘脈沖的負脈沖,然后恢復高電平,并一直保持高電平。
門控信號GATE為高電平時,計數器工作,為低電平時,計數器停止工作,恢復為高電平后計數器又從原裝入的計數初值開始減1工作。
在計數器工作期間,如果重新寫入新的計數初值,不影響當前計數狀態,僅當當前計數值記完后,計數值才按寫入的計數值工作。
方式4

例題:向8253的A1A0= 11B的地址寫入0101 1000B,則表示計數器1設置成方式4,并且采用低8位時常數,假設時常數為75,則計數器1的初始化程序段如下:

MOV DX,COUNTD;	寫入方式控制字
MOV AL.0101 1000B
OUT DX,AL
MOV DX,COUNTA;	計數器置入時常數
MOV AL,75
OUT DX,AL
[6]方式5 硬件觸發選通

方式5的工作特點是由GATE上升沿觸發計數器開始工作。
在方式5工作方式下,當寫入計數初值后,計數器并不立即開始計數,而要由門控信號的上升沿啟動計數。
在計數過程中(或者計數結束后),如果門控信號再次出現上升沿,計數器將從原裝入的計數初值重新計數。
方式5

需要注意的地方:
1、處理器寫入8253的計數初值只是寫入了預置寄存器,之后到來的第一個CLK輸入脈沖(需先由低電平變高,再由高電平變低)才將預置寄存器的初值送到減1計數器
2、方式0: 一般用作請求中斷源.
方式1:一般用作輸出固定時長的方波,比如定時器.
方式2差不多,只不過他n計數為零的時候,他只產生一次負脈沖,可作為一次信號,作為分頻器使用.

特點總結

特點
特點
比較8254方式0與方式4、方式1與方式5的區別?

方式0與方式4
方式0 OUT 端計數過程中為低,計數值減為0時,輸出變高
方式4 OUT端計數過程中為高,計數值減為0時輸出寬度為1個CLK的負脈沖.
方式1與方式5
方式1 OUT端輸出寬度為n個CLK的低電平,計數值減為0時,輸出為高
方式5 OUT 端計數過程中為高,計數值減為0時輸出寬度為1個CLK的負脈沖

【3】8253計數/定時器與系統總線的接法

在已經設計好的8086系統總線的情況下,可以直接利用系統總線的信號與8253連接。

與最小系統相連

使用偶地址:
與最小系統相連
使用奇地址:
1、A0換成BHE’
2、D7~ D0換成D15~D8

與最大系統相連

使用偶地址:
最大系統
使用奇地址:
1、A0換成BHE’
2、D7~ D0換成D15~D8

與PC機相連

此時實際上和最大系統是相似的,不過由于系統中存在DMA機構,所以必須使AEN=0,此時為非DMA操作。由于數據位只有8位,不分奇偶。
1

總結

關于這方面的應用其實就是書后習題,明天專門寫一章關于應用的筆記。
8253譯碼電路設計以及初始化編程講解


Reference:

8253的六種工作方式
8253與8255的工作方式
關于6種工作方式更加詳細的過程請參考《微機原理與接口技術.樓順天版》P253——P263。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/378548.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/378548.shtml
英文地址,請注明出處:http://en.pswp.cn/news/378548.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

php靜態分析工具window,window_SpeedPHP框架核心調試工具,在日常的編程開發當中,開發 - phpStudy...

SpeedPHP框架核心調試工具在日常的編程開發當中,開發者經常會使用到對變量的調試,而sp框架提供的變量調試輸出函數——dump正好滿足了變量調試的需求。下面來介紹一下dump函數的使用方法。dump —— 變量格式化輸出函數用法:dump($vars, $out…

python 溫度轉換程序_Python程序將米轉換為碼

python 溫度轉換程序There are many problems where we have to calculate the distance in yards at the end but initially, the measurements are given in meters. So for such type of problems, the solution is converting the initial parameters into yards and then …

Oracle轉Sqlserver 記錄

使用了微軟的SSMA幫忙,但是目前只有表能幫忙轉,其他的還是要手動改,- - oracle 可以這樣查詢AppServiceInfoaspdb ,調用其他庫的表。SQL是: aspdb.dob.AppServiceInfo si數據庫需要和 aspdb ASPDB_Capacity 在siinf…

形參與實參在函數中的傳遞

#include <iostream> #include <cstring> using namespace std; void myFun(int a[]); int main() {int a[10];cout<<"aaa"<<sizeof(a)<<endl;//40 int為4&#xff0c;a為10個int&#xff0c;故為40cout<<"yy"<<…

帶你走進緩存世界

我們搞程序的多多少少都了解點算法。總體來講&#xff0c;算法是什么&#xff1f;算法就是“時間”和“空間”的互換策略。我們常常考究一個算法的時間復雜度或空間復雜度&#xff0c;如果我們有絕對足夠的時間或空間&#xff0c;那么算法就不需要了&#xff0c;可惜這種條件是…

霍夫碼編碼(一種不等長,非前綴編碼方式)

霍夫曼編碼是一種不等長非前綴編碼方式&#xff0c;于1951年由MIT的霍夫曼提出。 用于對一串數字/符號編碼獲取最短的結果&#xff0c;獲取最大的壓縮效率。 特點&#xff1a;不等長、非前綴 等長式編碼 等長編碼&#xff0c;意思是對出現的元素采用相同位數的序號進行標定&a…

php調用shell腳本安全,從PHP調用的shell腳本問題

TLDR;我有一個shell腳本,從命令行運行時工作正常,但如果從PHP腳本中調用(通過Web訪問)則不行.在這兩種情況下,主叫用戶都是www-data.線路失敗是這樣的&#xff1a;openssl genrsa -des3 -out certs/$PCODE.key -passout env:PASSPHRASE 2048為什么會這樣&#xff1f;我該怎么調…

linux 運維基礎問題_Linux基礎能力問題和解答

linux 運維基礎問題This section contains Aptitude Questions and Answers on Linux Basics. 本節包含有關Linux基礎知識的 Aptitude問答。 1) There are the following statements that are given below, which of them are correct about Linux? Linux is system software…

JS 獲取瀏覽器信息,給出友情提示,避免部分兼容性問題

最近在做webform,瀏覽器兼容是個問題,這里我收集了一些獲取瀏覽器信息的資料,可以給一些用戶使用時,提示瀏覽器版本過低,讓升級版本用. 這樣會給開發的我們,省下很多用來調試兼容性的時間和精力. 本人就是這樣想的 ~  檢測瀏覽器及版本使用 JavaScript 檢測關于訪問者的瀏覽器…

兩欄 三欄的css

三欄格局 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns"http://www.w3.org/1999/xhtml" xml:lang"zh" lang"zh"><head pro…

06-機器學習(Haar+Adaboost實現人臉、人眼檢測)

機器學習是什么? 機器學習訓練樣本特征分類器&#xff0c;通過讓機器學習的方式&#xff0c;來達到某種功能的過程 深度學習是什么&#xff1f; 深度學習海量的學習樣本人工神經網絡 機器學習需要&#xff1a;樣本、特征、分類器、對訓練后的數據進行預測或檢驗 人臉樣本haar…

php xml表格形式輸出,PHP XML如何輸出nice格式

這里是代碼&#xff1a;$doc new DomDocument(1.0);// create root node$root $doc->createElement(root);$root $doc->appendChild($root);$signed_values array(a > eee, b > sd, c > df);// process one row at a timeforeach ($signed_values as $key &…

Opencv實戰【3】——圖像修復與圖像銳化(darling in the franxx)

目錄前言圖像修復圖像銳化darling in the franxx圖片總結前言 前天&#xff0c;在群里看見有人發了這張表情包&#xff1a; 感覺女主有點好看&#xff0c;然后問室友是啥番劇&#xff08;darling in the franxx&#xff09;&#xff0c;然后就去補番了&#xff0c;然后從晚上…

python 示例_Python date isoweekday()方法與示例

python 示例Python date.isoweekday()方法 (Python date.isoweekday() Method) date.isoweekday() method is used to manipulate objects of date class of module datetime. date.isoweekday()方法用于處理模塊日期時間的日期類的對象。 It uses a date class object and r…

07-機器學習(Hog+SVM實現小獅子識別)

一、SVM支持向量機 什么是SVM支持向量機&#xff1f; SVM支持向量機本質仍是一個分類器&#xff0c;其核心為尋求一個最優超平面最終實現分類&#xff0c;實現分類問題 在尋求超平面的時候有多種方式&#xff0c;可以使用若干條直線或曲線進行分類&#xff0c;這里使用的是直線…

Net Remoting基礎篇

一、Remoting基礎 什么是Remoting&#xff0c;簡而言之&#xff0c;我們可以將其看作是一種分布式處理方式。從微軟的產品角度來看&#xff0c;可以說Remoting就是DCOM的一種升 級&#xff0c;它改善了很多功能&#xff0c;并極好的融合到.Net平臺下。Microsoft .NET Remoting …

Maven3.0.5代理nexus

Nexus簡介 Nexus是Sonatype推出的強大Maven倉庫管理器產品&#xff0c;要比以前TSS上介紹的Artifactory要好使用的多&#xff0c;也是一個拆箱即用的Java App&#xff0c;內嵌Jetty容器和Java Wrapper做Windows服務&#xff0c;安裝簡單到解壓然后雙擊install即可。更詳細的幫助…

8253譯碼電路設計以及初始化編程講解

先驗知識回顧&#xff1a;知識點不清晰的時候可以查詢相關知識點。 https://blog.csdn.net/qq_42604176/article/details/105810973 需掌握的主要知識點 1、譯碼電路設計 2、初始化編程 例題1 在以 8086構成的最大方式系統中&#xff0c;有一片8254的端口地址分別為301H、3…

java安卓寫文件路徑,如何使用gradle作為構建系統,平臺Android配置Protobuf(Java)文件的輸出路徑?...

我正在努力解決以下問題&#xff1a;我有2個基于maven的java項目和1個基于gradle的Android項目 . 布局如下&#xff1a;Workspace/├── MavenProj1/├── MavenProj2/├── AndroidGradleProject1/├── Protos/所有這些的包結構很常見&#xff0c;比方說 com.example.* 所…

Java System類exit()方法及示例

系統類exit()方法 (System class exit() method) exit() method is available in java.lang package. exit()方法在java.lang包中可用。 exit() method is used to exit the currently running JVM (Java Virtual Machine). exit()方法用于退出當前正在運行的JVM(Java虛擬機)。…