#define flag 1 #ifdef flag==1 #define fosc 6M delay=10; #elif flag = = 0 #define fosc 8M delay=12; #else #define fosc 12M delay=20; #endif main() { for(I=0;I<delay;I++); }
C51编译器能对C语言源程序进行高效率的编译,生成高效简洁的代码,在绝大多数场合采用C语言编程即可完成预期的目的。但有时为了编程直观或某些特殊地址的处理,还须采用一定的汇编语言编程。而在另一些场合,出于某种目的,汇编语言也可调用C语言。在这种混合编程中,关键是参数的传递和函数的返回值。它们必须有完整的约定,否则数据的交换就可能出错。下面就以力源公司的10位串行A/D转换器TLC1549 为例说明C语言程序与汇编语言程序的调用。 |
图1 TLC1549管脚图 |
PUBLIC AD ;入口地址 SEG_AD SEGMENT CODE ;程序段 RSEG SEG_AD USING 0 AD: MOV R6,#00 MOV R7,#00 SETB P1.1 ACALL DELAY CLR P1.1 ACALL DELAY MOV R0,#10 RR0: SETB P1.2 NOP CLR P1.2 DJNZ R0,RR0 ACALL DELAY MOV 30H,R6 ;A/D转换的高 ;两位保存在R6中 ACALL CIR MOV R6,30H SETB P1.2 NOP CLR P1.2 MOV 30H,R6 ACALL CIR MOV R6,30H MOV R0,#8 ;A/D转换的低 ;8位保存在R7中 RR2: SETB P1.2 NOP CLR P1.2 MOV 30H,R7 ACALL CIR MOV R7,30H DJNZ R0,RR2 RET CIR: CLR C MOV C,P1.0 MOV A,30H RLC A MOV 30H,A RET END
#include <reg51.h> sbit P1_0=P1^0; void timer0(void)interrupt 1 using 1 { /*T0中断服务程序入口*/ P1_0=!P1_0; TH0=-(1000/256); /*计数初值重装*/ TL0=-(1000%256); } void main(void) { TMOD=0x01; /*T0工作在定时器方式1*/ P1_0=0; TH0=-(1000/256); /*预置计数初值*/ TL0=-(1000%256); EA=1; /*CPU开中断*/ ET0=1; /*T0开中断*/ TR0=1; /*启动T0*/ do{}while(1); }
欢迎光临 DIY编程器网 (http://diybcq.com/) | Powered by Discuz! X3.2 |