ORG 0000H
SJMP START
ORG 0030H
START:
MOV TMOD, #01H T0定时方式1
MOV TH0, #0D8H 10ms@12MHz
MOV TL0, #0F0H 65536-10000=D8F0H
SETB TR0 启动.
WAIT: 下面使用查询方式.
JNB TF0, WAIT 没有溢出就循环等待.
MOV TH0, #0D8H 到了10ms,重新写入初始值.
MOV TL0, #0F0H 65536-10000=D8F0H
CLR TF0
-----------------------------------------------
在败罩这里编写 每到10ms 应该执行的埋枯启指令.
CPL P1.0可以使外接的LED闪光.
-----------------------------------------------
SJMP WAIT继续查询.
END
软件延时段启程序就是利用执行每一条指令时所用的时间来进行延时的。一般采用循环结构,达到多次反复执行某一段指令的目的,来增加延时的时间,可以通过对循环次数的控制,来达到控制延时时间长短的目的。
为了延长延时时间握启如,一般要采用多重循环,即由外循环内部又含有内循环。
延时时间=(内循环时间)×外循环次数。
例如:设计一个延时1ms的延时子程序ys1ms,设单片机8051的时钟频率为12MHZ。
则单片旁敏机8051一个机器周期=12T=12/f=12/12MHZ=1微秒
程序和延时时间计算如下:
ys1ms:MOV R7,#4 单周期1uS ( 晶振为12MHz)
DEL1: MOV R6,#123 单周期1uS
DEL2: DJNZ R6,DEL2 双周期2uS*123=246uS
DJNZ R7,DEL1 双周期(2us+246+1)*4=996uS
NOP 单周期1uS
RET 双周期2uS
延时时间t=1uS +(1us+246uS+2uS)×4+1uS+2uS=1000uS=1ms
其中(1us+246uS+2uS)=249uS 为内循环时间 4为外循环次数
第一个1uS 是第一条指令的执行时间
1uS+2uS 是 最后二条指令 NOP RET指令的执行时间。
哈哈 给俺加分吧
优点:简单,很容易就能写出软件延时搏辩尘程序缺点:延时时间不容易计算,C语言写的延时程序不能直接计算出延时时间,要看了反灶亏汇编代码才能计算出延时时间
因此,精密的延时最好是用定时器;或者用混合编译,C语言调用汇编延时函数;还可参考下面这个程序,基禅我用C语言写的,精度也很高
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)