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

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

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

  • 7
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值