C51几个预编译指令的用法

合集下载

c51 条件编译

c51 条件编译

c51 条件编译C51的条件编译是预处理指令的一种,它允许在编译时根据某些条件选择性地编译代码。

C51条件编译主要有三种形式:1.#ifdef 标识符如果指定的标识符已被#define命令定义,则编译随后的程序段,直到遇到#else或#endif。

如果没有定义该标识符,且存在#else部分,则编译#else后的程序段。

c#ifdef DEBUG// 这部分代码仅在DEBUG被定义时编译#else// 这部分代码仅在DEBUG未被定义时编译#endif2.#ifndef 标识符这与#ifdef相反。

如果指定的标识符没有被#define命令定义,则编译随后的程序段。

如果标识符已被定义,且存在#else部分,则编译#else后的程序段。

c#ifndef RELEASE// 这部分代码仅在RELEASE未被定义时编译#else// 这部分代码仅在RELEASE被定义时编译#endif3.#if 常量表达式如果常量表达式为“真”(非零),则编译随后的程序段。

否则,如果存在#else部分,则编译#else后的程序段。

c#if VERSION > 2// 这部分代码仅在VERSION大于2时编译#else// 这部分代码在其他情况下编译#endif条件编译在多种情况下都很有用,例如:•调试和发布版本:通过定义不同的标识符(如DEBUG和RELEASE),可以在调试和发布版本之间切换。

•多平台支持:可以使用条件编译为不同的平台或硬件配置编写特定的代码。

•功能切换:可以通过条件编译启用或禁用某些功能。

请注意,在使用条件编译时要小心,确保代码的逻辑清晰,并避免创建难以理解和维护的复杂条件结构。

c51单片机c语言常用指令 -回复

c51单片机c语言常用指令 -回复

c51单片机c语言常用指令-回复C51单片机C语言常用指令C51单片机是一种广泛应用于嵌入式系统的微控制器,其C语言编程常用指令为开发者提供了便利。

本文将逐步回答关于C51单片机C语言常用指令的问题,涵盖了常用的输入输出指令、控制流指令、算术指令和逻辑指令等方面,帮助读者全面了解和掌握这些重要的指令。

一、输入输出指令1. 如何在C51单片机上进行输入操作?答:可以使用P1口进行输入操作,需要将P1口配置为输入模式,并使用P1口的位操作函数来读取具体的引脚输入值。

2. 如何在C51单片机上进行输出操作?答:可以使用P2口进行输出操作,需要将P2口配置为输出模式,并使用P2口的位操作函数来设置具体的引脚输出值。

3. 如何控制C51单片机的LED灯?答:可以使用P0口进行LED灯的控制,通过设置P0口的引脚为高电平或低电平来点亮或关闭LED灯。

二、控制流指令1. 如何使用条件语句控制程序的执行顺序?答:可以使用if-else语句或switch语句来进行条件判断,并根据判断结果执行不同的代码块。

2. 如何使用循环语句进行重复操作?答:可以使用for循环、while循环或do-while循环来实现重复操作,根据循环条件控制代码块的执行次数。

三、算术指令1. 如何进行加法运算?答:可以使用加法运算符"+"来进行加法运算,例如:a = b + c;表示将变量b和c的值相加,然后将结果赋值给变量a。

2. 如何进行减法运算?答:可以使用减法运算符"-"来进行减法运算,例如:a = b - c;表示将变量b减去变量c的值,然后将结果赋值给变量a。

四、逻辑指令1. 如何进行逻辑与运算?答:可以使用逻辑与运算符"&&"来进行逻辑与运算,例如:if(a > 0 && b < 10) {...}表示当变量a大于0且变量b小于10时执行相应的操作。

51单片机指令使用方法

51单片机指令使用方法

51单片机指令使用方法51单片机是一种常用的嵌入式微控制器,广泛应用于各种电子设备中。

它具有强大的控制能力和灵活的指令集,为我们开发各种应用提供了便利。

在使用51单片机时,我们需要熟悉其指令的使用方法,下面我们来介绍一些常用的指令及其应用。

首先,我们来讲解一些与数据传输和处理相关的指令。

MOV指令是最常用的指令之一,用于将一个数据从一个寄存器或内存单元传输到另一个寄存器或内存单元。

通过MOV指令,我们可以在单片机中实现数据的复制、传递和处理等操作。

除了MOV指令,还有一些其他常用的数据传输和处理指令,比如ADD指令用于进行加法运算,AND指令用于进行逻辑与操作,OR指令用于进行逻辑或操作等。

这些指令可以实现各种数据处理、逻辑运算和位操作等功能,为我们的程序提供灵活性和多样性。

接下来,我们介绍一些与控制流程相关的指令。

循环结构是程序中常用的一种控制结构,而JMP指令和CJNE指令可以实现跳转和循环控制。

JMP指令用于无条件跳转到指定的地址,而CJNE指令则根据比较结果决定是否跳转到指定的地址。

通过这些指令,我们可以实现程序的分支、循环和条件控制等功能。

此外,还有一些与中断处理相关的指令需要我们熟悉。

中断是单片机中常用的一种事件触发机制,通过中断处理,我们可以实现对外部事件的及时响应。

EA指令用于使能全局中断,而EN和DIS指令用于使能和禁止外部中断。

通过这些指令,我们可以合理利用中断机制,提高程序的响应速度和实时性。

最后,我们来介绍一些与IO口操作相关的指令。

单片机的IO口是与外部设备进行通信的接口,而P1、P2等寄存器则是与IO口对应的数据寄存器。

通过MOV指令和SETB/C指令,我们可以实现对IO口数据的读写操作和控制。

通过这些指令,我们可以与外部设备进行数据交互,实现各种输入输出功能。

总结起来,51单片机的指令使用是嵌入式开发中的基础知识,熟练掌握各种指令的使用方法能够提高我们的开发效率和程序的性能。

c语言编译命令

c语言编译命令

c语⾔编译命令第14章预处理及⽤户配置⽂件• 预处理命令通常在程序编译时进⾏⼀些符号处理,其并不执⾏具体的硬件操作。

C51语⾔中的预处理命令主要有宏定义指令、⽂件包指令和条件编译指令,还有其他⼀些调试时使⽤的指令。

本章将详细介绍各种预处理命令以及C51的⽤户配置⽂件,并结合⼀定的程序实例以加深理解。

本章包括:宏定义指令⽂件包指令条件编译指令C51编译器的控制指令C51的⽤户配置⽂件14.1 预处理命令概述• C51语⾔中提供了各种预处理命令,类似于汇编程序中的伪指令。

