• 沒有找到結果。

數位邏輯與實習:實驗八 D 型正反器實驗

N/A
N/A
Protected

Academic year: 2022

Share "數位邏輯與實習:實驗八 D 型正反器實驗"

Copied!
11
0
0

加載中.... (立即查看全文)

全文

(1)

數位邏輯與實習:實驗八 D 型正反器實驗

A. D Type Flip Flop 實驗

實驗目的: 1.請使用程式來撰寫一個 D 型正反器。

2.利用一個輸入埠,兩個輸出埠,觀察在模擬版 LED 顯示的結果,將實驗之結 果填入真值表。

3.真值表上的 1 代表高準位(請接 VDD),0 帶表低準位(請接 VSS)。

4.使用鍵盤來控制時脈,並且觀察結果。

實作方法: 1.將模擬板上之 VDD 與 VSS 分別以杜邦線接至麵包版的排針上。

2.將模擬上 J4 的 PA5、PA6 接至模擬板上 J5 的 L0、L1。

3.將模擬板上 J3 的 PA0 分別依照真值表來測試輸出結果。

4.將模擬板上 J3 與 J4 的 PA2、PA4 接至 J8 的 KB0、KA0。

5.鍵盤觸發,按下去觸發為 0,常態為 1 範例程式:

#include "ht48e50.h" //載入 ht48e50.h 的設定值 unsigned q,q_; //宣告非負之變數

void Delay(unsigned x1) //延遲副程式 {

unsigned x2,x3;

for(x2=0;x2<x1;x2++) for(x3=0;x3<250;x3++);

}

D_flip_flop(unsigned d0_,unsigned qq, unsigned qq_)//D 型副程式模組 {

unsigned i;

for(i=0;i<2;i++) //緩衝 {

unsigned v,g;

q=!(!d0_|qq_); //D 型基本邏輯閘運算 q_=!(d0_|qq);

qq=q; //更新 qq

qq_=q_; //更新 qq_

} }

班級:

姓名:

學號:

(2)

get_key() //鍵盤副程式 {

unsigned a; //宣告非負之變數

_pa4=0; //掃描鍵盤

Delay(1); //延遲副程式

a=_pa2; //將鍵盤掃描值讀回

return a; //回傳鍵盤掃描值

}

void main() //主程式

{

unsigned d0=0,d1=0,clk_0,r0=0,s0=1,q0=0,q0_=1; //宣告非負之變數與初始值 unsigned key_release=0; //宣告鍵盤放開旗標

unsigned key_debouncer=0; //宣告防彈跳旗標

_pac=0x0f; //設定 pa 低 4bits(pa0 ~pa3)為輸入;

//高 4bits(pa4~ pa7)為輸出。

_pa=0xff; //設定 pa 初始值(LED 初始為暗)

q=q0; //更新 q

q_=q0_; //更新 q_

while(1) //無窮回圈

{

d0=_pa0; //將 d0 的值自 pa0 讀入 clk_0=get_key(); //擷取觸發訊號

if ((clk_0==0)&&(key_release==0)) //若為觸發且鍵盤剛按下 {

key_release=1; //鬆開旗標設為 1,表鍵盤按下未放開 D_flip_flop(d0,q0,q0_); //把值帶入 D 型模組運算

q0=q; //更新 q0

q0_=q_; //更新 q0_

_pa5=q; //將 q 自 pa5 輸出 _pa6=q_; //將 q_自 pa6 輸出 }

else if(key_debouncer==100) //防彈跳 {

if((clk_0==1)) //當時脈 1 時則執行迴圈 {

key_release=0; //放開旗標設定成 0 key_debouncer=0; //防彈跳旗標設定為 0

} }

else if((key_release==1)) //若鍵盤按鍵已按下 key_debouncer=key_debouncer+1; //防彈跳旗標累積計數

(3)

} }

D_flip_flop 真值表:

Input Output

D Q Q

0 1

B. D Type Flip Flop 非同步 3bits 計數器實驗

實驗目的: 1.請使用 D 型正反器,來撰寫一個 3bits 計數器。

