MCS_51_96单片机堆栈延时子程序的延时计算

合集下载

延时子程序计算方法

延时子程序计算方法

学习MCS-51单片机,如果用软件延时实现时钟,会接触到如下形式的延时子程序:delay:mov R5,#data1d1:mov R6,#data2d2:mov R7,#data3d3:djnz R7,d3djnz R6,d2djnz R5,d1Ret其精确延时时间公式:t=(2*R5*R6*R7+3*R5*R6+3*R5+3)*T(“*”表示乘法,T表示一个机器周期的时间)近似延时时间公式:t=2*R5*R6*R7 *T假如data1,data2,data3分别为50,40,248,并假定单片机晶振为12M,一个机器周期为10-6S,则10分钟后,时钟超前量超过1.11秒,24小时后时钟超前159.876秒(约2分40秒)。

这都是data1,data2,data3三个数字造成的,精度比较差,建议C描述。

上表中e=-1的行(共11行)满足(2*R5*R6*R7+3*R5*R6+3*R5+3)=999,999e=1的行(共2行)满足(2*R5*R6*R7+3*R5*R6+3*R5+3)=1,000,001 假如单片机晶振为12M,一个机器周期为10-6S,若要得到精确的延时一秒的子程序,则可以在之程序的Ret返回指令之前加一个机器周期为1的指令(比如nop指令),data1,data2,data3选择e=-1的行。

比如选择第一个e=-1行,则精确的延时一秒的子程序可以写成:delay:mov R5,#167d1:mov R6,#171d2:mov R7,#16d3:djnz R7,d3djnz R6,d2djnz R5,d1nop ;注意不要遗漏这一句Ret附:#include"iostReam.h"#include"math.h"int x=1,y=1,z=1,a,b,c,d,e(999989),f(0),g(0),i,j,k;void main(){foR(i=1;i<255;i++){foR(j=1;j<255;j++){foR(k=1;k<255;k++){d=x*y*z*2+3*x*y+3*x+3-1000000;if(d==-1){e=d;a=x;b=y;c=z;f++;cout<<"e="<<e<<" "<<"R5="<<a<<" "<<"R6="<<b<<" "<<"R7="<<c<<""<<"f="<<f<<endl<<endl;};if(d==1){e=d;a=x;b=y;c=z;g++;cout<<"e="<<e<<" "<<"R5="<<a<<" "<<"R6="<<b<<" "<<"R7="<<c<<" "<<"g="<<g<<endl<<endl;};x++;}x=1;y++;}y=1;z++;}}。

单片机 延时 计算

单片机 延时 计算

单片机延时计算单片机是一种集成电路,具有微处理器、存储器和输入输出接口等功能。

在单片机的应用中,延时计算是一项重要的操作。

延时计算指的是在程序中通过控制单片机的时钟信号来实现一定的时间延迟。

延时计算常用于控制设备的时间间隔、时序控制等方面。

在单片机中,延时计算可以通过软件延时和硬件延时两种方式实现。

软件延时是通过在程序中循环执行一定的指令次数来实现延时,而硬件延时是通过控制单片机的时钟频率来实现延时。

软件延时是一种简单常用的延时计算方法。

在软件延时中,我们可以使用循环来实现延时。

通过控制循环次数,可以实现不同的延时时间。

例如,我们可以使用一个循环来延时1毫秒,使用多个循环来延时更长的时间。

软件延时的精度相对较低,受到单片机的工作频率、指令执行速度等因素的影响。

硬件延时是一种更精确的延时计算方法。

在硬件延时中,我们可以通过改变单片机的时钟频率来控制延时时间。

通过控制时钟频率,可以实现微秒级别的延时。

硬件延时的精度相对较高,但需要对单片机的时钟系统进行配置和调整。

延时计算在单片机的应用中非常重要。

在控制设备的时间间隔方面,延时计算可以实现设备的周期性工作。

例如,可以通过延时计算来控制LED灯的闪烁频率,实现呼吸灯效果。

在时序控制方面,延时计算可以实现不同操作之间的时间间隔。

例如,可以通过延时计算来控制舵机的旋转角度和速度。

延时计算的实现方法有很多种,可以根据具体需求选择合适的方法。

