当前位置:
文档之家› MCS_51_96单片机堆栈延时子程序的延时计算
MCS_51_96单片机堆栈延时子程序的延时计算
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 机时产生延时。在第二种方法中,延时时间等于指令执行 时间与指令循环次数的乘积,其中循环次数由循环重数及循环初值共同决定,是需要计算的延时 变量。在使用数据传输指令和循环指令构成延时程序段时,循环次数计算十分简单,但在使用堆 栈技术构成延时子程序段时,循环次数在各层循环中将发生变化,而且,随着循环重数的不同, 各层循环次数的表达式也不同。本文将研究堆栈延时子程序段的延时特点,给出其延时计算公式 及计算程序。