技术文档

单片机循环程序设计 三单片机c语言入门之循环语句

小编 2024-10-08 技术文档 23 0

三单片机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)的方式来实现带复杂运算的宏定义。对于初学者来说,暂时可以推后去理解,有兴趣的话可以令开章节再讨论。

MCU程序的编写方式,以及各型号单片机的区别和用途

MCU程序的编写方式,以及各型号单片机的区别和用途

单片机的程序编写

MCU的程序的编写与PC下的程序的编写存在很大的区别,虽然现在基于C的MCU开发工具越来越流行,但对于一个高效的程序代码和喜欢使用汇编的设计者来讲,汇编语言仍然是最简洁、最有效的编程语言。

对于MCU的程序编写,其基本的框架可以说是大体一致的,一般分为初始化部分(这是MCU程序设计与PC最大的不同),主程序循环体和中断处理程序三大部分,其分别说明如下:

初始化:对于所有的MCU程序的设计来讲,出世化是最基本也是最重要的一步,一般包括如下内容:

屏蔽所有中断并初始化堆栈指针:初始化部分一般不希望有任何中断发生。

清除系统的RAM区域和显示Memory:虽然有时可能没有完全的必要,但从可靠性及一致性的角度出发,特别是对于防止意外的错误,还是建议养成良好的编程习惯。

阅读累了可以先关注我,不迷路,打开头像关注查看个人主页以及简介,更多优秀内容,叫“林老师”分享给大家

IO口的初始化:根据项目的应用的要求,设定相关IO口的输入输出方式,对与输入口,需要设定其上拉或下拉电阻;对于输出口,则必须设定其出世的电平输出,以防出现不必要的错误。

中断的设置:对于所有项目需要用到的中断源,应该给予开启并设定中断的触发条件,而对于不使用的多余的中断,则必须给予关闭。

其他功能模块的初始化:对于所有需要用到的MCU的外围功能模块,必须按项目的应用的要求进行相应的设置,如UART的通讯,需要设定Baud Rate,数据长度,校验方式和Stop Bit的长度等,而对于Programmer Timer,则必须设置其时钟源,分频数及Reload Data等。

参数的出世化:完成了MCU的硬件和资源的出世化后,接下来就是对程序中使用到的一些变量和数据的初始化设置,这一部分的初始化需要根据具体的项目及程序的总体安排来设计。对于一些用EEPROM来保存项目预制数的应用来讲,建议在初始化时将相关的数据拷贝到MCU的RAM,以提高程序对数据的访问速度,同时降低系统的功耗(原则上,访问外部EEPROM都会增加电源的功耗)。

主程序循环体:大多数MCU是属于长时间不间断运行的,因此其主程序体基本上都是以循环的方式来设计,对于存在多种工作模式的应用来讲,则可能存在多个循环体,相互之间通过状态标志来进行转换。对于主程序体,一般情况下主要安排如下的模块:

计算程序:计算程序一般比较耗时,因此坚决反对放在任何中断中处理,特别是乘除法运算。

显示传输程序:主要针对存在外部LED、LCD Driver的应用。

中断处理程序:中断程序主要用于处理实时性要求较高的任务和事件,如,外部突发性信号的检测,按键的检测和处理,定时计数,LED显示扫描等。

一般情况下,中断程序应尽可能保证代码的简洁和短小,对于不需要实时去处理的功能,可以在中断中设置触发的标志,然后由主程序来执行具体的事务――这一点非常重要,特别是对于低功耗、低速的MCU来讲,必须保证所有中断的及时响应。

对于不同任务体的安排,不同的MCU其处理的方法也有所不同。

例如,对于低速、低功耗的MCU(Fosc=32768Hz)应用,考虑到此类项目均为手持式设备和采用普通的LCD显示,对按键的反应和显示的反应要求实时性较高,应此一般采用定时中断的方式来处理按键的动作和数据的显示;而对于高速的MCU,如Fosc》1MHz的应用,由于此时MCU有足够的时间来执行主程序循环体,因此可以只在相应的中断中设置各种触发标志,并将所有的任务放在主程序体中来执行。

在MCU的程序设计中,还需要特别注意的一点就是:要防止在中断和主程序体中同时访问或设置同一个变量或数据的情况。有效的预防方法是,将此类数据的处理安排在一个模块中,通过判断触发标志来决定是否执行该数据的相关操作;而在其他的程序体中(主要是中断),对需要进行该数据的处理的地方只设置触发的标志。――这可以保证数据的执行是可预知和唯一的。

在学校里学了这些知识,并没有时间思考这些之间概念之间的区别,一直注重渴望技术的提升,却忘了这些基础才是根本。蹭着在家的这一段时间,准备好好梳理一下之间的关系,这是一个宏大的框架,写下这些,也是因为在求职的时候对于这些涉及到了,加深一下自己的印象吧。不说了,直接入主题吧。

ARM

在嵌入式领域里,ARM本意是微处理器行业的一家知名企业,英国ARM公司是全球领先的半导体知识产权提供商。全球超过95%的智能手机采用ARM架构,ARM设计了大量的高性价比、耗能低的精简指令集计算(RISC)处理器。这里的ARM指的是处理器。处理器也是CPU的意思,所以ARM处理器就是CPU的意思。ARM公司不生产芯片、生产CPU.是一个32位精简指令集处理器架构,ARM处理器包含以下几个系列的处理器产品以及其它厂商实现的基于ARM体系结构的处理器。如ARM7 系列、ARM9系列、ARM9E系列、ARM10E系列等等。这些处理器广泛应用于实时嵌入式应用,如存储设备、汽车、工业和网络设备。

