标题: 5课:单片机延时程序分析 [打印本页]

作者: admin    时间: 2013-5-21 02:48
标题: 5课:单片机延时程序分析
上一次课中,我们已经知道,程序中的符号R7、R6是代表了一个个的RAM单元,是用来放一些数据的,下面我们再来看一下其它符号的含义。
DELAY:   MOV R7,#250   ;(6)
D1:   MOV R6,#250      ;(7)
D2:   DJNZ R6,D2      ;(8)
DJNZ R7,D1            ;(9)   
RET                ;(10)

〈单片机延时程序〉
  MOV:这是一条指令,意思是传递数据。说到传递,我们都很清楚,传东西要从一本人的手上传到另一本人的手上,也就是说要有一个接受者,一个传递者和一样东西。从指令MOV R7,#250中来分析,R7是一个接受者,250是被传递的数,传递者在这条指令中被省略了(注意:并不是每一条传递指令都会省的,事实上大部份数据传递指令都会有传递者)。它的意义也很明显:将数据250送到R7中去,因此执行完这条指令后,R7单元中的值就应当是250。在250前面有个#号,这又是什么意思呢?这个#就是用来说明250就是一个被传递的东西本身,而不是传递者。那么MOV R6,#250是什么意思,应当不用分析了吧。
  DJNZ:这是另一条指令,我们来看一下这条指令后面跟着的两个东西,一个是R6,一个是D2,R6我们当然已知是什么了,查一下D2是什么。D2在本行的前面,我们已学过,这称之为标号。标号的用途是什么呢?就是给本行起一个名字。DJNZ指令的执行过程是这样的,它将其后面的第一个参数中的值减1,然后看一下,这个值是否等于0,如果等于0,就往下执行,如果不等于0,就转移,转到什么地方去呢?可能大家已猜到了,转到第二个参数所指定的地方去(请大家用自已的话讲一下这条语句是怎样执行的)。本条指令的最终执行结果就是,在原地转圈250次。
  执行完了DJNZ R6,D2之后(也就是R6的值等于0之后),就会去执行下面一行,也就是DJNZ R7,D1,请大家自行分析一下这句话执行的结果。(转去执行MOV R6,#250,同时R7中的值减1),最终DJNZ R6,D2这句话将被执行250*250=62500次,执行这么多次同一条指令干吗?就是为了延时。
一个问题:如果在R6中放入0,会有什么样的结果。
二、时序分析:
  前面我们介绍了延时程序,但这还不完善,因为,我们只知道DJNZ R6,D2这句话会被执行62500次,但是执行这么多次需要多长时间呢?是否满足我们的要求呢?我们还不知道,所以下面要来解决这个问题。
  先提一个问题:我们学校里什么是最重要的。(铃声)校长能出差,老师能休息,但学校一日无铃声必定大乱。整个学校就是在铃声的统一指挥下,步调一致,统一协调地工作着。这个铃是按一定的时间安排来响的,我们能称之为“时序��时间的次序”。一个由人组成的单位尚且要有一定的时序,计算机当然更要有严格的时序。事实上,计算机更象一个大钟,什么时候分针动,什么时候秒针动,什么时候时针动,都有严格的规定,一点也不能乱。计算机要完成的事更复杂,所以它的时序也更复杂。
  我们已知,计算机工作时,是一条一条地从ROM中取指令,然后一步一步地执行,我们规定:计算机访问一次存储器的时间,称之为一个机器周期。这是一个时间基准,好象我们人用“秒”作为我们的时间基准一样,为什么不干脆用“秒”,多好,很习惯,学下去我们就会知道用“秒”反而不习惯。
一个机器周期包括12个时钟周期。下面让我们算一下一个机器周期是多长时间吧。设一个单片机工作于12M晶体震荡器,它的时钟周期是1/12(微秒)。它的一个机器周期是12*(1/12)也就是1微秒。(请计算一个工作于6M晶体震荡器的单片机,它的机器周期是多少)。
  MCS-51单片机的所有指令中,有一些完成得比较快,只要一个机器周期就行了,有一些完成得比较慢,得要2个机器周期,还有两条指令要4个机器周期才行。这也不难再解,不是吗?我让你扫地的执行要完成总得比要你完成擦黑板的指令时间要长。为了恒量指令执行时间的长短,又引入一个新的概念:指令周期。所谓指令周期就是指执行一条指令的时间。INTEL对每一条指令都给出了它的指令周期数,这些数据,大部份不需要我们去记忆,但是有一些指令是需要记住的,如DJNZ指令是双周期指令。
  下面让我们来计算刚才的延时。首先必须要知道晶体震荡器的频率,我们设所用晶体震荡器为12M,则一个机器周期就是1微秒。而DJNZ指令是双周期指令,所以执行一次要2个微秒。一共执行62500次,正好125000微秒,也就是125毫秒。
如果你对上面几句还是不懂请看这里的详解:http://www.51hei.com/mcu/1247.html
关于用C语言写延时函数的详解请看这:http://www.51hei.com/mcu/710.html
练习:设计一个延时100毫秒的延时程序。
要点分析:1、一个单元中的数是否能超过255。2、如何分配两个数。
三、复位电路
一、复位方式
⒈ 复位条件
        RST引脚保持2个机器周期以上的高电平。
⒉ 复位电路

〈单片机复位电路〉
⒊ 复位后CPU状态
       PC:  0000H         TMOD: 00H
       Acc: 00H           TCON: 00H
       B:   00H           TH0:  00H
       PSW: 00H           TL0:  00H
       SP:  07H           TH1:  00H
       DPTR:0000H         TL1:  00H
       P0~P3:FFH         SCON: 00H
       IP:×××00000B    SBUF: 不定
       IE:0××00000B     PCON: 0×××0000B
  任何单片机在工作之前都要有个复位的过程,复位是什么意思呢?它就象是我们上课之前打的预备铃。预备铃一响,大家就自动地从操场、其它地方进入教室了,在这一段时间里,是没有老师干预的,对单片机来说,是程序还没有开始执行,是在做准备工作。显然,准备工作不需要太长的时间,复位只需要5ms的时间就能了。如何进行复位呢?只要在单片机的RST管脚上加上高电平,就能了,按上面所说,时间不少于5ms。为了达到这个要求,能用很多种办法,这里供给一种供参考,见图1。实际上,我们在上一次实验的图中已见到过了。
  这种复位电路的工作原理是:通电时,电容两端相当于是短路,于是RST管脚上为高电平,然后电源通过电阻对电容充电,RST端电压慢慢下降,降到一定程序,即为低电平,单片机开始正常工作。

下一课:6课:单片机并行口结构


作者: 阿格拉瑞    时间: 2013-5-25 21:46
延时怎么不计算跟精确一点?更精确是125751us
作者: c2y3h2    时间: 2013-8-31 09:25
谢谢分享!!!!!
作者: xksok    时间: 2013-11-20 16:33
谢谢分享
作者: 云往这边飘    时间: 2013-12-19 22:54
不错!很好
作者: 曾经有过    时间: 2014-1-3 19:58
很详细,很全面,有汇编,有C语言,但有点转不过来(原因 要学汇编,要学C 语言)
作者: 鳏寡孤独    时间: 2014-3-6 19:43
对我的论文写作很有帮助。
作者: 菜菜鸟爱单片机    时间: 2014-3-20 17:16
我们设所用晶体震荡器为12M,则一个机器周期就是1微秒      这个·怎么算??
作者: happy5027    时间: 2014-3-20 21:26
厉害厉害
作者: lixichunedu    时间: 2014-4-5 12:46
菜菜鸟爱单片机 发表于 2014-3-20 17:16
我们设所用晶体震荡器为12M,则一个机器周期就是1微秒      这个·怎么算??

12MHZ的晶体振荡器  意味着这个晶体振荡器1秒钟震荡12000000次,也就是12000000个(高一下低一下),也就是脉冲。震荡1次消耗的时间(也就是时钟周期,其实就是换了个名称)是
(1秒)/12000000=0.0000000833333333(秒),
一个机器周期=12个时钟周期(规定的)
一个机器周期=12*0.000000083333333(秒)=0.000001(秒)=1(微秒)。
实际上计算不是这么复杂的。
楼主说 6MHZ的晶振的机器周期是多少?
我是这么计算的
12*(1/6)       =   2us.
         M 的倒数  = us 微
其实 单位量纲中的 兆(M)和 微(us)互为倒数的原因。
我说的不好的地方,希望大家批评指正。
作者: lixichunedu    时间: 2014-4-5 13:53
复位电路不是很清楚
作者: ivmmcu    时间: 2014-4-18 11:47
单片机上电是直流5v电压,电容不是隔直通交吗?为什么一上电电容就短路了?当电容充完电之后不用放电吗?复位电路还是有点不懂,希望楼主能给点建议,谢谢。
作者: 亭子    时间: 2014-7-22 10:27
感谢楼主
作者: impel    时间: 2014-7-29 20:15
谢谢分享!!!!!
作者: 麟01    时间: 2014-8-6 23:49
不太懂
作者: 麟01    时间: 2014-8-7 12:48
不太懂
作者: 清水    时间: 2014-12-3 20:14
lixichunedu 发表于 2014-4-5 12:46
12MHZ的晶体振荡器  意味着这个晶体振荡器1秒钟震荡12000000次,也就是12000000个(高一下低一下),也就 ...

你这么一解释,我就明白了
作者: jiashun    时间: 2014-12-5 21:17
大师的深入浅出的讲解
作者: Soar_C    时间: 2014-12-10 16:04
ivmmcu 发表于 2014-4-18 11:47
单片机上电是直流5v电压,电容不是隔直通交吗?为什么一上电电容就短路了?当电容充完电之后不用放电吗?复 ...

学过电路原理大家就知道,图示电容的两端电压是逐渐从0V慢慢增长到稳定状态时的电压5V的,而不是直接跃变到5v。也就是说RST引脚的电压是从5V逐渐降到0v的。假设单片机认为大于3V为高电平,也就是只要使RST引脚从5V降到3V的时间大于两个机器周期的话,单片机就复位。右边的图同理。因为这个时间与电阻、电容大小有关,所以复位电路中电阻值、电容值要精心选择。
作者: ouyase    时间: 2014-12-12 13:24
Soar_C 发表于 2014-12-10 16:04
学过电路原理大家就知道,图示电容的两端电压是逐渐从0V慢慢增长到稳定状态时的电压5V的,而不是直接跃变 ...

还是不明白,RST引脚上的5V电压是哪里来的?
作者: yjj2011    时间: 2014-12-16 21:08
努力学习中
作者: ardu    时间: 2014-12-18 20:01
初学者                 
作者: pps111    时间: 2014-12-20 12:28
学习了
作者: yyphone    时间: 2015-1-16 22:07
我觉得这个教程讲解得深入浅出!赞一个!
作者: yyphone    时间: 2015-1-16 22:07
多好的教程,相见恨晚啊!
作者: 我就要飞刀    时间: 2015-1-20 17:07
本帖最后由 我就要飞刀 于 2015-1-20 17:15 编辑

DELAY:   MOV R7,#250   ;(6)
D1:   MOV R6,#250      ;(7)
D2:   DJNZ R6,D2      ;(8)
DJNZ R7,D1            ;(9)   
RE
按老师提示,我把这段改了一下
DELAY: MOV R7,#250 ;(6)
D1: MOV R6,#0   ;(7)
D2: DJNZ R6,D2     ;(8)
       DJNZ R7,D1  ;(9)
  好象看起来变化不大
再改成这样:
DELAY: MOV R7,#1 ;(6)
D1: MOV R6,#250  ;(7)
D2: DJNZ R6,D2     ;(8)
       DJNZ R7,D1

明显闪烁慢了很多。



作者: dimozun    时间: 2015-3-30 20:30
对于正在学单片机的我来说,帮助很大,谢谢分享~\(≧▽≦)/~。。
作者: b4082    时间: 2015-4-1 10:21
感谢分享!
作者: 崔三爷    时间: 2015-4-18 10:38
我就要飞刀 发表于 2015-1-20 17:07
DELAY:   MOV R7,#250   ;(6)
D1:   MOV R6,#250      ;(7)
D2:   DJNZ R6,D2      ;(8)

满了吗?
作者: 崔三爷    时间: 2015-4-18 10:38
真的很好,真心的
作者: cikesheshou    时间: 2015-4-29 22:49
谢谢分享
作者: eject2015    时间: 2015-5-5 16:57
ivmmcu 发表于 2014-4-18 11:47
单片机上电是直流5v电压,电容不是隔直通交吗?为什么一上电电容就短路了?当电容充完电之后不用放电吗?复 ...

在直流电刚上电时,电容上是有电子移动产生电流的 ,当电容充电完成后相当断路
作者: 高佳篷    时间: 2015-6-8 19:11
时序逻辑电路是什么
作者: 高佳篷    时间: 2015-6-8 19:11
看不懂啊怎么办
作者: yangsb6717    时间: 2015-7-4 11:28
看的我手痒痒的
作者: 白鹤859    时间: 2015-7-28 08:26
赞,刚开始学习单片机借了好多书发现都云里雾里的,这个资料感觉棒极了,以前C语言虽然学了,但糊里糊涂的,现在和汇编语言放一块感觉慢慢理解了,太棒了,谢谢楼主!!!!
作者: silverdj    时间: 2015-8-7 13:44
ouyase 发表于 2014-12-12 13:24
**** 作者被禁止或删除 内容自动屏蔽 ****

我个人觉得应该是 VCC
作者: silverdj    时间: 2015-8-7 13:46
eject2015 发表于 2015-5-5 16:57
在直流电刚上电时,电容上是有电子移动产生电流的 ,当电容充电完成后相当断路

只有在充满电后才 断开? 没电的 时候 可以理解通路?
作者: hzb123    时间: 2015-8-22 17:34
菜菜鸟爱单片机 发表于 2014-3-20 17:16
**** 作者被禁止或删除 内容自动屏蔽 ****

t=(1/12)×12=1
作者: wcx6270    时间: 2015-10-8 12:00
silverdj 发表于 2015-8-7 13:46
只有在充满电后才 断开? 没电的 时候 可以理解通路?

电容的特性可以理解为隔直通交,当直流电加在其两端时,其两端电压会缓慢上升,直到等于输入电压,然后由于电容的储能特性(相当于水缸存满了水),假设现在电容两端是上正下负,由于直流电方向不变,所以当其存满电之后,电路中就没有电流流动了(只能从上面加水).但交流电由于方向在不断变化,相当于形成了通路(现在下面也有了口,可以放水了),所以说通交.
作者: somexu    时间: 2015-10-16 10:40
學些了,講的不錯
作者: Demon_H    时间: 2016-4-20 11:50
感谢分享
作者: likemanweb    时间: 2016-5-12 16:11
250  200
作者: 251495979    时间: 2016-5-26 09:12
那慢慢消化
作者: oleandre    时间: 2016-6-11 17:58
感谢老师!讲得通俗易懂。有些类比看了非常清楚。
作者: 1238    时间: 2016-7-17 18:34
很详细,很全面,有汇编,有C语言
作者: 592317602    时间: 2016-8-1 13:42
执行完D2行(DJNZ R6,D2)250次以后、R6为0、转去D2。不就是又是D2这一行了么?怎么会到下一行去
作者: B型血    时间: 2016-11-9 19:20
学习ing,感谢楼主
作者: B型血    时间: 2016-11-9 19:25
电容通电时候相当于短路吗?
作者: B型血    时间: 2016-11-9 19:30
silverdj 发表于 2015-8-7 13:46
只有在充满电后才 断开? 没电的 时候 可以理解通路?

确定是这样吗
作者: 初学者hex    时间: 2016-11-25 17:28
谢谢分享,课程设计帮大忙了

作者: 流星雨掉到地球    时间: 2016-11-26 18:19
学习了,谢谢
作者: 流星雨掉到地球    时间: 2016-11-26 18:19
很好,学习了
作者: durantx    时间: 2016-11-29 15:40
好东西
作者: durantx    时间: 2016-11-29 16:42
好,很好 !
作者: durantx    时间: 2016-11-30 09:24
ivmmcu 发表于 2014-4-18 11:47
单片机上电是直流5v电压,电容不是隔直通交吗?为什么一上电电容就短路了?当电容充完电之后不用放电吗?复 ...

同感!!!
作者: 随易而安    时间: 2016-12-3 21:11
学习了,慢慢来
作者: alainyyj    时间: 2016-12-12 17:20
菜菜鸟爱单片机 发表于 2014-3-20 17:16
**** 作者被禁止或删除 内容自动屏蔽 ****

晶振12M,则时钟周期为1/12M.秒
一个机器周期等于12个时钟周期=1/12M * 12=1/1000000秒即一微秒。
作者: Hosanna    时间: 2017-1-11 16:24
592317602 发表于 2016-8-1 13:42
**** 作者被禁止或删除 内容自动屏蔽 ****

  R6为0之后应该是执行下一行,R6不等于0才是转移到第二个参数指定的地方,即D2
作者: AD-Asiens    时间: 2017-2-9 09:06
能不能把练习的答案和解析也做出来,那就更完美了,有练习绝对是一大亮点,因为有了自己动手实践的机会,这是很重要的,感谢楼主吗,感谢51,能把汇编和C的程序都写出来。辛苦辛苦。
作者: AD-Asiens    时间: 2017-2-9 09:08
durantx 发表于 2016-11-30 09:24
同感!!!

我觉得错误了
作者: AD-Asiens    时间: 2017-2-9 09:15
ivmmcu 发表于 2014-4-18 11:47
单片机上电是直流5v电压,电容不是隔直通交吗?为什么一上电电容就短路了?当电容充完电之后不用放电吗?复 ...

电容加电瞬间视为短路,加电瞬间,电能类似脉冲阶跃,电能从无到有,类似交流电的上升沿。

作者: AD-Asiens    时间: 2017-2-9 09:18
ivmmcu 发表于 2014-4-18 11:47
单片机上电是直流5v电压,电容不是隔直通交吗?为什么一上电电容就短路了?当电容充完电之后不用放电吗?复 ...

这里的电阻电容选择,根据单片机需求的复位时间去选择,RC充放电时间公式去计算。这里电容式22uf,电阻是1K,所以充电时间是RC=2.2微秒>2微秒,即两个机械周期,可以维持两个机械周期的高电平所以单片机会复位。
作者: 满腹经纶    时间: 2017-3-2 09:16
2、如何分配两个数。
作者: 如花绽放明    时间: 2017-3-21 11:20
天哪,每次看不准确的延时都贼费劲,根据晶振频率不同,凑出来的数又不一样,还不会算
作者: vincetan9    时间: 2017-4-1 14:12
li hai
作者: 96008562    时间: 2017-5-3 18:00
C2作用是什么?
作者: zhangdaili    时间: 2017-5-4 16:11
复位电路的电容大小是如何确定的?是否跟电路的时间常数有关系?
作者: zhangdaili    时间: 2017-5-4 16:21
ivmmcu 发表于 2014-4-18 11:47
单片机上电是直流5v电压,电容不是隔直通交吗?为什么一上电电容就短路了?当电容充完电之后不用放电吗?复 ...

单片机上电瞬间相当于是交流电,频率为无穷大,根据隔直通交,上电瞬间电容导通,约等于电容短路,复位端出现高电平。电路后续通过串联电阻放电使复位端回到低电平。
作者: 030237    时间: 2017-5-9 11:01
什么叫一个单元中的数...
作者: arctic_michael1    时间: 2017-6-8 09:55
thanks for sharing
作者: 蓝野    时间: 2017-8-16 10:16
一个问题:如果在R6中放入0,会有什么样的结果。结果是该程序只执行250次
作者: 蓝野    时间: 2017-8-16 11:39
     RST引脚保持2个机器周期以上的高电平可以复位,是不是频率不同的晶振,这2个周期的时间也不一样呀?

作者: wuminhong    时间: 2017-8-19 10:40
ivmmcu 发表于 2014-4-18 11:47
单片机上电是直流5v电压,电容不是隔直通交吗?为什么一上电电容就短路了?当电容充完电之后不用放电吗?复 ...

电容元件的特征就是 先有电流再有电压,电容加载电源时,理论电流无限大电压零。
跟电感元件的特征刚好相反。
作者: ytxxzhi    时间: 2017-9-20 15:02

单片机上电是直流5v电压,电容不是隔直通交吗?为什么一上电电容就短路了?当电容充完电之后不用放电吗,放电如何确定正负极,
作者: ytxxzhi    时间: 2017-9-20 16:13
70楼应该是正解,按70楼讲解能多少明白点,为什么一上电就是高电平;41楼解释了程序恢复后的理解,就是当电流不动时,又恢复低电平
作者: 浩洁nice    时间: 2017-10-8 20:14
牛逼。。。。
作者: 浩洁nice    时间: 2017-10-8 20:15
不错
作者: Jackps27    时间: 2017-10-9 13:22
请大家用自已的话讲一下这条语句是怎样执行的:第(8)句就是,R6=250,执行减1,等于249,不等于0,转移到D2;此时的D2里的R6=249,减1,等于248,不等于0,转移到D2……如此以往,到底250次,R6=0,执行下一行也就是(9),而(9)也是同样的原理,转移到D1再执行D2,最终结果就是原地转圈250(R7由250每次减1减到0) x 250(R由250每次减1减到0)次
作者: Jackps27    时间: 2017-10-9 13:24
如果在R6中放入0,会有什么样的结果。 就是执行250次
作者: cnc2020    时间: 2017-10-22 23:27
不错!很好
作者: s11223    时间: 2017-10-29 00:14
很详细

很详细
作者: yatou520    时间: 2017-11-16 11:49
谢谢楼主分享的资料
作者: f13233259343    时间: 2017-12-12 16:54
Soar_C 发表于 2014-12-10 16:04
**** 作者被禁止或删除 内容自动屏蔽 ****

怎么算从5V降到3V所需要的时间?
作者: 轻730    时间: 2017-12-26 18:37
练习:DELAY: MOV R7 #199
作者: 轻730    时间: 2017-12-26 18:41
练习
DELAY: MOV R7 #199;
D1: MOV R6 #245;
D2:DJNZ R6,D2;
DJNZ R7,D1;
RET
作者: liuzclzc    时间: 2018-1-16 20:19
这节讲的命令对于相应引脚的作用和复位过程。
作者: taodongyanyan    时间: 2018-3-2 11:09
需要学习
作者: dragoars    时间: 2018-3-14 19:49
菜菜鸟爱单片机 发表于 2014-3-20 17:16
**** 作者被禁止或删除 内容自动屏蔽 ****

12MHZ 即12M次1秒,12次为1US,一个机器周期为12个时钟周期,所以一个机器周期为1US。
作者: 太阳黑子1    时间: 2018-4-12 23:11
前面哪里有讲啦R6和R7是什么?
作者: GUOXUAN    时间: 2018-4-15 10:10
感谢老师详讲延时时序.
作者: 627341504    时间: 2018-4-21 20:42
第五课,又学习了
作者: 接淅子    时间: 2018-5-21 16:56
很给力!
作者: js_iq    时间: 2018-5-21 17:31
有点懵
作者: keneng    时间: 2018-6-25 15:55
除了主贴的内容,下面回复的内容也有助于理解主贴的内容。
作者: kevina    时间: 2018-7-1 15:07
非常感想,讲的很通俗,一下子就看懂了
作者: 莲蓬16    时间: 2018-8-29 20:39
请问设计100ms的延时单元中的数分配法则是啥啊
作者: bslch    时间: 2018-9-23 17:26
楼主写程序时最好写完整的程序比如头文件等,因为只写一段程序初学者会误解的,自己写的时候照你的抄结果搞半天搞不出
作者: guanlinzhong    时间: 2018-10-10 16:06
菜菜鸟爱单片机 发表于 2014-3-20 17:16
**** 作者被禁止或删除 内容自动屏蔽 ****

一个机器周期等于12个时钟周期,12M的时钟周期等于1/12微秒,所以12M的机器周期等于1微秒
作者: lyy001    时间: 2019-3-22 06:37
简单明了,初步学习好资料!感谢admin,感.




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1