⼀般来说,在对源程序进⾏编译前,C51编译器需要先对程序中的预处理命令进⾏处理,然后将预处理的结果与源程序⼀并进⾏编译,最后产⽣⽬标代码。

通过这些预处理命令,在很⼤程度上为C51提供功能和符号等⽅⾯的扩展,使⽤预处理命令也可以提⾼程序的可读性。

为了与源程序中的语句相区 ,预处理命令前要加⼀个“#”。

C51程序中的预处理命令包括以下⼏个:#define //⽤于宏定义#error //⽤于程序调#include //⽤于⽂件包#if //⽤于条件编译#else //⽤于条件编译#elif //⽤于条件编译#endif //⽤于条件编译#ifdef //⽤于宏定义#ifndef //⽤于更改⾏号#undef //⽤于传送控制指令#line //⽤于条件编译#pragma //⽤于多种条件编译选择14.2 宏定义指令• 宏定义指令是⽤⼀些标识符作为宏名来代替⼀些符号或者常量的命令。

宏定义指令可以带参数, 也可以不带参数。

下⾯分 介绍⽤于宏定义的⼀些预处理指令。

14.2.1 #define命令• #define命令⽤于定义⼀个“宏名”。

其中“宏名”是⼀个标识符,在源程序中遇到该标识符时,均以定义的串的内容替代该标识符。

ANSI标准将标识符定义为“宏名”,这个替换过程称为“宏替换”。

#define命令⽤于定义宏名时,可以带参数,也可以不带参数,下⾯分 介绍这两种情况。

C51指令表

C51指令表

)→))C51汇编伪指令:1、DS ---预留存储区命令格式:〔标号:〕DS 表达式值其功能是从指定地址开始,定义一个存储区,以备源程序使用。

存储区预留的存储单元数由表达式的值决定。

TMP: DS 1从标号TEP地址处开始保留1个存储单元(字节)。

2、BIT---定义位命令格式:字符名称BIT 位地址其功能用于给字符名称定义位地址。

SPK BIT P3.7经定义后,允许在指令中用SPK代替P3.7。

3、USING指令USING指令通知汇编器使用8051的哪一个工作寄存器组。

格式:USING 表达式(值必须为0-3,默认值为0。

)USING 0使用第0组工作寄存器。

4、SEGMENT指令SEGMENT 指令用来声明一个再定位段和一个可选的再定位类型。

格式:再定位段名SEGMENT 段类型〔再定位类型〕其中,“再定位段名”用于指明所声明的段。

“段类型”用于指定所声明的段将处的存储器地址空间。

可用的段类型有CODE、XDA TA、DA TA、IDA TA和BIT。

STACK_SEG SEGMENT IDA TADA TA_SEG SEGMENT DATA5、RSEG---再定位段选择指令再定位段选择指令为RSEG,用于选择一个已在前面定义过的再定位段作为当前段。

格式:RSEG 段名段名必须是在前面已经声明过的再定位段。

DA TA_SEG SEGMENT DATA ;声明一个再定位DATA段RSEG DATA_SEG ;选择前面声明的再定位DA TA段作为当前段6、绝对段选择指令CSEG---绝对代码段DSEG---内部绝对数据段XSEG---外部绝对数据段ISEG---内部间接寻址数据段BSEG---绝对位寻址数据段格式:CSEG [AT 绝对地址表达式]DSEG [AT 绝对地址表达式]XSEG [AT 绝对地址表达式]ISEG [AT 绝对地址表达式]BSEG [AT 绝对地址表达式]括号内是可选项,用来指定当前绝对段的基地址。

CC++常用预处理指令

CC++常用预处理指令

CC++常⽤预处理指令 预处理是在编译之前的处理,⽽编译⼯作的任务之⼀就是语法检查,预处理不做语法检查。

预处理命令以符号“#”开头。

常⽤的预处理指令包括:宏定义:#define⽂件包含:#include条件编译:#if、#elif、#ifndef、#ifdef、#endif、#undef错误信息指令:#error#line指令布局控制:#pragma宏定义 宏定义⼜称为宏代换、宏替换,简称“宏”。

宏替换只作替换,不做计算,不做表达式求解。

宏定义分带参数的宏定义和不带参数的宏定义。

在带参数的宏定义,宏名和参数的括号间不能有空格。

宏定义不分配内存,变量定义分配内存。

宏展开不占运⾏时间,只占编译时间;函数调⽤占运⾏时间(分配内存、保留现场、值传递、返回值)。

出现在宏定义中的#运算符把跟在其后的参数转换成⼀个字符串,有时把这种⽤法的#称为字符串化运算符。

例如:#include<iostream>using namespace std;#define STR(n)"abcd"#nint main(){cout<<STR(6)<<endl;system("pause");return0;} 输出结果为: ##运算符⽤于把参数连接到⼀起,预处理程序把出现在##两侧的参数合并成⼀个符号。

例如:#include<iostream>using namespace std;#define STR(a,b,c) a##b##cint main(){cout<<STR(1,2,3)<<endl;system("pause");return0;} 输出结果为:⽂件包含 #include<⽂件名>称为标准⽅式,到系统头⽂件⽬录查找⽂件,#include"⽂件名"则先在当前⽬录(⽤户路径)查找,⽽后到系统头⽂件⽬录查找。

c51单片机c语言常用指令 -回复

c51单片机c语言常用指令 -回复

c51单片机c语言常用指令-回复C51单片机C语言常用指令导语:C51单片机是一种非常常用的微控制器,它广泛应用于许多嵌入式系统和电子设备中。

在单片机的开发过程中,C语言是一种非常常用的编程语言。

本文将介绍C51单片机常用的指令,帮助读者了解这些指令的功能和使用方法。

第一部分:常用的I/O口控制指令I/O口控制指令是C51单片机中非常重要的一部分,因为它们用于控制单片机与外部设备之间的数据交互。

以下是一些常用的I/O口控制指令:- P0:将P0口设置为输入或输出,可以用于与外部设备进行数据通信。

- P1:将P1口设置为输入或输出,可以用于与外部设备进行数据通信。

- P2:将P2口设置为输入或输出,可以用于与外部设备进行数据通信。

- P3:将P3口设置为输入或输出,可以用于与外部设备进行数据通信。

第二部分:常用的中断控制指令中断是C51单片机中实现实时响应的重要机制之一。

以下是一些常用的中断控制指令:- EA:使能所有中断。

- EX0:外部中断0的控制指令,用于外部设备产生中断信号。

- EX1:外部中断1的控制指令,用于外部设备产生中断信号。

- IT0:外部中断0的触发方式,可以设置为电平触发或边沿触发。

