數位邏輯與實習:實驗八 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_
} }
班級:
姓名:
學號:
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; //防彈跳旗標累積計數
} }
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
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) //此迴圈當作非同步觸發
{
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) //延遲副程式 {
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)為輸入;
//高 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) //防彈跳
{
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。
設計步驟:
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。
設計步驟:
實驗心得與討論: