如果在程序中X=,你写程序时肯定会给他赋一个值,在这里假定是,,即在程序的某处会有delay(这样的。相当于循环了,X=,,。可以根据自己的需要来定。你说得对,可以写一个就行。但是有些芯片,你在控制他时,时序要求非常严格,如果延时太长或延时太短。这是一个双重嵌套循环写法,外面的循环从,始递增,循环,,里面一个循环从,始递增,循环,,i和j是自定义的变量,和数学中设定x,y,z一样,但同一函数内不可定义两个名称一样的变量,编译器会报错,取值范围不一样是根据你的业务需要定的,{;}这个分号为什么写在这里我不大清楚。
单片机中的delay()的单位时间不是系统提供的,而是用户自己编制的。如果用循环实现的循环,没法计算,但是可以通过软件看到具体时间,但是一般精精确延时是没法用循环实现的。如果想精确延时,一般需要用到定时器,延时时间与晶振有关系,单片机系统一般常选用,,MHz、MHz或。以下是一个单片机间隔点亮一LED灯的C语言程序,以,片机为例:cCopycodeinclude//包含了AT,,寄存器定义voiddelay(unsignedintxms)//延时函数,xms为要延时的毫秒数{unsignedinti,j;for(i=xms;i>,i–)for(j=,j>,j–);}voidmain(){P,,,//将P。
定义一个延时xms毫秒的延时函数voiddelay(unsignedintxms)//xms代表需要延时的毫秒数{unsignedintx,y;for(x=xms;x》x–)for(y=,y》y–);}使用:voidDelay,s(ucharMs){uchardatai;for(;Ms》Ms–)for(i=。意思就是延迟,s,是,s延时子函数写成,s的。voiddelay(chari){charj=,for(i=,i<,i )for(;i<。
voiddelay(uintz){ucharx,y;for(x=z;x>,x–)for(y=,y>,y–);}这个其实就是让单片机一直在那里执行空指令,达到延时的效果..函数参数z没有啥特别的意思..z的值给的越大,延时时间越长,越小的话,延时时间越短..为了防止出现意外,所以特意写成了uint.。在循环里判断是否满足跳出的条件,满足则跳出循环,不满足就继续延时直到延时结束。具体的条件要有程序的要求来,比如说某个IO口的电平的状态。sbitstate=P,,delay(uint){uintx,y;for(x=,x>,x–)for(y=,y>,y–){if(state==,return;//当p。
单片机delay用法
原理:只是执行一些所谓的“无实际意义的指令”,如缩放或执行一个int自加,简单地说,就像高中数学中的“乘法原理”一样,很容易迅速增加上面提到的“无意义指令”的数量关于大小的值:如果是在C语言中,该值不仅与水晶振动、单片机本身的速度,但也与C的编译器,所以,虽然这个值可以精确计算。Delay(,是延时一段时间,加入到流水灯中,是每个LED灯点亮的间隔时间。
voiddelay(uintz){ucharx,y;for(x=z;x>,x–)for(y=,y>,y–);}这个其实就是让单片机一直在那里执行空指令,达到延时的效果..函数参数z没有啥特别的意思..z的值给的越大,延时时间越长,越小的话,延时时间越短..为了防止出现意外,所以特意写成了uint.。delay函数是一般自己定义的一个延时函数。C语言定义延时函数主要通过无意义指令的执行来达到延时的目的。关于单片机C语言的精确延时,网上很多都是大约给出延时值没有准确那值是多少,也就没有达到精确高的要求,而本函数克服了以上缺点,能够精确计数出要延时值且精确达到,s,本举例所用CPU为STC,。
几个精确延时程序:在精确延时的计算当中,最容易让人忽略的是计算循环外的那部分延时,在对时间要求不高的场合,这部分对程序不会造成影响。s延时子程序程序:(晶振,Hz,一个机器周期,s。)voiddelay,s(void){unsignedchari,j,k;for(i=,i>,i–)for(j=,j>。与单片机的计算速度有关,主要看cpu频率假如你的单片机cpu频率为,hz则该单片机大约每秒进行,,,的运算,这个delay函数就是通过i,j,k的自减运算来达到延迟效果一直减到ijk都为,执行下一段函数delay(就是让单片机进行i(*j(*k(=,的自减运算。
单片机的延时程序通过执行指令来达到延时效果,这个时间等于执行的指令需要的时间,而一个指令需要的时间叫做指令周期,这个时间等于若干个机器周期。DELAYLOOP:是行号,这句:DJNZR,DELAYLOOP就是说R,一后要是不为,就跳到DELAYLOOP:执行。DELAY:是子函数入口。ACALLDELAY这句调用子函数DELAY,也就是从DELAY:执行执行到RET后返回,执行下一句ACALLDELAY也就是DJNZR,OUTPUT这个子函数是延时用的。。
单片机delay1s
再对R,环,就实现了,S延时。至于,s、,s、,等等方法类似,只是调整相应的初值。多设置几次循环就行。程序代码如下:DELAY:MOVR,#H;赋值R,,DELAY,MOVR,#C,;赋值R,,DELAY,DJNZR,$;R,减到,不到,续等待DJNZR,DELAY,;R。应该是,Hz吧?单片机内部,计时的单位是《机器周期T》。下面是每条指令执行时,所用的周期数:MOVR,#,F:MOVR,#,DJNZR,$,DJNZR,F,RET,下面是程序循环时所用的周期数:MOVR,#F:MOVR,#DJNZR,$,*,=。
MOVTH,#HDJNZR,HERECLRTR,;定时器要软件清零SETBEX,RET,C语言延时程序:s延时子程序(HZ)voiddelay,s(void){unsignedchari,j,k;for(i=,i>,i–)for(j=,j>,j–)for(k=,k>,k–);},延时子程序(HZ)voiddelay。//功能:include
暂无评论内容