周期和指令周期的差异,不知道延时程序指令的用法, ,本文就此问题从延时程序的根本概念、机器周期和指
令周期的差异和联络、相关指令的用法等用图解法的方式翔实的答复读者
在交通灯的操控程序中,需求操控红灯亮的时刻继续30秒,就能够经过延时程序来完结。延时程序是怎么
完结的呢?下面让咱们先来了解一些相关的概念。
一、机器周期和指令周期
1.机器周期是指单片机完结一个根本操作所花费的时刻,一般运用微秒来计量单片机的运转速度,
51 单片机的一个机器周期包括12 个时钟振动周期,也便是说假如51 单片机选用12MHz 晶振,那么履行
一个机器周期就只需求1μs;假如选用的是6MHz 的晶振,那么履行一个机器周期就需求2 μs。
在51 单片机里有单周期指令(履行这条指令只需一个机器周期),双周期指令(履行这条指令只需求两个
机器周期),四周期指令(履行这条指令需求四个机器周期)。除了乘、除两条指令是四周期指令,其他均
为单周期或双周期指令。也便是说,假如51 单片机选用的是12MHz 晶振,那么它履行一条指令一般只需
1~2 微秒的时刻;假如选用的是6MH 晶振,履行一条指令一般就需2~4 微秒的时刻。
器周期,了解以上概念后,那么能够根据单片机器材手册中的指令履行周期和单片机所用晶振频率来完结
需求准确延时时刻的延时程序。
二、延时指令
定的时刻,所以要到达延时的作用,只须让单片机不断地履行没有具体实际意义的指令,然后到达了延时
的作用。
1.数据传送指令 MOV
指令而言并没有任何实际意义,而履行该指令则需求一个机器周期。
2.空操作指令 NOP
3.循环搬运指令 DJNZ
三、1 秒延时子程序、流程图及时刻核算 (以单片机晶振为12MHz 为例,1 个机器周期需求1μs)
了解了以上的内容,现在让咱们来看看
程序一共所需时刻:1+10+2560+330240+660480+5120+20+2=998433 μs≈1S
要在回来指令RET 前再增加一些指令让它把1567μs 的延时完结。有爱好的读者能够自己试着增加完结。
最终弥补一点,编写程序时一般将延时程序编写成独立的子程序,而所谓子程序也便是一个完结某个功用
的小模块。这样在主程序中就能够方便地重复调用编写好的延时子程序。
程序就跳回本指令履行。例如:
时,则履行完该条程序所需的时刻为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:
;*****************************************************************
;延时50uS
;*****************************************************************
time50us:
;*****************************************************************
;延时100uS
;*****************************************************************
time100us:
;*****************************************************************
;延时200uS
;*****************************************************************
time200us:
;*****************************************************************
;延时250uS
;*****************************************************************
time250us: