找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 68034|回复: 107
打印 上一主题 下一主题
收起左侧

5课:单片机延时程序分析

  [复制链接]
跳转到指定楼层
楼主
ID:1 发表于 2013-5-21 02:48 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
上一次课中,我们已经知道,程序中的符号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课:单片机并行口结构

评分

参与人数 6黑币 +33 收起 理由
zbfdyw + 8 简单明了,初步学习好资料!感谢admin,感.
水木易安 + 5 赞一个!
yida1698 + 5 赞一个!
路神 + 5 很给力!
么么小辉 + 5 很给力!
chen_zhouge + 5 很给力!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏9 分享淘帖 顶10 踩
回复

使用道具 举报

沙发
ID:49404 发表于 2013-5-25 21:46 | 只看该作者

回帖奖励 +2

延时怎么不计算跟精确一点?更精确是125751us
回复

使用道具 举报

板凳
ID:53820 发表于 2013-8-31 09:25 | 只看该作者
谢谢分享!!!!!
回复

使用道具 举报

地板
ID:46675 发表于 2013-11-20 16:33 | 只看该作者
谢谢分享
回复

使用道具 举报

5#
ID:58052 发表于 2013-12-19 22:54 | 只看该作者
不错!很好
回复

使用道具 举报

6#
ID:58513 发表于 2014-1-3 19:58 | 只看该作者
很详细,很全面,有汇编,有C语言,但有点转不过来(原因 要学汇编,要学C 语言)
回复

使用道具 举报

7#
ID:56867 发表于 2014-3-6 19:43 | 只看该作者
对我的论文写作很有帮助。
回复

使用道具 举报

8#
ID:59837 发表于 2014-3-20 17:16 | 只看该作者
我们设所用晶体震荡器为12M,则一个机器周期就是1微秒      这个·怎么算??
回复

使用道具 举报

9#
ID:59853 发表于 2014-3-20 21:26 | 只看该作者
厉害厉害
回复

使用道具 举报

10#
ID:59987 发表于 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)互为倒数的原因。
我说的不好的地方,希望大家批评指正。
回复

使用道具 举报

11#
ID:59987 发表于 2014-4-5 13:53 | 只看该作者
复位电路不是很清楚
回复

使用道具 举报

12#
ID:60228 发表于 2014-4-18 11:47 | 只看该作者
单片机上电是直流5v电压,电容不是隔直通交吗?为什么一上电电容就短路了?当电容充完电之后不用放电吗?复位电路还是有点不懂,希望楼主能给点建议,谢谢。
回复

使用道具 举报

13#
ID:64206 发表于 2014-7-22 10:27 | 只看该作者
感谢楼主
回复

使用道具 举报

14#
ID:64543 发表于 2014-7-29 20:15 | 只看该作者
谢谢分享!!!!!
回复

使用道具 举报

15#
ID:64634 发表于 2014-8-6 23:49 | 只看该作者
不太懂
回复

使用道具 举报

16#
ID:64634 发表于 2014-8-7 12:48 | 只看该作者
不太懂
回复

使用道具 举报

17#
ID:69838 发表于 2014-12-3 20:14 | 只看该作者
lixichunedu 发表于 2014-4-5 12:46
12MHZ的晶体振荡器  意味着这个晶体振荡器1秒钟震荡12000000次,也就是12000000个(高一下低一下),也就 ...

你这么一解释,我就明白了
回复

使用道具 举报

18#
ID:70004 发表于 2014-12-5 21:17 | 只看该作者
大师的深入浅出的讲解
回复

使用道具 举报

19#
ID:70249 发表于 2014-12-10 16:04 | 只看该作者
ivmmcu 发表于 2014-4-18 11:47
单片机上电是直流5v电压,电容不是隔直通交吗?为什么一上电电容就短路了?当电容充完电之后不用放电吗?复 ...

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

使用道具 举报

20#
ID:70294 发表于 2014-12-12 13:24 | 只看该作者
Soar_C 发表于 2014-12-10 16:04
学过电路原理大家就知道,图示电容的两端电压是逐渐从0V慢慢增长到稳定状态时的电压5V的,而不是直接跃变 ...

还是不明白,RST引脚上的5V电压是哪里来的?
回复

使用道具 举报