- IT1:外部中断1的触发方式,可以设置为电平触发或边沿触发。

第三部分:常用的定时器控制指令定时器是C51单片机中实现时间计数和定时任务的重要模块。

以下是一些常用的定时器控制指令:- TMOD:设置定时器模式,可以选择定时器0/1的工作模式。

- TL0、TL1:定时器0/1的低8位计数器,用于保存定时值的低8位。

- TH0、TH1:定时器0/1的高8位计数器,用于保存定时值的高8位。

- TR0、TR1:定时器0/1的运行控制位,用于启动和停止计时器。

- TF0、TF1:定时器0/1的溢出标志位,用于判断定时器是否溢出。

第四部分:常用的串口通信指令串口通信是C51单片机中常用的通信方式之一,用于与其他设备进行数据交互。

预处理命令

预处理命令

3
math.h——文件包含数学程序。 reg51.h——文件中包含51单片机的特殊寄存器定义。 reg52.h——文件中包含52单片机的特殊寄存器定义。 setjmp.h——文件包含定义jmp_buf类型和setjmp和longjmp程序原型。 stdarg.h——文件包含可变长度参数列表程序。 stdlib.h——文件包含存储区分配程序。 stdio.h——文件包含标准输入和输出程序。 string.h——文件包含字符串操作程序、缓冲区操作程序。 对于51单片机而言,源程序开头必须要包含reg51.h头文件,因为该文件对51单片 机的相关位及寄存器进行了定义,这样在程序中才可以正常使用寄存器等资源。
#else 程序段2
#endif 若常量表达式成立,则编译程序1,否则编译程序2。
5
单片机原理及应用
单片机原理及应用
C51语言中提供了各种预处理命令,其作用类似于汇编程序中的伪指令。在编译环 境对源程序进行编译前,需要先对程序中的预处理命令进行处理,然后将处理结果和源 程序一起编译。C51语言中的预处理命令包括宏定义命令、文件包含命令和条件编译命 令等。通常,除条件编译命令外,预处理命令一般放在函数体之外,并且通常都放置在 源文件的开头。
句如下:
outputs=0xff;
/*输出 1111 1111 */
进行编译时,预处理器会将整个程序中的所有outputs替换为P2。
2.文件包含命令
#include命令的功能是将指定的定义或声明文件放入程序之中,该命令常用于引入 标准库函数文件。下面是一些常用的C51头文件:
absacc.h——包含允许直接访问8051不同存储区的宏定义。 assert.h——文件定义宏,用来建立程序的测试条件。 ctype.h——包含字符转换和分类程序。 intrins.h——文件包含指示编译器产生嵌入式固有代码的程序原型。

C51汇编语言指令集

C51汇编语言指令集

51汇编语言指令集一、符号定义表符号含义Rn R0~R7寄存器n=0~7Direc t 直接地址,内部数据区的地址RAM(00H~7FH)SFR(80H~FFH) B,ACC,PSW,IP,P3,IE,P2,SCON,P1,TCON,P0@Ri 间接地址Ri=R0或R1 8051/31RAM地址(00H~7FH) 8052/32RAM地址(00H~FFH)#data 8位常数#data1616位常数Addr16 16位的目标地址Addr11 11位的目标地址Rel 相关地址bit 内部数据RAM(20H~2FH),特殊功能寄存器的直接地址的位二、指令介绍指令字节周期动作说明算数运算指令1.ADD A,Rn 1 1 将累加器与寄存器的内容相加,结果存回累加器2.ADD A,direct 2 1 将累加器与直接地址的内容相加,结果存回累加器3.ADD A,@Ri 1 1 将累加器与间接地址的内容相加,结果存回累加器4.ADD A,#data 2 1 将累加器与常数相加,结果存回累加器5.ADDC A,Rn 1 1 将累加器与寄存器的内容及进位C相加,结果存回累加器6.ADDC A,direct 2 1 将累加器与直接地址的内容及进位C相加,结果存回累加器7.ADDC A,@Ri 1 1 将累加器与间接地址的内容及进位C相加,结果存回累加器8.ADDC A,#data 2 1 将累加器与常数及进位C相加,结果存回累加器9.SUBB A,Rn 1 1 将累加器的值减去寄存器的值减借位C,结果存回累加器10.SUBB A,direct 2 1 将累加器的值减直接地址的值减借位C,结果存回累加器11.SUBBA,@Ri1 1 将累加器的值减间接地址的值减借位C,结果存回累加器12.SUBBA,0data2 1 将累加器的值减常数值减借位C,结果存回累加器13.INC A 1 1 将累加器的值加114.INC Rn 1 1 将寄存器的值加l15.INCdirect2 1 将直接地址的内容加116.INC@Ri1 1 将间接地址的内容加117.INCDPTR1 1 数据指针寄存器值加1说明:将16位的DPTR加1,当DPTR的低字节(DPL)从FFH溢出至00H时,会使高字节(DPH)加1,不影响任何标志位18.DEC A 1 1 将累加器的值减119.DEC Rn 1 1 将寄存器的值减120.DEC direct 2 1 将直接地址的内容减121.DEC@Ri1 1 将间接地址的内容减122.MUL AB 1 4 将累加器的值与B寄存器的值相乘,乘积的低位字节存回累加器,高位字节存回B寄存器说明:将累加器A和寄存器B内的无符号整数相乘,产生16位的积,低位字节存入A,高位字节存入B寄存器。

C51指令代码

C51指令代码

一、ACALL addr11指令名称:绝对挪用指令指令代码:A10 A9 A8 10001 A7 A6 A5 A4 A3 A2 A1 A0指令功能:构造目的地址,进行子程序挪用。

其方式是以指令提供的11位地址(al0~a0),取代PC的低11位,PC的高5位不变。

操作内容:PC←(PC)+2SP←(SP)+1(SP)←(PC)7~0SP←(SP)+1(SP)←(PC)15~8PC10~0←addrl0~0字节数: 2机械周期:2利用说明:由于指令只给出子程序入口地址的低11位,因此挪用范围是2KB。

