1.sbit 在Keil中的sbit LED_POWER = P0^4;需要改为宏的形式:#define LED_POWER P0_bit.pin5 __sfr __no_init volatile union { unsigned char P0; /* Port 0 */ union{ struct /* Port 0 */ { unsigned char AD0 : 1; unsigned char AD1 : 1; unsigned char AD2 : 1; unsigned char AD3 : 1; unsigned char AD4 : 1; unsigned char AD5 : 1; unsigned char AD6 : 1; unsigned char AD7 : 1; }; struct /* Port 0 */ { unsigned char pin0 : 1; unsigned char pin1 : 1; unsigned char pin2 : 1; unsigned char pin3 : 1; unsigned char pin4 : 1; unsigned char pin5 : 1; unsigned char pin6 : 1; unsigned char pin7 : 1; }; } P0_bit; } @ 0x80; 2.code和const 只需要吧code关键字替换为const就行了。但是编译报错,说定义的常量数组太大,这是为什么。打开工程的option选项,首页右下角有个关于常量位置的设置,选择将常量放到代码空间即可。 3.寄存器位的访问 由于IAR中不支持直接的位访问,所以对于CY、TR0之类的寄存器位都要通过位段的形式来访问,好在51的寄存器不多。 4.中断函数的写法 在keil中,中断函数是如下形式 void Timer0_isr(void) interrupt 1 { //code } 而在IAR中是这样 #pragma vector=timer0 __interrupt void Timer0_isr(void) { //code } 这里 __interrupt 表示Timer0_isr()是一个中断函数,#pragma vector 说明该中断函数的入口地址。