設置 | 登錄 | 註冊

目前共有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許可協議進行許可。