二、ADD A,Rn指令名称:寄放器加法指令指令代码:28H~2FH指令功能:累加器内容与寄放器内容相加操作内容:A←(A)+(Rn), n=0~7字节数: 1机械周期;1阻碍标志位:C,AC,OV3、ADD A,direct指令名称:直接寻址加法指令指令代码:25H指令功能:累加器内容与内部RAM单元或专用寄放器内容相加操作内容:A←(A)+(direct)字节数: 2机械周期:1阻碍标志位:C,AC,OV4、ADD A,@Ri ’指令名称:间接寻址加法指令指令代码:26H~27H指令功能:累加器内容与内部RAM低128单元内容相加操作内容:A←(A)+((Ri)), i=0,1字节数: 1机械周期:1阻碍标志位:C,AC,OV五、ADD A,#data指令名称:当即数加法指令指令代码:24H指令功能:累加器内容与当即数相加操作内容:A←(A)+data字节数: 2机械周期:1阻碍标志位:C,AC,OV六、ADDC A,Rn指令名称:寄放器带进位加法指令指令代码:38H~3FH指令功能:累加器内容、寄放器内容和进位位相加操作内容:A←(A)+(Rn)+(C), n=0~7字节数: 1机械周期:1阻碍标志位:C,AC,OV7、ADDC A,direct指令名称:直接寻址带进位加法指令指令代码:35H指令功能:累加器内容、内部RAM低128单元或专用寄放器内容与进位位加操作内容:A←(A)+(direct)+(C)字节数: 2机械周期:1阻碍标志位:C,AC,OV八、ADDC A,@Ri指令名称:间接寻址带进位加法指令指令代码:36H~37H指令功能:累加器内容、内部RAM低128单元内容及进位位相加操作内容:A←(A)+((Ri))+(C), i=0,1字节数: 1机械周期:1阻碍标志位:C,AC,OV九、ADDC A,#data指令名称:当即数带进位加法指令指令代码:34H指令功能:累加器内容、当即数及进位位相加操作内容:A←(A)+data+(C)字节数: 2机械周期:1阻碍标志位:C,AC,OV10、AJMP addr11指令名称:绝对转移指令指令代码:A10 A9 A8 1 0 0 0 1 A7 A6 A5 A4 A3 A2 A1 A0指令功能:构造目的地址,实现程序转移。

c语言程序中的预编译命令

c语言程序中的预编译命令

c语言程序中的预编译命令预编译命令是在编译之前就交由编译器进行相关处理的指令,通常以"#"开头。

预编译命令在整个程序开始编译之前就已经执行。

以下是一些常用的预编译命令:1. #include:用于引入头文件。

例如:```C#include <stdio.h> //引入标准输入输出头文件#include "myheader.h" //引入自定义头文件myheader.h```2. #define:用于定义宏。

例如:```C#define PI 3.14159 //定义宏PI,宏的值是3.14159```3. #undef:用于取消之前定义的宏。

例如:```C#undef PI //取消之前定义的宏PI```4. #ifdef,#ifndef,#endif:用于条件编译。

例如:```C#ifdef PI// 如果宏PI已被定义,则编译以下代码#endif#ifndef PI// 如果宏PI未被定义,则编译以下代码#endif```5. #if, #else, #elif:也是用于条件编译。

例如:```C#if defined(PI)//如果宏PI已被定义,则编译以下代码#else//如果宏PI未被定义,则编译以下代码#endif```6. #error:当某些条件不满足时,输出错误并停止编译。

例如:```C#error "Something went wrong"```7. #pragma:用于实现一些特殊的功能,这个指令和编译器实现有关。

例如:```C#pragma pack(1) //设置结构体的对齐方式为1字节对齐```。

c51汇编语言指令集

c51汇编语言指令集