在选择延时计算方法时,需要考虑延时的精度、可靠性和资源占用等因素。

同时,还需要根据单片机的工作频率和指令执行速度等参数进行调整和优化。

延时计算在单片机的应用中起着重要的作用。

通过延时计算,可以实现对设备的精确控制和时序管理。

延时计算的方法和技巧也是单片机程序设计中的重要内容之一。

通过深入了解和研究延时计算,可以提高单片机程序的可靠性和性能。

希望通过本文的介绍,读者对延时计算有更深入的了解和认识。

51单片机汇编延时程序算法详解

51单片机汇编延时程序算法详解

51 单片机汇编延时程序算法详解
51 单片机汇编延时程序算法详解
将以12MHZ 晶振为例,详细讲解MCS-51 单片机中汇编程序延时的精确
算法。

指令周期、机器周期与时钟周期
指令周期:CPU 执行一条指令所需要的时间称为指令周期,它是以机器周期为单位的,指令不同,所需的机器周期也不同。

时钟周期:也称为振荡周期,一个时钟周期=晶振的倒数。

MCS-51 单片机的一个机器周期=6 个状态周期=12 个时钟周期。

MCS-51 单片机的指令有单字节、双字节和三字节的,它们的指令周期不
尽相同,一个单周期指令包含一个机器周期,即12 个时钟周期,所以一条单周期指令被执行所占时间为12*(1/12000000)=1&mu;s。

扩展阅读:单片机有
哪些延时方法详细介绍
程序分析
例1 50ms 延时子程序:。

单片机C51延时时间怎样计算

单片机C51延时时间怎样计算

C程序中可‎使用不同类‎型的变量来‎进行延时设‎计。

经实验测试‎,使用uns‎i gned‎ char类‎型具有比u‎n sign‎e d int更优‎化的代码,在使用时应‎该使用un‎si gne‎d char作‎为延时变量‎。

以某晶振为‎12MHz‎的单片机为‎例,晶振为12‎MH z即一‎个机器周期‎为1us。

一. 500ms‎延时子程序‎程序:void delay‎500ms‎(void){unsig‎n ed char i,j,k;for(i=15;i>0;i--)for(j=202;j>0;j--)for(k=81;k>0;k--);}计算分析:程序共有三‎层循环一层循环n‎:R5*2 = 81*2 = 162us‎DJNZ 2us二层循环m‎:R6*(n+3) = 202*165 = 33330‎u s DJNZ 2us + R5赋值1us = 3us三层循环: R7*(m+3) = 15*33333‎= 49999‎5us DJNZ 2us + R6赋值1us = 3us循环外: 5us 子程序调用‎ 2us + 子程序返回‎ 2us + R7赋值1us = 5us延时总时间‎ =三层循环+ 循环外= 49999‎5+5 = 50000‎0us =500ms‎计算公式:延时时间=[(2*R5+3)*R6+3]*R7+5二. 200ms‎延时子程序‎程序:void delay‎200ms‎(void){unsig‎n ed char i,j,k;for(i=5;i>0;i--)for(j=132;j>0;j--)for(k=150;k>0;k--); }三. 10ms延‎时子程序程序:void delay‎10ms(void){unsig‎n ed char i,j,k;for(i=5;i>0;i--)for(j=4;j>0;j--)for(k=248;k>0;k--); }四. 1s延时子‎程序程序:void delay‎1s(void){unsig‎n ed char h,i,j,k;for(h=5;h>0;h--)for(i=4;i>0;i--)for(j=116;j>0;j--)for(k=214;k>0;k--);}参考链接:http://www.picav‎/news/2010-04/2106.htm摘要实际的单片‎机应用系统‎开发过程中‎,由于程序功‎能的需要,经常编写各‎种延时程序‎,延时时间从‎数微秒到数‎秒不等,对于许多C‎51开发者‎特别是初学‎者编制非常‎精确的延时‎程序有一定‎难度。

51单片机延时时间计算和延时程序设计

51单片机延时时间计算和延时程序设计

一、关于单片机周期的几个概念时钟周期时钟周期也称为振荡周期,定义为时钟脉冲的倒数(可以这样来理解,时钟周期就是单片机外接晶振的倒数,例如12MHz 的晶振,它的时间周期就是1/12 us),是计算机中最基本的、最小的时间单位。

