汇编延时程序讲解.docx

上传人:b****3 文档编号:4910864 上传时间:2023-05-07 格式:DOCX 页数:16 大小:19.13KB
下载 相关 举报
汇编延时程序讲解.docx_第1页
第1页 / 共16页
汇编延时程序讲解.docx_第2页
第2页 / 共16页
汇编延时程序讲解.docx_第3页
第3页 / 共16页
汇编延时程序讲解.docx_第4页
第4页 / 共16页
汇编延时程序讲解.docx_第5页
第5页 / 共16页
汇编延时程序讲解.docx_第6页
第6页 / 共16页
汇编延时程序讲解.docx_第7页
第7页 / 共16页
汇编延时程序讲解.docx_第8页
第8页 / 共16页
汇编延时程序讲解.docx_第9页
第9页 / 共16页
汇编延时程序讲解.docx_第10页
第10页 / 共16页
汇编延时程序讲解.docx_第11页
第11页 / 共16页
汇编延时程序讲解.docx_第12页
第12页 / 共16页
汇编延时程序讲解.docx_第13页
第13页 / 共16页
汇编延时程序讲解.docx_第14页
第14页 / 共16页
汇编延时程序讲解.docx_第15页
第15页 / 共16页
汇编延时程序讲解.docx_第16页
第16页 / 共16页
亲,该文档总共16页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

汇编延时程序讲解.docx

《汇编延时程序讲解.docx》由会员分享,可在线阅读,更多相关《汇编延时程序讲解.docx(16页珍藏版)》请在冰点文库上搜索。

汇编延时程序讲解.docx

汇编延时程序讲解

 延时程序在单片机编程中使用非常广泛,但一些读者在学习中不知道延时程序怎么编程,不知道机器

周期和指令周期的区别,不知道延时程序指令的用法,,本文就此问题从延时程序的基本概念、机器周期和指

令周期的区别和联系、相关指令的用法等用图解法的形式详尽的回答读者

  我们知道程序设计是单片机开发最重要的工作,而程序在执行过程中常常需要完成延时的功能。

例如

在交通灯的控制程序中,需要控制红灯亮的时间持续30秒,就可以通过延时程序来完成。

延时程序是如何

实现的呢?

下面让我们先来了解一些相关的概念。

一、机器周期和指令周期

1.机器周期是指单片机完成一个基本操作所花费的时间,一般使用微秒来计量单片机的运行速度,

51单片机的一个机器周期包括12个时钟振荡周期,也就是说如果51单片机采用12MHz晶振,那么执行

一个机器周期就只需要1μs;如果采用的是6MHz的晶振,那么执行一个机器周期就需要2μs。

  2.指令周期是指单片机执行一条指令所需要的时间,一般利用单片机的机器周期来计量指令周期。

在51单片机里有单周期指令(执行这条指令只需一个机器周期),双周期指令(执行这条指令只需要两个

机器周期),四周期指令(执行这条指令需要四个机器周期)。

除了乘、除两条指令是四周期指令,其余均

为单周期或双周期指令。

也就是说,如果51单片机采用的是12MHz晶振,那么它执行一条指令一般只需

1~2微秒的时间;如果采用的是6MH晶振,执行一条指令一般就需2~4微秒的时间。

  现在的单片机有很多种型号,但在每个型号的单片机器件手册中都会详细说明执行各种指令所需的机

器周期,了解以上概念后,那么可以依据单片机器件手册中的指令执行周期和单片机所用晶振频率来完成

需要精确延时时间的延时程序。

二、延时指令

  在单片机编程里面并没有真正的延时指令,从上面的概念中我们知道单片机每执行一条指令都需要一

定的时间,所以要达到延时的效果,只须让单片机不断地执行没有具体实际意义的指令,从而达到了延时

的效果。

1.数据传送指令MOV

  数据传送指令功能是将数据从一个地方复制、拷贝到另一个地方。

  如:

MOVR7,#80H  ;将数据80H送到寄存器R7,这时寄存器R7里面存放着80H,就单这条

指令而言并没有任何实际意义,而执行该指令则需要一个机器周期。

2.空操作指令NOP

  空操作指令功能只是让单片机执行没有意义的操作,消耗一个机器周期。

3.循环转移指令DJNZ

  循环转移指令功能是将第一个数进行减1并判断是否为0,不为0则转移到指定地点;为0则往下执行。

  如:

DJNZR7,KK;将寄存器R7的内容减1并判断寄存器R7里的内容减完1后是否为0,如果

  不为0则转移到地址标号为KK的地方;如果为0则执行下一条指令。

这条指令需要2个机器周期。

  利用以上三条指令的组合就可以比较精确地编写出所需要的延时程序。

三、1秒延时子程序、流程图及时间计算(以单片机晶振为12MHz为例,1个机器周期需要1μs)

