2016-05-15 54 views
-2

我應該使用Dallas 8051芯片製作一個多路複用器。 p1.0,p1.1和p1.2是輸入。 P1.3是使能線,輸出是P2.0到P2.3。除了所有輸入爲零且啓用爲1時,所有輸出均可正常工作。 (在Keil調試器視圖的輸出中只應該有零,但事實並非如此)。裝配零誤差 - 開關語句

#include<reg51.h> 

sbit input0 = p1^0; 
sbit input1 = p1^1; 
sbit input2 = p1^2; 
sbit enable = p1^3; 
sbit output0 = p2^0; 
sbit output1= p2^1; 
sbit output2 = p2^2; 
sbit output3 = p2^3; 
sbit output4 = p2^4; 
sbit output4 = p2^5; 
sbit output6 = p2^6; 
sbit output7 = p2^7; 

void main (void) { 
    P2 = 0x00; 

    if (enable==1) 
    { 
     P1&=0x07; 
     switch(P1) 

     { 
      case 1: output1=1; break; 
      case 2: output2=1; break; 
      case 3: output3=1; break; 
      case 4: output4=1; break; 
      case 5: output5=1; break; 
      case 6: output6=1; break; 
      case 7: output7=1; break; 
      default: output0 =1; break; 
     } 

    } 

    else {P2&=0x07;} 

} 

回答

2


你問爲什麼不工作時,所有的輸入都爲零,使之一。 對不起,我在代碼中看不到這種行爲的原因,但我有一些問題和建議。

你在哪裏停止你的調試器來讀取輸出?你確定要設置output0的語句已經被執行了嗎?

P2的原因是什麼& = 0x07;在其他部分?

你想如何處理P1 & = 0x07;切換之前?
如果你想屏蔽4..7位,直接在switch語句中這樣做會更好。 現在您所做的工作取決於P1中第0..3位輸入信號。如果其中一個爲0,則將在P1的該位寫入0。
8051的端口可以雙向使用。如果寫入1,則引腳僅由弱電阻驅動爲1。但是如果你寫一個0,它將被驅動爲0的輸出晶體管驅動幾個毫安。 0將強制8051的引腳作爲輸出。

因此,我建議用

switch(P1 & 0x07) 

最好的問候和良好的運氣,以取代

P1&=0x07; 
switch(P1) 

Helmut

+0

這實際上修復了錯誤,謝謝。 其他部分中P2 &=0x07;的原因是什麼? 這實際上是一個錯字。 P2應該被設置爲0x00。 – Goblinette