二单片机C语言入门之判断语句
C语言中一个相当常用的语句结构就是判断语句,判断语句结构要求程序员指定一个或者多个需要判断的条件,以及条件满足或者不满足时程序需要执行的动作(可选)。
C语言中常用的判断语句如下:
判断语句
单片机按键状态读取图
if语句的格式及用法
第一种形式
if(条件表达式)
{
条件表达式为真时需要执行的语句1;
}
语句解释:当条件表达式为真时,程序将执行语句1,如果if条件表达式不为真,将跳转到大括号外继续执行后续的语句。
举个简单的例子,单片机中一般采用IO口来读取按键的状态(硬件如上图),需要实现的是按键每按下一次,自定义变量seft_count值自加1。
按上面要求,采用判断语句的程序如下:
Unsigned int seft_count //自定义变量
if(P3^0==0) //判断按键按下
{
seft_count = seft_count+1; //变量自加1
}
第二种形式
if(条件表达式)
{
条件表达式为真时需要执行的语句1;
}
else
{
上述if条件不满足,执行语句2;
}
语句解释:当if条件表达式为真时,程序将执行语句1,如果if条件表达式不为真时,将执行语句2。
同样上面硬件,需要实现的是按键每按下一次,自定义变量seft_count值自加1,如果按键没有按下,自定义变量值seft_count值自减1。
Unsigned int seft_count //自定义变量
if(P3^0==0) //按键按下
{
seft_count = seft_count+1; //变量自加1
}
else //按键没有按下
{
seft_count = seft_count-1; //变量自减1
}
第三种形式
if(条件表达式1)
{
条件表达式1为真时需要执行的语句1;
}
else if(条件表达式2)
{
条件1不为真,条件表达式2为真时需要 执行的语句2;
}
语句解释:当if条件表达式1为真时,程序将执行语句1,如果if条件表达式1不为真时,转而判断if表达式2是否为真,如果为真则将执行语句2。如果两个条件表达式都不为真,则执行if判断后续的语句。
同样上面硬件,需要实现的是按键每按下一次,自定义变量seft_count值自加1,按键没有按下的情况下,如果自定义的变量值seft_count大于0,则自定义变量值seft_count值自减1。
Unsigned int seft_count //自定义变量
if(P3^0==0)
{
seft_count = seft_count+1;
}
else if(seft_count>0) //变量值大于0为真
{
seft_count = seft_count-1; //变量自减1
}
第四种形式
if(条件表达式1)
{
条件表达式为真时需要执行的语句1;
}
else if(条件表达式2)
{
条件1不为真,条件表达式2为真时需要执行的语句2;
}
else
{
上述条件都不满足,则执行语句3;
}
语句解释:当if条件表达式1为真时,程序将执行语句1,如果if条件表达式1不为真时,转而判断if表达式2是否为真,如果条件2为真则将执行语句2。如果两个条件表达式都不为真,则执行语句3.
同样上面硬件,需要实现的是按键每按下一次,自定义变量seft_count值自加1,按键没有按下的情况下,如果自定义的变量值seft_count大于0,则自定义变量值seft_count值自减1,如果按键没有按下,并且seft_coun也不满足大于0的情况下,清除自定义变量seft_count的值。
Unsigned int seft_count //自定义变量
if(P3^0==0)
{
seft_count = seft_count+1;
}
else if(seft_count>0)
{
seft_count = seft_count-1;
}
else
{
seft_count = 0; //变量清零
}
switch语句的格式及用法
与if判断语句非此即彼的判断不一样,switch判断的条件可以选择很多分支,简单来说,if可以看作不是甲就是乙,而switch判断的分支可以是甲乙丙丁...等等分成很细致的条件,其格式及形式如下:
switch(表达式) //也可以是变量
{
case 常量表达式1://表达式必须是常量
{语句1;}break;
case 常量表达式2://表达式必须是常量
{语句2;}break;
case 常量表达式3://表达式必须是常量
{语句3;}break;
...
default://如果上述条件都不满足
{语句n;}break;
}
语句解释:switch判断语句,直观来说就是匹配语句,语句执行时,将switch(表达式)括号里的表达式运算的结果或变量,一个个跟case的常量去匹配,当两者相等时,相等的那个case满足判断条件,如果所有case的常量都跟表达式的结果不相等,那就执行default;
同样上面硬件,需要实现的是按键每按下一次,自定义变量seft_count值自加1,当按键按10次后,自定义变量值a加10,按键按20次后,变量值a加20,按键按30次后,变量值a加30。
unsigned int seft_count;
unsigned int a;
if(P3^0==0)
{
seft_count = seft_count+1;
Switch(seft_count)
{
case 10:{a = a+10;}break;
case 20: {a = a+20;}break;
case 30:{a = a+30;}break;
default:{;}break;
}
}
注意:举例只为了直观阐明判断语句用法,不代表单片机按键扫描的现实函数就是如此,别的不说,首先按键扫描读的端口状态就不能直接作为判断按键是否按下的直接条件,单片机应用后续再介绍,此处只介绍c语言。
另外,上述阐述的是判断语句的独立用法,判断语句还可以嵌套使用,大家可以自行理解[机智]
单片机C语言基础入门第五章:语句的组成(分支、循环结构)
前面介绍了单片机C语言编程中表达式和运算符的规范以及规则,但是仅仅有表达式和运算符是远不能满足编程的要求。通常程序在单片机中执行是逐步按照地址的顺序进行的,这样会产生一个问题就是当用户希望程序是按照某种条件来运行的时候就会变得复杂,接下来要向大家介绍一下单片机C语言中的语句的表达,在编程中经常用的语句表达式主要是条件语句以及循环语句。有了这几种控制语句使得在编程过程中用户可以按照自己的逻辑或者条件或者时序条件来设计程序执行的顺序。
单片机C语言的条件语句。
主要包括if语句和switch语句。If语句在单片机c语言中是极为常用的语句,用来判断某些变量(信号)达到预期的值后,再执行满足条件的指令,或者执行不满足条件的指令。If 语句的基本形式有三种:
直接的if语句;
if……else……语句;
if……else if……语句;
下面对这三种语句逐一进行介绍
1.直接if语句,其表达式为if(表达式)语句
直接的if语句的执行过程如下图所示:
从图中可以看到,如果表达式为真的时候才执行if的语句,否则直接跳过执行if以外的语句。在单片机的中断延时程序中可以看到:
void INT0_ISR() interrupt 0 //外部中断服务程序
{
Delayms(100);//延时程序100ms一般用于去除抖动,自己编写的延时程序
If(INT0)//判断INT0的电平信号,如果是1运行线下面的程序,如果为0则跳出服务程序,也就是判断是不是误动作导致的INT0发生变化。
{
……//用户的程序
}
}
2.if……else……语句,一般表示为:if(表达式)语句1 else 语句2
if……else……语句是当表达式为真或者假的时候,都会执行相应的程序语句,这样的好处是当判断表达式(或者信号)的真假的时候都会有相应的动作与之对应,其执行的流程图如下:
在单片机程序的设计中这样的例子也很多,比如下面的一段程序来自STC15系列单片机库函数的timer 初始化程序
u8 Timer_Inilize(u8TIM, TIM_InitTypeDef *TIMx)
{
……
if(TIM == Timer0)
{
TR0 = 0; //停止计数
if(TIMx->TIM_Interrupt== ENABLE) ET0 = 1; //允许中断
else ET0= 0; //禁止中断
if(TIMx->TIM_Polity== PolityHigh) PT0 = 1; //高优先级中断
else PT0= 0; //低优先级中断
if(TIMx->TIM_Mode> TIM_16BitAutoReloadNoMask) return 2; //错误
TMOD =(TMOD & ~0x03) | TIMx->TIM_Mode; //工作模式,0: 16位自动重装, 1: 16位定时/计数, 2: 8位自动重装, 3: 16位自动重装, 不可屏蔽中断
if(TIMx->TIM_ClkSource== TIM_CLOCK_12T) AUXR &= ~0x80; //12T
if(TIMx->TIM_ClkSource== TIM_CLOCK_1T) AUXR |= 0x80; //1T
if(TIMx->TIM_ClkSource== TIM_CLOCK_Ext) TMOD |= 0x04; //对外计数或分频
else TMOD&= ~0x04; //定时
if(TIMx->TIM_ClkOut== ENABLE) INT_CLKO |= 0x01; //输出时钟
else INT_CLKO&= ~0x01; //不输出时钟
TH0 =(u8)(TIMx->TIM_Value >> 8);
TL0 =(u8)TIMx->TIM_Value;
if(TIMx->TIM_Run== ENABLE) TR0 = 1; //开始运行
return 0; //成功
}
……//省略下面的部分
}
可以看到if……else……在单片机中的应用。
3.if……else if ……。这样的判断语句的基本格式为:if(表达式1)语句1 else if(表达式2) 语句2 else if(表达式3) 语句3……,其执行的流程如下:
这种结构的好处在于,多个判断表达式和多个执行语句,在数学中这可以表示分段函数的取值,在但片中也通常用于判断电压信号灯具有连续变化的数值信号分段取值的对应不同执行程序的场合。并且这种结构的一个好处是当满足其中的某一个条件的时候,就会执行相应的程序,而不再执行后面的程序,这样可以提高程序运行的效率。
4.有了前面三种if语句的基本组成然后就是if语句的嵌套组成的if复合语句,也就是在if语句中的执行语句中继续嵌入if语句来实现多重if语句的嵌套结构。在这里就不详细介绍了,其用法和基本的if语句相同。
switch语句实现多分支的选择语句,其原理和if……else if……相似,利用多个条件实现多个分支语句的控制,其实也可以从名字看出来switch就是多路开关的意思,即根据变量的取值那然后选择相对应的语句来执行。其表达式如下:
switch(表达式)
{
case 常量表达式1: 语句1
case 常量表达式2: 语句2
case 常量表达式3: 语句3
……
case 常量表达式n: 语句n
default:语句n+1
}
这样会根据表达式的不同常量结果来选择相对应的语句来执行,注意:在这里没有break的时候,执行的顺序会从上往下一直进行,会得到我们并不希望得到的结果,因此在switch语句的case分支语句中增加break来实现真正的分支选择形式,如下:
switch(表达式)
{
case 常量表达式1: {语句1;break;}
case 常量表达式2: {语句2;break;}
case 常量表达式3: {语句3;break;}
……
case 常量表达式n: {语句n;break;}
default:语句n+1;break;
}
这样增加break以后会得到相应的分支语句,执行完后就会跳出switch语句,其break的用法将在后面介绍。
循环语句
1.goto语句,其表达式为goto lable;lable为程序的标号。
goto语句和汇编的Jmp语句类似就是根据程序的标号来进行不会的跳动,结合if语句就构成了循环结构,但是这种语句在单片机C语言中的出现率并不是很高,除非不得已的时候才使用这用语句。
2.while语句,其表达式为while(表达式) 语句,执行的流程如下:
在单片机中百分之百用到的语句,因为在单片机中不管是在带系统的小的任务还是不带系统的应用中,单片机的每个小程序都是在一个死循环中进行的,也就是在固定的程序空间进行执行,因为单片机的程序是在一个while的死循环中进行,一般常用的是while(1),因此经常看到单片机的程序如下所示:
初始化程序;
while(1)//死循环
{
用户程序;
}
While语句中还有do……while语句语句也在单片机编程中经常用到,其表达式分别为:
do
循环体语句
while(表达式)
执行的流程为:
do……while循环常用到模拟一些总线的输出过程中比如SPI,I2C等。
3.for 循环语句, for(表达式1;表达式2;表达式3)语句
一般在常用的是for(循环变量赋初值;循环条件;循环变量增值)语句,在单片机中的死循环中有的时候while(1)会用for(;;)循环来代替,这样也是一个死循环,主要在语句中填写用户的程序即可。其执行的流程如下:
For循环也经常用于模拟SPI、I2C、UART等串口通信的程序中,比如:
void Write_Byte(unsigned char value)
{
unsigned char i;
for (i=0;i<8;i++)
{
if (((value>>(7-i))&0x01)==0x01) ;
SPI_DI=1;
else SPI_DI=0;
SPI_SCL=0;
delay(5); //必须要加延时,否则会因为操作太快而不响应。
SPI_SCL=1;
delay(5);//必须要加延时,否则会因为操作太快而不响应。
}
}
4.break、continue和return语句
break、continue和return都可以使得程序在跳出当前的流程。其中break前面已经在switch语句中涉及,他可以跳出switch语句,进入并执行switch后面的语句。值得注意的是break语句不能用于循环语句和switch之外的任何其他语句,也就是break跳出程序是限制在循环语句和switch语句之中的。然而continue是结束本次循环,也就是跳出循环体下面尚未执行的语句,然后接着进行下一次是否执行循环的判定,不跳出循环体,两者的执行流程如下,以while作为例子。而return是表示从被调函数返回到主调函数继续执行,返回时可附带一个返回值,由return后面的参数指定。return后函数就结束了,后面的语句不再执行(这将在以后的函数中介绍)。
两个while循环中的执行流线个流程如下:
while(表达式1) while(表达式1)
{ {
…… ……
If(表达式2)break; if(表达式2)continue;
…… ……
} }
分支结构的语句和循环语句在单片机的开发过程过程中是及常用到C语言控制语句,也是构成C语言基本函数的重要一部分,因此能够对这两种语句进行熟练的运用会对单片机的开发有着重要的作用。
今天这章的主要内容就是,介绍了分支语句if和switch语句,和循环goto、while、do while、for语句,并介绍了break、continue的区别,以及初步认识了return的功能,谢谢大家,希望大家积极讨论,有什么错误还请各位指正。
相关问答
单片机c语言 编程点亮led灯?用c啊,我想想:1、和硬件有点儿关系,这个你清楚么?2、假设led连接到p1口吧。第一个灯接到p1.0。阴极接io,阳极接5v。#includebitsecflag;unsignedchar...
单片机 怎么用 c语言 设置I/O口输入或输出?单片机的IO口缺省时一般都是双向,既可以是输入又可以是输出,C语言中判断这个口是输入还是输出要看表达式的形式,比如:sbitkey=P1^0;if(key==1).....这里是作...
麻烦高手帮我注释一下这段程序51 单片机 的void t0 (void)interr...[最佳回答]不知道你要怎么样的注释,它是一个定时器0,工作方式1的定时中断程序,定时器的定时时间好像是500个机器周期,其它的就是一些if条件语句和flag标志位判...
单片机 中 IF 语句的使用1?inti+=1;if(i%2=0){输出i}else{i不是偶数}inti+=1;if(i%2=0){输出i}else{i不是偶数}
比特率为9600, 单片机 里用 c语言 怎么写 - 你若安好_590BD45E ...很简单,要看你选择的单片机以89C51举例,11.0592晶振;#includevoidInitUART(void){TMOD=0x20;SCON=0x50;TH1=0xFD;...
51 单片机 汇编 语言 的ifelse如何实现?51单片机汇编语言的ifele语句实现如下:if语句由关键字“if”开始,后面跟随一个逻辑表达式。if语句根据该逻辑表达式的值来决定哪些语句会被执行。if语句可以...
单片机 一条 IF 语句所需要的时间?还真不好确定,这与变量的数据类型有关,char,int对应的IF语句所需时间是不一样的。因为处理方式不一样。还真不好确定,这与变量的数据类型有关,char,int对应...
用 C语言 写51 单片机 闹钟程序 - 180****7518 的回答 - 懂得#definep_keyP1#defineled_dateP0#definechoose_pP2unsignedcharchange(unsignedchari);unsignedintdisplay...
求解 C语言 编写的51 单片机 用按键实现 暂停 开启-ZOL问答{//判断这4个模式是否为真,否则不执行该模式里面的内容1程序{};2启/停{用一个标志是否为1或为0,表示启动或暂停};3电源{进入SLEEP,再次按按键就唤醒单片机};4水...
用 C语言 写51 单片机 闹钟程序 - 156****1626 的回答 - 懂得#definep_keyP1#defineled_dateP0#definechoose_pP2unsignedcharchange(unsignedchari);unsignedintdisplay...