单片机c语言教程:C51循环语句

发布者:心灵的旅程最新更新时间:2012-09-21 来源: 21ic 关键字:单片机  c语言教程  C51循环语句 手机看文章 扫描二维码
随时随地手机看文章

循环语句是几乎每个程序都会用到的,它的作用就是用来实现需要反复进行多次的操 作。如一个 12M 的 51 芯片应用电路中要求实现 1 毫秒的延时,那么就要执行 1000 次空语句 才能达到延时的目的(当然能使用定时器来做,这里就不讨论),如果是写 1000 条空语 句那是多么麻烦的事情,再者就是要占用很多的存储空间。我们能知道这 1000 条空语句, 无非就是一条空语句重复执行 1000 次,因此我们就能用循环语句去写,这样不但使程序

结构清晰明了,而且使其编译的效率大大的提高。在  C  语言中构成循环控制的语句有 while,do-while,for 和 goto 语句。同样都是起到循环作用,但具体的作用和使用方法又大不一 样。我们具体来看看。

goto 语句

这个语句在很多高级语言中都会有,记得小时候用 BASIC 时就很喜欢用这个语句。它是 一个无条件的转向语句,只要执行到这个语句,程序指针就会跳转到 goto 后的标号所在的 程序段。它的语法如下:

goto  语句标号; 其中的语句标号为一个带冒号的标识符。示例如下

void  main(void)

{

unsigned  char  a;

start:  a++;

if  (a==10)  goto  end;

goto  start;

end:;

}

上面一段程序只是说明一下 goto 的使用方法,实际编写很少使用这样的手法。这段程序的意思是在程序开始处用标识符“start:”标识,表示程序这是程序的开始,“end:”标识程序的 结束,标识符的定义应遵循前面所讲的标识符定义原则,不能用 C 的关键字也不能和其它变 量和函数名相同,不然就会出错了。程序执行 a++,a 的值加 1,当 a 等于 10 时程序会跳到 end 标识处结束程序,不然跳回到 start 标识处继续 a++,直到 a 等于 10。上面的示例说明 goto 不但能无条件的转向,而且能和 if 语句构成一个循环结构,这些在 C 程序员的程 序中都不太常见,常见的 goto 语句使用方法是用它来跳出多重循环,不过它只能从内层循环 跳到外层循环,不能从外层循环跳到内层循环。在下面说到 for 循环语句时再略为提一提。 为何大多数 C 程序员都不喜欢用 goto 语句?那是因为过多的使用它时会程序结构不清晰,过多的跳转就使程序又回到了汇编的编程风格,使程序失去了 C 的模块化的优点。

while 语句

while  语句的意思很不难理解,在英语中它的意思是“当…的时候…”,在这里我们可 以理解为“当条件为真的时候就执行后面的语句”,它的语法如下:

while  (条件表达式)  语句;

使用 while 语句时要注意当条件表达式为真时,它才执行后面的语句,执行完后再次回

到 while 执行条件判断,为真时重复执行语句,为假时退出循环体。当条件一开始就为假时, 那么 while 后面的循环体(语句或复合语句)将一次都不执行就退出循环。在调试程序时要注意 while 的判断条件不能为假而造成的死循环,调试时适当的在 while 处加入断点,也许 会使你的调试工作更加顺利。当然有时会使用到死循环来等待中断或 IO 信号等,如在第一 篇时我们就用了 while(1)来不停的输出“Hello  World!”。下面的例子是显示从 1 到 10 的累 加和,读者能修改一下 while 中的条件看看结果会如果,从而体会一下 while 的使用方法。

[page]

#include

#include

void main(void)

{

unsigned int I = 1;

unsigned int SUM = 0; //设初值

SCON = 0x50; //串行口方式 1,允许接收

TMOD = 0x20; //定时器 1 定时方式 2

TCON = 0x40; //设定时器 1 开始计数

TH1 = 0xE8;   //11.0592MHz 1200 波特率

TL1 = 0xE8; TI = 1;

TR1 = 1; //启动定时器

while(I<=10)

{

SUM = I + SUM; //累加

printf ("%d SUM=%dn",I,SUM); //显示

I++;

}

while(1); //这句是为了不让程序完后,程序指针继续向下造成程序“跑飞”

}

//最后运行结果是 SUM=55;

do  while 语句

do while 语句能说是 while 语句的补充,while 是先判断条件是否成立再执行循环体,

