一、请查阅汇编指令 “MOV R6,#250”和“DJNZ R6,D2”的指令周期数,计算其对应的时钟周期 us值;然后计算 Delay函数的总的循环次数和对应的时钟周期总数us,说明这个LED灯大约每隔多少毫秒(ms)或秒(s)才变化一次亮灭状态;
MOV指令的时钟周期为:1 * 1=1 us,DJNZ指令的时钟周期为:2 * 1=2us
DELAY函数中总的循环次数为:250x250=62500
MOV=251次,DJNZ=62750次,进行一次DELAY所需的机器周期个数为251 + 62750x2=125751,时钟周期个数为125751x12=1509012
经过约125751x1=125751us≈125ms发生一次亮灭转换
二、如果要求实现准确的LED 每隔1s亮灭的周期性变化,上面程序如何修改?请给出完整代码。请在edsim51中进行实践练习。
修改如下:
LOOP:SETB 90H
LCALL DELAY
CLR 90H
LCALL DELAY
AJMP LOOP
DELAY: MOV R5,#25
D1: MOV R6,#100
D2: MOV R7,#200
D3: DJNZ R7,D3
DJNZ R6,D2
DJNZ R5,D1
RET
END
结果:
三、请参考网上资料(如B站哈工大单片机课程)完成一个查找平方数的汇编程序。对程序进行学习和理解。在Edsim51、proteus中进行验证。
查找平方数的汇编程序:
ORG 000H
LJMP START
ORG 80H
START:
NOP
NOP
MOV SP,#60H
MOV DPTR,#0300H
MOV A,#4
MOVC A,@A+DPTR
MOV 40H,A
LOOP:
SJMP LOOP
ORG 300H
DB 00H,01H,04H,09,10H,19H,24H,31H,40H,51H,64H,79H,90H,0C4H
END
验证结果: