#error命令通常嵌入在条件编译之中,以便捕捉到一些不可预料的编译条件。需要指出的是,并非所有的C51编译控制命令都可以在C语言源程序中对#pragma预处理命令多次使用,对于Keil Cx51编译器的首要控制命令只能使用一次,如果多次使用将导致致命的编译错误。......
2023-11-17
宏定义命令为#define。它的作用是用一个字符串来进行替换,而这个字符串既可以是常数,也可以是其他任何字符串,甚至还可以是带参数的宏。宏定义的简单形式是符号常量定义,复杂形式是带参数的宏定义。
1.不带参数的宏定义
不带参数的宏定义又称为符号常量定义,一般格式如下:
其中,“标识符”是所定义的宏符号名(也称为宏名),它的作用是在程序中使用指定的标识符代替指定的常量表达式。例如,“#define PI 3.141592”就是用PI这个符号来代替常数3.141592。使用了这个宏定义之后,程序中就不必每次都写出常数3.141592,而可以用符号PI代替。在编译时,编译器会自动将程序中所有的符号名PI都替换成常数3.141592。这种方法使编程人员可以在C语言源程序中用一个简单的符号名来替换一个很长的字符串,还可以使用一些有一定意义的标识符,以提高程序的可读性。
实际使用宏定义时,按一般习惯,通常将宏符号名用大写字母表示,以区别于其他的变量名。宏定义不是C语言的语句,因此在宏定义行的末尾不要加分号,否则在编译时将连同分号一起进行替换而导致出现语法错误。在进行宏定义时,可以引用已经定义过的宏符号名,即可以进行层层代换,但最多不能超过8级嵌套。需要注意的是,预处理命令对于程序中用双引号括起来的字符串内的字符,即使该字符与宏符号名相同也不作替换。
宏符号名的有效范围是从宏定义命令#define开始,直到本源文件结束。通常将宏定义命令#define写在源程序的开头、函数的外面,作为源文件的一部分,从而在整个档范围内有效。需要时可以用命令#undef来终止宏定义的作用域。
2.带参数的宏定义
带参数的宏定义与符号常量定义的不同之处在于,对于源程序中出现的宏符号名不仅进行字符串替换,而且还能进行参数替换。带参数宏定义的一般格式如下:(www.chuimin.cn)
#define 宏符号名(参数表) 表达式
其中,表达式内包含了在括号中所指定的参数,这些参数称为形式参数,在以后的程序中它们将被实际参数所替换。带参数的宏定义将一个带形式参数的表达式定义为一个带形式参数表的宏符号名,对程序中所有带实际参数表的该宏符号名,用指定的表达式来替换,同时用参数表中的实际参数替换表达式中对应的形式参数。下面通过一些实例来说明带参数的宏定义的用法。
带参数的宏定义常用来代表一些简短的表达式,它用来将直接插入的代码代替函数调用,从而提高程序的执行效率。例如:
该语句定义了一个带参数的宏MIN(x,y),以后在程序中就可以用这个宏而不用函数MIN()。例如,语句“m=MIN(u,v);”经宏展开后成为“m=(((u)<(v))?(u):(v))”。
宏定义的应用,举例如下:
程序执行结果:
这个例子实现的功能,为将片内存储区30H和31H中的数据中的较小的值存放至片内存储区40H中。
有关单片机基础及应用的文章
#error命令通常嵌入在条件编译之中,以便捕捉到一些不可预料的编译条件。需要指出的是,并非所有的C51编译控制命令都可以在C语言源程序中对#pragma预处理命令多次使用,对于Keil Cx51编译器的首要控制命令只能使用一次,如果多次使用将导致致命的编译错误。......
2023-11-17
8051有5个中断源,即两个外部中断、两个定时/计数器中断和一个串行发送/接收中断。1.外部中断外部中断是由连接到单片机外部引脚信号变化而引起的中断,反映外部某一事件的发生。CPU是在每个机器周期的S5P2检测P 3.2和P 3.3上的信号,如果是有效信号则对定时器控制寄存器TCON中的IE0或IE1置1,建立中断请求标志。表6-1中断源的主要内容及说明......
2023-11-17
1.基本组成微型计算机的基本组成如图1-2所示。图1-2微型计算机的组成框图中央处理器CPUCPU是计算机的核心部件,它由运算器和控制器组成,完成计算机的运算和控制功能。电池式NVRAM是由CMOS的SRAM、备用电池和切换电路组成,在电源断开或低于某值时切换电路把备用电池接入,对RAM进行写保护,防止意外数据写入和信息丢失。......
2023-11-17
MCS-51单片机的算术运算类指令包括加、减、乘、除、加1、减1等指令。这类指令有ADD、ADDC、INC、SUBB、DEC、DA、MUL、DIV共8种。表3-3算术运算类指令注:√表示该指令影响某一标志位。运算结果对PSW的影响同上述4条ADD指令。6.十进制调整指令十进制调整指令只有以下1条:该指令用于BCD码加法运算时,对BCD码的加法运算结果自动进行调整,但对BCD码的减法运算不能用此指令来调整。在运算过程中,单片机按二进制规则进行运算。......
2023-11-17
1.生产厂商常见的单片机生产厂商有Intel公司、Motorola公司、Philips公司、Atmel公司、Zilog公司、NEC公司、MicroChip公司、ADI公司、Epson公司、NS公司、AMD公司、WinBond公司、Scenix公司、Toshiba公司、Fujitsu公司、Samsung公司等。2.单片机系列常见的单片机系列有Intel公司的MCS-51、MCS-96/98系列,Motorola公司的68HC05、68HC5X、68HC12、68HC16、683XX系列,Philips公司的80C5X系列,Atmel公司的AT89系列,Zilog公司的Z8、Z86系列,ADI公司的MC-6801系列,MicroChip公司的PIC16CX、PIC16FX、PIC17CX、PIC18CX系列,NEC公司的μPD7800系列,Toshiba公司的MB8900、MB90系列等。......
2023-11-17
在单片机应用系统设计时,应按以下6条原则进行:1)明确设计目标。在整个设计过程中要不断地对照设计目标并满足目标要求。2)自上而下设计。3)软、硬件优化设计。大部分子任务可以以硬件为主实现也可以以软件为主实现,必须进行协调优化设计,从而提高性能质量,降低成本。6)组合及开放式设计。......
2023-11-17
数组是由若干个具有相同数据类型的数据变量组成的集合。数组名的命名规则与变量名的命名规则相同。数组元素用同一个数组名字的不同下标来区别,数组的下标放在方括号中,从0开始,是0,1,2,3,…数组元素由数组名a和下标共同表示,数组元素分别为a[0],a[1],a[2],…在C51程序设计中,八段数码管的段码表就是用数组表示的。......
2023-11-17
程序存储器以程序计数器PC作为地址指针,通过16位地址总线,可寻址的地址空间为64KB,片内/外统一编址。根据单片机的类型及引脚的电平,CPU可从内部也可从外部程序存储器开始执行。而当EA=0时,内部程序存储器被忽略,程序直接从外部程序存储器的0000H开始执行。64KB程序存储器中有一些特殊的单元,在使用时应加以注意。0023H——串行口的中断服务子程序入口地址。......
2023-11-17
相关推荐