要求编写延时子程序,就不要使用定时器中岁;
也不要用C语言,因为C语郑桥言的执行时间,并不确定。
用汇编语言,卖丛睁是最简单、准确的。
51单片机的程序如下:
DL1000:
MOV R7,#248
DJNZ R7,$
MOV R7,#250
DJNZ R7,$
RET
正好1000个机器周期。
R7,是8位寄存器,其最大数值是255,不能直接存入500。
不同频率晶振的单片机指侍空令周期不一样,假如指令周期是1us,1000个指令周期就是1000us=1ms就是写一个1ms的延时,最准确的方法用定时器,汇编写很麻烦的,要计算初值建议用c语言,初始化为
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
中断程序:
void timer0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
。。。。。。。;腊谈团内部操作自己补上
}
这个程序不一定对的,更具自己要求再改轮橘动。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
nop 指令空转3个时钟周期
mov cx,118 塌凯逗4个时钟周期
push 15个
pop 12个
loop 孙早 5个
ret 20个
delay proc
push cx
mov cx,118
@delay:
团卖 nop
loop @delay
pop cx
ret
endp
这要根亏掘据你的晶振频颂空敬率和每条指令的指令周期来编写,有的指令是1个机器周期,有的是2或4个……,你所说的1000个指令周期到底是多少?你想要延时多久,软件野慎延时还是定时器延时?
MOV R7,#500
DJNZ R7,$