
1)设置: target->xtal 为12Mhz
2)debug
LED=0运行以前
LED=0运行以后,该指令运行时间为390-3=1us
delay()运行以前
delay()运行以后,delay()运行时间为400591-390=400201us=400.201ms
●i=50000改为i=30000后,delay()运行时间为240513-390=240ms
void delay() // 函数定义
{
unsigned int i; // 最大65535
for (i=30000;i>0;i--);
}
●i=50000改为i=70000后,延时时间按比例算约为400ms*7/5 = 560ms
70000超过了65536,实际为i=70000-65536= 44,观察值约为36ms
●延时1ms,i=125,延时1396-390=1006us
void delay1ms() // 函数定义
{
unsigned int i; // 最大65535
for (i=125;i>0;i--);
}
●delayms(unsigned int n), delayms(1)延时时间为1427-390=1037us,因为运行while也要花时间,可以把delay1ms()内部的i=125改小一些比如i=124
void delayms(unsigned int n)
{
while(n--) {
delay1ms();
}
}
小结:掌握调试方法,同时注意到unsigned int有表达范围
●LED-DELAY.ASM
P50 3.14, 延时时间50608-3=50605us=50.6ms
LED EQU P1.0
ORG 0000H
JMP LOOP
LOOP:
SETB LED
CALL DEL50
CLR LED
CALL DELAY
JMP LOOP
DEL50: MOV R7,#200
DEL1: MOV R6,#125
DEL2: DJNZ R6,DEL2
DJNZ R7,DEL1
RET
END
DJNZ前
DJNZ后,R6值减1, 7d-7c=1, 时间2us, 9-7=2
DJNZ, decrease and jump if not zero, P48,(程序计数器, program counter)PC指向代码地址
作业:
1)仿真以下子程序,测量延时时间
DEL50a: MOV R7,#100 ; 1us
DEL1a: MOV R6,#250
DEL2a: DJNZ R6,DEL2a ; 2us ; 250 * 2us = 500us
DJNZ R7,DEL1a ; 100 * 500us = 50000us = 50ms
RET
DEL50b: MOV R7,#50 ; 1us
DEL1b: MOV R6,#500 ; 500>256
DEL2b: DJNZ R6,DEL2b ; 2us ; 500 * 2us = 1000us
2)用汇编实现delay1ms, 延时1ms
3)预习:第二步实现的delay1ms汇编程序,嵌入到c程序中。教材有
