关于单片机中#if,#else if 的用法

下面程序中带有#if和#elif的是什么意思,它们怎么用的?
#include "reg51.h"
#define FOSC 18432000L#define BAUD 115200
#define NONE_PARITY 0 //无校验位#define ODD_PARITY 1 //奇校验
#define EVEN_PARITY 2 //偶校验
#define MARK_PARITY 3 //标记校验
#define SPACE_PARITY 4 //空校验

#define PARITYBIT EVEN_PARITY
#define S2RI 0x01#define S2TI 0x02
#define S2RB8 0x04
#define S2TB8 0x08

sfr AUXR = 0x8e;sfr S2CON = 0x9a;
sfr S2BUF = 0x9b;
sfr BRT = 0x9c;
sfr IE2 = 0xaf;

bit busy;
void SendData(char dat);void SendString(char *s);
void main(){
#if (PARITYBIT == NONE_PARITY) //
S2CON = 0x5a; //8位可变波特率 (无校验位)
#elif (PARITYBIT == ODD_PARITY) || (PARITYBIT == EVEN_PARITY) || (PARITYBIT == MARK_PARITY)
S2CON = 0xda; //9位可变波特率,校验位初始为1
#elif (PARITYBIT == SPACE_PARITY)
S2CON = 0xd5; //9位可变波特率,校验位初始为0
#endif

BRT = -(FOSC/32/BAUD); //设置独立波特率发生器的重载初值 AUXR = 0x14; //独立波特率发生器工作在1T模式
IE2 = 0x01; //使能串口2中断
EA = 1; //开总中断

SendString("STC12C5A60S2\r\nUart2 Test !\r\n"); while(1);
}

void Uart2() interrupt 8 using 1{
if (S2CON & S2RI)
{
S2CON &= ~S2RI; //清除接收完成标志
P0 = S2BUF; //P0显示串口数据
P2 = (S2CON & S2RB8); //P2.2显示校验位
}
if (S2CON & S2TI)
{
S2CON &= ~S2TI; //清除发送完成标志
busy = 0;
}
}

void SendData(char dat){
while (busy); //等待上个数据发送完成
ACC = dat; //取得偶校验位P
if (P) //根据P来设置串口数据的校验位
{
#if (PARITYBIT == ODD_PARITY)
S2CON &= ~S2TB8; //置校验位为0
#elif (PARITYBIT == EVEN_PARITY)
S2CON |= S2TB8; //置校验位为1
#endif
}
else
{
#if (PARITYBIT == ODD_PARITY)
S2CON |= S2TB8; //置校验位为1
#elif (PARITYBIT == EVEN_PARITY)
S2CON &= ~S2TB8; //置校验位为0
#endif
}
busy = 1;
S2BUF = ACC; //发送数据
}

void SendString(char *s){
while (*s) //判断字符串结束标志
{
SendData(*s++); //发送字符
}
}

#if............
#else if...........这是预处理语句。
预处理就是在进行编译的第一遍词法扫描和语法分析之前所作的工作。说白了,就是对源文件进行编译前,先对预处理部分进行处理,然后对处理后的代码进行编译。这样做的好处是,经过处理后的代码,将会变的很精短。在单片机中属于条件编译,也就是说当满足条件,就将#if后面的语句进行编译,否则,丢弃这些部分语句,编译#else if后面的语句。
温馨提示:内容为网友见解,仅供参考
第1个回答  2013-02-27
#if #else #endif 这叫条件编译,在编译时确定哪些代码编译,哪些代码不编译。而if else 是在运行的时候根据条件决定执行哪部分代码。追问

你的意思就是if else是都要编译的?

追答

是这样的。
而#if 是当其条件为真时才编译,否则编译#else里的代码。

参考资料:http://baike.baidu.com/view/1995627.htm

