三单片机c语言入门之循环语句
循环语句在单片机编程应用中是必不可少的一种语句结构,c语言是一种顺序执行语言,如果没有循环语句,c语言会根据程序指针地址的增加一直向下执行,如果没有循环语句加以干涉,加上单片机程序存储空间一般都不大,很容易就会出现程序指针越界的错误。
使用循环可以多次重复地执行多条语句,这里的“多条语句”称为循环体。在C语言中,可以使用三种循环,分别是:while、do...while和for。
While循环语句结构
while(表达式)
{
语句;
}
while 表达式是顶部判断的循环,先计算循环条件(while表达式)。如果为真,则执行循环体语句,然后再次计算循环条件。如果循环条件为假,程序跳过循环体,而去执行循环体后面的语句。从语法上讲,循环体只有一条循环条件。如果需要执行多条循环条件综合判断,可以使用运算方式将它们组合在一起,相关知识后续章节再做介绍,
举个简单的例子,在单片机应用程序开发中,我们都知道main函数是必不可少的,编译器通过main函数来给整个程序定位运行的起始flash地址(单片机应用code,除非用户特别指定,否则应用程序并不是一定从flash的00地址开始执行code的,这点大家需要注意,后续也会有介绍)。而main函数中,最重要也是必不可少的就是while循环语句,而且是应用code中的死循环,我们希望它永远不要跳出去的循环体(原因上面也已经简单介绍了,如果跳出循环,程序执行就有程序指针越界的风险)。
如上例子,就是典型的while死循环的用法,因为其循环判断条件直接就是常数1,也就是真,所以它会一直循环下去。
再举个例子,单片机中一般采用IO口来读取按键的状态(硬件如上图),需要实现的是按键每按下一次,自定义变量seft_count值自加1,直到按键按下10次为止。
for循环语句结构
for循环第一种用法
for(表达式1;表达式2;表达式3)
{
语句;
}
在一个典型的 for 循环中,在循环体判断条件有三个动作需要执行:
(1) 表达式 1:判断条件中变量的初始化
只计算一次。在计算其他循环判断表达式之前,先计算一次,以进行必要的初始化,后面不再计算它。
(2) 表达式 2:控制表达式
每轮循环前都要计算控制表达式,以判断是否需要继续本轮循环。当控制表达式的结果为假,结束循环。
(3) 表达式 3:调节器(计算规则)
调节器(例如计数器自增)在每轮循环结束后且表达式 2 计算前执行。即,在运行了调节器后,执行表达式 2,以进行判断。 2 计算前执行。即,在运行了调节器后,执行表达式 2,以进行判断。
初学者看起来似乎有点晕,没关系,我们举个简单的例子。
上述while举例中出现了一个delay_1ms的延时函数,如果我们对延时时间的精度要求没有那么精确的话,那么delay_1ms的延时函数可以采用for循环的方式来编写。
for循环第二种用法
for(;;)
{
语句;
}
如果没有控制表达式,则表示循环条件始终是 true,也就是说,这定义了一个死循环。
此时for循环的作用就跟while(1)一样,不作累述。
for循环第三种用法
for(;表达式2;)
{
语句;
}
此时for 循环,既没有初始化表达式1,也没有调节器表达式3,它与 while(表达式)语句含义是等效的,所以使用方法可以参照上述while(表达式)的用法。
do…while循环语句结构
do
{
语句;
}while(表达式)
do...while 循环是一种底部判断的循环,在判断条件表达式被第一次计算之前,循环体语句会首先被执行一次。与 while 和 for 循环不同,do...while 循环会确保循环体语句至少执行一次。如果表达式判断的值为真,那么另一次循环就会继续;如果是假,则循环结束。
需要说明的是,相对于while/for语句来说,do…while语句在常规程序中应用不多,但是有一种应用却是很有用,那就是采用do语句while(0)的方式来实现带复杂运算的宏定义。对于初学者来说,暂时可以推后去理解,有兴趣的话可以令开章节再讨论。
用S7-1200 PLC实现循环彩灯的控制,含源程序
在S7-1200型PLC的实际编程工作中,无论是经验设计法还是顺序控制设计法对于要求比较复杂的任务都会产生大量的程序段,可读性差。本实例通过常见的循环彩灯控制为例,了解学习S7-1200型PLC程序块的应用。
相关知识:移动操作相关指令
(1) 移动值MOVE指令
MOVE指令用于将IN输入端的源操作数(数值或地址中的数据)赋值给输出端OUT1指定的地址中,指令执行后源操作数保持不变。该指令支持的数据类型为除Bool型数据之外的所有数据类型。
如下图程序段是PLC上电后将Q0口数值清零,一般用于系统的上电复位。
如果输入 IN 数据类型的位长度超出输出 OUT1 数据类型的位长度,则源值的高位会丢失。如果输入 IN 数据类型的位长度低于输出 OUT1 数据类型的位长度,则目标值的高位会被改写为 0。
小提示: 移动指令MOVE一般用于批量给输出寄存器Q赋值,或者在输入信号较多的情况下批量读取输入寄存器I中的数据。
例1:控制Q1.0~Q1.7上连接的8位彩灯隔一跳一点亮
再加一个按位操作的程序进行对比
例2:读取一位拨码开关输入的数值并保存在辅助寄存器M中
再加一个按位操作的程序进行对比
通过以上对比可以看出,在一些特定情况下使用MOVE指令可以可以大量简化程序步骤。
任务布置
选用5个点动按键S0~S4给PLC的输入信号,作为花样功能选择键,8个发光二极管LED0~LED7作为PLC的输出信号,编写程序实现8个发光二极管闪烁花样的切换显示。
按下按键S1,发光二极管点亮1个,并向右循环移动点亮,每秒移动1位;
按下按键S2,发光二极管点亮2个,并向右循环移动点亮,每秒移动1位;
按下按键S3,发光二极管点亮3个,并向右循环移动点亮,每秒移动1位;
按下按键S4,发光二极管点亮4个,并向右循环移动点亮,每秒移动1位;
按下按键S5,发光二极管点亮5个,并向右循环移动点亮,每秒移动1位;
任务实施
(1) 任务分析
1)在实际应用中压力传感器是将水的压力值转换成电压信号输入给PLC、单片机等控制系统,这个输入信号是模拟量。在模块中用可调电位器来模拟了压力传感器,电位器输出的电压范围是0~5V,对应的压力量程为0~0.1MPa。S7-1200PLC集成了两路模拟信号输入,传感器将电压信号输入PLC后会经过A/D转换成范围0~27648的数字量保存在IW64中。所以在本任务中要设法将地址IW64中采集的数字信号值还原成以Pa为单位的压力值。
2)系统要求有手动和自动两种工作模式,不同工作模式由点动按键ME进行切换,因此在梯形图程序编写时采用手动单步运行程序和自动连续运行程序两个函数块进行调用,具体转换条件如下图所示。
(2)I/O地址分配表
该系统共有5个输入,3个输出,资源分配如下表。
按照I/O分配表设置PLC变量,在Portal V13 软件中设置PLC变量表如下图所示
(3)硬件接线图 按照任务控制要求和I/O地址分配表画出硬件接线图并插接导线。
此处就略过不再详细解释了
(4)梯形图程序
重点难点详解:该任务有自动连续运行和手动单步运行两种工作模式,并由点动按键ME作为切换条件,设置以下4个函数功能块:
完整梯形图参考程序
OB1中的程序
FC1 上电初始化
FC4 300ms脉冲信号
FC3跑马灯循环
FC4控制循环次数
相关问答
51 单片机 在R7初值为00H情况下,JNZR7rel指令将 循环 多少次?没有JNZR7rel这条指令应该是:DJNZR7,rel初值为0.则循环256次.因为,要先减1,就变成R7=255了,再循环255次,结束,所以,总计循环256次.没有JNZR7rel...
51 单片机 C语言for 循环 延时程序时间计算设晶振12MHz,即一个机...[最佳回答]不可能的,是不是你的编译有错的啊我改的晶振12M,在KEIL4.0里面编译的,为你得出的结果最大也就是40ms,这是软件的原因,不可能出现100ms那么大的差...
单片机 的延时,延时时间长度是怎么算的?最好有一个例子,来...单片机的延时可以使用定时器和循环来实现。以下是两种常见的方式:1.使用定时器延时时间长度取决于定时器的时钟源和预分频器的设置。例如,如果使用...
单片机 延时函数怎么写? - 懂得for(j=0;j<125;j++)这是一个1ms基准延时程序,i=500就延时了500ms,具体的和机器内核有关,把这个程序记住就行了单片机延时程序就是空循环,循环的次...
单片机 c语言中常用的两种 循环 语句?PrivateSubForm_Load()DimcnnAsADODB.Connection'定义数据库连接DimrsAsADODB.Recordset'定义数据...
用汇编语言编写51 单片机 程序让LED灯亮0.5秒,灭2秒无限 循环 ?ORG0000HMOVSP,#60HE:CLRP1.0;P1.0LED亮ACALLDEL_1S;0.5秒SETBP1.0;P1.0LED灭ACALLDEL_2S;2....
单片机 除法怎么算比较简单?单片机除法的计算过程可以通过循环减法来实现,即将被除数不断减去除数,直到被除数小于除数为止,此时被除数即为余数。同时,每次减法的次数即为商。需要注意的...
52 单片机 延时咋写?52单片机延时可以使用循环计数的方式实现。具体步骤如下:1.首先,明确延时的时间要求,例如延时100毫秒。2.接下来,根据单片机的主频确定每个机器周期的时间...
单片机 延时函数怎么写? - p8mJcCJeKa 的回答 - 懂得单片机延时程序就是空循环,循环的次数越多,延时越长。for(j=0;j<125;j++)这是一个1ms基准延时程序,i=500就延时了500ms,具体的和机器内核有关,把这...
单片机 编程用C语言如何实现 循环 左移两位?循环左移时,用从左边移出的位填充字的右端,而循环右移时,用从右边移出的位填充字的左侧。这种情况在系统程序中时有使用,在一些控制程序中用得也不少。设...循...