而 do  while 则是先执行循环体,再根据条件判断是否要退出循环。这样就决定了循环体无 论在任何条件下都会至少被执行一次。它的语法如下:

do  语句  while  (条件表达式)

用 do  while 怎么写上面那个例程呢?先想一想,再参考下面的程序。

#include  

#include  

void  main(void)

{

unsigned  int  I  =  1;

unsigned  int  SUM  =  0;  //设初值

SCON  =  0x50;  //串行口方式 1,允许接收 TMOD  =  0x20;  //定时器 1 定时方式 2

TCON  =  0x40;  //设定时器 1 开始计数

TH1  =  0xE8;  //11.0592MHz  1200 波特率 TL1  =  0xE8;

TI  =  1;

TR1  =  1;  //启动定时器

do

{

SUM  =  I  +  SUM;  //累加

printf  ("%d  SUM=%dn",I,SUM);  //显示 I++;

}

while(I<=10);

while(1);

}

[page]


在上面的程序看来 do  while 语句和 while 语句似乎没有什么两样,但在实际的应用中要注

意任何 do while 的循环体一定会被执行一次。如把上面两个程序中 I 的初值设为 11,那么 前一个程序不会得到显示结果,而后一个程序则会得到 SUM=11。

for  语句

在明确循环次数的情况下,for 语句比以上说的循环语句都要方便简单。它的语法如下: for  ([初值设定表达式];[循环条件表达式];[条件更新表达式])  语句 中括号中的表达式是可选的,这样 for 语句的变化就会很多样了。for 语句的执行:先

代入初值,再判断条件是否为真,条件满足时执行循环体并更新条件,再判断条件是否为 真……直到条件为假时,退出循环。下面的例子所要实现的是和上二个例子一样的,对照着 看不难理解几个循环语句的差异。

#include 

#include 

void  main(void)

{

unsigned  int  I;

unsigned  int  SUM  =  0;  //设初值

SCON  =  0x50;  //串行口方式 1,允许接收 TMOD  =  0x20;  //定时器 1 定时方式 2

TCON  =  0x40;  //设定时器 1 开始计数

TH1  =  0xE8;  //11.0592MHz  1200 波特率 TL1  =  0xE8;

TI  =  1;

TR1  =  1;  //启动定时器

for  (I=1;  I<=10;  I++)  //这里能设初始值,所以变量定义时能不设

{

SUM  =  I  +  SUM;  //累加

printf  ("%d  SUM=%dn",I,SUM);  //显示

}

while(1);

}

如果我们把程序中的 for 改成 for(; I<=10; I++)这样条件的初值会变成当前 I 变量的值。如果改成 for(;;)会怎么样呢?试试看。

continue  语句

continue  语句是用于中断的语句,通常使用在循环中,它的作用是结束本次循环,跳 过循环体中没有执行的语句,跳转到下一次循环周期。语法为:

continue;

continue 同时也是一个无条件跳转语句,但功能和前面说到的 break 语句有所不一样, continue  执行后不是跳出循环,而是跳到循环的开始并执行下一次的循环。在上面的例子 中的循环体加入 if  (I==5)  continue;看看什么结果?

return  语句

return 语句是返回语句,不属于循环语句,是要学习的最后一个语句所以一并写下了。 返回语句是用于结束函数的执行,返回到调用函数时的位置。语法有二种:

return  (表达式);

return; 语法中因带有表达式,返回时先计算表达式,再返回表达式的值。不带表达式则返回的值不确定。


[page]


下面是一个同样是计算 1-10 的累加,所不一样是的用了函数的方式。

#include 

#include 

int  Count(void);  //声明函数

void  main(void)

{

unsigned  int  temp;

SCON  =  0x50;  //串行口方式 1,允许接收 TMOD  =  0x20;  //定时器 1 定时方式 2

TCON  =  0x40;  //设定时器 1 开始计数

TH1  =  0xE8;  //11.0592MHz  1200 波特率 TL1  =  0xE8;

TI  =  1;

TR1  =  1;  //启动定时器

temp  =  Count();

printf  ("1-10  SUM=%dn",temp);  //显示

while(1);

}

int  Count(void)

{

unsigned  int  I,  SUM;

for  (I=1;  I<=10;  I++)

{

SUM  =  I  +  SUM;  //累加

}

return  (SUM);

}

关键字:单片机  c语言教程  C51循环语句 引用地址:单片机c语言教程:C51循环语句

