設置 | 登錄 | 註冊

作者共發了2篇帖子。

我終於知道為什麼在51單片機中執行P2 &= ~BIT(2);會出錯了

1樓 巨大八爪鱼 2015-12-23 18:48
在AVR單片機中,PORTC |= BIT(2) 和 PORTC &= ~BIT(2)均能正常運行,但是在C51單片機中後者會出錯。這主要是因為定義BIT宏的時候格式有問題。
在AVR單片機中,BIT(n)宏(ICCAVR)和_BV(n)宏(WinAVR)都是在頭文件中定義好了的,而C51單片機庫函數裡沒有這兩個宏,所以需要手動定義。如果在手動定義時寫的是下面的語句:
#define BIT(n) 1<<n
那麼,如果執行P2 &= ~BIT(2),編譯器在編譯時就會將其替換為P2 &= ~1<<2。那麼問題來了,因為~1 == 0xfe,且0xfe << 2 == 0xf8,因此執行後的結果是P2被賦上了0xf8的值,也就是11111000。而我們期望的P2值卻是0xfb (11111011)。
因此,錯誤的根源就是BIT宏替換後1<<2沒有加上括號。如果替換後的語句是P2 &= ~(1<<2),那麼我們就能得出正確的結果。
所以,在手動定義BIT宏的時候,一定要把1<<n用括號括起來:
#define BIT(n) (1<<n)
2樓 巨大八爪鱼 2015-12-23 18:49
可以推測出,AVR單片機的自帶頭文件里,BIT或BV宏定義肯定是加了括號的,所以才不會出錯。而C51單片機里手動定義時卻忽略了這一點。

內容轉換:

回覆帖子
內容:
用戶名: 您目前是匿名發表。
驗證碼:
看不清?換一張
©2010-2025 Purasbar Ver3.0 [手機版] [桌面版]
除非另有聲明,本站採用知識共享署名-相同方式共享 3.0 Unported許可協議進行許可。