了解了以上的内容,现在让我们来看看

程序总共所需时间:

1+10+2560+330240+660480+5120+20+2=998433μs≈1S

  在这里运行这段程序共需998433μs,还差1567μs才达到1S的,所以想要达到完美的1S延时,需

要在返回指令RET前再添加一些指令让它把1567μs的延时完成。

有兴趣的读者可以自己试着添加完成。

最后补充一点,编写程序时一般将延时程序编写成独立的子程序,而所谓子程序也就是一个实现某个功能

的小模块。

这样在主程序中就可以方便地反复调用编写好的延时子程序。

  小提示:

循环转移指令(DJNZ)除了可以给定地址标号让其跳转外,还可以将地址标号改成$,这样

程序就跳回本指令执行。

例如:

  DJNZR7,$;R7内容减1不为0,则再次执行本指令;为0则往下执行,当R7的值改为10

时,则执行完该条程序所需的时间为2*10=20μs。

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

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

  

指令周期、机器周期与时钟周期

  指令周期:

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

  时钟周期:

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

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

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

  程序分析

  例150ms延时子程序:

  DEL:

MOVR7,#200①

  DEL1:

MOVR6,#125②

  DEL2:

DJNZR6,DEL2③

  DJNZR7,DEL1④

  RET⑤

  精确延时时间为:

1+(1*200)+(2*125*200)+(2*200)+2

  =(2*125+3)*200+3⑥

  =50603μs

  ≈50ms

  由⑥整理出公式(只限上述写法)延时时间=(2*内循环+3)*外循环+3⑦

详解:

DEL这个子程序共有五条指令,现在分别就每一条指令被执行的次数和所耗时间进行分析。

  第一句:

MOVR7,#200在整个子程序中只被执行一次,且为单周期指令,所以耗时1μs

  第二句:

MOVR6,#125从②看到④只要R7-1不为0,就会返回到这句,共执行了R7次,共耗时200μs

  第三句:

DJNZR6,DEL2只要R6-1不为0,就反复执行此句(内循环R6次),又受外循环R7控制,所以共执行R6*R7次,因是双周期指令,所以耗时2*R6*R7μs。

  例21秒延时子程序:

  DEL:

MOVR7,#10①

  DEL1:

MOVR6,#200②

  DEL2:

MOVR5,#248③

  DJNZR5,$④

  DJNZR6,DEL2⑤

  DJNZR7,DEL1⑥

  RET⑦

  对每条指令进行计算得出精确延时时间为:

   1+(1*10)+(1*200*10)+(2*248*200*10)+(2*200*10)+(2*10)+2

  =[(2*248+3)*200+3]*10+3⑧

  =998033μs≈1s

  由⑧整理得:

延时时间=[(2*第一层循环+3)*第二层循环+3]*第三层循环+3⑨

  此式适用三层循环以内的程序,也验证了例1中式⑦(第三层循环相当于1)的成立。

  注意,要实现较长时间的延时,一般采用多重循环,有时会在程式序里加入NOP指令,这时公式⑨不再适用,下面举例分析。

  例3仍以1秒延时为例

  DEL:

MOVR7,#101指令周期1

  DEL1:

MOVR6,#0FFH1指令周期10

  DEL2:

MOVR5,#80H1指令周期255*10=2550

  KONG:

NOP1指令周期128*255*10=326400

  DJNZR5,$2指令周期2*128*255*10=652800

  DJNZR6,DEL22指令周期2*255*10=5110

  DJNZR7,DEL12指令周期2*10=20

  RET2

  延时时间=1+10+2550+326400+652800+5110+20+2=986893μs约为1s

  整理得:

延时时间=[(3*第一层循环+3)*第二层循环+3]*第三层循环+3⑩

  结论:

针对初学者的困惑,对汇编程序的延时算法进行了分步讲解,并就几种不同写法分别总结出相应的计算公式,只要仔细阅读例1中的详解,并用例2、例3来加深理解,一定会掌握各种类型程序的算法并加以运用。

单片机延时子程序

1)延时为:

20ms晶振12M

1+(1+2*248+2)*4+1+1+1=20000US=20MS

用汇编..优点就是精确...

缺点就是算有点复杂.

DELAY20MS:

MOVR7,#4

D1:

MOVR6,#248

DJNZR6,$

DJNZR7,D1

NOP

NOP

RET

2)一些通过计算51汇编指令得出的软延时子程序

;*****************************************************************   

;延时10uS   

;*****************************************************************   

  

time10us:

              mov    r5,#05h                ;11us   

                       djnz   r5,$   

                       ret  

  

;*****************************************************************   

;延时50uS   

;*****************************************************************   

  

time50us:

              mov    r5,#19h                ;51us   

                       djnz   r5,$   

                       ret  

  

;*****************************************************************   

;延时100uS   

