
汇编语句对时间的把握精确于C语言,所以参考不同指令的长度,
就可以算出你的延迟时间。
单片机的延时程序:
MOV
R7,#200
LOOP1:MOV
R6,#125
LOOP2:DJNZ
R6,LOOP2
DJNZ
R7,LOOP1
RET
第一句为单周期指令,耗时2us
第二句执行了200次,耗时2200us
第三句为双周期指令,执行了125200次,耗时22125200us
第四句同第三句,耗时22200us
第五句双指令周期
总够耗时2+2200+22125200+22200+22
约为100ms
本程序的耗时计算如下:
1
+
[1
+
(1
+
1
+
2)
249
+
2]
5
+
2
=
4998
T
如果再算上主程序中的调用指令的2T,总共延时5000T。
如果时钟频率是6MHz,那么正好延时10ms。
原来12mhz的,机器周期是1us,
但是在循环程序,没运行一次空语句需要花2us,
因此原来程序中为
20202482=198400,大约是200000us,即02s
如果变为1mhz后,机器周期是1/12us,没运行一次空语句需要花1/6us,
然后把r3r4r51/6=200000,把r3、r4、r5取整数值就可以
精确计算如下:
DELAY:
MOV R5,#20 ---1T
D1: MOV R6,#20--1T
D2: MOV R7,#248 -1T
DJNZ R7,$ ----2T,(2) 248 = 496
DJNZ R6,D2----2T,(1 + 496 + 2) 20 = 9980
DJNZ R5,D1----2T,(1 + 9980 + 2) 20 = 199660
RET-------2T, 1 + 199660 + 2 = 1996603
总共,耗用199660 T。
时间,关键是要取决于晶振频率。
当晶振频率=12MHz,则有 T = 1us。
计算延时时间应注意以下几点:1、晶振跑多少的,象这里的6M的话,那么它执行的机器周期就是2us,2、看指令执行要多少个机器周期,向DJNZ、RET都要两个机器周期,3、那么,这里总共时间是26(1A)255(0FF)255(0FF)2(机器周期)2us(1个机器周期的时间)=6762600us 若要精确计算的话要加上上面赋值的时间和子程序返回的时间。不过一般只要计算到上面就行了,因为赋值和返回指令的时间很短(相对于整个延时程序来说)希望对你有所帮助
你好:
如果你想直接知道答案,那么我告诉你,12MHz晶振:
void delayms(unsigned int t)
{
unsigned int i,j;
for(i=t;i>0;i--)
for(j=123;j>0;j--);
}
能精确到1ms。
如果是110592MHz晶振,只需把上面的“j=123”改为“j=114”,都是调试过的,没问题。
然后你要想知道是怎么调试的,很简单,打开uv2编程软件,在最上边的工具栏里边有个“Debug”,点击后出现下拉菜单,选择第一个“start/stop Debug Session”,然后在最右边有一个Watch栏,有两个项目,一个是“Register”,一个是“value”,然后在“Register”栏下边的“Sys”里边有个“sec”,你只要单击“Step over”运行程序并观察“sec”的值就能调试出你程序的执行时间了。
注意,一定要先选择晶振频率,不然会默认24MHz。
希望我的回答能帮助到你。
以上就是关于单片机的延时,延时时间长度是怎么算的最好有一个例子,来说明!全部的内容,包括:单片机的延时,延时时间长度是怎么算的最好有一个例子,来说明!、单片机延时程序的计算、求单片机延时0.2S计算方法等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)