用STC-ISP V6吧,很方便
DELAY50MS:;@12000MHz
PUSH 30H
PUSH 31H
MOV 30H,#98
MOV 31H,#62
NEXT:
DJNZ 31H,NEXT
DJNZ 30H,NEXT
POP 31H
POP 30H
RET
ms = ms 30 把 ms的值变为 30倍(乘以30)
while(ms--); 当ms不为0,一直运行 ms--
单纯靠计算 ms--,来延时,ms越大,延时越长
不同型号的话 ,应该改变 30这个常数。可能这个型号的计算30次ms--,消耗1秒钟
执行空语句执行124次,大概就能延时到1秒不是很准的。
如要算的话:
比如51,mdelay函数想延时1ms,而执行for(i=0;i<124;i++),假设4个机器周期,每个机器周期时长为[12(1/晶振频率)秒],若晶振为6MHz时,每个机器周期为2us,这样12442是992us,加上for(;Delay>0;Delay--)需要的8us,正好延时1ms
延时函数很常见:
delay1ms(unsigned
int
tt)
//延时1ms
{
unsigned
char
i;
while(tt--)
for(i
=
113;
i
>
0;
i--);
}
反复多次调用即可。
但是,用软件延时,观察起来,就像死机一样,经常会误事的。
/-----------------------------------------------
注:1硬件应使用12MHz晶振;
2程序使用定时器0,溢出周期50ms,计90次溢出为
4分半,其它以此类推,15分到时IC4脚(P13)输
出低电平,然后关闭定时器,停止计数。
-------------------------------------------------/
#include<reg52h>
sbit P10=P1^0;
sbit P11=P1^1;
sbit P12=P1^2;
sbit P13=P1^3;
unsigned char Count=0;
unsigned char Half_Min=0;
void main()
{
TMOD=0x01;
TH0=0x3C;
TL0=0xB0;
ET0=1;
EA=1;
TR0=1;
while(1);
}
void timer_0() interrupt 1
{
TH0=0x3C;
TL0=0xB0;
Count++;
if(Count>10) //大于10则为500ms
{Half_Min++;
Count=0;
switch(Half_Min)
{
case 9:P10=0;break; //4分半
case 10:P11=0;break; //5分
case 20:P12=0;break; //10分
case 30:P13=0;TR0=0;break; //15分
default:break;
}
}
}
/ 刚写好的,绝非复制,有问题加QQ447212829 /
以上就是关于单片机50ms延时程序全部的内容,包括:单片机50ms延时程序、不同型号的单片机延时程序怎么写 { ms = ms * 30; while(ms--); }、单片机的延时程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)