资料转移指令MOV 移动MOVC 程式记忆体移动MOVX 外部RAM和扩展I/O口与累加器A的数据传送指令PUSH 放入堆叠POP 由堆叠取回XCH 8位元交换XCHD 低4位元交换SWAP 高低4位元交换算术指令ADD 两数相加ADDC 两数相加再加CSUBB 两数相减再减CINC 加一指令DEC 减一指令MUL (MUL AB乘法指令仅此一条)相乘指令,所得的16位二进制数低8位存累加器A高8位存BDIV (DIV AB 除法指令仅此一条)相除指令,所得商存A,余数存BDA (DA A 只此一条指令)调整为十进数逻辑指令ANL做AND(逻辑与)运算ORL做OR(逻辑或)运算XRL 做(逻辑异或)运算CLR 清除为0CPL 取反指令RL 不带进位左环移RLC 带进位左环移RR 不带进位右环移RRC 带进位右环移控制转移类指令JC C=1时跳JNC C=0时跳JB 位元=1时跳JNB 位元=0时跳JBC 位元=1时跳且清除此位元LCALL 长调用子程序ACALL 绝对调用子程序RET 由副程式返回RETI 由中断副程式返回AJMP 绝对转移SJMP 相对转移JMP @A+DPTR 散转,相对DPTR的间接转移JZ A=0时跳JNZA 0时跳CJNE 二数比较,不相等时跳DJNZ 减一,不等於0时跳NOP 空操作位变量指令SETB 设定为1ORG 程序开始,规定程序的起始地址END 程序结束EQU 等值指令(先赋值后使用)例:SUM EQU 30HDB 定义字节指令DW 定义字内容DS 定义保留一定的存贮单元数目BIT 位地址符号指令例:SAM BIT P1.0 RET 子程序返回指令RETI 中断子程序返回指令$ 本条指令地址算术运算指令指令说明周期ADD A,Rn A←A+Rn 12ADD A,direct A←A+direct 12ADD A,@Ri A←A+Ri 12ADD A,#data A←A+data 12ADDC A,Rn A←A+Rn+C 12ADDC A,direct A←A+direct+C 12 ADDC A,@Ri A←A+Ri+C 12ADDC A,#data A←A+data+C 12SU BB A,Rn A←A-Rn-C 12SUBB A,direct A←A-direct-C 12 SUBB A,@Ri A←A-Ri-C 12SUBB A,#data A←A-data-C 12INC A A←A+1 12INC Rn Rn←Rn+1 12INC direct direct←direct+1 12INC @Ri @Ri←@Ri+1 12INC DPTR DPTR←DPTR+1 12DEC A A←A-1 12DEC Rn Rn←Rn-1 12DEC direct direct←direct-1 12DEC @Ri @Ri←@Ri-1 12MUL AB 两个无符号的8位数据相乘,其中高阶8位放入B缓存器,低阶8位则放入累积器ACC 24DIV AB 两个无符号的8位数据相除,把ACC 值除以B缓存器值,商数放回ACC,余数放在B 48DA A 累加器作十进制调整 48逻辑运算指令指令说明周期ANL A,Rn A←A and Rn 12ANL A,direct A←A and direct 12ANL A,@Ri A←A and Ri 12ANL A,#data A←A and data 12ANL direct,A direct←direct and A 12 ANL direct,#data direct←direct and data 24ORL A,Rn A←A or Rn 12ORL A,direct A←A or direct 12ORL A,Rn A←A or Rn 12ORL A,@Ri A←A or Ri 12ORL A,#data A←A or data 12ORL direct,A direct←direct or A 12 ORL direct,#data direct←direct or data 24XRL A,Rn A←A xor Rn 12XRL A,direct A←A xor direct 12XRL A,@Ri A←A xor Ri 12XRL A,#data A←A xor data 12XRL direct,A direct←direct xor A 12 XRL direct,#data dir ect←direct xor data 12CLR A 清除累加器 12CPL A 累加器反相 12RL A 累加器向左旋转 12RLC A 累加器和C左旋 12RR A 累加器向右旋转 12RRC A 累加器和C右旋 12SWAP A 累加器的高低四位互换 12数据转移指令指令说明周期MOV A,Rn A←Rn 12MOV A,direct A←direct 12MOV A,@Ri A←Ri 12MOV A,#data A←data 12MOV Rn,A Rn←A 12MOV Rn,direct Rn←direct 24MOV Rn,#data Rn←data 12MOV direct,A direct←A 12MOV direct,Rn direct←Rn 24MOV direct,direct direct←direct 24 MOV direct,@Ri direct←Ri 24MOV direct,#data direct←data 24MOV @Ri,A Ri←A 12MOV @Ri,direct Ri←direct 24MOV @Ri,#data Ri←data 12MOV DPTR,#data 16 Ri←16bit data 24 MOVC A,@A+DPTR A←程序内存的数据 24 MOVC A,@A+PC A←程序内存的数据 24 MOVX A,@Ri A←外部RAM的数据(8bit地址) 24MOVX A,@DPTR A←外部RAM的数据(16bit地址) 24MOVX @Ri,A 外部的RAM(8bit)←A 24 MOVX @DPTR,A 外部的RAM(16bit)←A 24 PUSH direc 推迭区←direct 24POP direc direct←堆栈区 24XCH A,Rn A和Rn互换 12XCH A,direct A和direct互换 12XCH A,@Ri A和Ri互换 12XCHD A,@Ri A和Ri的低四位互换 12位运算指令指令说明周期CLR C 清除进位旗标 12CLR bit 清除直接位 12SETB C 设定进位旗标 12SETB bit 设定直接位 12CPL C 进位旗标反相 12CPL bit 直接位反相 12ANL C,bit C←C and bit 24ANL C,/bit C←C and bit(反相) 24 ORL C,bit C←C or bit 24ORL C,/bit C←C or bit(反相) 24 MOV C,bit C←bit 12MOV bit,C bit←C 24JC rel 若C=1跳至rel 24JNC rel 若C=0跳至rel 24JB bit,rel 若bit=1跳至rel 24JNB bit,rel 若bit=0跳至rel 24JBC bit,rel 若bit=1跳至rel,且清除此位24程序跳跃指令指令说明周期ACALL addr11 绝对式子程序呼叫 24 LCALL addr16 远程子程序呼叫 24RET 从子程序返回 24RETI 从中断子程序返回 24AJMP addr11 绝对式跳跃 24LJMP addr16 远程跳跃 24SJMP rel 短程跳跃 24JMP @A+DPTR 间接跳跃 24JZ rel 若A=0跳至rel 24JNZ rel 若A不等于0跳至rel 24CJNE A,direct,rel 若A不等于direct跳至rel 24CJNE A,#data,rel 若A不等于data跳至rel 24CJNE Rn,#data,rel 若Rn不等于data跳至rel 24CJNE @Ri,#data,rel 若Ri不等于data跳至rel 24DJNZ Rn,rel Rn减1不等于0跳至rel 24 DJNZ direct,rel direct减1不等于0跳至rel 24NOP 没动作 12缩写符号说明缩写符号说明备注Rn 缓存器R0-R7direct 8bit内部数据存储器,包括1.内部数据存储器(00-7F)的地址2.特殊功能缓存器(80-FF)的地址,如P0,PSW,TMOD..等@Ri 由缓存器R0或R1所寻址的内部RAM数据#data 8bit常数#data 16 16bit常数addr 16 16bit的目的地址,可使跳跃指令跳跃64kaddr 11 11bit的目的地址,可使跳跃指令跳跃2krel 具正负号的8位地址偏移量,用于相对地址的跳跃bit 1个bit:只所有可以位寻址的位。

单片机的C51语言基础

单片机的C51语言基础

或LCALL进行函数调用。
1. 本征库函数:9个 (1)_crol_和_cror_:将char型变量循环左/右移动指定位数 后返回。 (2)_irol_和_iror_:将int型变量循环左/右/移动指定位数后 返回。 (3)_lrol_和_lror_:将long型变量循环左/右/移动指定位数后 返回。 (4)_nop_:相当于插入汇编指令NOP。 (5)_testbit_:相当于JBC指令。 (6)_chkfloat_:测试并返回浮点数状态。 上面所列举的本征函数的说名都包含在头文件<intrins.h> 中。若想使用上述本征函数,必须在源程序开头包涵该头文件, 即:#include<intrins.h>。
缺省存储种类为auto (自动)型变量
【存储种类】
数据类型
【存储类型】
变量名
数据的不同格式叫做数据类型
标准C语言的数据类型
* 有符号数类型可以忽略signed标识符
C51扩充数据类型:bit、sfr或sfr16、sbit 标准C的变量定义举例: int a = 5 ; //定义一个初值为5的整形变量a 语法规则:int int_name [ = 常数];
1. C51的变量
在程序执行过程中,数值可以发生改变的量称为变量。
例如
变量名与存储单元地址相对应,变量值 与存储单元的内容相对应。 在哈佛结构的存储空间中如何建立变量概念?
C51变量定义的四要素: 【存储种类】 数据类型 【存储类型】 变量名
(标准C) (标准C+C51)
(C51特有) (标准C)
* 括号项——可以缺省(但需有缺省值)
【存储种类】 数据类型 共有四个说明符:
【存储类型】
变量名

keilc51程序编译

keilc51程序编译

keilc51程序编译如何使用Keil C51编译程序。

第一步:安装Keil C51编译器首先,我们需要从Keil官方网站下载并安装Keil C51编译器。

在安装过程中,按照安装向导的指示进行操作,选择安装目录和组件,并在安装完成后将安装目录添加到系统的环境变量中。

第二步:创建一个新的工程在Keil C51打开后,选择“File”菜单,然后选择“New Project”选项。

在弹出的对话框中,选择一个适当的文件夹来保存你的工程文件,并为工程命名。

然后选择“C51”作为工程类型,并点击“OK”按钮。

第三步:添加源代码文件在新建的工程中,选择“Project”菜单,然后选择“Add New File to Group”选项。

在弹出的对话框中,选择你的源代码文件,并点击“Add”按钮。