21#
ID:67837 发表于 2014-12-16 21:08 | 只看该作者
努力学习中
回复

使用道具 举报

22#
ID:70525 发表于 2014-12-18 20:01 | 只看该作者
初学者                 
回复

使用道具 举报

23#
ID:70104 发表于 2014-12-20 12:28 | 只看该作者
学习了
回复

使用道具 举报

24#
ID:71621 发表于 2015-1-16 22:07 来自手机 | 只看该作者
我觉得这个教程讲解得深入浅出!赞一个!
回复

使用道具 举报

25#
ID:71621 发表于 2015-1-16 22:07 来自手机 | 只看该作者
多好的教程,相见恨晚啊!
回复

使用道具 举报

26#
ID:72479 发表于 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

明显闪烁慢了很多。


回复

使用道具 举报

27#
ID:75710 发表于 2015-3-30 20:30 | 只看该作者
对于正在学单片机的我来说,帮助很大,谢谢分享~\(≧▽≦)/~。。
回复

使用道具 举报

28#
ID:75791 发表于 2015-4-1 10:21 | 只看该作者
感谢分享!
回复

使用道具 举报

29#
ID:77323 发表于 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)

满了吗?
回复

使用道具 举报

30#
ID:77323 发表于 2015-4-18 10:38 | 只看该作者
真的很好,真心的
回复

使用道具 举报

31#
ID:78174 发表于 2015-4-29 22:49 | 只看该作者
谢谢分享
回复

使用道具 举报

32#
ID:78483 发表于 2015-5-5 16:57 | 只看该作者
ivmmcu 发表于 2014-4-18 11:47
单片机上电是直流5v电压,电容不是隔直通交吗?为什么一上电电容就短路了?当电容充完电之后不用放电吗?复 ...

在直流电刚上电时,电容上是有电子移动产生电流的 ,当电容充电完成后相当断路
回复

使用道具 举报

33#
ID:82423 发表于 2015-6-8 19:11 | 只看该作者
时序逻辑电路是什么
回复

使用道具 举报

34#
ID:82423 发表于 2015-6-8 19:11 | 只看该作者
看不懂啊怎么办
回复

使用道具 举报

35#
ID:84645 发表于 2015-7-4 11:28 | 只看该作者
看的我手痒痒的
回复

使用道具 举报

36#
ID:86884 发表于 2015-7-28 08:26 | 只看该作者
赞,刚开始学习单片机借了好多书发现都云里雾里的,这个资料感觉棒极了,以前C语言虽然学了,但糊里糊涂的,现在和汇编语言放一块感觉慢慢理解了,太棒了,谢谢楼主!!!!
回复

使用道具 举报

37#
ID:87812 发表于 2015-8-7 13:44 | 只看该作者
ouyase 发表于 2014-12-12 13:24
**** 作者被禁止或删除 内容自动屏蔽 ****

我个人觉得应该是 VCC
回复

使用道具 举报

38#
ID:87812 发表于 2015-8-7 13:46 | 只看该作者
eject2015 发表于 2015-5-5 16:57
在直流电刚上电时,电容上是有电子移动产生电流的 ,当电容充电完成后相当断路

只有在充满电后才 断开? 没电的 时候 可以理解通路?
回复

使用道具 举报

39#
ID:88716 发表于 2015-8-22 17:34 来自手机 | 只看该作者
菜菜鸟爱单片机 发表于 2014-3-20 17:16
**** 作者被禁止或删除 内容自动屏蔽 ****

t=(1/12)×12=1

评分

参与人数 1威望 +5 黑币 +5 收起 理由
美丽人生美 + 5 + 5

查看全部评分

回复

使用道具 举报

40#
ID:89591 发表于 2015-10-8 12:00 | 只看该作者
silverdj 发表于 2015-8-7 13:46
只有在充满电后才 断开? 没电的 时候 可以理解通路?

电容的特性可以理解为隔直通交,当直流电加在其两端时,其两端电压会缓慢上升,直到等于输入电压,然后由于电容的储能特性(相当于水缸存满了水),假设现在电容两端是上正下负,由于直流电方向不变,所以当其存满电之后,电路中就没有电流流动了(只能从上面加水).但交流电由于方向在不断变化,相当于形成了通路(现在下面也有了口,可以放水了),所以说通交.
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表