2.使用三個輸出埠,觀察在模擬版 LED 顯示的結果。

3.使用鍵盤來控制時脈,並且觀察結果。

實作方法: 1.將模擬上 J4 的 PA5、PA6、PA7 接至模擬板上 J5 的 L0、L1、L2。

2.將模擬板上 J3 與 J4 的 PA2、PA4 接至 J8 的 KB0、KA0。

3.鍵盤觸發,按下去觸發為 0,常態為 1

※在規劃非同步邏輯設計,須從前面的正反器先作處理,更新其輸出,以判斷觸發後級動作。

範例程式:

#include "ht48e50.h" //載入 ht48e50.h 的設定值 unsigned q,q_; //宣告非負之變數

void Delay(unsigned x1) //延遲副程式 {

unsigned x2,x3;

for(x2=0;x2<x1;x2++) for(x3=0;x3<250;x3++);

}

D_flip_flop(unsigned d0_,unsigned qq, unsigned qq_)//D 型副程式模組 {

unsigned i;

for(i=0;i<2;i++) //緩衝 {

q=!(!d0_|qq_); //D 型邏輯運算 q_=!(d0_|qq);

qq=q; //更新 qq

(4)

qq_=q_; //更新 qq_

} }

get_key() //鍵盤副程式

{

unsigned a; //宣告非負之變數

_pa4=0; //掃描鍵盤

Delay(1); //延遲副程式

a=_pa2; //將鍵盤掃描值讀回

return a; //回傳鍵盤掃描值

}

void main() {

unsigned clk_0, q0=0,q0_=1,q1=0,q1_=1,q2=0,q2_=1; //宣告非負之變數 unsigned key_release=0; //宣告鍵盤放開旗標

unsigned key_debouncer=0; //宣告防彈跳旗標

_pac=0x0f; //設定 pa 低 4bits(pa0 ~pa3)為輸入;

//高 4bits(pa4~ pa7)為輸出 _pa=0x1f; //pa 初始值

q=q0; //更新 q 值

q_=q0_; //更新 q_值

while(1) //無窮迴圈

{

clk_0=get_key(); //擷取觸發訊號

if ((clk_0==0)&&(key_release==0)) //若為觸發且鍵盤剛按下 {

key_release=1; //鬆開旗標設為 1,表鍵盤按下未放開 D_flip_flop(q0_,q0,q0_); //將值代入 D 型模組運算(D0)

q0=q; //更新 q0

q0_=q_; //更新 q0_

_pa5=q0; //將 q0 自 pa5 輸出

if(q0_!=0) //此迴圈當作非同步觸發 {

D_flip_flop(q1_,q1,q1_); //將值代入 D 型模組運算(D1)

q1=q; //更新 q1

q1_=q_; //更新 q1_

_pa6=q1; //將 q1 自 pa6 輸出 if(q1_!=0) //此迴圈當作非同步觸發

{

(5)

D_flip_flop(q2_,q2,q2_); //將值代入 D 型模組運算(D2) q2=q; //更新 q2

q2_=q_; //更新 q2_

_pa7=q2; //將 q2 自 pa7 輸出 }

} }

else if(key_debouncer==100) //防彈跳 {

if((clk_0==1)) //若已鬆開鍵盤按鍵 {

key_release=0; //放開旗標設定成 0 key_debouncer=0; //防彈跳旗標設定為 0

} }

else if((key_release==1)) //若鍵盤按鍵已按下 key_debouncer=key_debouncer+1; //防彈跳旗標累積計數 }

}

C. D Type Flip Flop 非同步上下數 4bits 計數器實驗

實驗目的: 1.請使用 D 型正反器,來撰寫一個 4bits 上下數計數器。

2.將輸出腳接至七段顯示器,觀察在模擬板七段顯示器顯示的結果。

3.使用鍵盤來控制時脈,並且觀察結果。

4.使用一個輸入埠來控制上下數。

實作方法: 1.將模擬板上 J3 的 PB0~PB3 與 J4 的 PB4~PB6,依序接到 J6 的 SA~SF。

