先驗知識回顧:知識點不清晰的時候可以查詢相關知識點。
https://blog.csdn.net/qq_42604176/article/details/105810973
需掌握的主要知識點
1、譯碼電路設計
2、初始化編程
例題1
在以 8086構成的最大方式系統中,有一片8254的端口地址分別為301H、303H、305H和307H,給定的外部時鐘為512kHz。 要求:、
(1)利用計數器0產生周期為1ms的周期信號,請編寫初始化程序;利用這一計數器能產生的最低信號頻率為_______, 這時的時常數CR。=________;
思路:
1、分析采用哪種方式
根據要求產生周期信號,采用方式2/3:分頻器/周期性方波輸出;
2、計算時常數CR0
CR0=輸出信號周期/外部時鐘周期=1ms/(1/512k)=512
3、了解該計數器的最大分頻次數,計算最大分頻次數
最大分頻次數是62256次,這樣可以獲取最低頻率:512k/62256=8.22Hz
MOV DX,307H;DX指向控制寄存器
MOV AL,0011 0110B;配置字:選擇通道0, CR/OL使用16位,方式3,2進制計數
OUT DX,AL; 字配置完成
MOV DX,301H;DX指向通道0
MOV AX,512;設置時常數
OUT DX,AL;
XCHG AL,AH;
OUT DX,AL; 配置完成
(2)利用計數器1和2產生如圖9. 17所示的周期信號,并編寫初始化程序;
產生這種非方波的周期信號,使用方式2,但是在方式2下,低電平時間僅為一個時鐘周期。因此,利用一個計數通道無法實現。現在采用計數器1和計數器2聯合,先利用計數器1產生周期為1.5ms的周期信號,然后將輸出OUT1信號作為計數器2的時鐘輸入CLK2。
對于計數器1,工作方式可以選擇方式2/3,一般選擇方式3,這樣可以使產生的信號近似對稱,其時常數CR1=1.5ms/(1/512k)=768,采用16位的時常數表示。
對于計數器2,工作方式只能選擇方式2,其時間常數CR2=(3s+1.5ms)/1.5ms=2001,所以也需要16位時常數表示。
;配置計數器1
MOV DX,307H;DX指向控制寄存器
MOV AL,0111 0110B;配置字:選擇通道1, CR/OL使用16位,方式3,2進制計數
OUT DX,AL; 字配置完成
MOV DX,303H;DX指向通道1
MOV AX,768;設置時常數
OUT DX,AL;
XCHG AL,AH;
OUT DX,AL; 配置完成;配置計數器2
MOV DX,307H;DX指向控制寄存器
MOV AL,1011 0100B;配置字:選擇通道2, CR/OL使用16位,方式2,2進制計數
OUT DX,AL; 字配置完成
MOV DX,305H;DX指向通道2
MOV AX,2001;設置時常數
OUT DX,AL;
XCHG AL,AH;
OUT DX,AL; 配置完成
(3)畫出8253的端口譯碼電路(地址線只使用Ao~Ag)及其連接圖。
譯碼電路地址要求:
A2A1 | ADDR(二進制) | ADDR(16進制) |
---|---|---|
00 | 11,0000,0001 | 301H |
01 | 11,0000,0011 | 303H |
10 | 11,0000,0101 | 305H |
11 | 11,0000,0111 | 307H |
注意由于是奇地址,數據線和A0所做出的的更改:
例題2
設8253的端口地址為260H ~ 263H,外部時鐘信號為1MHz,要求產生如圖所示的周期波形,畫出8253的連接圖,并編寫初始化程序段。
分析:
產生的信號低電平時間比高電平寬的多,所以不能直接采用方式2實現。如果可以增加外部器件,則可以在上一題的基礎上,將OUT端信號非門取反。
1、由于要采用方式3,產生周期:1s+12ms=1012ms的方波信號,題目給定的外部時鐘周期為1MHz,這時候需要的分頻系數(時常數)為:1012ms/1us=1012000,顯然這個超過了65536(2^16),所以通過一個計數通道無法實現,所以采用計數器0和計數器1聯合產生。CR0=1000,CR1=1012,這樣OUT0周期為1ms。
2、利用計數器2的方式1(可編程單穩脈沖)實現單脈沖形成一次作為要求產生信號的低電平,時常數CR2=1s/1ms-1=1000-1=999,計數器0 的OUT0信號作為計數器2的時鐘輸入信號,OUT1作為計數器2的硬件觸發信號,確保周期為1012ms。這里注意,計數器的方式1的時常數確定的是輸出低電平的時長,也就是所謂的單脈沖寬度.
MOV DX,263H;寫計數器0方式控制字
MOV AL, 0011 0110B;計數器0,16位,方式三,二進制
OUT DX,AL;
MOV DX,260H;寫計數器0的時常數
MOV AX,1000;
OUT DX,AL;
XCHG AL,AH;
OUT DX,AL;
MOV DX,263H;寫計數器1方式控制字
MOV AL,0111 0110B;計數器1,16位,方式三,二進制
OUT DX,AL;
MOV DX,261H;寫計數器1時常數
MOV AX,1012;
OUT DX,AL;
XCHG AL,AH;
OUT DX,AL;
MOV DX,263H;寫計數器2方式控制字
MOV AL,1011 0010B;計數器2,16位,方式1,二進制
OUT DX,AL;
MOV DX,262H;寫計數器2時常數
MOV AX,999;
OUT DX,AL;
XCHG AL,AH;
OUT DX,AL;
OUT0:輸出的是周期為1ms的方波
OUT1:輸出的是周期為1012ms的方波,也就是說每1012ms產生一個上升沿,這確定了計數器2的方式1一個周期寬度
OUT2:輸出的是周期為1012ms,低電平時長為1000ms的脈沖。
我覺得最需要關注的兩個連接點就是:OUT0->CLK1,OUT1->GATE2
例題3
在8088最小系統中,8253 的端口地址為284H~287H.系統提供的時鐘為IMHz,要求在OUT0輸出周期為20微秒的方波,在OUTI輸出周期為200微秒,其中每周期為負的時間是180微秒的信號。請編寫8253的初始化程序。
分析:這一題和上一題的思路很相似,主要的就是不需要聯合。
通道0產生方波,可以使用方式3產生。
時常數CR0=輸出信號周期/外部時鐘周期=20us/(1/1M)=20;
通道2產生方波,可以使用方式3產生。
時常數CR2=輸出信號周期/外部時鐘周期=200us/(1/1M)=200;
通道1,采用方式1,時常數,CR1=180/20-1=8;
;配置計數器0
MOV DX,287H;DX指向控制寄存器
MOV AL,0001 0110B;配置字:選擇通道0, CR/OL使用低8位,方式3,2進制計數
OUT DX,AL; 字配置完成
MOV DX,284H;DX指向通道0
MOV AL,20;設置時常數
OUT DX,AL;配置完成
MOV DX,287H;寫計數器2控制方式字
MOV AL,1001 0110B;
OUT DX,AL;
MOV DX,286H;寫計數器2時常數
MOV AL,200;
OUT DX,AL;
MOV DX,287H;
MOV AL,0101 0010B;
OUT DX,AL;
MOV DX,285H;
MOV AL,8;
OUT DX,AL;