深入探究单片机的原理和应用:延时1秒(第一部分)

单片机原理及应用(1)–延时1s

目录

  • 单片机原理及应用(1)–延时1s
  • 1.前言
  • 2.关于11.0592Mhz晶振
  • 3.关于”无用指令“
  • 3.1nop
  • 3.2DJNZ
  • 4.程序讨论
  • 演示:
  • 1.前言

    学单片机的各位入门第一个难题想必就是做一个精确的延时函数,在单片机里实现延时说白了就是让cpu去做很多无用的指令,比如说nop(no operations)。

    还有类似DJNZ指令等,下面介绍11.0592MHz晶振的1s延时

    2.关于11.0592Mhz晶振

    11.0592,一串多么令人不爽的数字,为啥不凑个整数,但是想想既然量产的话一定自由其中的到了,今天咱们目前用不到,所以就不展开叙述了,简单来说就是为了波特率

    11.0592Mhz晶振的时钟周期为1s/11.0592Mhz,即

    时钟周期≈0.00000009s

    机器周期的长度为12个时钟周期,即

    机器周期≈0.00000109s(没算错)

    下面的周期时长全部基于11.0592Mhz晶振

    3.关于”无用指令“

    在延时函数中常用的让CPU打摆子的指令就是nop和DJNZ,所以我们有必要来好好了解一下这两个指令

    3.1nop

    nop是no operations,意思就是没有操作,指令周期为1个机器周期,所以执行这条指令所耗费的时间就是0.00000109s

    3.2DJNZ

    djnz是一个跳转指令,判断第一个操作数是否为0,不是0就跳转执行相应的程序,为0就将第一个操作数减一,指令周期为2个机器周期,所以执行这条指令所耗费的时间就是0.00000218s

    4.程序讨论

    上面说到延时程序就是让cpu打摆子,一遍打摆子指令消耗的时间是有限的,所以我们需要重复执行,

    重复执行的话,就要用到我们上面说过的DJNZ指令,类似于一个while(i–)循环

    然后,这个i(while的)的范围又是比较小的

    汇编中我们常用的存储数字的寄存器是Rx,而Rx只有8位,只能表示0-255范围的数值,

    粗略计算一下延时1s大约要消耗的机器周期大约为900000

    这么多遍肯定不能自己来一遍遍的输进去,所以需要嵌套,

    而且只能在循环次数为0-255内进行嵌套

    大概需要嵌套3层

    所以程序的样子大概就是这个样子:

    Delay:	MOV  	R5,#n1
    TIME1:  MOV 	R6,#n2
    TIME2:	MOV 	R7,#n3
    TIME3:	
    		DJNZ  	R7,TIME3
    		DJNZ  	R6,TIME2
    		DJNZ	R5,TIME1
    		RET
    

    现在我们就只要计算三个嵌套分别有多少了

    观察最内圈的循环TIME3:

    第一句指令就是DJNZ R7,TIME3,由上面可知DJNZ占有两个指令周期,所以TIME3所能够产生的延时时间为2*n1个指令周期

    第二句指令是DJNZ R6,TIME2,要执行此条指令必须完全等待第一句指令执行完毕才可以,然而R6所存储的数值n2就是第二句指令重复执行第一条指令的次数,即能延时多少个2*n1个指令周期,计算一下就知道是(2*n1+2(第二条DJNZ所消耗的指令周期数)+1(TIME2中MOV指令消耗的指令周期数))*n2

    即(2*n1+3)*n2个机器周期

    同理

    整个延时函数执行完毕应该是消耗了

    ((2*n1+3)*n2+3)*n3个机器周期数

    计算得到延时1s所消耗的机器周期个数应该为1/(12*(1/11059200))=921600个

    所以只需要求解三元一次方程组((2*n1+3)*n2+3)*n3=921600即可

    在这里用一个python小程序求解:

    for j in range(255):
        for k in range(255):
            for l in range(255):
                a = ((2*j+3)*k+3)*l
                if a==921600 :
                    print('j:',j,'k:',k,'l:',l,'a:',a)
    

    得到如下解

    ========================== RESTART: E:\Desktop\123.py ==========================
    j: 17 k: 249 l: 100 a: 921600
    j: 18 k: 123 l: 192 a: 921600
    j: 19 k: 117 l: 192 a: 921600
    j: 20 k: 119 l: 180 a: 921600
    j: 27 k: 101 l: 160 a: 921600
    j: 30 k: 195 l: 75 a: 921600
    j: 31 k: 189 l: 75 a: 921600
    j: 32 k: 191 l: 72 a: 921600
    j: 33 k: 89 l: 150 a: 921600
    j: 38 k: 243 l: 48 a: 921600
    j: 39 k: 237 l: 48 a: 921600
    j: 40 k: 111 l: 100 a: 921600
    j: 43 k: 69 l: 150 a: 921600
    j: 44 k: 135 l: 75 a: 921600
    j: 49 k: 57 l: 160 a: 921600
    j: 51 k: 117 l: 75 a: 921600
    j: 54 k: 83 l: 100 a: 921600
    j: 57 k: 41 l: 192 a: 921600
    j: 57 k: 105 l: 75 a: 921600
    j: 58 k: 43 l: 180 a: 921600
    j: 60 k: 39 l: 192 a: 921600
    j: 66 k: 91 l: 75 a: 921600
    j: 70 k: 179 l: 36 a: 921600
    j: 88 k: 143 l: 36 a: 921600
    j: 93 k: 65 l: 75 a: 921600
    j: 94 k: 67 l: 72 a: 921600
    j: 96 k: 63 l: 75 a: 921600
    j: 117 k: 81 l: 48 a: 921600
    j: 120 k: 79 l: 48 a: 921600
    j: 123 k: 37 l: 100 a: 921600
    j: 130 k: 219 l: 16 a: 921600
    j: 132 k: 23 l: 150 a: 921600
    j: 135 k: 45 l: 75 a: 921600
    j: 149 k: 17 l: 180 a: 921600
    j: 150 k: 19 l: 160 a: 921600
    j: 152 k: 15 l: 200 a: 921600
    j: 156 k: 39 l: 75 a: 921600
    j: 164 k: 87 l: 32 a: 921600
    j: 173 k: 33 l: 80 a: 921600
    j: 174 k: 35 l: 75 a: 921600
    j: 175 k: 29 l: 90 a: 921600
    j: 183 k: 13 l: 192 a: 921600
    j: 184 k: 207 l: 12 a: 921600
    j: 207 k: 221 l: 10 a: 921600
    j: 226 k: 27 l: 75 a: 921600
    j: 227 k: 21 l: 96 a: 921600
    j: 237 k: 161 l: 12 a: 921600
    j: 240 k: 159 l: 12 a: 921600
    

    理论上随便选一组带进去就可以了

    最后上最后在开发板上的代码,用led体现1s的延时

    		ORG 00H
    		LJMP START
    		ORG  200H      
    START:	MOV		A,#01H
    	
    LOOP:	
    		 	
    		LCALL  	Delay
    		  
    		CPL     P2.0		
    		SJMP  	LOOP   
    		
    
    Delay:	MOV  	R5,#100
    TIME1:  MOV 	R6,#249
    TIME2:	MOV 	R7,#17
    TIME3:	
    		DJNZ  	R7,TIME3	 
    		DJNZ  	R6,TIME2
    		DJNZ	R5,TIME1
    		RET			
    
    

    演示:

    1s_led

    物联沃分享整理
    物联沃-IOTWORD物联网 » 深入探究单片机的原理和应用:延时1秒(第一部分)

    发表评论