广州周立功单片机发展有限公司Tel:(020)38730916387309173873097638730977Fax:38730925 FUNCTION main (BEGIN) SOURCE LINE 9 SOURCE LINE 10 0000 750004 R MOv generic_ _ptr, #04H 0003 750000 R MOv generic ptr+0lH, #HIGH mystring 00 750000 R MOV generic_ ptr+02H, #LOW mystring ?C0001 SOURCE LINE #11 000B aano R MOV R3, generic ptr R MOV R2, generic_ ptr+OlH 000DA900 MOV Rl, generic ptr+02H 000F 120000E LCALL ?C CLDPTR 0012FF MOV R7.A 00136011 Jz?C0002 SOURCE LINE 12 0015900000 MOV DPTR, #OOH 0018F0 MOVX DPTR. A SOURCE LINE #13 00197401 MOV A FOIH 001B2500 R ADD A, generic ptr+02H 001DF500 generic_ptr+02H, A CLR A 00203500 ADDC A, generic ptr+OlH 0022F500 R MOv generic ptr+OlH, A SOURCE LINE 14 002480E3 SJMP?00001 0026 ?C0002 SOURCE LINE #16 0026 750000 R MOv xd ptr, #LOW mystring 0029 SOURCE LINE #17 0029 A800 R MOV RO, xd _ ptr MOv A. RO 002C FF MOV R7.A 002D6008 JZ?00005 SOURCE LINE 18 002F900000 MOV DPTR #OOH 0032F0 MOVX DPTR. A SOURCE LINE #19 00330500 xd ptr SOURCE LINE 20 003580F2 SJMP ?C0003 SOURCE LINE 21 0037 ?C0005
广州周立功单片机发展有限公司 Tel 020 38730916 38730917 38730976 38730977 Fax:38730925 26 ; FUNCTION main (BEGIN) ; SOURCE LINE # 9 ; SOURCE LINE # 10 0000 750004 R MOV generic_ptr,#04H 0003 750000 R MOV generic_ptr+01H,#HIGH mystring 0006 750000 R MOV generic_ptr+02H,#LOW mystring 0009 ?C0001: ; SOURCE LINE # 11 0009 AB00 R MOV R3,generic_ptr 000B AA00 R MOV R2,generic_ptr+01H 000D A900 R MOV R1,generic_ptr+02H 000F 120000 E LCALL ?C_CLDPTR 0012 FF MOV R7,A 0013 6011 JZ ?C0002 ; SOURCE LINE # 12 0015 900000 MOV DPTR,#00H 0018 F0 MOVX @DPTR,A ; SOURCE LINE # 13 0019 7401 MOV A,#01H 001B 2500 R ADD A,generic_ptr+02H 001D F500 R MOV generic_ptr+02H,A 001F E4 CLR A 0020 3500 R ADDC A,generic_ptr+01H 0022 F500 R MOV generic_ptr+01H,A ; SOURCE LINE # 14 0024 80E3 SJMP ?C0001 0026 ?C0002: ; SOURCE LINE # 16 0026 750000 R MOV xd_ptr,#LOW mystring 0029 ?C0003: ; SOURCE LINE # 17 0029 A800 R MOV R0,xd_ptr 002B E6 MOV A,@R0 002C FF MOV R7,A 002D 6008 JZ ?C0005 ; SOURCE LINE # 18 002F 900000 MOV DPTR,#00H 0032 F0 MOVX @DPTR,A ; SOURCE LINE # 19 0033 0500 R INC xd_ptr ; SOURCE LINE # 20 0035 80F2 SJMP ?C0003 ; SOURCE LINE # 21 0037 ?C0005:
广州周立功单片机发展有限公司Te:(020)38730916387309173870976387097Fax389305 003722 FUNCTION main (END) 由于使用具体指针能够节省不少时间,所以我们一·般都不使用通用指针 6中断服务 8051的中断系统十分重要,C51使你能够用C来声明中断和编写中断服务程序(当然你 也可以用汇编来写)。中断过程通过使用 Interrupt关键字和中断号(0到31)来实现中断 号告述编译器中断程序的入口地址。中断号对应着IE寄存器中的使能位,换句话说,IE 寄存器中的0位对应着外部中断0,相应的外部中断0的中断号是0。表0-6反映了这种关 系 正寄存器中的使能中断源 一个中断过程并不一定带上所有参数,可位和C中的中断号 以没有返回值。有了这些限制,编译器不须要 外部中断0 担心寄存器组参数的使用和对累加器,状态寄 定时器0溢出 存器,B寄存器,数据指针和默认的寄存器的 外部中断1 保护,只要他们在中断程序中被用到,编译的 定时器1溢出 时候会把他们入栈,在中断程序结束时将他们 串行口中断 恢复。中断程序的入口地址被编译器放在中断 定时器2溢出 表06 向量中。C51支持所有5个8051/8052标准中 断(从0到4)和在8051系列中多达27个中断源。一个中断服务程序的例子如下 列表0-9 2 #include <stdio. h> 4 #define reloadvalh ox 3c #define reloadvall oxbo 7 extern unsigned int tick count 9 void timer(void) interrupt 1 i 101 //停止定时器0 THO=RELOADVALH /50ms后溢出 12 1 TLO=RELOADVALL 131TRO=1 /启动T0 141 tick count++ //时间计数器加 15 1 printf( tick count=%05u\n, tick count) 编译后产生的汇编代码 functioN timer0 (BEGIN) 0000 COEO PUSH ACC 0002 COFO PUSH B 0004 C083 PUSH DPH 0006 C082 PUSH DPL
广州周立功单片机发展有限公司 Tel 020 38730916 38730917 38730976 38730977 Fax:38730925 27 0037 22 RET ; FUNCTION main (END) 由于使用具体指针能够节省不少时间 所以我们一般都不使用通用指针 6 中断服务 8051 的中断系统十分重要,C51 使你能够用 C 来声明中断和编写中断服务程序(当然你 也可以用汇编来写) 中断过程通过使用 interrupt 关键字和中断号(0 到 31)来实现.中断 号告述编译器中断程序的入口地址 中断号对应着 IE 寄存器中的使能位 换句话说 IE 寄存器中的 0 位对应着外部中断 0 相应的外部中断 0 的中断号是 0 表 0-6 反映了这种关 系 一个中断过程并不一定带上所有参数 可 以没有返回值 有了这些限制 编译器不须要 担心寄存器组参数的使用和对累加器 状态寄 存器 B 寄存器 数据指针和默认的寄存器的 保护 只要他们在中断程序中被用到 编译的 时候会把他们入栈 在中断程序结束时将他们 恢复 中断程序的入口地址被编译器放在中断 向量中 C51 支持所有 5 个 8051/8052 标准中 断 从 0 到 4 和在 8051 系列中多达 27 个中断源 一个中断服务程序的例子如下 列表 0-9 1 #include <reg51.h> 2 #include <stdio.h> 3 4 #define RELOADVALH 0x3C 5 #define RELOADVALL 0xB0 6 7 extern unsigned int tick_count; 8 9 void timer0(void) interrupt 1 { 10 1 TR0=0; // 停止定时器0 11 1 TH0=RELOADVALH; // 50ms后溢出 12 1 TL0=RELOADVALL; 13 1 TR0=1; // 启动 T0 14 1 tick_count++; // 时间计数器加1 15 1 printf("tick_count=%05u\n", tick_count); 16 1 } 编译后产生的汇编代码 ; FUNCTION timer0 (BEGIN) 0000 C0E0 PUSH ACC 0002 C0F0 PUSH B 0004 C083 PUSH DPH 0006 C082 PUSH DPL IE 寄存器中的使能 位和 C 中的中断号 中断源 0 外部中断 0 1 定时器 0 溢出 2 外部中断 1 3 定时器 1 溢出 4 串行口中断 5 定时器 2 溢出 表 0-6
广州周立功单片机发展有限公司Tel:(020)38730916387309173873097638730977Fax:38730925 0008 CODO PUSH PSW 000A C000 PUSH ARO 000C C001 PUSH ARI 000E C002 PUSH AR2 0010 C003 PUSH AR3 0012 C004 PUSH AR4 0014 C005 PUSH AR5 0016 C006 PUSH 0018 C007 PUSH SOURCE LINE 9 SOURCE LINE 10 001A C28C CLR TRO SOURCE LINE 11 001C 758C3C MOV THO. #03CH SOURCE LINE #12 001F 758AB0 MOV TLO. #OBOH BOURCE LINE 13 0022 D28 SETB TRO SOURCE LINE 14 0024 900000E MOV DPTR #tick count+01H 0027E0 MOVX A. ODPTR 002804 INC A 0029F0 MOVX ODPTR A 002A7006JNZ?00002 002c 900000 E MoV DPTR #tick count 002FE0 MOVX A. ODPTR 003004 INC A 0031F0 MOVX DPTR.A 003220002 SOURCE LINE #15 00327B05MoVR3,#05H 0034 7A0OR MOV R2 #HIGH ?SC O 0036 7900R MOV Rl, #LOW ?SC 0 0038 900000 E Mov DPTR #tick count 003BE0 MoVX A. ODPTR 003C FF MOV R7.A 003DA INC DPTR 003EE0 MOVX A. ODPTR 003F 900000 E MOV DPTR, # printf?BYTE+03H MOVX @DPTR, A 0044A3 INC DPTR 0045EF MOv A R7 0046F0 MOVX DPTR.A
广州周立功单片机发展有限公司 Tel 020 38730916 38730917 38730976 38730977 Fax:38730925 28 0008 C0D0 PUSH PSW 000A C000 PUSH AR0 000C C001 PUSH AR1 000E C002 PUSH AR2 0010 C003 PUSH AR3 0012 C004 PUSH AR4 0014 C005 PUSH AR5 0016 C006 PUSH AR6 0018 C007 PUSH AR7 ; SOURCE LINE # 9 ; SOURCE LINE # 10 001A C28C CLR TR0 ; SOURCE LINE # 11 001C 758C3C MOV TH0,#03CH ; SOURCE LINE # 12 001F 758AB0 MOV TL0,#0B0H ; SOURCE LINE # 13 0022 D28C SETB TR0 ; SOURCE LINE # 14 0024 900000 E MOV DPTR,#tick_count+01H 0027 E0 MOVX A,@DPTR 0028 04 INC A 0029 F0 MOVX @DPTR,A 002A 7006 JNZ ?C0002 002C 900000 E MOV DPTR,#tick_count 002F E0 MOVX A,@DPTR 0030 04 INC A 0031 F0 MOVX @DPTR,A 0032 ?C0002: ; SOURCE LINE # 15 0032 7B05 MOV R3,#05H 0034 7A00 R MOV R2,#HIGH ?SC_0 0036 7900 R MOV R1,#LOW ?SC_0 0038 900000 E MOV DPTR,#tick_count 003B E0 MOVX A,@DPTR 003C FF MOV R7,A 003D A3 INC DPTR 003E E0 MOVX A,@DPTR 003F 900000 E MOV DPTR,#?_printf?BYTE+03H 0042 CF XCH A,R7 0043 F0 MOVX @DPTR,A 0044 A3 INC DPTR 0045 EF MOV A,R7 0046 F0 MOVX @DPTR,A
广州周立功单片机发展有限公司Tel:(020)38730916387309173873097638730977Fax:38730925 0047 120000 E LCALL printf SOURCE LINE #16 004AD007 OP AR7 004CD006 004ED005 POP AR 0050 D004 POP AR4 0052 D003 POP AR3 0054D002 POP AR2 0056D001 POP AR1 0058D000 POP 005A DODO POP PSW 005CD082 005ED083 0060 DOF0 POP B 0062DOE0 POP ACC 006432 RETI functioN timer0 (END 在上面的例子中,调用 printf函数使得编译器把所有的工作寄存器入栈,因为调用本 身和非再入函数 printf的处理过程中要使用到这些寄存器。如果在C源程序中把调用语句 去掉的话,编译出来的代码就小得多了。 列表0-10 #include <regal.h> 23456789 #define reloadvalh 0x3c #define reloadvall oxbo extern unsigned int tick count: void timer (void) interrupt 1 using 0 i TRO=O //停止定时器0 THO=RELOADVALH //设定溢出时间50ms 111 TLOFRELOADVALL TR0=1; //启动T0 131 tick count++ //时间计数器加1 141 编译后产生的汇编代码 Function timer (BEGIN) 0000COE0 Push and pop of register bank 0 and the b register is eliminated because printf was usingthe registers for parameters and using b internally. 0002C083 PUSH DPH 00040082 PUSH DPL
广州周立功单片机发展有限公司 Tel 020 38730916 38730917 38730976 38730977 Fax:38730925 29 0047 120000 E LCALL _printf ; SOURCE LINE # 16 004A D007 POP AR7 004C D006 POP AR6 004E D005 POP AR5 0050 D004 POP AR4 0052 D003 POP AR3 0054 D002 POP AR2 0056 D001 POP AR1 0058 D000 POP AR0 005A D0D0 POP PSW 005C D082 POP DPL 005E D083 POP DPH 0060 D0F0 POP B 0062 D0E0 POP ACC 0064 32 RETI ; FUNCTION timer0 (END) 在上面的例子中 调用 printf 函数使得编译器把所有的工作寄存器入栈 因为调用本 身和非再入函数 printf 的处理过程中要使用到这些寄存器 如果在 C 源程序中把调用语句 去掉的话 编译出来的代码就小得多了 列表 0-10 1 #include <reg51.h> 2 3 #define RELOADVALH 0x3C 4 #define RELOADVALL 0xB0 5 6 extern unsigned int tick_count; 7 8 void timer0(void) interrupt 1 using 0 { 9 1 TR0=0; // 停止定时器0 10 1 TH0=RELOADVALH; // 设定溢出时间50ms 11 1 TL0=RELOADVALL; 12 1 TR0=1; // 启动T0 13 1 tick_count++; // 时间计数器加1 14 1 } 编译后产生的汇编代码 ; FUNCTION timer0 (BEGIN) 0000 C0E0 PUSH ACC Push and pop of register bank 0 and the B register is eliminated because printf was usingthe registers for parameters and using B internally. 0002 C083 PUSH DPH 0004 C082 PUSH DPL
广州周立功单片机发展有限公司Tel:(020)38730916387309173873097638730977Fax:38730925 SOURCE LINE 8 SOURCE LINE #9 0006C28C TRO SOURCE LINE 10 0008 758C3C MOV THO. #03C SOURCE LINE 11 000B 758AB0 MOV TLO. #OBOH SOURCE LINE 12 000E D28C TRO SOURCE LINE 13 0010 900000 E Mov DPTR #tick count+olH 0013E0 MOVX A. ODPTR 001404 DPTR. A 00167006 ?00002 0018 900000 E MOv DPTR, #tick count 001BE0 MOVX A. DPTR 001C04 001DF0 MOVX DPTR.A 001E ?C0002 SOURCE LINE #14 001ED082 POP 0020D083 POP DPH 0022DOE0 002432 FUNction timer0(END) 6.1指定中断服务程序使用的寄存器组 当指定中断程序的工作寄存器组时,保护工作寄存器的工作就可以被省略。使用关键 字 using,后跟一个0到3的数对应着4组工作寄存器。当指定工作寄存器组的时候,默 认的工作寄存器组就不会被推入堆栈,这将节省32个处理周期,因为入栈和出栈都需要 个处理周期。为中断程序指定工作寄存器组的缺点是,所有被中断调用的过程都必须使用 同一个寄存器组,否则参数传递会发生错误。下面的例子给出了定时器0的中断服务程序, 但我已经告述编译器使用寄存器组0 列表0-11 #include <regal. h finc lude <stdio. h 123456789 #define reloadvalh ox 3c #define reloadval oxbo extern unsigned int tick count oid timer(void) interrupt 1 using
广州周立功单片机发展有限公司 Tel 020 38730916 38730917 38730976 38730977 Fax:38730925 30 ; SOURCE LINE # 8 ; SOURCE LINE # 9 0006 C28C CLR TR0 ; SOURCE LINE # 10 0008 758C3C MOV TH0,#03CH ; SOURCE LINE # 11 000B 758AB0 MOV TL0,#0B0H ; SOURCE LINE # 12 000E D28C SETB TR0 ; SOURCE LINE # 13 0010 900000 E MOV DPTR,#tick_count+01H 0013 E0 MOVX A,@DPTR 0014 04 INC A 0015 F0 MOVX @DPTR,A 0016 7006 JNZ ?C0002 0018 900000 E MOV DPTR,#tick_count 001B E0 MOVX A,@DPTR 001C 04 INC A 001D F0 MOVX @DPTR,A 001E ?C0002: ; SOURCE LINE # 14 001E D082 POP DPL 0020 D083 POP DPH 0022 D0E0 POP ACC 0024 32 RETI ; FUNCTION timer0 (END) 6.1 指定中断服务程序使用的寄存器组 当指定中断程序的工作寄存器组时 保护工作寄存器的工作就可以被省略 使用关键 字 using 后跟一个 0 到 3 的数对应着 4 组工作寄存器 当指定工作寄存器组的时候 默 认的工作寄存器组就不会被推入堆栈 这将节省 32 个处理周期 因为入栈和出栈都需要 2 个处理周期 为中断程序指定工作寄存器组的缺点是 所有被中断调用的过程都必须使用 同一个寄存器组 否则参数传递会发生错误 下面的例子给出了定时器 0 的中断服务程序 但我已经告述编译器使用寄存器组 0 列表 0-11 1 #include <reg51.h> 2 #include <stdio.h> 3 4 #define RELOADVALH 0x3C 5 #define RELOADVALL 0xB0 6 7 extern unsigned int tick_count; 8 9 void timer0(void) interrupt 1 using 0 {