STM32

上面说了ARM处理器核当前ARM7、ARM9、ARM9E、ARM10E、SecurCore以及最新的ARM11系列。而STM32使用的其中的Cortex-M3内核。当时由于arm7能效低,arm9的硬件和编程过于复杂。为了满足消费电子的需求而改进arm7,代号为cortex -m,这样st或nxp等产家以这个新的核心来加自己的外设就得到了stm32或lpc系列的单片机了。可以清楚得到stm32是基于ARM Cortex-M3内核的,但不属于ARM。因为ARM公司只提供了处理器,st(意法半导体)还有nxp(恩智浦半导体)厂家以此内核为核心添加外设得到了stm32或lpc系列单片机。只能说stm32是基于ARM Cortex -M3内核的,但是不属于ARM。ARM Cortex-M3内核具有高性能、低成本、低功耗等特点,属于ARM7架构中的一员。

51单片机

谈谈51单片机与stm32单片机的区别,先介绍一下,什么是单片机。单片机全称单片微型计算机,简单来说就是集CPU(运算、控制)、RAM(数据存储-内存)、ROM(程序存储)、输入输出设备(串口、并口等)和中断系统处于同一芯片的器件。在我们个人电脑中CPU、RAM、ROM、I/O这些都是单独的芯片,然后这个芯片被安装一个主板上,这样就构成了我们的PC主板,进而组装成电脑,而单片机只是将这所有的集中在一个芯片上而已。

51单片机是对所有兼容Intel8031指令系统的单片机的统称,这一系列的单片机的始祖是Intel的8031单片机,后来随着flash ROM技术的发展,8031单片机取得了长足的进展成为了应用最广泛的8bit单片机之一,他的代表型号是ATMEL公司的AT89系列。STM32单片机则是ST(意法半导体)公司使用arm公司的cortex-M为核心生产的32bit系列的单片机,它的内部资源(寄存器和外设功能)较8051、AVR和PIC都要多的多,基本接近于计算机的CPU了,适用于手机、路由器等等。

开发板与单片机的区别

经过之前的总结,ARM处理器内核加上外设模块(如UART、IIC)组成了芯片(如STM32),也就是单片机,单片机芯片再加上

一些常用的电子器件构成的电路板便是开发板。方便初学者使用,上面常用的外设有led灯、数码管、独立按键、矩阵按键、液晶显示屏、红外线接收头等。而单片机只是上面的核心芯片。

相关问答

单片机 C语言编写点亮两盏led灯,首先从中间两盏点亮,依次相邻两盏灯点亮,依次 循环 永不停息?

#includesbitM=P1^0;voiddelayms(unsignedcharms){unsignedinti;while(ms--){for(i=0;i}}...

51 单片机循环 语句有几种?

51单片机程序中,循环语句一般采用for、while和do...while来实现在循环中可以采用countune退出当次循环,继续执行下一次循环在循环中可以采用break退出循...

c51 单片机 中断中可以加 循环 吗?

c51单片机中断函数中通过以下程序实现对中断函数的运算循环。延时通过定时器定时来实现,中断多次进入就能实现重复多次处理。设...c51单片机中断中可以加循...

单片机 程序 运行一次怎么写?

这是各中单片机自身决定的。有的单片机程序内如果没有循环程序,那它会从头执行到最后,然后返回最开始继续执行。一直重复。而有的单片机再执行一次之后,就会...

单片机 用keil编程C语言,控制某I/O口通断--通断的 循环 ,公式怎么编,比如 循环 通断100次,并编写多种延时?

用FOR循环或While也可以for(k=0;k<100;k++){P1=0;Delay();//这里自己加个延时P1=1;}用FOR循环或While也可以for(k=0;k<100;k...

单片机 编程控制8个LED,先逐个点亮,再逐个熄灭,再逐个点亮,如此 循环 ,变化间隔为1秒左右,用软件 循环 实现?

假如:P0口接8个LED,程序可以这样:#include#defineucharunsignedchar#defineuintunsignedintsbitled1=P2^0...

单片机 c语言里的 循环 左移指令_crol_的格式是?这指令是每秒 循环 左移一次还是怎么移?主要用在什么场合,本?

for(i=0;i<8;i++){temp=_crol_(temp,1);delay(1000);}程序前面要有#includefor(i=0;i<8;i++){temp=_c...

急用的西门子S7-200 单片机 ,灯L1到L10分别是Q0.4-Q1.5,要求...

[最佳回答]定时器加MOV指令,就能完成.

单片机 编写 程序 ,让LED灯闪烁三次后熄灭?

单片机LED灯闪烁三次的代码应该能写吧,用for循环3次。然后停下,就是不再执行任何代码了,有一个死循环语句,while(1);这个就行了。单片机LED灯闪烁三次的代...

单片机 编程 循环 和计数有什么区别?

单片机的定时用定时器中断来控制,预先把时间设定好,触发定时器中断就达到定时器的时间设定了。计数原理利用检测I/O电平状态,状态每改变一次,计数器就会加1...

猜你喜欢