2.將模擬板上 J3 與 J4 的 PA2、PA4 接至 J8 的 KB0、KA0。

3.鍵盤觸發,按下去觸發為 0,常態為 1

4.將模擬板上 J4 的 PC4、PC5 接至 J7 的 COM2、COM3。

※在規劃非同步邏輯設計,須從前面的正反器先作處理,更新其輸出,以判斷觸發後級動作。

範例程式:

#include "ht48e50.h" //載入 ht48e50.h 的設定值 unsigned q,q_,c0; //宣告非負之變數

void Delay(unsigned x1) //延遲副程式 {

(6)

unsigned x2,x3;

for(x2=0;x2<x1;x2++) for(x3=0;x3<25;x3++);

}

D_flip_flop(unsigned d0_,unsigned qq, unsigned qq_) //D 副程式模組 {

unsigned i;

for(i=0;i<2;i++) //緩衝

{

q=!(!d0_|qq_); //RS 邏輯運算 q_=!(d0_|qq);

qq=q; //更新 qq

qq_=q_; //更新 qq_

} }

Up_Down(unsigned q, unsigned q_) //上下數副函式 {

unsigned a0,a1; //宣告非負之變數 a1=(_pa0&q_); //上下數邏輯運算 a0=(!_pa0&q);

c0=(a0|a1);

}

get_key() //鍵盤副程式

{

unsigned a; //宣告非負之變數

_pa4=0; //掃描鍵盤

Delay(1); //延遲副程式

a=_pa2; //將鍵盤掃描值讀回

return a; //回傳鍵盤掃描值

}

void main() {

unsigned tab[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x83,0xd8,0x80,0x98,0x7f};

//七段顯示器字元

unsigned clk_0,r0=0,s0=1,q0=0,q0_=1,q1=0,q1_=1,q2=0,q2_=1,q3=0,q3_=1,se=0;

//宣告非負之變數 unsigned key_release=0; //宣告鍵盤放開旗標 unsigned key_debouncer=0; //宣告防彈跳旗標

_pac=0x0f; //設定 pa 低 4bits(pa0~pa3)為輸入;

(7)

//高 4bits(pa4~pa7)為輸出。

_pcc=_pbc=0x00; //設定 pc、pb 埠為輸出 _pa=0x1f; //pa 初始值

_pc=_pb=0xff; //pc 與 pb 初始值

q=q0; //將 q 值更新

q_=q0_; //將 q_值更新

while(1) //無窮迴圈

{

clk_0=get_key(); //擷取觸發訊號

if ((clk_0==0)&&(key_release==0)) //若為觸發且鍵盤剛按下 {

key_release=1; //鬆開旗標設為 1,表鍵盤按下未放開 D_flip_flop(q0_,q0,q0_); //將值代入 D 模組(D0)

q0=q; //更新 q0

q0_=q_; //更新 q0_

Up_Down(q0,q0_); //將 q0 跟 q0_值代入上下數副程式 if(c0!=0) //非同步觸發(D1)

{

D_flip_flop(q1_,q1,q1_); //將值代入 D 模組(D1)

q1=q; //更新 q1

q1_=q_; //更新 q1_

Up_Down(q1,q1_); //將 q1 跟 q1_值代入上下數副程式

if(c0!=0) //非同步觸發(D2) {

D_flip_flop(q2_,q2,q2_); //將值代入 D 模組(D2) q2=q; //更新 q2

q2_=q_; //更新 q2_

Up_Down(q2,q2_); //將 q2 跟 q2_值代入上下數副程式

if(c0!=0) //非同步觸發(D3) {

D_flip_flop(q3_,q3,q3_); //將值代入 D 模組(D3) q3=q; //更新 q3

q3_=q_; //更新 q3_

Up_Down(q3,q3_); //將 q3 跟 q3_值代入上下數副程式 }

} }

se=q0+(q1*2)+(q2*4)+(q3*8); //將輸出的 2 進制數值轉 10 進制 }

else if(key_debouncer==20) //防彈跳

(8)

{

if((clk_0==1)) //若已鬆開鍵盤按鍵 {

key_release=0; //放開旗標設定成 0 key_debouncer=0; //防彈跳旗標設定為 0

} }

