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 说明该中断函数的入口地址。