1. 实验任务<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
如图4.1.1所示:在P1.0端口上接一个发光二极管L1,使L1在不停地一亮一灭,一亮一灭的时间间隔为0.2秒。
2. 汇编源程序
ORG 0000H
START: CLR P1.0
LCALL DELAY
SETB P1.0
LCALL DELAY
LJMP START
DELAY: MOV R5,#20 ;延时子程序,延时0.2秒
D1: MOV R6,#20
D2: MOV R7,#248
DJNZ R7,$
DJNZ R6,D2
DJNZ R5,D1
RET
END
注意:P1.0每间隔0.2秒输出电平变化一次,若使用示波器观察P1.0输出波形,会发现P1.0口输出周期是0.4s(400ms)频率2.25HZ的方波。
3. C语言源程序
#include <AT89X51.H>
sbit L1=P1^0;
void delay02s(void) //延时0.2秒子程序
{
unsigned char i,j,k;
for(i=20;i>0;i--)
for(j=20;j>0;j--)
for(k=248;k>0;k--);
}
void main(void)
{
while(1)
{
L1=0;
delay02s();
L1=1;
delay02s();
}
}
注意:delay函数中签连个for循环后面没有分号,在最后一个for循环再加分号
3、总结
1、汇编和C语言实现在演示技术方面完全一样,即一个MOV或者DJNZ指令的执行时间和for执行一次循环的指令时间相同(都是两个机器周期)。
2、延时计算:(248*2+2)*20*20
文章评论(0条评论)
登录后参与讨论