void serial_intr(void) interrupt 4 {
if (!_testbit_(TI)) { // 是否是发送中断
P0=1; // 翻转 P0.0
_nop_(); // 等待一个指令周期
P0=0;
...
}
if (!_testbit_(RI)) {
test=_cror_(SBUF, 1); // 将SBUF中的数据循环
// 右移一位
...
}
}

        9、使用宏替代函数
        对于小段代码,像使能某些电路或从锁存器中读取数据,你可通过使用宏来替代函数使得程序有更好的可读性你可把代码定义在宏中,这样看上去更像函数。编译器在碰到宏时,按照事先定义的代码去替代宏,宏的名字应能够描述宏的操作,当需要改变宏时,你只要修该宏定义处。
        #define led_on() {\
led_state=LED_ON; \
XBYTE[LED_CNTRL] = 0x01;}
#define led_off() {\
led_state=LED_OFF; \
XBYTE[LED_CNTRL] = 0x00;}
#define checkvalue(val) \
( (val < MINVAL || val > MAXVAL) ? 0 : 1 )
        宏能够使得访问多层结构和数组更加容易,可以用宏来替代程序中经常使用的复杂语句以减少你打字的工作量且有更好的可读性和可维护性。
        10、存储器模式
        C51提供了 3 种存储器模式来存储变量、过程参数和分配再入函数堆栈。你应该尽量使用小存储器模式,很少应用系统需要使用其它两种模式,像有大的再入函数堆栈系统那样。一般来说如果系统所需要的内存数小于内部RAM 数时,都应以小存储模式进行编译。在这种模式下 DATA 段是所有内部变量和全局变量的默认存储段,所有参数传递都发生在DATA 段中,如果有函数被声明为再入函数,编译器会在内部 RAM 中为他们分配空间,这种模式的优势就是数据的存取速度很快,但只有120个字节的存储空间供你使用,总共有128个字节,但至少有8个字节被寄存器组使用,你还要为程序调用开辟足够的堆栈。如果你的系统有 256 字节或更少的外部 RAM 你可以使用压缩存储模式。这样一来,如果不加说明,变量将被分配在 PDATA 段中,这种模式将扩充你能够使用的 RAM 数量,对XDATA 段以外的数据存储仍然是很快的,变量的参数传递将在内部 RAM 中进行,这样存储速度会比较快,对 PDATA 段的数据的寻址是通过 R0 和R1进行间接寻址,比使用 DPTR 要快一些在大存储模式中,所有变量的默认存储区是 XDATA 段 Keil C 尽量使用内部寄存器组进行参数传递,在寄存器组中可以传递参数的数量和和压缩存储模式一样,再入函数的模拟栈将在 XDATA中 对 XDATA 段数据的访问是最慢的,所以要仔细考虑变量应存储的位置使数据的存储速度得到优化。
        11、混合存储模式
        Keil 允许使用混合的存储模式,这点在大存储模式中是非常有用的。在大存储器模式下,有些过程对数据传递的速度要求很高。我就把过程定义在小存储模式寄存器中,这使得编译器为该过程的局部变量在内部 RAM中分配存储空间,并保证所有参数都通过内部 RAM进行传递。尽管采用混合模式后编译的代码长度不会有很大的改变,但这种努力是值得的就像能在大模式下把过程声明为小模式一样,你像能在小模式下把过程声明为压缩模或大模式,这一般使用在需要大量存储空间的过程上,这样过程中的局部变量将被存储在外部存储区中,你也可以通过过程中的变量声明,把变量分配在 XDATA 段中。
        12、运行库
        运行库中提供了很多短小精悍的函数,你可以很方便的使用他们,你自己很难写出更好的代码了。值得注意的是库中有些函数不是再入函数,如果在执行这些函数的时候被中断,而在中断程序中又调用了该函数,将得到意想不到的结果。而且这种错误很难找出来,最好禁止使用这些函数的中断。