2013-12-20 105 views
5

8051微控制器復位後,所有端口引腳鎖存器都被設置爲'1'值。現在我讀這本書「嵌入式C」,並指出與下面的代碼THR的問題是,它可以麻痹開發成安全的錯覺:嵌入式c和8051微控制器

// Assume nothing written to port since reset 
// – DANGEROUS!!! 
Port_data = P1; 

如果,在以後的日子,有人修改

unsigned char Port_data; 
P1 = 0x00; 
. . . 
// Assumes nothing written to port since reset 
// – WON’T WORK BECAUSE SOMETHING WAS WRITTEN TO PORT ON RESET 
Port_data = P1; 

任何與嵌入式C的知識能向我解釋爲什麼這個代碼將無法正常工作:方案,包括爲寫入同一端口的全部或部分常規,這個代碼一般不會要求工作?它所做的就是將0賦給一個char變量。

回答

2

潛在的問題。

1)與所述端口相關聯的數據方向寄存器(DDR)可能無法按預期進行設置,從而在上電時,該DDR可以被設置爲「輸入」。所以寫入端口0可能會意外地沒有讀過讀0

2)與所述端口相關聯的數據方向寄存器可能已被設置爲「輸出」和「讀取」的數據可能不具有明確的含義。根據體系結構的不同,可能需要幻像位來隱藏輸出位以便回讀。

3)上電碼可以通過復位命令無非是跳轉到「復位向量」更獲得進入。因此,與「冷」加電相關的任何硬件特定操作都不會發生,因爲這是「熱」加電。

解決方案:

上電代碼,明確設置DDR和(根據需要和陰影比特)的輸出值。

可能並不適用於8051 - 說話一般嵌入式處理器。

-1

我正在閱讀同一本書,幾個月前也有同樣的困惑。後期從事PIC18和M0 +項目的工作,並且瞭解它的真正意義。

其實,這不是一個軟件/程序問題,而是一個硬件/電子之一。如果您的805X代碼希望能夠從引腳上的外部輸入讀取1和0,則代碼必須提前將1寫入引腳。如果你的代碼提前將0寫入引腳,外部外設將無法將引腳拉高並允許代碼讀取1.爲什麼?電子東西!想象一下,如果你想享受窗外的風,你必須先打開窗戶。

如果你真的有興趣,自己谷歌「銷值VS鎖存器的價值。」我認爲程序員可以把它留給硬件工程師是沒問題的。我相信805Xs沒有DDR作爲先進的。在輸入和輸出模式之間切換引腳可能很容易但令人困惑。