在一个时钟周期内,CPU仅完成一个最基本的动作。

机器周期完成一个基本操作所需要的时间称为机器周期。

以51 为例,晶振12M,时钟周期(晶振周期)就是(1/12)μs,一个机器周期包含12 个时钟周期,一个机器周期就是1μ s。

指令周期:执行一条指令所需要的时间,一般由若干个机器周期组成。

指令不同,所需的机器周期也不同。

对于一些简单的的单字节指令,在取指令周期中,指令取出到指令寄存器后,立即译码执行,不再需要其它的机器周期。

对于一些比较复杂的指令,例如转移指令、乘法指令,则需要两个或者两个以上的机器周期。

2.延时常用指令的机器周期1.指令含义DJNZ:减 1 条件转移指令这是一组把减 1 与条件转移两种功能结合在一起的指令,共2条。

DJNZ Rn,rel ;Rn←(Rn)-1;若(Rn)=0,则PC←(PC)+2 ;顺序执行;若(Rn)≠ 0,则PC←(PC)+2+rel,转移到rel 所在位置DJNZ direct,rel ;direct ←(direct )-1;若(direct)= 0,则PC←(PC)+3;顺序执行;若(direct)≠ 0,则PC←(PC)+3+rel,转移到rel 所在位置2.DJNZ Rn,rel 指令详解例:MOV R7,#5DEL:DJNZ R7,DEL; r在el本例中指标号DEL三、51 单片机延时时间的计算方法和延时程序设计1.单层循环由上例可知,当Rn赋值为几,循环就执行几次,上例执行 5 次,因此本例执行的机器周期个数=1(MOV R7,#5)+2(DJNZ R7,DE)L ×5=11,以12MHz的晶振为例,执行时间(延时时间)=机器周期个数×1μs=11μ s,当设定立即数为0 时,循环程序最多执行256 次,即延时时间最多256μ s。

MCS51单片机程序设计时堆栈的计算方法解析

MCS51单片机程序设计时堆栈的计算方法解析

MCS51单片机程序设计时堆栈的计算方法解析[导读]用C语言进行MCS51系列单片机程序设计是单片机开发和应用的必然趋势。

Keil公司的C51编译器支持经典8051和8051派生产品的版本,通称为Cx51。

应该说,Cx51是C 语言在MCS51单片机上的扩展,既有C语言的共性,又有它自己的特点。

本文介绍的是Cx51程序设计时堆栈的计算方法。

用C语言进行MCS51系列单片机程序设计是单片机开发和应用的必然趋势。

Keil公司的C51编译器支持经典8051和8051派生产品的版本,通称为Cx51。

应该说,Cx51是C语言在MCS51单片机上的扩展,既有C语言的共性,又有它自己的特点。

本文介绍的是Cx51程序设计时堆栈的计算方法。

1.堆栈的溢出问题。

MCS51系列单片机将堆栈设置在片内RAM中,由于片内RAM资源有限,堆栈区的范围也是有限的。

堆栈区留得太大,会减少其他数据的存放空间,留得太少则很容易溢出。

所谓堆栈溢出,是指在堆栈区已经满了的时候还要进行新的压栈操作,这时只好将压栈的内容存放到非堆栈区的特殊功能寄存器(SFR)中或者堆栈外的数据区中。

特殊功能寄存器的内容影响系统的状态,数据区的内容又很容易被程序修改,这样一来,之后进行出栈操作(如子程序返回)时内容已变样,程序也就乱套了。

因此,堆栈区必须留够,宁可大一些。

要在Cx51程序设计中防止堆栈的溢出,要解决两个问题:第一,精确计算系统分配给用户的堆栈大小,假设是M;第二,精确计算用户需要堆栈的大小,假设是N。

要求M≥N,下面分别分析这两个问题。

2.计算系统分配给用户的堆栈大小Cx51程序设计中,因为动态局部变量是长驻内存中的,实际上相当于局部静态变量,即使在函数调用结束时也不释放空间(这一点不同于标准C语言)。

Cx51编译器按照用户的设置,将所有的变量存放在片内和片外的RAM中。