上一篇:基于STC89C52RC单片机控制的智能听障助理系统
下一篇:单片机c语言教程:C51开关分支语句

推荐阅读最新更新时间:2024-03-16 13:09

德州仪器支持广泛开发商社群的 CC430 MCU 平台
日前,德州仪器 (TI) 宣布推出支持广泛开发商社群、可提供完整可扩展软硬件的 CC430F513x 微处理器 (MCU),进一步推动了单芯片射频 (RF) 解决方案的发展。该 CC430F513x MCU 将业界领先的超低功耗 MSP430™ MCU 与 1GHz 以下的高性能 CC1101 RF 收发器进行了完美结合,并采用 7 毫米 x 7 毫米小型封装,不但可实现高达 20 MIPS 的性能,而且还可支持如集成型 AES 硬件模块等安全选项。此外,TI 还推出 CC430F61xx 系列器件,进一步壮大了其 LCD 产品阵营,其可为开发人员提供能够满足不同设计需求的更多选项。 CC430 MCU 支持多种协议
[单片机]
基于STC12C5624AD单片机的液晶屏背光模块驱动和调节电路设计
为使座舱内的用户随时得到准确、可靠的信息,座舱内使用的显示器必须具有高可靠性,同时,因为飞机驾驶员左右手都要操作仪器,且为提高座舱显示器的易读性和缓解视觉疲劳,显示器的光强还应能根据周围环境和用户需求进行自动和手动调整,避免用户在环境光很强时看不清显示内容,或在环境光很暗时感到刺眼。液晶显示器的背光亮度直接决定显示器的平均亮度,通过调节液晶显示器的背光亮度来调节显示器的亮度。 笔者采用国产的STC12C5624AD单片机设计一个液晶屏背光模块驱动和调节电路,能够准确测量环境光的照度,根据环境光实现自动和手动调节背光亮度。 1 显示器背光调节的原理 因为飞机座舱的特殊性,对座舱显示的可靠性、准确性和智能性有更高的
[单片机]
基于STC12C5624AD<font color='red'>单片机</font>的液晶屏背光模块驱动和调节电路设计
基于PIC16C72单片机的空调控制系统的研制
    摘要: 提出一种基于单片机PIC16C72的热泵式分体壁挂空调控制系统的设计方案。设计出系统硬件结构的主要组成部分电路;简述其工作原理;给出软件设计思想和主控程序软件框图。     关键词: PIC单片机 空调 控制 热泵式分体壁挂空调以其优越的性能,已越来越被广大家庭所选用,其功能更是日新月异,而对其功能的提高起核心作用的其控制系统。本文介绍一种基于PIC16C72控制的空调控制系统设计方法。 该系统具有制冷、制热、除湿、自动4种工作模式,包括定时、睡眠、风向、智能化霜、应急运转、试运转以及5种可调室内风速等控制功能;在定时开机时,可根据访间温度作智能判断,自动调整定时开机时间,避免开机时太冷或太
[应用]
赛普拉斯PSoC 4可编程片上系统有望替代整个专有MCU
    日前,赛普拉斯半导体公司宣布推出PSoC 4可编程片上系统架构,它将赛普拉斯一流的PSoC模拟和数字架构以及业界领先的CapSense电容式触摸技术同ARM的低功耗Cortex-M0内核完美相结合。这款真正可扩展的低成本架构可提供PSoC标志性的高灵活性、模拟性能和高集成度,而且能提供数十种免费的PSoC组件(Components),也就是在赛普拉斯PSoC Creator集成设计环境中用图标代表的“虚拟芯片”。全新PSoC 4器件系列将对专有的8位和16位微控制器(MCU)以及其它32位器件发起挑战。赛普拉斯计划在2013年上半年宣布推出新的PSoC 4系列产品。 PSoC 4架构在抗噪性方面拥有巨大的领先优势,可有
[嵌入式]
如何使用单片机驱动标准PC机键盘?C51程序详细说明
  功能:实现pc机键盘(p/s2接口)与8位单片机连接使用   原理:键盘时钟接在p3.2口,既8051的外部中断int0上,键盘数据接到p1.0上   每次按键,键盘会向单片机发脉冲使单片机发生外部中断,数据有p1.0口一位一位传进来   传回的数据格式为:1位开始位(0),8位数据位(所按按键的通码,用来识别按键),1位校验位(奇校验)   1位结束位(1)   实现:将键盘发回的数据放到一个缓冲区里(数组),当按键结束后发生内部中断来处理所按的按键   缺点:由于51单片机的容量有限所以缓冲区不可以开的太大,这就导致可以记录键盘的按键次数过少,   也就是容错性一般。不过如果正常使用键盘是不会出错
