单片机c语言编程文件结构:单片机C语言基础入门第五章
单片机c语言编程文件结构:单片机C语言基础入门第五章
2024-11-05 08:51:46  作者:无心顾及  网址:https://m.xinb2b.cn/tech/prz423737.html

前面介绍了单片机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发生变化。

{

……//用户的程序

在单片机程序的设计中这样的例子也很多,比如下面的一段程序来自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的功能,谢谢大家,希望大家积极讨论,有什么错误还请各位指正。

  • 崩坏3羽渡尘怎么样 崩坏3特别预告新神之键武器
  • 2024-11-05崩坏3羽渡尘怎么样 崩坏3特别预告新神之键武器舰长好!今天的跟班告诉你将为大家带来:全新神之键武器「羽渡尘」、武装人偶常驻补给的特别情报一起来看看吧~新神之键武器「羽渡尘」3.8版本更新后,神之键阁将迎来全新的意识之键——「羽渡尘」作为意识之键,。
  • 迫不及待的近义词(迫不及待是什么意思)
  • 2024-11-05迫不及待是什么意思迫不及待的近义词有十万火急、迫在眉睫、心如火焚、按捺不住、心急如焚、千钧一发等等迫不及待[pòbùjídài],意思是,迫:紧急急迫得不能等待形容心情急切,【出自】:清·李汝珍《镜花缘》第六回:“且系。
  • 乘风破浪未来可期的意思(乘风破浪这个词出自哪里)
  • 2024-11-05乘风破浪这个词出自哪里乘风破浪未来可期的意思是:不畏艰险,奋勇直前,未来会很美好,值得期待乘风破浪意思指船只乘着风势破浪前进形容发展迅猛,也比喻志趣远大,勇往直前出自《宋书·宗悫传》未来可待,解释为未来可以期望说明将有一个。
  • 苏伊士运河通行一次费用(苏伊士运河过路费)
  • 2024-11-05苏伊士运河过路费来源:人民日报海外版据美联社消息,埃及苏伊士运河管理局日前发布声明称,将于2023年1月上调苏伊士运河的船舶通行费,游船和运输干货船只的通行费将上调10%,其余船只通行费将上调15%苏伊士运河管理局主。
  • 补钙要多吃什么食物(怎样吃才能补钙呢)
  • 2024-11-05怎样吃才能补钙呢不管男女老少都是需要补钙的,小孩要补钙,青年也要补钙,老年人也不能缺少补钙那补钙的食物有哪些呢?需要怎样来做好补钙呢?含钙量最高的食物是哪种呢?下面我们一起来看看吧!无论是大人还是小孩或者是老人,一生。
  • 张杰最近的新歌(张杰新歌震撼首发)
  • 2024-11-05张杰新歌震撼首发内地总榜467期2018年第34期1.《微笑着胜利》歌词:《微笑着胜利》(庆祝建军91周年网宣主题曲)作词:李劲/张凯作曲:亢竹青演唱:张杰多少次伤痛却不再哭泣多少次倒地又重新站起让青春冲锋在那硝烟里。
  • 愿得一人心而不分离(言不伤人诺不轻许)
  • 2024-11-05言不伤人诺不轻许诺不轻许,故我不负人;诺不轻信,故人不负我人,不要轻言永远,也不要轻许诺言失足,你可以马上恢复站立;失信,你也许永难挽回世间万物都是瞬间变化,我们也许能把握今天,但却难以把握明天,很多时候是计划经常赶。
  • 凝心聚力务实笃行抗疫必胜决心(厘清认知误区少一些私心)
  • 2024-11-05厘清认知误区少一些私心厘清认知误区,少一些私心,戮力同心,打赢这场抗疫攻坚战!文/吴其伦11月11日,国务院联防联控机制综合组发布了《关于进一步优化新冠肺炎疫情防控措施,科学精准做好防控工作的通知》,这则通知公布了进一步优。
  • 狗笼子底部怎么弄 防止狗狗拉屎拉
  • 2024-11-05狗笼子底部怎么弄 防止狗狗拉屎拉两个月还太小啊,这个时候就不要勉强它了,两个月的小狗体质还很虚,搞不好弄个后遗症就得不偿失啦学大小便什么的要慢慢来,在它拉在笼子外面的时候把粑粑指给它看,然后立刻惩罚它,然后把便便挪到正确的位置让他看。
  • 碧玉跟翡翠的区别(碧玉跟翡翠的区别分析)
  • 2024-11-05碧玉跟翡翠的区别分析颜色不同碧玉和翡翠看起来比较类似,但它们主要的区别在于颜色的不同,碧玉的颜色主要以暗绿色居多,而翡翠的颜色多种,有浅绿、深绿、油青色等多种,相比来说,翡翠的颜色要比碧玉鲜艳很多,看起来给人一种鲜活的感。
  • 股的组词(汉字股的组词)
  • 2024-11-05汉字股的组词股骨[gǔgǔ]人和脊椎动物的大腿骨在人体,是全身最长、最结实的骨上端为股骨头,股骨头下方较细长部分为股骨颈,为年老时易发生骨折之处扭股儿糖[niǔgǔrtáng]用麦芽糖制成的两股或三股扭在一起的食。