重复这个步骤,如果你有多个源代码文件需要添加到工程中。

第四步:配置编译器选项选择“Project”菜单,然后选择“Options for Target”选项。

在弹出的对话框中,选择“C51”标签,并配置你需要的编译器选项,如程序存储器和数据存储器的大小等。

点击“OK”按钮保存你的选项配置。

第五步:进行编译选择“Project”菜单,然后选择“Build Target”选项。

Keil C51将会开始编译你的源代码文件,并生成一个可执行程序。

编译过程中,你可以在编译输出窗口中查看编译器的输出信息和错误提示。

第六步:运行程序在编译成功后,你可以选择“Project”菜单,然后选择“Debug Target”选项以进行程序的调试。

在调试过程中,你可以单步执行程序,观察程序的变量和寄存器的值,并在需要时进行断点调试。

第七步:下载程序到目标设备当你调试完成并运行程序没有问题后,你可以选择“Project”菜单,然后选择“Output”选项。

在弹出的对话框中,选择你的目标设备,并点击“OK”按钮。

Keil C51将会生成一个可下载的程序文件。

C51编程语句总结

C51编程语句总结

C51编程语句总结- bit:1位变量,取值为0或1- unsigned char:8位无符号整数,取值范围为0-255- bit\*:指针类型,用于指向bit类型的变量。

- unsigned char\*:指针类型,用于指向unsigned char类型的变量。

2.控制语句:- if-else语句:根据条件判断执行不同的代码块。

- while语句:循环执行一段代码,直到条件不满足。

- for语句:循环执行一段代码,按照规定的次数进行迭代。

- switch语句:根据表达式的值,执行不同的代码分支。

- break语句:用于在循环或switch语句中跳出当前的代码块。