;*****************************************************************   

  

time100us:

             mov    r5,#31h                ;99.6us   

                       djnz   r5,$   

                       ret  

  

;*****************************************************************   

;延时200uS   

;*****************************************************************   

  

time200us:

             mov    r5,#64h                ;201us   

                       djnz   r5,$   

                       ret  

  

;*****************************************************************   

;延时250uS   

;*****************************************************************   

  

time250us:

             mov    r5,#7ch                ;249.6us   

                       djnz   r5,$   

                       ret  

  

;*****************************************************************   

;延时350uS   

;*****************************************************************   

  

time350us:

             mov    r5,#0afh                ;351us   

time350us_1:

           djnz   r5,time350us_1   

                       ret  

  

;*****************************************************************   

;延时500uS   

;*****************************************************************   

  

time500us:

             mov    r5,#0fah                ;501us   

time500us_1:

           djnz   r5,time500us_1   

                       ret  

  

;*****************************************************************   

;延时1mS   

;*****************************************************************   

  

time1ms:

               mov    r5,#0fah               ;1001us   

time1ms_1:

             nop  

                       nop  

                       djnz   r5,time1ms_1   

                       ret  

  

;*****************************************************************   

;延时2.5mS   

;*****************************************************************   

  

time2_5ms:

             mov    r5,#05h         ;2.496ms   

time2_5ms_1:

           mov    r6,#0f8h        ;497us   

                       djnz   r6,$   

                       djnz   r5,time2_5ms_1   

                       ret  

  

;*****************************************************************   

;延时10mS   

;*****************************************************************   

  

time10ms:

              mov   r5,#14h        ;10.262ms   

time10ms_1:

            mov   r6,#0ffh       ;511us   

                       djnz  r6,$   

                       djnz  r5,time10ms_1   

                       ret  

  

;*****************************************************************   

;延时50mS   

;*****************************************************************   

  

time50ms:

              mov   r5,#63h        ;49.996ms   

time50ms_1:

            mov   r6,#0fbh       ;503us   

                       djnz  r6,$   

                       djnz  r5,time50ms_1   

                       ret  

  

;*****************************************************************   

;延时100mS   

;*****************************************************************   

  

time100ms:

             mov    r5,#0c3h       ;100.036ms   

time100ms_1:

           mov    r6,#0ffh       ;511us   

                       djnz   r6,$   

                       djnz   r5,time100ms_1   

                       ret  

  

;*****************************************************************   

;延时200mS   

;*****************************************************************   

  

time200ms:

             mov    r5,#02h        ;250.351ms   

time200ms_1:

           mov    r6,#0f4h       ;125.173ms   

time200ms_2:

           mov    r7,#0ffh       ;511us   

                       djnz   r7,$   

                       djnz   r6,time200ms_2   

                       djnz   r5,time200ms_1   

                       ret  

  

;*****************************************************************   

;延时500mS   

;*****************************************************************   

  

time500ms:

             mov   r5,#04h        ;500.701ms   

time500ms_1:

           mov   r6,#0f4h       ;125.173ms   

time500ms_2:

           mov   r7,#0ffh       ;511us   

                       djnz  r7,$   

                       djnz  r6,time500ms_2   

                       djnz  r5,time500ms_1   

                       ret  

  

;*****************************************************************   

;延时1S   

;*****************************************************************   

  

time1s:

                mov   r5,#08h        ;1001.401ms   

time1s_1:

              mov   r6,#0f4h       ;125.173ms   

time1s_2:

              mov   r7,#0ffh       ;511us   

                       djnz  r7,$   

                       djnz  r6,time1s_2   

                       djnz  r5,time1s_1   

                       ret

12M晶振 机器周期为1US  NOP为单周期指令 DJNZ为双周期指令.

3)

;;晶振12MHZ,延时1秒  

   

   

   

DELAY:

MOV  72H,#100  

LOOP3:

MOV  71H,#100  

LOOP1:

MOV  70H,#47  

LOOP0:

DJNZ  70H,LOOP0  

             NOP    

             DJNZ  71H,LOOP1  

             MOV  70H,#46  

LOOP2:

DJNZ  70H,LOOP2  

             NOP  

             DJNZ  72H,LOOP3  

             MOV  70H,#48  

LOOP4:

DJNZ  70H,LOOP4

4);延时1分钟子程序,F=6MHz

;程序已测过,延时时间60,000,000.0uS

delay60s:

movr3,#228

        movr2,#253

        movr1,#219

loop1:

  djnzr1,$

        djnzr2,loop1

        djnzr3,loop1

        nop

        ret

5)计算机反复执行一段程序以达到延时的目的称为软件延时,单片机程序中经常需要短时间的延时,但是相当一部分人对延时程序很模糊,对延时程序的算法不够了解,在这里我以12MHz晶振和两个经典延

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2