[单片机]
如何使用<font color='red'>单片机</font>驱动标准PC机键盘?<font color='red'>C51</font>程序详细说明
基于单片机和GSM的远程车载防盗报警系统设计
  随着监控范围的不断扩大, 传统的有线监控报警已不能满足用户的需求。然而, 伴随着GSM 网络的发展,远程网络监控报警系统的硬件实现已成为可能, 有望取代传统的仅由单机控制的监控报警系统。本文针对目前的需求设计了一套基于GSM 网络的远程无线报警监控系统。其基本思路是: 将单片机与SIM300 通信模块通过串口连接, 实现单片机与SIM300 之间的相互通信。   SIM300 模块设有SIM 卡插槽, 可以实现与各种用户相互通信的功能。系统接有震动、红外、声音等类型传感器,当汽车发生警情时, 传感器将警情信号传送给单片机,经过单片机判断处理后,向用户发送报警短信,或者是直接拨打报警电话。如果情况紧急,用户可以直接发送短信密码
[单片机]
基于<font color='red'>单片机</font>和GSM的远程车载防盗报警系统设计
学习PIC单片机有感
学起PIC,上手还是蛮快的,毕竟已经学了2种16位的单片机,更是接触了一款32位的处理器,再来学习16位的单片机,自然十分容易。刚开始的时候拿到一块dsPIC33FJ128M706单片机开发板,此单片机乃microchip公司较为高端的单片机,具有DSP引擎数字图像处理功能;内置两路SPI,IIC,UART,CAN等多种通信模块;9路16位定时器,其中有八路课组成4路32位定时器;10/12位可选择AD转换模块,其端口可以任意设定,共多达32路;4对含有死区电压的PWM发生器及其他一些常见的模块。如此强大的单片机可谓是单片机中的顶尖角色。所以,我很庆幸现在就接触了这款单片机。 拿到开发板,去官网下载datasheet,发现官
[单片机]
51单片机P0口的特性及使用方法解析
一、P0口特性: P0口为三态双向I/O口。对于内部有程序存贮器的单片机基本系统(如定制的8051),P0口可以作为输入/输出口使用,直接连外部的输入/输出设备;也可以作为系统扩展的地址/数据总线口。对于内部没有程序存贮器的单片机(如8031),P0口只能作为地址/数据总线口使用。 1、P0口的输出驱动器中也有一个多路电子开关。输出驱动器转接至口锁动器的Q端时,P0口作为双向I/O口使用。 这时,CPU发来的控制信号为低电平,使输出驱动电路的上拉场效应管T1截止。P0口的锁存器为“1”时,输出驱动器中的两个场效应管均截止,引脚浮空;由于P0口输出电路是漏极开路的电路,必须外接10kΩ拉高电阻才能有高电平输出。而写入“0”时,下
[单片机]
51<font color='red'>单片机</font>P0口的特性及使用方法解析
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
  • ARM裸机篇--按键中断
    先看看GPOI的输入实验:按键电路图:GPF1管教的功能:EINT1要使用GPF1作为EINT1的功能时,只要将GPFCON的3:2位配置成10就可以了!GPF1先配 ...
  • 网上下的--ARM入门笔记
    简单的介绍打今天起菜鸟的ARM笔记算是开张了,也算给我的这些笔记找个存的地方。为什么要发布出来?也许是大家感兴趣的,其实这些笔记之所 ...
  • 学习ARM开发(23)
    三个任务准备与运行结果下来看看创建任务和任运的栈空间怎么样的,以及运行输出。Made in china by UCSDN(caijunsheng)Lichee 1 0 0 ...
  • 学习ARM开发(22)
    关闭中断与打开中断中断是一种高效的对话机制,但有时并不想程序运行的过程中中断运行,比如正在打印东西,但程序突然中断了,又让另外一个 ...
  • 学习ARM开发(21)
    先要声明任务指针,因为后面需要使用。 任务指针 volatile TASK_TCB* volatile g_pCurrentTask = NULL;volatile TASK_TCB* vol ...
  • 学习ARM开发(20)
  • 学习ARM开发(19)
  • 学习ARM开发(14)
  • 学习ARM开发(15)
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved