单片机的主频是12MHZ,试用循环指令编写延时500ms的延时子程序 求大神解答,在线等,略急

单片机的主频是12MHZ,试用循环指令编写延时500ms的延时子程序 求大神解答,在线等,略急,第1张

12MHZ就是 1/12M 秒运行一个指令周期,(部分指令是2周期、3周期指令,具体看你执行什么指令),

times= 500ms / 1/12M,

times就是 500ms需要运行的周期数。

你先把循环计时指令写好,再计算循环指令执行1次需要多少个指令周期(即循环程序种每条指令运行周期数叠加),再把 times/一次循环周期数 就是要循环的次数 x,把 x 放进已经写好的循环程序中,替换循环的次数即可。

1、比较死板的方法是自己写一个delay函数,里面用for,while等做一些循环,下面是1ms的延时函数

void delay1ms(void)

{

unsigned char i,j;

for(i=0;i<10;i++)

for(j=0;j<33;j++);

}

具体算法是//(3j+2)i=(3×33+2)×10=1010(us),但精确度不高,如果想准确点可以调节相应的参数用示波器来实

现,上面的函数适用于程序简单,对时间性要求不高,如:点led灯,单个按键 *** 作等等。

2,就是用定时器中断里面设定标志位来产生延时的方法,比如你可以把定时器设定为每1ms进一次中断,在中断里面

把一个标志位(如flag)置一

当你需要1ms延时的时候你可以先初始化定时器,然后查询标志位是否置一,置一则执行if后面的语句,即if(fla{};

当你需要10ms延时时,你可以把flag设置为uchar,中断里面flag++;外面查询用if(10==flag){};

以此类推,上面的方法精确度高适用地方。

首先明确机器执行一条指令耗时大概是1us那么延时10ms的程序如下:MOV AX,50L1:MOV BX,100L2:DEC BX     JNZ L2DEC AXJNZ L1执行完之后时间大约为10ms多一点

根据具体问题类型,进行步骤拆解/原因原理分析/内容拓展等。

具体步骤如下:/导致这种情况的原因主要是……

多简单的小程序呀:

TIME1MS:

MOV R6, #2

TIME1:

;延时498uS

MOV R7, #248

DJNZ R7, $ ;R7的为0时,程序向下运行,否则继续减

;

DJNZ R6, TIME1 ;加上此命令后,每个小周期时间为500uS

;运行两周为1MS,再加上最前面的MOV R6那条指令,就是1002MS

RET

此程序实现的是1002MS的定时,当然这当中不算主程序调用此延时程序时现场保护的时间,即压栈和出栈的时间

以上就是关于单片机的主频是12MHZ,试用循环指令编写延时500ms的延时子程序 求大神解答,在线等,略急全部的内容,包括:单片机的主频是12MHZ,试用循环指令编写延时500ms的延时子程序 求大神解答,在线等,略急、延时子程序实现原理、求汇编语言延时程序,延时10毫秒的延时程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/10167613.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-05
下一篇2023-05-05

发表评论

登录后才能评论

评论列表(0条)

    保存