请问在单片机C语言中,while(--t)和while(t--)有什么区别啊?

作者&投稿:漆爱 (若有异议请与网页底部的电邮联系)
c语言中 while(t--)~

t--是自减运算,是每次t自身减1
while(t--)就是当t自身减到0就退出循环。

不一样
t--是先判断再减1
--t是先减1再判断

两者的基层汇编语言不同,程序运行时间也不同。

一、基层汇编语言的差别

(1)while(--t)用到了减一不为0转移指令DJNZ

keil5中while(--t)的汇编语言

        上图中,DJNZ的意思是先将R7中的数值减1,判断是否为0,不为0则跳转至标号为C:06F4的语句处继续执行程序,否则跳出循环。

        可见while(--t)只需一条汇编指令便可完成一次循环操作。

(2)while(++t)用到了数据传输指令MOV

keil5中while(t--)的汇编语言

        上图中,MOV R6,0x07采用立即寻址方式,先将0x07数据(变量t的值)存至寄存器R6中,之后将寄存器R7(存有变量t)中的数据减1,然后再将原先没有减1过的t值送往寄存器A(后方JNZ指令的操作寄存器,用于判断是否为0)中,最后再用JNZ不为0转移指令判断寄存器A中数值是否为0,为0则跳转至标号为C:06EE的语句处继续执行程序,否则跳出循环。

        综上,不难发现,while(--t)的基层汇编语言比while(t--)的基层汇编语言简单得多,这势必会导致单片机在执行while(--t)时所消耗的时间比在执行while(t--)时所消耗的时间短。

二、程序运行时间的差别

下面,将通过Debug测试数据验证上一部分的结论。

(1)while(--t)的时间消耗

执行一次while(--t) 的起始时间

执行一次while(--t) 的结束时间

        可得单片机在执行while(--t)指令时,共耗时:

(0.00082899s-0.00082682s)/(12/11059200Hz)=1.999872个机器周期(mc)≈2mc,

(2)while(t--)的时间消耗

执行一次while(t--) 的起始时间

执行一次while(t--) 的结束时间

        可得单片机在执行while(t--)指令时,共耗时:

(0.00050130s-0.00049479s)/(12/11059200Hz)=5.999616mc≈6mc,

        可以发现,单片机在执行while(--t)时所消耗的时间比在执行while(t--)时所消耗的时间短了整整4个机器周期,验证了第一部分所得结论的正确性。



--t和t--是不同的,--t是将t的值减1之后再代入,而t--是代入计算之后再减1.

前者先把t减1再判断--t是真是假;后者先判断t的真假再减1。哥们儿,找一本C语言的书看看就知道了

先减 后减

51单片机 c语言 、或、在数码管上的用法
答:你这个问题提得不是很确切,你是纯新手。首先你没有说你的数码管是共阴极,还是共阳极的。共阳极:位选为高时,为低电平亮,那么你就要给你的H引脚一个低电平,那个点就亮起来了。共阴极:位选为低时,为高电平亮,那么你就要给你的H引脚一个高电平,那个点就亮起来了。比如你是共阴极的数码管,...

C语言单片机程序 初学大家帮忙看看错在哪里了 #include <reg51.h...
答:程序百分百没问题,可能是编译的有问题,你 用的是keil编译的吗? 建议你多重新编译一下, 也有可能是你烧写程序的时候 数据传输的过程中出错了,校验出错 一般是传输过程中某个或者某些bit或者byte出错 建议你重新编译 重新下载烧写试试, 单片机这东西就是经常出些小问题,有时候我们买的开发板或者有...

单片机中的C语言串行通讯问题。
答:include<reg51.h> define uchar unsigned char uchar dat,dati;bit jy;void delay(){ uchar i=250;while(i--);} void uart() interrupt 4 { if(RI){ RI=0;dati=SBUF;jy=RB8;} if(TI)TI=0;} main(){ dat=0;TMOD=0x30;TH1=0xe8;TL1=0xe8;SCON=0x50;ES=1;EA=1;while(1){...

请问单片机用c语言编程为什么在主函数开头有时要给sp赋值?
答:程序发上来看看,只记得汇编给SP赋值

求大神在keil上帮写51单片机C语言程序
答://第一个实验://假设8个LED阴极指向单片机,D11连接P0.1,D12连接P0.2 ... D18连接P0.7//假设K1按键在P2.3引脚#include<reg51.h>#include<intrins.h>sbit k1=P2^3;//假设K1按键在P2.3引脚void main(){P0=0xfe;while(1){if(k1==0){while(k1==0);P0=_crol_(P0,1);}}}...

51单片机,keil 软件 C语言问题(我错在哪了)
答:……p0=0x00;//关闭数码管---P0,应该大写 ……//主机串口接收中断函数 void serial_INT()interrupt 4 { uint k;---在这里定义 uint j;---在这里定义 if(RI)//接收到一字节 { RI=0;//清除串行接收中断标志 while(SW){ SPK=~SPK;LED=~LED;// uint j;--不要在这里定义...

请问单片机的C语言怎么编写啊?
答:单片机C语言编译错误:requires ANSI-style prototype,是编译过程错误造成的,解决方法如下:1、编程前保存文件,单击文件菜单,下拉菜单中选择保存按钮。2、输入文件名,文件类型选择为.c类型。3、然后开编辑,首先,定义头文件,头文件一般为stdio.h。4、接着,定义主函数,主函数名为main。5、然后,...

51单片机C语言问题
答:问题不是很清楚。2637&2=0;&是按位与 操作过程是101001001101 & 0000000010 =000000000000;你的取4位数的任一位有很多理解方式:1).比如:4位数是1234,分别取1,2,3,4出来,这个很简单 2). 比如:4位数是1234,二进制为10011010010,取后面的0010四位。(单片机经常需要这样).这个就是分别&0x08...

单片机,C语言写的程序,大家帮看一下
答:1、#include所包含的文件reg52.h是定义特殊功能寄存器和位的。可以快捷地访问单片机的这些资源。如P0,P1……等等。打开该文件,你可以看到若干寄存器的定义。sfr sbit是主要的C51两个关键字。分别用来声明。2、所有的C语句都应该用;来结束。除非特殊的约定或宏。你的程序没有;。3、p0是个没有定义...

关于单片机中的c语言问题
答:同学你好,我是学嵌入式的,我们现在用单片机的话都是用的汇编,不过多数人还是用的C语言。要说学到什么程度呢,,,我个人觉得你把那些条件语句比如while(),if()等你要学扎实,比如说你要实现一个乘法口诀功能,因为段选和位选的原因我们必须将乘数、被乘数很好的、清楚的(比如亮1秒)显示在...