- void functionName(:声明一个无返回值的函数。

- unsigned char functionName(unsigned char parameter):声明一个返回值为unsigned char类型的函数,并接受一个unsigned char类型的参数。

4.常用指令:- bit\_name = value:给bit类型的变量赋值。

- var\_name = value:给unsigned char类型的变量赋值。

- var\_name++:将unsigned char类型的变量增加1 - var\_name--:将unsigned char类型的变量减少1 - \_\_delay(key):延时指令,key为延时的关键字。

- P1 = value:将P1口的值设定为value。

-EA=1:使能总中断。

5.位操作指令:-\&:按位与操作。

-,:按位或操作。

-\^:按位异或操作。

-~:按位取反操作。

-<<:左移操作。

-\>\>:右移操作。

6.特殊功能寄存器(SFR)的使用:-P1:端口1,用于输入输出。

-P2:端口2,用于输入输出。

-P3:端口3,用于输入输出。

-P0:端口0,用于输入输出。

51单片机汇编指令集(附记忆方法)

51单片机汇编指令集(附记忆方法)

51单片机汇编指令集一、数据传送类指令(7种助记符)MOV(英文为Move):对内部数据寄存器RAM和特殊功能寄存器SFR的数据进行传送;MOVC(Move Code)读取程序存储器数据表格的数据传送;MOVX (Move External RAM) 对外部RAM的数据传送;XCH (Exchange) 字节交换;XCHD (Exchange low-order Digit) 低半字节交换;PUSH (Push onto Stack) 入栈;POP (Pop from Stack) 出栈;二、算术运算类指令(8种助记符)ADD(Addition) 加法;ADDC(Add with Carry) 带进位加法;SUBB(Subtract with Borrow) 带借位减法;DA(Decimal Adjust) 十进制调整;INC(Increment) 加1;DEC(Decrement) 减1;MUL(Multiplication、Multiply) 乘法;DIV(Division、Divide) 除法;三、逻辑运算类指令(10种助记符)ANL(AND Logic) 逻辑与;ORL(OR Logic) 逻辑或;XRL(Exclusive-OR Logic) 逻辑异或;CLR(Clear) 清零;CPL(Complement) 取反;RL(Rotate left) 循环左移;RLC(Rotate Left throught the Carry flag) 带进位循环左移;RR(Rotate Right) 循环右移;RRC (Rotate Right throught the Carry flag) 带进位循环右移;SWAP (Swap) 低4位与高4位交换;四、控制转移类指令(17种助记符)ACALL(Absolute subroutine Call)子程序绝对调用;LCALL(Long subroutine Call)子程序长调用;RET(Return from subroutine)子程序返回;RETI(Return from Interruption)中断返回;SJMP(Short Jump)短转移;AJMP(Absolute Jump)绝对转移;LJMP(Long Jump)长转移;CJNE (Compare Jump if Not Equal)比较不相等则转移;DJNZ (Decrement Jump if Not Zero)减1后不为0则转移;JZ (Jump if Zero)结果为0则转移;JNZ (Jump if Not Zero) 结果不为0则转移;JC (Jump if the Carry flag is set)有进位则转移;JNC (Jump if Not Carry)无进位则转移;JB (Jump if the Bit is set)位为1则转移;JNB (Jump if the Bit is Not set) 位为0则转移;JBC(Jump if the Bit is set and Clear the bit) 位为1则转移,并清除该位;NOP (No Operation) 空操作;五、位操作指令(1种助记符)CLR 位清零;SETB(Set Bit) 位置1。

keil c51 详细中文手册

keil c51 详细中文手册

KeilC51使用详解V1.0第一章KeilC51开发系统基本知识 (6)第一节系统概述 (6)第二节KeilC51单片机软件开发系统的整体结构 (6)第三节第四节1.C512.L51第一节1.2.3.第二节1.dScope51forDos112.dScopeforWindows12第三节Monitor51及其使用 (13)1.Monitor51对硬件的要求 (13)2.Mon51的使用 (13)3.MON51的配置 (13)5.MON51命令及使用 (14)第四节集成开发环境(IDE)的使用 (14)1.IshellforDos的使用 (14)2.uVisionforwindows的使用 (15)第三章KeilC51vs标准C..15第一节KeilC51扩展关键字 (15)1.bit2.可位寻址区说明20H-2FH..18第七节KeilC51指针 (18)1.一般指针 (18)2.存储器指针 (18)3.指针转换 (18)第八节KeilC51函数 (19)2.通用存储工作区 (19)3.选通用存储工作区由usingx声明,见上例。

(19)4.指定存储模式 (19)5.#pragmadisable.196.递归或可重入函数指定 (19)7.指定PL/M-51函数 (20)1.2._at_3.第二节1.2.第三节1.2.C513.4.第四节段名协定与程序优化 (25)1.段名协定(SegmentNamingConventions)252.程序优化 (25)第五章KeilC51库函数参考 (26)第一节本征库函数(intrinsicroutines)和非本征证库函数 (26)第二节几类重要库函数 (26)1.专用寄存器include文件 (26)2.绝对地址include文件absacc.h.263.动态内存分配函数,位于stdlib.h中 (27)4.缓冲区处理函数位于“string.h”中 (27)5.输入输出流函数,位于“stdio.h”中 (27)第三节KeilC51库函数原型列表 (27)1.CTYPE.H..27第一节第二节2.调试窗口(DEBUGWindow) (32)3.命令窗口(CommandWindow) (32)4.观察窗口(WatchWindow) (32)5.寄存器窗口(RegisteWindow) (32)6.串口窗口(SericalWindows) (32)7.性能分析窗口 (32)8.内存窗口(MemoryWindow) (32)9.符号浏览窗口(SymbolBrowserWindow) (33)10.调用线窗口(Call-StackWindow) (33)11.代码覆盖窗口 (33)12.外围设备窗口(peripherals)33第二节dScopeforWindows基本操作 (33)1.指定初始化文件 (33)第三节8.指针: (38)9.dScope命令语句 (38)10.函数 (43)第一章KeilC51开发系统基本知识第一节系统概述KeilC51是美国KeilSoftware公司出品的51系列兼容单片机C语言软件开发系统,与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。

常用Keil C51库函数

常用Keil C51库函数
将字符型数据val循环右移n位,相当于RR命令
unsigned int _iror_(unsigned int val,unsigned char n)
将整型数据val循环右移n位,相当于RR命令
unsigned long _lror_(unsigned long val,unsigned char n)
函数名及定义
功能说明
void *memchr(void *s1, char val, int len)
顺序搜索字符串s1的前len个字符,以找出字符val,成功时返回s1中指向val的指针,失败时返回NULL
char memcmp(void *s1, void *s2, int len)
逐个字符比较串s1和s2的前len个字符,成功时返回0,如果串s1大于或小于s2,则相应地返回一个正数或一个负数
bit isdigit(char c)
检查参数字符是否为十进制数字0~9,是则返回1,否则返回0
bit isgraph(char c)
检查参数字符是否为可打印字符(不包括空格),值域0x21~0x7e,是则返回1,否则返回0
bit isprint(char c)
检查参数字符是否为可打印字符(包括空格),值域0x21~0x7e,是则返回1,否则返回0
检查参数字符是否为空格、制表符、回车、换行、垂直制表符和送纸(值为0x09~0x0d,或为0x20),是则返回1,否则返回0
bit isxdigit(char c)
检查参数字符是否为十六进制数字字符,是则返回1,否则返回0
char toint(char c)
将ASCII字符的0~9、a~f(大小写无关)转换为十六进制数字
void *memcpy(void *dest, void *src , int len)

单片机指令表汇总

单片机指令表汇总

51单片机指令表汇总51单片机是一种广泛应用的微控制器,其指令集是进行编程的基础。

下面将51单片机的指令表进行汇总,以帮助初学者更好地理解其指令集。

一、数据传输指令1、MOV指令:将源操作数的内容传送到目标操作数。

2、XCH指令:将两个操作数的内容互换。

3、MOVC指令:从外部存储器将数据传送到目标操作数。

4、MOVX指令:将外部存储器中的数据传送到目标操作数。

5、PUSH指令:将数据压入堆栈。

6、POP指令:从堆栈中弹出数据。

二、算术运算指令1、ADD指令:将两个操作数相加,并将结果存放在目标操作数中。

2、SUB指令:从目标操作数中减去源操作数,并将结果存放在目标操作数中。

3、MUL指令:将两个操作数相乘,并将结果存放在目标操作数中。

4、DIV指令:将目标操作数除以源操作数,并将结果存放在目标操作数中。

5、ANL指令:对目标操作数和源操作数进行按位与运算,并将结果存放在目标操作数中。

6、ORL指令:对目标操作数和源操作数进行按位或运算,并将结果存放在目标操作数中。

7、XRL指令:对目标操作数和源操作数进行按位异或运算,并将结果存放在目标操作数中。

8、CPL指令:对目标操作数进行按位取反运算,并将结果存放在目标操作数中。

9、INC指令:将目标操作数加1。

10、DEC指令:将目标操作数减1。

11、ASR指令:将目标操作数右移n位,最高位用符号位补齐。

12、LSR指令:将目标操作数右移n位,最低位用0补齐。

13、ROL指令:将目标操作数循环左移n位,最高位移入最低位。

14、ROR指令:将目标操作数循环右移n位,最低位移入最高位。

单片机汇编指令表一、概述在单片机的世界里,汇编语言扮演着举足轻重的角色。

它是一种低级语言,能够直接与硬件进行交互,提供高效的代码执行效率。

下面,我们将详细列出一些常见的单片机汇编指令,以及它们的功能。

二、指令表1、MOV指令:用于将数据从一个寄存器移动到另一个寄存器。

例如,MOV R1, R2将把 R2的内容移动到 R1中。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

C51几个预编译指令的用法标签:指令用法编译2009-07-31 10:47预处理过程扫描源代码,对其进行初步的转换,产生新的源代码提供给编译器。

可见预处理过程先于编译器对源代码进行处理。

在C语言中,并没有任何内在的机制来完成如下一些功能:在编译时包含其他源文件、定义宏、根据条件决定编译时是否包含某些代码。

要完成这些工作,就需要使用预处理程序。

尽管在目前绝大多数编译器都包含了预处理程序,但通常认为它们是独立于编译器的。

预处理过程读入源代码,检查包含预处理指令的语句和宏定义,并对源代码进行响应的转换。

预处理过程还会删除程序中的注释和多余的空白字符。

预处理指令是以#号开头的代码行。

#号必须是该行除了任何空白字符外的第一个字符。

#后是指令关键字,在关键字和#号之间允许存在任意个数的空白字符。

整行语句构成了一条预处理指令,该指令将在编译器进行编译之前对源代码做某些转换。

下面是部分预处理指令:指令用途#空指令,无任何效果#include包含一个源代码文件#define定义宏#undef取消已定义的宏#if如果给定条件为真,则编译下面代码#ifdef如果宏已经定义,则编译下面代码#ifndef如果宏没有定义,则编译下面代码#elif如果前面的#if给定条件不为真,当前条件为真,则编译下面代码#endif结束一个#if……#else条件编译块#error停止编译并显示错误信息一、文件包含#include预处理指令的作用是在指令处展开被包含的文件。

包含可以是多重的,也就是说一个被包含的文件中还可以包含其他文件。

标准C编译器至少支持八重嵌套包含。

预处理过程不检查在转换单元中是否已经包含了某个文件并阻止对它的多次包含。

这样就可以在多次包含同一个头文件时,通过给定编译时的条件来达到不同的效果。

例如:#define AAA#include "t.c"#undef AAA#include "t.c"为了避免那些只能包含一次的头文件被多次包含,可以在头文件中用编译时条件来进行控制。

例如:#ifndef MY_H#define MY_H……#endif在程序中包含头文件有两种格式:#include <my.h>#include "my.h"第一种方法是用尖括号把头文件括起来。

这种格式告诉预处理程序在编译器自带的或外部库的头文件中搜索被包含的头文件。

第二种方法是用双引号把头文件括起来。

这种格式告诉预处理程序在当前被编译的应用程序的源代码文件中搜索被包含的头文件,如果找不到,再搜索编译器自带的头文件。

采用两种不同包含格式的理由在于,编译器是安装在公共子目录下的,而被编译的应用程序是在它们自己的私有子目录下的。

一个应用程序既包含编译器提供的公共头文件,也包含自定义的私有头文件。

采用两种不同的包含格式使得编译器能够在很多头文件中区别出一组公共的头文件。

二、宏宏定义了一个代表特定内容的标识符。

预处理过程会把源代码中出现的宏标识符替换成宏定义时的值。

宏最常见的用法是定义代表某个值的全局符号。

宏的第二种用法是定义带参数的宏,这样的宏可以象函数一样被调用,但它是在调用语句处展开宏,并用调用时的实际参数来代替定义中的形式参数。

1.#define指令#define预处理指令是用来定义宏的。

该指令最简单的格式是:首先神明一个标识符,然后给出这个标识符代表的代码。

在后面的源代码中,就用这些代码来替代该标识符。

这种宏把程序中要用到的一些全局值提取出来,赋给一些记忆标识符。

#define MAX_NUM 10int array[MAX_NUM];for(i=0;i<MAX_NUM;i++)在这个例子中,对于阅读该程序的人来说,符号MAX_NUM就有特定的含义,它代表的值给出了数组所能容纳的最大元素数目。

程序中可以多次使用这个值。

作为一种约定,习惯上总是全部用大写字母来定义宏,这样易于把程序红的宏标识符和一般变量标识符区别开来。

如果想要改变数组的大小,只需要更改宏定义并重新编译程序即可。

宏表示的值可以是一个常量表达式,其中允许包括前面已经定义的宏标识符。

例如:#define ONE 1#define TWO 2#define THREE (ONE+TWO)注意上面的宏定义使用了括号。

尽管它们并不是必须的。

但出于谨慎考虑,还是应该加上括号的。

例如:six=THREE*TWO;预处理过程把上面的一行代码转换成:six=(ONE+TWO)*TWO;如果没有那个括号,就转换成six=ONE+TWO*TWO;了。

xx还可以代表一个字符串常量,例如:#define VERSION "Version1.0 Copyright(c) 2003"2.带参数的#define指令带参数的宏和函数调用看起来有些相似。

看一个例子:#define Cube(x) (x)*(x)*(x)可以时任何数字表达式甚至函数调用来代替参数x。

这里再次提醒大家注意括号的使用。

宏展开后完全包含在一对括号中,而且参数也包含在括号中,这样就保证了宏和参数的完整性。

看一个用法:int num=8+2;volume=Cube(num);展开后为(8+2)*(8+2)*(8+2);如果没有那些括号就变为8+2*8+2*8+2了。

下面的用法是不安全的:volume=Cube(num++);如果Cube是一个函数,上面的写法是可以理解的。

但是,因为Cube是一个宏,所以会产生副作用。

这里的擦书不是简单的表达式,它们将产生意想不到的结果。

它们展开后是这样的:volume=(num++)*(num++)*(num++);很显然,结果是10*11*12,而不是10*10*10;那么怎样安全的使用Cube宏呢?必须把可能产生副作用的操作移到宏调用的外面进行:int num=8+2;volume=Cube(num);num++;3.#运算符出现在宏定义中的#运算符把跟在其后的参数转换成一个字符串。

有时把这种用法的#称为字符串化运算符。

例如:#define PASTE(n) "adhfkj"#nmain(){printf("%s\n",PASTE(15));}宏定义中的#运算符告诉预处理程序,把源代码中任何传递给该宏的参数转换成一个字符串。

所以输出应该是adhfkj15。

4.##运算符##运算符用于把参数连接到一起。

预处理程序把出现在##两侧的参数合并成一个符号。

看下面的例子:#define NUM(a,b,c) a##b##c#define STR(a,b,c) a##b##cmain()printf("%d\n",NUM(1,2,3));printf("%s\n",STR("aa","bb","cc"));}最后程序的输出为:123aabbcc千万别担心,除非需要或者宏的用法恰好和手头的工作相关,否则很少有程序员会知道##运算符。

绝大多数程序员从来没用过它。

三、条件编译指令条件编译指令将决定那些代码被编译,而哪些是不被编译的。

可以根据表达式的值或者某个特定的宏是否被定义来确定编译条件。

1.#if指令#if指令检测跟在制造另关键字后的常量表达式。

如果表达式为真,则编译后面的代码,知道出现#else、#elif或#endif为止;否则就不编译。

2.#endif指令#endif用于终止#if预处理指令。

#define DEBUG 0main(){#if DEBUGprintf("Debugging\n");#endifprintf("Running\n");}由于程序定义DEBUG宏代表0,所以#if条件为假,不编译后面的代码直到#endif,所以程序直接输出Running。

3.#ifdef和#ifndef#define DEBUGmain(){#ifdef DEBUGprintf("yes\n");#endif#ifndef DEBUGprintf("no\n");#endif}#if defined等价于#ifdef; #if !defined等价于#ifndef4.#else指令#else指令用于某个#if指令之后,当前面的#if指令的条件不为真时,就编译#else后面的代码。

#endif指令将中指上面的条件块。

#define DEBUGmain(){#ifdef DEBUGprintf("Debugging\n");#elseprintf("Not debugging\n");#endifprintf("Running\n");}5.#elif指令#elif预处理指令综合了#else和#if指令的作用。

#define TWOmain(){#ifdef ONEprintf("1\n");#elif defined TWOprintf("2\n");#elseprintf("3\n");#endif}程序很好理解,最后输出结果是2。

6.其他一些标准指令#error指令将使编译器显示一条错误信息,然后停止编译。

#line指令可以改变编译器用来指出警告和错误信息的文件号和行号。

#pragma指令没有正式的定义。

编译器可以自定义其用途。

典型的用法是禁止或允许某些烦人的警告信息。

相关文档
最新文档