采用for循环实现40ms的延时

作者&投稿:佐胃 (若有异议请与网页底部的电邮联系)
如何利用for循环实现1ms延时~

不过大体来说,一条for循环大概8个机器周期,在12M晶振下,通常用以下代码实现1ms的延时:
void delayms(unsigned int ms){unsigned char i;
while(ms--){for(i = 0; i < 120; i++);}}大概算一下,120*8*1us=1ms,如果需要精确的定时,还是得用定时器。

1.循环延时的方法
DELAY: ;误差 0us
MOV R7,#25H
DL1:
MOV R6,#9AH
DL0:
MOV R5,#02H
DJNZ R5,$
DJNZ R6,DL0
DJNZ R7,DL1
RET

不过这不实用。40MS时间单片机都 在这里循环,不作能它事。


1.可以用定时中断的方法:

ORG 0000H
LJMP START
ORG 000BH
LJMP Timer0Interrupt

START:
MOV SP,#60H
LCALL InitTimer0

LOOP:
;add your code here!
LJMP LOOP

InitTimer0:
MOV TMOD,#01H
MOV TH0,#63H
MOV TL0,#0C0H
SETB EA
SETB ET0
SETB TR0
RET

Timer0Interrupt:
PUSH DPH
PUSH DPL
PUSH ACC
MOV TH0,#63H
MOV TL0,#0C0H
;========================
;add your code here!
;========================
POP ACC
POP DPL
POP DPH
RETI

END

这个不好做,因为每条指令的执行时间与计算机的晶振有关系。
提供如下思路,你可以不断测试:
unsigned long a,b,c,d,e;
for(a=0;a<0xffffffff;a++)
for(b=0;b<0xffffffff;b++)
for(c=0;c<0xffffffff;c++)
for(d=0;d<0xffffffff;d++)
for(e=0;e<0xffffffff;e++)
{
;//循环体
}
看一下整体运行时间,然后估算一下一次循环的时间,根据40ms,确定a,b,c,d,e的值

首先确定程序运行的平台提供的主频是多少?主频分之一应该就是一条机器语句的执行时间,根据这个,再利用for完成延时的要求。
int i=0;
for(i=0;i<N;i++);
for语句可以当成5个机器语句,N可通过此方法计算得来。

这个要看你电脑的运行速度,一条指令要执行多长时间

sleep函数啊


用一个for循环输入4行4列怎么输入?
int main(){ int a[4][4],i;int j=0,k=0;for(i=0;i<16;i++){ a[j][k++]=i+1;if((i+1)%4==0){ j++;k=0;} } \/\/test--- for(i=0;i<4;i++){ for(j=0;j<4;j++){ printf("%d ",a[i][j]);} printf("\\n");} return 0;} ...