else if((key_release==1)) //若鍵盤按鍵已按下 key_debouncer=key_debouncer+1; //防彈跳旗標累積計數

if(se<10) //若輸出小於 10 時 {

_pc= 0xe0; //指定七段顯示器掃描位址 _pb=tab[se]; //輸出 10 進制數字資料(個位數)

Delay(10); //與輸出七段顯示器亮度和掃描頻率有關 _pc= 0xd0; //指定七段顯示器掃描位址

_pb=tab[0]; //輸出數字 0(十位數)

Delay(10); //與輸出七段顯示器亮度和掃描頻率有關 }

else //若輸出大於 10 時

{

_pc= 0xe0; //指定七段顯示器掃描位址 _pb=tab[se-10]; //輸出 10 進制數字資料(個位數)

Delay(10); //與輸出七段顯示器亮度和掃描頻率有關 _pc= 0xd0; //指定七段顯示器掃描位址

_pb=tab[1]; //輸出數字 1(十位數)

Delay(10); //與輸出七段顯示器亮度和掃描頻率有關 }

} }

D. 同步序向邏輯設計使用 D Type Flip Flop

實驗目的: 1.請使用 D 型正反器,來撰寫一個授課老師指定的同步序向邏輯題目。

2.將輸出腳接至 LED,觀察在模擬板上顯示的結果。

3.使用鍵盤來控制時脈,並且觀察結果。

實作方法: 1.將模擬板上 J3 的 PA0~PA2 與 J4 的 PB4~PB6,依序接到的 L0~L2。

2.將模擬板上 J3 與 J4 的 PA3、PA7 接至 J8 的 KB0、KA0。

3.鍵盤觸發,按下去觸發為 0,常態為 1。

(9)

設計步驟:

(10)

E. 同步序向邏輯設計使用 J-K Type Flip Flop

實驗目的:1.請使用 J-K 型正反器,來撰寫一個授課老師指定的同步序向邏輯題目。

2.將輸出腳接至 LED,觀察在模擬板上顯示的結果。

3.使用鍵盤來控制時脈,並且觀察結果。

實作方法: 1.將模擬板上 J3 的 PA0~PA2 與 J4 的 PB4~PB6,依序接到的 L0~L2。

2.將模擬板上 J3 與 J4 的 PA3、PA7 接至 J8 的 KB0、KA0。

3.鍵盤觸發,按下去觸發為 0,常態為 1。

設計步驟:

(11)

實驗心得與討論:

參考文獻

相關文件

布林函數標準形式的表示是一個二階電路。不過,有時數位系統的設 計在閘的結構可能需要三階或更多階。通常設計多階電路的步驟是將布林 函數以 AND,OR 及補數來表示,所以函數可以用 AND 和

[r]

一、15 公分、11.4 公分的冰棒棍響笛,在線長 50 公分時,可以發出最大的響度,分別 是 69.73 分貝和 66.77 分貝,線長低於或超過 50 公分,響度反而比較小;9.5 公分長 的冰棒棍,在線長

[r]

 邏輯閘階層 邏輯閘階層(gate level) 邏輯閘階層 邏輯閘階層 (gate level) (gate level)模型 (gate level) 模型 模型 模型.  暫存器轉移階層 暫存器轉移階層( 暫存器轉移階層 暫存器轉移階層 (( (r

這次的報告真的有一點點難度,再來後面的單元一定又是一 個極大的考驗,這次的報告真的只要前面一有錯誤真的影響

精稱 精稱 精稱柳酸 2.0 克及醋酸酐 5.0mL(也要精稱 精稱 精稱 精稱 精稱) 置於乾淨乾燥的錐形瓶中。(醋酸酐 醋酸酐 醋酸酐 醋酸酐遇水則成醋酸 遇水則成醋酸 遇水則成醋酸

藉由本次碘鐘實驗,我們得以了解反應級數如何測定及其反應原理,不僅學習了以初 期反應速率法與積分作圖法決定反應級數及速率常數,更加深了 Word 及 Excel