您的位置 首页 分销

谈谈51单片机延时子程序

延时程序在单片机编程中使用非常广泛,但一些读者在学习中不知道延时程序怎么编程,不知道机器周期和指令周期的区别,不知道延时程序指令的用

延时程序在单片机编程中运用十分广泛,但一些读者在学习中不知道延时程序怎样编程,不知道机器

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

令周期的差异和联络、相关指令的用法等用图解法的方式翔实的答复读者

咱们知道程序设计是单片机开发最重要的作业,而程序在履行过程中常常需求完结延时的功用。例如

在交通灯的操控程序中,需求操控红灯亮的时刻继续30秒,就能够经过延时程序来完结。延时程序是怎么

完结的呢?下面让咱们先来了解一些相关的概念。

一、机器周期和指令周期

1.机器周期是指单片机完结一个根本操作所花费的时刻,一般运用微秒来计量单片机的运转速度,

51 单片机的一个机器周期包括12 个时钟振动周期,也便是说假如51 单片机选用12MHz 晶振,那么履行

一个机器周期就只需求1μs;假如选用的是6MHz 的晶振,那么履行一个机器周期就需求2 μs。

2 .指令周期是指单片机履行一条指令所需求的时刻,一般使用单片机的机器周期来计量指令周期。

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

机器周期),四周期指令(履行这条指令需求四个机器周期)。除了乘、除两条指令是四周期指令,其他均

为单周期或双周期指令。也便是说,假如51 单片机选用的是12MHz 晶振,那么它履行一条指令一般只需

1~2 微秒的时刻;假如选用的是6MH 晶振,履行一条指令一般就需2~4 微秒的时刻。

现在的单片机有很多种类型,但在每个类型的单片机器材手册中都会具体阐明履行各种指令所需的机

器周期,了解以上概念后,那么能够根据单片机器材手册中的指令履行周期和单片机所用晶振频率来完结

需求准确延时时刻的延时程序。

二、延时指令

在单片机编程里边并没有真实的延时指令,从上面的概念中咱们知道单片机每履行一条指令都需求一

定的时刻,所以要到达延时的作用,只须让单片机不断地履行没有具体实际意义的指令,然后到达了延时

的作用。

1.数据传送指令 MOV

数据传送指令功用是将数据从一个当地仿制、拷贝到另一个当地。

如:MOV R7,#80H;将数据80H 送到寄存器R7,这时寄存器R7 里边存放着80H,就单这条

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

2.空操作指令 NOP

空操作指令功用仅仅让单片机履行没有意义的操作,耗费一个机器周期。

3.循环搬运指令 DJNZ

循环搬运指令功用是将榜首个数进行减1 并判别是否为0,不为0 则搬运到指定地址;为0 则往下履行。

如:DJNZ R7,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 )除了能够给定地址标号让其跳转外,还能够将地址标号改成$,这样

程序就跳回本指令履行。例如:

DJNZ R7,$ ;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。

  程序剖析

  例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

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

详解:DEL这个子程序共有五条指令,现在别离就 每一条指令 被履行的次数和所耗时刻进行剖析。

  榜首句:MOV R7,#200 在整个子程序中只被履行一次,且为单周期指令,所以耗时1μs

  第二句:MOV R6,#125 从②看到④只需R7-1不为0,就会回来到这句,共履行了R7次,共耗时200μs

  第三句:DJNZ R6,DEL2 只需R6-1不为0,就重复履行此句(内循环R6次),又受外循环R7操控,所以共履行R6*R7次,因是双周期指令,所以耗时2*R6*R7μs。

  例2 1秒延时子程序:

  DEL:MOV R7,#10 ①

  DEL1:MOV R6,#200 ②

  DEL2:MOV R5,#248 ③

  DJNZ R5,$ ④

  DJNZ R6,DEL2 ⑤

  DJNZ R7,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:MOV R7,#10 1指令周期1

  DEL1:MOV R6,#0FFH 1指令周期10

  DEL2:MOV R5,#80H 1指令周期255*10=2550

  KONG:NOP 1指令周期128*255*10=326400

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

  DJNZ R6,DEL2 2指令周期2*255*10=5110

  DJNZ R7,DEL1 2指令周期2*10=20

  RET 2

  延时时刻=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:

MOV R7,#4

D1:

MOV R6,#248

DJNZ R6,$

DJNZ R7,D1

NOP

NOP

RET

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

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

;延时10uS

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

time10us:movr5,#05h;11us

djnzr5,$

ret

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

;延时50uS

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

time50us:movr5,#19h;51us

djnzr5,$

ret

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

;延时100uS

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

time100us:movr5,#31h;99.6us

djnzr5,$

ret

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

;延时200uS

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

time200us:movr5,#64h;201us

djnzr5,$

ret

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

;延时250uS

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

time250us:movr5,#7ch;249.6us

djnzr5,$

ret

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/bandaoti/fenxiao/258369.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部