片内变量分配好空间后,将剩下的空间全部作为堆栈空间,这个空间是最大可能的堆栈空间。

51单片机汇编延时程序算法详解

51单片机汇编延时程序算法详解

51单片机汇编延时程序算法详解
51 单片机汇编延时程序算法详解
将以12MHZ 晶振为例,详细讲解MCS-51 单片机中汇编程序延时的精确算法。

指令周期、机器周期与时钟周期
指令周期:CPU 执行一条指令所需要的时间称为指令周期,它是以机器周期为单位的,指令不同,所需的机器周期也不同。

时钟周期:也称为振荡周期,一个时钟周期=晶振的倒数。

MCS-51 单片机的一个机器周期=6 个状态周期=12 个时钟周期。

MCS-51 单片机的指令有单字节、双字节和三字节的,它们的指令周期不尽相同,一个单周期指令包含一个机器周期,即12 个时钟周期,所以一条单周期指令被执行所占时间为12*(1/12000000)=1μs
程序分析
例1 50ms 延时子程序:
DEL:MOV R7,#200 ①
DEL1:MOV R6,#125 ②
DEL2:DJNZ R6,DEL2 ③
DJNZ R7,DEL1 ④
RET ⑤
精确延时时间为:1+(1*200)+(2*125*200)+(2*200)+2
=(2*125+3)*200+3 ⑥
=50603μs
≈50ms。

51单片机延时程序

51单片机延时程序

51单片机延时程序51单片机延时程序应用单片机的时候,经常会遇到需要短时间延时的情况。

需要的延时时间很短,一般都是几十到几百微妙(us)。

有时候还需要很高的精度,比如用单片机驱动DS18B20的时候,误差容许的范围在十几us 以内,不然很容易出错。

这种情况下,用计时器往往有点小题大做。

而在极端的情况下,计时器甚至已经全部派上了别的用途。

这时就需要我们另想别的办法了。

以前用汇编语言写单片机程序的时候,这个问题还是相对容易解决的。

比如用的是12MHz晶振的51,打算延时20us,只要用下面的代码,就可以满足一般的需要:mov r0, #09hloop: djnz r0, loop51 单片机的指令周期是晶振频率的1/12,也就是1us一个周期。

mov r0, #09h需要2个极其周期,djnz也需要2个极其周期。

那么存在r0里的数就是(20-2)/2。

用这种方法,可以非常方便的实现256us 以下时间的延时。

如果需要更长时间,可以使用两层嵌套。

而且精度可以达到2us,一般来说,这已经足够了。

现在,应用更广泛的毫无疑问是Keil的C编译器。

相对汇编来说,C固然有很多优点,比如程序易维护,便于理解,适合大的项目。

但缺点(我觉得这是C的唯一一个缺点了)就是实时性没有保证,无法预测代码执行的指令周期。

因而在实时性要求高的场合,还需要汇编和C的联合应用。

但是是不是这样一个延时程序,也需要用汇编来实现呢?为了找到这个答案,我做了一个实验。

用C语言实现延时程序,首先想到的就是C常用的循环语句。