本回答被提问者采纳
第2个回答  2013-02-27
#if (PARITYBIT == NONE_PARITY) //
S2CON = 0x5a; //8位可变波特率 (无校验位)
#elif (PARITYBIT == ODD_PARITY) || (PARITYBIT == EVEN_PARITY) || (PARITYBIT == MARK_PARITY)
S2CON = 0xda; //9位可变波特率,校验位初始为1
#elif (PARITYBIT == SPACE_PARITY)
S2CON = 0xd5; //9位可变波特率,校验位初始为0
#endif
我拿这一段举例子, #if (PARITYBIT == NONE_PARITY) :如果if后面的条件成立,编译后面部分,就是S2CON = 0x5a; //8位可变波特率 (无校验位)。#elif (PARITYBIT == ODD_PARITY) || (PARITYBIT == EVEN_PARITY) || (PARITYBIT == MARK_PARITY): 如果前面#if条件没有成立,没有编译,继续判断这一句, 这一句再不成立,在判断下面的#elif ,一直到#endif 为止。 #endif就是一段条件编译的结束。 每一个#if或者#ifndef或者#ifdef为开始的条件起始,必对应有一个#endif条件编译的结束。追问

那为什么不用if和else,把前面的宏定义可以改为位定义的啊,再说了这个“#if”叫什么语句的?

追答

#if 条件编译, 。 为什么不用if,else,C语言就是这样规定的。

关于单片机中#if,#else if 的用法
在单片机中属于条件编译,也就是说当满足条件,就将#if后面的语句进行编译,否则,丢弃这些部分语句,编译#else if后面的语句。

51单片机elseif什么意思
1. 当变量K等于0时,执行if语句块中的程序。2. 如果K不等于0,则执行else语句块中的程序。3. 单片机是一种将CPU、存储器、定时器、输入输出端口等集成在一块芯片上的小型计算机。4. 与个人电脑中使用的通用微处理器相比,单片机更注重无需外部硬件支持且成本较低的特点。5. 单片机的显著特点是体积...

else if和if语句的用法,C语言单片机
else if(i<10){ i=8;} 则只会执行if,不会执行else if,两个是互斥的。最后i=9.

51单片机else if什么意思
if(k==0){} else {} 这里就是说如果说K确实为0,就执行if后面的{}里面的程序;如果K为除0以外的任何数,就执行else后面{}的语句。单片机,全称单片微型计算机(英语:Single-Chip Microcomputer),又称微控制器(Microcontroller),是把中央处理器、存储器、定时\/计数器(Timer\/Counter)、各种输...

单片机中IF语句的使用1
1、if...else 语句 除了要在括号里条件满足时执行相应的语句外,在不满足该条件的时候,也要执行一些另外的语句,这时候就用到了 if...else 语句,它的基本语法形式是:if (条件表达式){ 语句 1; }else{ 语句 2;} 2、if...esle 语句 if...esle 语句是一个二选一的语句,或者执行 if...

单片机编程, if ( 两个按键同时按下){ 语句1;} else { 语句2;} 两个...
如果按键按下后,接GND。则对应管脚电平为0.假设变量为A,B if((A==0)&&(B==0))有些软件也可以直接用管脚,比如P1.0==0 如果按键按下后,接VCC。则对应管脚电平为1.if((A==1)&&(B==1))

单片机头文件中的#ifndef#define#endif是什么意思?
if就是如果\\x0d\\x0andef就notdef就是notdefine就是未定义。\\x0d\\x0adefine就是定义\\x0d\\x0aendif就是结束如果。\\x0d\\x0a#如果未定义xxxx.h\\x0d\\x0a#则定义xxxx.h\\x0d\\x0a??\\x0d\\x0a#结束如果。\\x0d\\x0a\\x0d\\x0a这样的话,在多个文件同时包含该头文件时就不会出现...

单片机if语句 为什么只执行if后面的语句 else后面的无论什么条件都不...
单片机不熟 但if else 要判断前面为真就执行前面 数字类非0都是真 比如赋值语句 a以定以if(a=3) 那条件就是真 对于起它类型 已从在已定以(有的语言比较松)且已有值也就是非空值就为真 自己理解关系运算符 每种语言都有输出语句 你Boolean()强型输出 也就两种结果 真假 ...

怎么用if函数控制51单片机,用按键就亮?
while(true){ \/\/不断轮询 if(button_A==0){ \/\/这里按键采用低电平 led0 = 1;\/\/点亮LED0 }else { led0 = 0;\/\/熄灭LED0 } }

怎么把单片机里原有的程序拷贝出来
if(单片机加密){ if(想要这个程序) 找专门破解公司读取; if(想要这个功能) { 找会这个单片机的人设计程序,或者硬件也重新设计; }}else if(单片机未加密){ 选择对应的下载器; 选择对应的型号; 在单片机的编程软件上读取;} ...

相似回答