void
delay1ms(void)
{
unsigned
char
i,j
for(i=0i<10i++)
for(j=0j<33j++)
}
具体算法是//(3j+2)*i=(3×33+2)×10=1010(us),但精确度不高,如果想准确点可以调节相应的参数用示波器来实
现,上面的函数适用于程序简单,对时间性要求不高,如:点led灯,单个按键 *** 作等等。
2,就是用定时器中断里面设定标志位来产生延时的方法,比如你可以把定时器设定洞扒为每1ms进一次中断,在中断里面
把一个标志位(如flag)置一
当你需要1ms延时的时候你可以先初始化定时器,然乎颤乎后查询标志位是否置一,置一则执行if后面的语句,即if(fla{}
当你需要10ms延时时,你可以把flag设置为uchar,中断里面flag++外面查询用if(10==flag){}
以此类推,上面的岁悉方法精确度高适用地方。
用汇编代码设计程序,完成8个LED灯的循环闪烁:LED1亮,其余灭->LED2亮,其余灭……,如此循环5次后,
进行全灭->全亮闪烁,凳宽时间间隔为500ms用p0口控制
下列程序已枣胡亮经测试通过
----------------------
ORG 0000H
LJMP MAIN
ORG 000BH
LJMP T0_INT
MAIN:
SETB TR0 T0定时方做物式0
MOV SP, #60H
MOV IE, #82H
MOV B, #61 定时500ms,500 000 / 8192 = 61
-----------------------
MOV A, #127
MOV R1, #40
LP0:MOV P0, A
JBC F0, $ + 5
SJMP $ - 3
RRA
DJNZ R1, LP0
-----------------------
CLR A
LP1:MOV P0, A
JBC F0, $ + 5
SJMP $ - 3
CPL A
LJMP LP1
-----------------------
T0_INT: 自动重新装入0
DJNZ B, T0_END
MOV B, #61
SETB F0
T0_END:
RETI
-----------------------
END
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)