下面这段代码是我经常在网上看到的:void delay2(unsigned char i){for(; i != 0; i--);到底这段代码能达到多高的精度呢?为了直接衡量这段代码的效果,我把 Keil C 根据这段代码产生的汇编代码找了出来:; FUNCTION _delay2 (BEGIN); SOURCE LINE # 18;---- Variable i assigned to Register R7 ----; SOURCE LINE # 19; SOURCE LINE # 200000 ?C0007:0000 EF MOV A,R70001 6003 JZ ?C00100003 1F DEC R70004 80FA SJMP ?C0007; SOURCE LINE # 210006 ?C0010:0006 22 RET; FUNCTION _delay2 (END)真是不看不知道~~~一看才知道这个延时程序是多么的不准点~~~光看主要的那四条语句,就需要6个机器周期。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

2 堆栈延时子程序
(1)一个四重堆栈延时子程序段分析[2]
设寄存器 R2 中存放延时初值 n,n→(R2),堆栈命令保护现场,则数值 n 为决定循环次数的
基本变量。一个 MCS-51 单片机的四重堆栈延时子程序如下[3]:
DELY: PUSH 02H
;①
DEL2: PUSH 02H
;②
DEL3: PUSH 02H
i =1
i =1
i =1
i =1
各求和项系数的递推公式为
(13)
⎧α k+1,1 ⎩⎨αk+1, j
= αk1 = 1 = α k+1, j−1 + αkj
(j=2,3,…,n)
(14)
利 用 递 推 公 式 ( 11 ) 和 ( 14 ) 可 以 求 出 各 重 循 环 中 各 层 循 环 次 数 的 表 达 式 。 例 如 六 重 循 环 中 的第六层循环次数 M66 可通过其第五层循环次数 M65 求得。由式(11)和式(10)有
i =1
i =1
i =1
(3)
n
n −1
2
∑ ∑ ∑ 第四层循环的循环次数:M44= i +2 i +…+(n-1) i +n
i =1
i =1
i =1
(4)
总的指令执行次数还应考虑压栈及弹出指令的执行次数。在整个子程序运行过程中,第①、
⑨、⑩行指令执行的次数同为 M41 次;第②、⑦、⑧行同为 M42 次;第③、⑤、⑥行同为 M43 次。
循环指令(第⑥行),使 R2=n-1。程序再转而执行第③行,使压入堆栈内的 R2=n-1,接着第二次
执行第四层循环指令第④行 n-1 次到 R2=0。弹出堆栈指令第⑤行恢复第③行压入的 R2=n-1,第二
次执行第三层循环指令第⑥行,使 R2=n-2,此值决定第三次执行第四层循环指令的次数。于是,
在第三层循环指令③到⑥行执行过程中,第四层循环指令各次循环执行的次数将从 n 依次减 1,
第 17 卷 第 3· 4 期
四川理工学院学报(自然科学版)
JOURNAL OF SICHUAN UNIVERSITY OF
2004 年 12 月
SCIENCE & ENGINEERING(NATURAL SCIENCE EDITION)
文章编号:1008-438X(2004)03·04-0001-05
n
2 n−1
n−1 2
n
∑ ∑ ∑ ∑ ∑ ∑ M65= M55=1× i + i i +…+ i i + i ×1 (q=6,k=5)
i =1
i=1 i=1
i=1 i=1
i =1
(15)
再由式(14)可得
n
2
n −1
2
n−1
2
n
M66=1× ∑i + (1 + ∑i) ∑i +…+ (1 + ∑i + L +∑i) ∑i + (1 + L + ∑i) ×1
i =1
i=1 i=1
i=1 i=1
i =1
(10)
研究表明,循环重数相临的各层循环次数与上述四、五重循环有相同的规律。循环重数多的 各层循环次数,包含了循环重数较少的各层循环次数,需要计算的仅仅是第 q 层的循环次数。对 比式(1)到(4)与式(6)到(9)可得到相临循环重数,除第 q 层之外各层循环次数的递推公 式如下:
i =1
i=1 i=1
1
i=1 i=1
i =1
(16)
q 重循环总的指令执行次数 Mq 为
q−1
∑ Mq=Mqq+3 M qk k =1
(17)
对于 MCS-51,堆栈延时子程序段中各条指令的执行时间都是两个机器周期,因而延时时间可 计算为
4
四川理工学院学报(自然科学版)
2004 年 12 月
T= 2 ×
收稿日期:2004-05-27 作者简介:郭天石(1944-),男,四川人, 教授, 主要从事控)
2004 年 12 月
设循环重数为 q,各层循环次数为 Mqk(k=1,2,…,q)如程序注释所示。当调用子程序执行循环时, 第四层循环指令(第④行)将重复执行 n 次到 R2=0.然后弹出堆栈恢复 R2 的值 n,接着执行第三层
参 考 文 献:
[1] 赵长德. MCS-51/98 单片机原理与应用[M]. 北京: 清华大学出版社, 1997. [2] 刘守义. 单片机应用技术[M]. 西安: 西安电子科技大学出版社, 2002. [3] 房小翠,王金凤. 单片机实用系统设计技术[M]. 北京: 国防工业出版社, 1999.
⎧M q1 = n
⎨ ⎩M q,k
=
M q−1,k
(k = 2,3,L, q − 1)
(11)
求取第 q 层循环次数需要建立另外的递推公式。从上述四重五重循环次数的表达式可以看出, 除最外层循环次数的表达式 Mq1 不含求和运算之外,其于各层循环次数都需要进行求和运算,而 且都可以表达成对循环初值 n 依次递减求和后再累加的形式,只是各求和项前面的系数不同而已。 下面导出 q 重循环中各求和项系数的递推公式。
9 9 45 165 495 1287 3003 6435 12870 24310 43758 277113 1108452
10 10 55 220 715 2002 5005 11440 24310 48620 92378 554245 2216980
20
30
20
30
210
465
1540
4960
8855
于是,该四重堆栈延时子程序总的指令执行次数 M4 为 M4=M44+3(M43+M42+M41)
(5)
(2)循环次数的递推公式
为导出递推公式,再给出五重循环中,各相应层的循环次数表达式如下: M51= M41 = n
n
∑ M52= M42 = i i =1
(6) (7)
n
n −1
2
∑ ∑ ∑ M53= M43 = i + i +…+ i +1
40920
42504
278256
177100 1623160
657800 8347680
2220075 38608020
6906900 163011640
20030010 635745396
90135002 2542981521
360540008 10171926084
4结语
MCS-51/96 单片机延时子程序段在实际中应用广泛。在理论上, 使用循环指令子程序可以获 得任意长的延时时间,编程也很简单。但这是依靠耗费 CPU 机时而获得的。对上述计算值,在启 东达爱思计算机有限公司生产的“Dais-958PH+”型单片机开发实验装置上进行不同循环重数,不 同循环初值的运行测试,所得各层循环次数、循环总次数及延时时间都与实验值一致。
6 6 21 56 126 252 462 792 1287 2002 3003 24009 96036
7 7 28 84 210 462 924 1716 3003 5005 8008 58327 233308
8 8 36 120 330 792 1716 3432 6435 11440 19448 131255 525020
Vol.17 No. 3· 4 Dec.2004
MCS-51/96 单片机堆栈延时子程序的延时计算
郭天石
(四川理工学院机电工程系, 四川 自贡 643000)
摘 要:提出了在 MCS-51/96 系列单片机中使用堆栈子程序,利用循环指令进行延时的延时
计算公式及计算程序,计算结果与实验一致。
关键词:单片机;延时;堆栈;子程序
syms k n N %进入 MATLAB 的符号运算 n=5; M8=0;M7=0;M6=0;M5=0;M4=0;M3=0;M2=0;M1=0;a1=0;a2=0;a3=0; M1=n; M2=symsum(k,0,n); for i=0:n;
A=symsum(k,0,i); M3=M3+A; M4=M4+(n-i+1)*A; A1=symsum(k,0,n-i+1); M5=M5+A*A1; a1=a1+A; M6=M6+a1*A1; a2=a2+a1; M7=M7+a2*A1; a3=a3+a2; M8=M8+a3*A1; if i>=n, end, i=i+1; end M=M8+3*(M7+M6+M5+M4+M3+M2+M1); tm=4*M; %循环时间计算,仅对 MCS-51 系列,晶振频率为 6MHz,单位为微秒 [M1 M2 M3 M4 M5 M6 M7 M8 M tm]
中图分类号:TP272 ;TP273
文献标识码:A
1 问题的提出
MCS-51/96 系列单片机[1]是目前国内广泛使用的主流单片机型,在其开发中经常使用延时子程 序段。众所周知,单片机延时通常有两种方法:第一,使用片内或片外定时器延时;第二,采用 循环指令进行多重循环,通过耗费 CPU 机时产生延时。在第二种方法中,延时时间等于指令执行 时间与指令循环次数的乘积,其中循环次数由循环重数及循环初值共同决定,是需要计算的延时 变量。在使用数据传输指令和循环指令构成延时程序段时,循环次数计算十分简单,但在使用堆 栈技术构成延时子程序段时,循环次数在各层循环中将发生变化,而且,随着循环重数的不同, 各层循环次数的表达式也不同。本文将研究堆栈延时子程序段的延时特点,给出其延时计算公式 及计算程序。
相关文档
最新文档