c语言编程用循环语句输入四个数 要求这四个数由从小到大输出
include<stdio.h>int main(){int a[4]; \/\/数组存储数据int i,j;for( i=0;i<4;i++ ) \/\/循环输入scanf("%d", &a[i] );for( i=0;i<3;i++ ) \/\/排序for( j=i+1;j<4;j++ )if ( a[i] > a[j] ){int t=a[i];a[i]=a[j];a[j]=t;}for( i=0;i<4;i++...

java中的for循环嵌套语句怎么执行啊 比如嵌套4个 ?
a++;执行语句就只有一句a++,然后我们来看执行顺序:先从上到下执行for循环,先执行第一层,i=0满足条件,进去执行他的方法体,他的方法体就是第二层;第二层一看也满足,继而执行第三层;第三层也满足,执行第四层。现在i,j,k值都为0,m是之后一层循环,先把m的这层全部满足后跳出循环执行第...

怎样用 for循环实现四组数据同时输入处理后又同时输出
import java.util.*;public class CharacterTest {static Scanner sc=new Scanner(System.in);public static void main(String[] args) {char[] chs=new char[4];String str="";for(int i=0;i<chs.length;i++){System.out.println("输入第"+(i+1)+"个字符回车结束!");chs[i]=sc.n...

用for循环 输出1,2,3,4,5,6,7,8,9,0
include <stdio.h> int main(){ int i,j,k=1,t;for(i=0;i<4;i++){ printf("\\n");for(j=0;j<7;j++)if(j==3-i){ for(t=0;t=2)printf(" ");} } else printf(" ");} return 0;} \/\/看我的吧,运行过了,和你的图一样 ...

JAVA用FOR LOOP写下面的程序 1 2 3 4 2 4 6 8 3 6 9 12 4 8 12 16
你好,按照你的要求写的代码如下,可以直接运行 public class test { public static void main(String[] args) { for (int i = 1; i <= 4; i++) { for (int j = 1; j <= 4; j++) { System.out.print((i * j) + " ");} } } } 运行结果:1 2 3 4 2 4 6 8 3 6...

C语言用for循环语句输入4个整数,输出其和
C语言的数组概念的学习,通过for循环输出打印数组

c语言for循环输出 1 2 4 3 6 9 4 8 12 16 5 10 15 20 25
include <stdio.h>int main(){ int i = 1,j; for(; i <= 5; ++i){ for(j = i; j <= i*i; j += i){ printf(" %d ",j); } printf("\\n"); } return 0;}

java.用 for循环嵌套实现输出一个 4行 10列的**矩阵?
public class Main { public static void main(String[] args) { for (int i=0;i<4;i++){ for (int j=0;j<10;j++){ System.out.print("*"+" ");} System.out.println();} } }

使用嵌套的for循环语句,在控制台上输出如下内容: 1 2 3 4 5 2 4 5...
是在控制台上输出如下内容: 1 2 3 4 5 2 4 6 8 10 3 6 9 12 15吧?这样每个内循环输出五个元素,外循环控制循环次数(3次),才比较好做。如果是这样,代码大致如下:char i,j;for(i=1;i<4;i++){ for(j=1;j<6;j++)printf(" %d",i*j);} ...

浚县15067355849: 51单片机C语言for循环延时程序时间计算 -
镡勉泰吡: 不可能的,是不是你的编译有错的啊 我改的晶振12M,在KEIL 4.0 里面编译的,为你得出的结果最大也就是40ms,这是软件的原因, 不可能出现100ms那么大的差距,是你的软件的原因. 不信你实际编写一个秒钟,利用原理计算编写一个烧进单片机和利用软件测试的秒程序烧进单片机,你会发现原理计算的程序是正确的

浚县15067355849: 单片机中,怎么用汇编语言编写程序实现延迟40ms -
镡勉泰吡: 1.循环延时的方法 DELAY: ;误差 0usMOV R7,#25H DL1:MOV R6,#9AH DL0:MOV R5,#02HDJNZ R5,$DJNZ R6,DL0DJNZ R7,DL1RET不过这不实用.40MS时间单片机都 在这里循环,不作能它事.1.可以用定时中断的方法: ...

浚县15067355849: Verilog语言中怎么延时?我想延时几us,能用for语句循环计数吗? -
镡勉泰吡: 是代码还是Testbench,代码中可以使用D触发器延时也就是使用“<=”进行赋值,要是在Testbench中可以直接使用“#”加时间,“# 5”就是延时5个单位

浚县15067355849: 如何利用for循环实现1ms延时 -
镡勉泰吡: 不过大体来说,一条for循环大概8个机器周期,在12M晶振下,通常用以下代码实现1ms的延时:void delayms(unsigned int ms){unsigned char i; while(ms--){for(i = 0; i 如果是for (i=0;i

浚县15067355849: 若单片机的主频为12MHz,试编写延时为40us的延时子程序? -
镡勉泰吡: 不如使用T1,方式1 解答:Mc=2^16-Tc/Tp=65536-20ms/(12/12*10^6)=65536-20000=B1E0(H)TMOD=#10(H)初始化程序段为mov TMOD,#10Hmov TH1,#0B1Hmov TL1,#E0Hsetb TR1... ... 就写这么多吧,你的悬赏分数让我觉得我写这些已经足够了! 请参考

浚县15067355849: c单片机的延时问题 -
镡勉泰吡: 标准的C语言中没有空语句.但在单片机的C语言编程中,经常需要用几个空指令产生短延时的效果.这在汇编语言中很容易实现,写几个nop就行了. 在keil C51中,直接调用库函数: #include // 声明了void _nop_(void); _nop_(); // 产生一...

浚县15067355849: 用MCS51单片机的汇编语言,编二级循环嵌套子程序,实现50毫秒的延时,振荡频率为12MHZ,要写出计算过程 -
镡勉泰吡: DEALY50MS: MOV R2,#100 ;1 DLY1: MOV R3,#248 ;1*100 DJNZ R3,$ ;2*100*248 DJNZ R2,DLY1 ;2*100 RET ;2 Total=1+100+49600+200+2=49903us=49.903ms 将248改为249为50.103ms

浚县15067355849: 关于KeilC51单片机延时的问题 -
镡勉泰吡: 编译后可以通过KEIL 中的DEBUG查看些段程序所对应的汇编代码... 再概据汇编代码计算出所用周期.. 但一般是采用调试的办法.. 比如先定时,1MS 用FOR后,先写个数值随便写个数值..用DEBUG调试,运行完这个1MS的程序,用时实际为多少..在一次次的修改中接近1MS.. :)

浚县15067355849: 单片机C程序里面何如灵活的使用空指令,for循等环延时有的时候要
镡勉泰吡: 两个问题:为什么延时?延时多长时间? 延时是为了弥补一定程度的不确定性.如果很多的事情你能精确控制时间,那么延时也就没有用了.若不用延时,一般应对程序作出错误处理程序,同样是为了弥补不确定的东西.延时耗费了cpu的时间,浪费了cpu的资源.错误处理程序增加了程序的用量(空间复杂度).这两者应该是一个平衡取舍,一个是以时间换空间,一个是以空间换时间. 延时多长时间,一般要根据实际情况作出计算,应该取一个有一定冗余的值.

浚县15067355849: 51单片机如何用for写一个5ms的延时,晶振是12MHZ的 -
镡勉泰吡: 非常简单,先写一个大概的,然后用示波器测量,微调一下.就OK了! 反正我们都是这样调整的. 呵呵,没时间去研究怎么写. 你可以写一个基准定时,1ms的.然后就是入口参数delay_ms(time);的问题了... time=20

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网