
单片机音响技术网 文章浏览次数:960
这个例子是让LED闪烁,即让LED交替亮与灭。要让接在P1.0引脚上的LED闪烁,实际上就是要LED亮一段时间,再灭一段时间,然后再亮,再灭。。。。换一个说法就是说P1.0周而复始地输出高电平、低电平。
单个闪烁程序如下:
;主程序
MAIN: SETB P1.0 (1)
CALL DELAY (2)
CLR P1.0 (3)
CALL DELAY (4)
JMP MAIN (5)
延时子程序
DELAY:MOV R7,#250 (6)
D1: MOV R6,#250 (7)
D2: DJNZ R6,D2 (8)
DJNZ R7,D1 (9)
RET (10)
END (11)
程序分析:
(1).将P1.0置位为高电平,即让LED熄灭.
(2).调用延时子程序.
(3)将P1.0置位为低电平,即让LED亮
(4).调用延时子程序
(5).跳转到主程序
(6).延时子程序开始,将立即数250传送给寄存器R7.
(7).将立即数250传送给寄存器R6.
(8).将R6中的内容减一后判断,若为0则程序向下执行;若不为0则跳转到D2处(即本行)执行.
(9).将R7中的内容减一后判断,若为0则程序向下执行,若不为0则跳转到D1处执行.
(10).返回调用子程序处.
(11).程序结束.
延时程序的分析
1) MOV
这条指令的意思是传递数据.在指令MOV R7,#250中,R7是接收者,250是被传递的数.这一条指令的意思是:将数据250送到R7中去.因此,执行完这条指令后,R7单元中的值是250.在250前面有个#号,这条指令称之为立即数传递指令,而#后面的数被称为立即数.
2) DJNZ
这条指令后面跟着的两个符号,一个是R6,,一个是D2.R6是寄存储器,D2是标号.DJNZ指令的执行过称如下:将后面第一个参数中的值减1,然后看这个值是否等于0.如果等于0,就往下一条知令执行,如果不等于0,则转移到第二个参数所指定的位置去执行,在这里是转移到由D2所标识的那条指令去执行.该条指令最终执行的结果是:指令被执行了250次(因为次前R6中已被送入了一个数:250).
在执行完DJNZ R6,D2(即R6中的值等于0)之后,转去执行下一条指令,即DJNZ R7,D1。由于R7中的值不为0,所以减1后转去D1标号处,即执行MOV R6,#250这条指令。这样,R6中又被送入了250这个数,然后再去执行DJNZ R6,D2,最终的结果是DJNZ R6,D2这条指令将被执行了250×250=62500次,从而实现了延时。
3)RET
子程序在执行过程中如果遇到这条指令,就会回到主程序,到调用这段程序指令的下一条指令继续执行。
摘录:半键纵横; 责任编辑:mcu51av 2007-11-10
