while(--n)延时计算详解

合集下载

while 的用法总结

while 的用法总结

while 的用法总结一、while 循环的基本概念和用法在编写程序时,经常会遇到需要重复执行某些代码块的情况。

而 while 循环正是为了解决这类问题而存在的一种控制结构。

它用于在给定条件成立时重复执行一个代码块,直到该条件不再满足为止。

1. while 循环的语法格式:while (条件表达式) {// 待执行的代码块}执行过程:- 首先,判断条件表达式是否成立;- 如果条件表达式成立,则执行代码块;- 执行完代码块后,再次判断条件表达式是否成立;- 如果条件表达式仍然成立,则继续执行代码块,并重复以上步骤;- 当条件表达式不再成立时,停止执行循环,并继续执行循环外的下一个语句。

2. while 循环的使用场景:while 循环适用于当我们事先无法确定需要循环多少次,但可以在每次循环开始前判断某个条件是否满足来决定是否退出循环。

常见应用包括:用户交互输入、处理未知数量的数据等。

二、while 循环的实例及注意事项下面通过几个例子来进一步认识 while 循环以及需要注意的一些问题:1. 示例一:计算累加和我们经常在编程中需要对数列进行求和操作。

假设我们要计算从 1 加到 n 的累加和,其中 n 是用户输入的一个正整数。

下面是一个使用 while 循环实现的示例代码片段:```javaimport java.util.Scanner;public class CalculateSum {public static void main(String[] args) {Scanner input = new Scanner(System.in);System.out.print("请输入一个正整数:");int n = input.nextInt();int sum = 0;int i = 1;while (i <= n) {sum += i;i++;}System.out.println("1 到 " + n + " 的累加和为:" + sum);}}```在上述代码中,首先通过 `Scanner` 类读取用户输入的正整数 `n`。

(单片机)

(单片机)

实验四一、实验题目:当K1键按下后,首先使蜂鸣器响一声,然后使LED1-LED8完成3种闪亮的花样(自己定义),每一种花样循环3次,然后周而复始。

二、keil代码:/*当K1键按下后,首先使蜂鸣器响一声,然后使LED1- LED8完成3种闪亮的花样(自己定义),每一种花样循环3次,然后周而复始。

*/#include<reg51.h>sbit P2_0=P2^0;//接蜂鸣器sbit P2_7=P2^7;sbit P1_0=P1^0;sbit P1_1=P1^1;sbit P1_2=P1^2;sbit P1_3=P1^3;sbit P1_4=P1^4;sbit P1_5=P1^5;sbit P1_6=P1^6;sbit P1_7=P1^7;void DELAY(int time)//延时{while(time--){}}void BUZ_ON(){if(P2_7==0){P2_0=1;}else{ P2_0=0;}}void F1(void){int i;char data_group_mide[5]={0x00,0x18,0x24,0x42,0x81};//向两边延伸for(i=0;i<5;i++){P1=data_group_mide[i];DELAY(20000);}P1=0x00;}void F2(void){int i;char data_group_left[8]={0xFF,0x7F,0x3F,0x0F,0x07,0x03,0x01,0x00};//向左延伸for(i=0;i<8;i++){P1=data_group_left[i];DELAY(20000);P1=0x00;}void F3(void){int i;char date_group_right[8]={0x00,0x01,0x03,0x07,0x0f,0x3f,0x7f,0xff};//向右延伸for(i=0;i<8;i++){P1=date_group_right[i];DELAY(20000);}P1=0x00;}void main(){unsigned int i; //每种花样循环三次P2_0=0;P2_7=1;BUZ_ON();P1=0x00;while(P2_7==0){for(i=0;i<3;i++)//花样1 {F1();}for(i=0;i<3;i++)//花样2 {F2();}for(i=0;i<3;i++)//花样3 {F3();}}}三、protues电路图:四、实验截图:五、实验小结:通过本次实验,我们熟悉了protues的编译环境,对以后的单片机学习有很大帮助。

pythonwhile循环用法计数

pythonwhile循环用法计数

一、介绍Python中的while循环在Python编程语言中,while循环是一种常用的循环结构,它根据一定的条件来重复执行一段代码块。

当条件为真时,循环会继续执行;当条件为假时,循环会停止。

while循环的语法结构如下:```while 条件:循环体```二、使用while循环进行计数在实际编程中,经常需要使用while循环来实现一定次数的计数操作。

下面通过几个简单的示例来演示如何使用while循环进行计数。

1.示例一:使用while循环打印1到10的数字```pythonnum = 1while num <= 10:print(num)num += 1```代码解析:- 我们定义了一个变量num,初始值为1。

- 在while循环中,当num小于等于10时,执行循环体中的代码。

- 每次循环,打印当前num的值,并将num加1。

- 当num大于10时,循环停止。

2.示例二:使用while循环计算1到100的累加和```pythonnum = 1sum = 0while num <= 100:sum += numnum += 1print("1到100的累加和为:", sum)```代码解析:- 我们定义了两个变量num和sum,分别用于计数和存储累加和,初始值分别为1和0。

- 在while循环中,当num小于等于100时,执行循环体中的代码。

- 每次循环,将num的值累加到sum中,并将num加1。

- 当num大于100时,循环停止,最后打印累加和的结果。

3.示例三:使用while循环查找某个数的平方根```pythonnum = 1target = 16while num * num != target:num += 1print("16的平方根为:", num)```代码解析:- 我们定义了两个变量num和target,分别用于计数和存储目标数的平方,初始值分别为1和16。

51单片机的几种精确延时

51单片机的几种精确延时
的方法来实现,因此,循环嵌套的方法常用于达到ms级的延时。
对于循环语句同样可以采用for,do…while,while结构来完
成,每个循环体内的变量仍然采用无符号字符变量。
unsigned char i,j
for(i=255;i>0;i--)
for(j=255;j>0;j--);

unsigned char i,j
{unsigned char b,c;
b="j";
c="k";
do{
do{
do{k--};
while(k);
k="c";
j--;};
while(j);
j=b;
i--;};
while(i);
在实际应用中,定时常采用中断方式,如进行适当的循环可实现几秒甚至更长时间的延时。使用定时器/计数器延时从程序的执行效率和稳定性两方面考虑都是最佳的方案。但应该注意,C51编写的中断服务程序编译后会自动加上PUSH ACC、PUSH PSW、POP PSW和POP ACC语句,执行时占用了4个机器周期;如程序中还有计数值加1语句,则又会占用1个机器周期。这些语句所消耗的时间在计算定时初值时要考虑进去,从初值中减去以达到最小误差的目的。
51单片机的几种精确延时实现延时
51单片机的几种精确延时实现延时通常有两种方法:一种是硬件延时,要用到定时器/计数器,这种方法可以提高CPU的工作效率,也能做到精确延时;另一种是软件延时,这种方法主要采用循环体进行。
1使用定时器/计数器实现精确延时
单片机系统一般常选用11.059 2 MHz、12 MHz或6 MHz晶振。第一种更容易产生各种标准的波特率,后两种的一个机器周期分别为1μs和2μs,便于精确延时。本程序中假设使用频率为12 MHz的晶振。最长的延时时间可达216=65 536μs。若定时器工作在方式2,则可实现极短时间的精确延时;如使用其他定时方式,则要考虑重装定时初值的时间(重装定时器初值占用2个机器周期)。

while(--n)延时计算详解

while(--n)延时计算详解

C51中精确的延时与计算的实现(转载)2011-12-29 13:44:39| 分类:每天一学|举报|字号订阅C51由于其可读性和可移植性很强,在单片机中得到广泛的应用,但在某些时候由于C51编写的程序对在有精确时间要求下,可能就得要用汇编语言来编写,但在C51是否也能实现时间的精确控制呢?答案是肯定的。

在C51中要实现对时间的精确延时有以下几种方法其一:对于延时很短的,要求在us级的,采用“_nop_”函数,这个函数相当汇编NOP指令,延时几微秒,就插入个这样的函数。

NOP指令为单周期指令,可由晶振频率算出延时时间,对于12M晶振,延时1uS。

其二:对于延时比较长的,要求在大于10us,采用C51中的循环语句来实现。

在选择C51中循环语句时,要注意以下几个问题第一、定义的C51中循环变量,尽量采用无符号字符型变量。

第二、在FOR循环语句中,尽量采用变量减减来做循环。

第三、在do…while,while语句中,循环体内变量也采用减减方法。

这因为在C51编译器中,对不同的循环方法,采用不同的指令来完成的。

下面举例说明:unsigned char I;for(i=0;i<255;i++);unsigned char I;for(i=255;i>0;i--);其中,第二个循环语句C51编译后,就用DJNZ指令来完成,相当于如下指令:MOV09H,#0FFHLOOP:DJNZ09H,LOOP指令相当简洁,也很好计算精确的延时时间。

同样对do…while,while循环语句中,也是如此例:unsigned char n;n=255;do{n--}while(n);或n=255;while(n){n--};这两个循环语句经过C51编译之后,形成DJNZ来完成的方法,故其精确时间的计算也很方便。

其三:对于要求精确延时时间更长,这时就要采用循环嵌套的方法来实现,因此,循环嵌套的方法常用于达到ms级的延时。

51单片机延时函数

51单片机延时函数

51单片机延时函数在嵌入式系统开发中,51单片机因其易于学习和使用、成本低廉等优点被广泛使用。

在51单片机的程序设计中,延时函数是一个常见的需求。

通过延时函数,我们可以控制程序的执行速度,实现定时器功能,或者在需要的时候进行延时操作。

本文将介绍51单片机中常见的延时函数及其实现方法。

一、使用for循环延时这种方法不精确,但是对于要求不高的场合,可以用来估算延时。

cvoid delay(unsigned int time){unsigned int i,j;for(i=0;i<time;i++)for(j=0;j<1275;j++);}这个延时函数的原理是:在第一个for循环中,我们循环了指定的时间次数(time次),然后在每一次循环中,我们又循环了1275次。

这样,整个函数的执行时间就是time乘以1275,大致上形成了一个延时效果。

但是需要注意的是,这种方法因为硬件和编译器的不同,延时时间会有很大差异,所以只适用于对延时时间要求不精确的场合。

二、使用while循环延时这种方法比使用for循环延时更精确一些,但是同样因为硬件和编译器的不同,延时时间会有差异。

cvoid delay(unsigned int time){unsigned int i;while(time--)for(i=0;i<1275;i++);}这个延时函数的原理是:我们先进入一个while循环,在这个循环中,我们循环指定的时间次数(time次)。

然后在每一次循环中,我们又循环了1275次。

这样,整个函数的执行时间就是time乘以1275,大致上形成了一个延时效果。

但是需要注意的是,这种方法因为硬件和编译器的不同,延时时间会有差异,所以只适用于对延时时间要求不精确的场合。

三、使用定时器0实现精确延时这种方法需要在单片机中开启定时器0,并设置定时器中断。

在中断服务程序中,我们进行相应的操作来实现精确的延时。

这种方法需要使用到单片机的定时器中断功能,相对复杂一些,但是可以实现精确的延时。

STM32延时函数的三种方法

STM32延时函数的三种方法

STM32延时函数的三种方法在STM32中,延时函数是一种常见的操作,用于控制程序的运行间隔时间。

延时函数的实现方法可以有多种,下面介绍三种常见的方法:1.使用循环延时循环延时是最简单直接的延时方法。

其原理是通过循环指定次数来实现延时,每次循环花费一定的时间,从而实现延时效果。

以下是使用循环延时实现的一个简单的延时函数示例:```void Delay(uint32_t nCount)for(; nCount != 0; nCount--);```上述代码中,`nCount`表示需要延时的时间,其单位可以是任意精度的时间,如毫秒、微秒等。

通过递减`nCount`的值来实现延时。

循环延时的主要缺点是,它是一个阻塞式的延时方法,即在延时期间,CPU无法执行其他操作,会浪费大量的处理器资源。

2. 使用SysTick定时器延时SysTick定时器是STM32微控制器上的一个定时器模块,可以用于生成特定的定时事件。

通过配置SysTick定时器的时钟源和重装载值,可以实现不同精度的延时效果。

以下是使用SysTick定时器实现的延时函数示例:void Delay(uint32_t nTime)if (nTime <= 0) return;SysTick_Config(SystemCoreClock / 1000); // 配置SysTick定时器为1毫秒一次中断TimingDelay = nTime;while (TimingDelay != 0); //等待定时时间到达SysTick->CTRL = 0; // 关闭SysTick定时器SysTick->VAL = 0; // 清零定时器当前值```上述代码中,`SystemCoreClock`表示系统时钟频率,用于计算SysTick定时器的计数周期。

`TimingDelay`表示需要延时的时间,单位为毫秒。

使用SysTick定时器延时相比于循环延时的优势在于,它是非阻塞式的,可以在延时期间执行其他操作,充分利用了处理器资源。

while循环语句例题及解析

while循环语句例题及解析

题目:while循环语句例题及解析在编程语言中,while循环是一种常见的循环语句,它能够根据给定的条件重复执行一段代码。

通过while循环,开发者可以实现对一个条件的反复检查,并在满足条件时执行相应的操作。

本文将通过一些例题及其解析,帮助读者更好地理解和掌握while循环的用法和特点。

1. 例题1:使用while循环计算1到100的和给定一个整数n,计算1到n的和。

当n=100时,应计算1+2+3+...+100的结果。

解析:这是一个经典的求和问题,可以通过while循环轻松实现。

我们需要一个变量sum来存储累加的结果,初始值为0。

通过while循环,对从1到n的数字依次累加到sum中,直到累加到n为止。

```pythonn = 100sum = 0i = 1while i <= n:sum += ii += 1print("1到d的和为:d" (n, sum))```在上述代码中,我们使用了变量n来表示需要计算的范围,sum来存储累加的结果,i作为循环的控制变量。

通过while循环,当i小于等于n时,执行累加操作并将i递增1。

最终输出1到100的和为5050。

2. 例题2:使用while循环找出100以内的所有质数给定一个整数n,找出所有小于等于n的质数。

当n=100时,应找出所有小于等于100的质数。

解析:质数是指除了1和本身外,没有其他正因子的数。

在这个例题中,我们可以利用while循环逐个检查1到n之间的每个数,判断其是否为质数。

具体的算法思路如下:- 我们需要一个列表prime_list来存储所有找到的质数,初始为空列表。

- 我们使用while循环,从2开始逐个判断每个数是否为质数。

对于每个数i,从2开始逐个检查是否存在能整除i的数,若不存在,则将i加入到prime_list中。

- 输出prime_list中找到的所有质数。

```pythonn = 100i = 2prime_list = []while i <= n:j = 2while j <= (i/j):if i j == 0:breakj += 1if j > i/j:prime_list.append(i)i += 1print("100以内的质数有:", prime_list)```在上述代码中,我们先对每个数i进行了从2到i的遍历,通过while 循环对每个数遍历寻找质数。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
512 4493 600 5197 700 5997 767 6533
389 2046
389 2055 389 2407 389 3207 389 4007 389 4095
389 4104 389 4808 389 5608 389 6144
255*8+6
256*8+7 300*8+7 400*8+7 500*8+7 511*8+7
A,R7
R7
C:0014
R6
8N
A
A,R6
Delayms(C:000F)
768 6542
389 6153
768*8+9 第 2 页,共 3 页
时间 /us
1 1 2
1 1 2 备注 1 1 2 2
关于while(--n)的延时计算
反汇编
包含函数调用时间,晶振12M,12T
n
实际执行时 初始时间 耗时/us 间(仿真) (仿真) (仿真)
512*8+8 600*8+8 700*8+8 767*8+8
C:0x000F
C:0x0010
C:0x0011 C:0x0013 C:0x0014 C:0x0015 C:0x0016 C:0x0018
EF
1F
7001 1E 14 4E 70F7 22
MOV
DEC
JNZ DEC DEC ORL JNZ RET
389 8202 389 16013
389 24017 389 48029 389 80045 389 240123 389 522653 389 524501 389 524542
1024*8+10 200*8+13
24017 48029 80045 240123 522653 524501 524541
200 794 255 904
389
405
389
515
200*2+5 255*2+5
MOV=1us;LCALL=2us;DJNZ=2us;RET=2us;执行 DJNZ相当于--n;所以执行了n次,包含赋值和调用 、返回共5us
延时时间 = uchar 2*n + 5 us;精度为2us 以上均包含函数调用时间
5
404
389
15
5*2+5
C:0x0016 DFFE DJNZ R7,Delayms(C:0016) 2n
10
414
389
25
10*2+5
20
434
389
45
20*2+5
C:0x0018 22 RET
2
50
494
389
105
50*2+5
100 594
389
205
100*2+5
为什么是2*n+5 ?
关于while(--n)的延时计算
反汇编
包含函数调用时间,晶振12M,12T
n
实际执行时 初始时间 耗时/us 间(仿真) (仿真) 时间 /us
uchar型
1
396
389
7
1*2+5
C:0x000F 7FFF MOV R7,#0xFF
1
3
400
389
11
3*2+5
C:0x0011 120016 LCALL Delayms(C:0016) 2
128 1419
389 1030
128*8+6
C:0x001B 7E01 MOV R6,#0x01
200 1995
389 1606
200*8+6
C:0x001D 12000F LCALL Delayms(C:000F)
255 2435
256 2444 300 2796 400 3596 500 4396 511 4484
8位单片机的1字节为256;所以在定义uint型的变量时 候会产生这个语句,这个语句只有在256的倍数下变换 一次,相当产生了高8位的值,因为定义的是uint型, 所以每个数据占用2个字节(16位),所以在赋值的时 候也出现了2个MOV指令,其中R6就是高8位;这就是为 什么当N每大于一个256的时候理论的计算时间多了 1us,共计(n/256)us
第 1 页,共 3 页
关于while(--n)的延时计算
包含函数调用时间,晶振12M,12T
反汇编
n
实际执行时 初始时间 耗时/us 间(仿真) (仿真) (仿真)
理论计算时间
程序
uchar 变为uint
1
403
389
14
1*8+6
N=300
3
419
389
30
3*8+6
C:0x0019 7F2C MOV R7,#0x2C
相差1us因为对256求模的时候不再增加了
n
n*8+n/256+6
延时时间 = uint (n*8+n/256)+ 6 us;精度为8us 以上均包含函数调用时间
第 3 页,共 3 页
理论计算时间
程序
时间 /us
1000 8398 1023 8582
389 8009 389 8193
1000*8+9 1023*8+9
备注:
1024 8591 2000 16402
3000 6000 10000 30000 65299 65530 65535
24406 48418 80434 240512 523042 524890 524931
相关文档
最新文档