单片机的内外部结构分析(二)
发布时间:2008/5/27 0:00:00 访问次数:505
一、 程序的完善
上一次我们的程序实在是没什么用,要灯亮还要重写一下片子,下面我们要让灯不断地闪烁,这就有一定的实用价值了,比如可以把它当成汽车上的一个信号灯用了。怎样才能让灯不断地闪烁呢?实际上就是要灯亮一段时间,再灭一段时间,也就是说要p10不断地输出高和低电平。怎样实现这个要求呢?请考虑用下面的指令是否可行:
setb p10
clr p10
……
这是不行的,有两个问题,第一,计算机执行指令的时间很快,执行完setb p10后,灯是灭了,但在极短时间(微秒级)后,计算机又执行了clr p10指令,灯又亮了,所以根本分辨不出灯曾灭过。第二,在执行完clr p10后,不会再去执行setb p10指令,所以以后再也没有机会让灭了。
为了解决这两个问题,我们可以做如下设想,第一,在执行完setb p10后,延时一段时间(几秒或零点几秒)再执行第二条指令,就可以分辨出灯曾灭过了。第二在执行完第二条指令后,让计算机再去执行第一条指令,不断地在原地兜圈,我们称之为"循环",这样就可以完成任务了。
以下先给出程序(后面括号中的数字是为了便于讲解而写的,实际不用输入):
;主程序:
loop: setb p10 ;(1)
lcall delay ;(2)
clr p10 ;(3)
lcall delay ;(4)
ajmp loop ;(5)
;以下子程序
delay: mov r7,#250 ;(6)
d1: mov r6,#250 ;(7)
d2: djnz r6,d2 ;(8)
djnz r7,d1 ;(9)
ret ;(10)
end ;(11)
按上面的设想分析一下前面的五条指令。
第一条是让灯灭,第二条应当是延时,第三条是让灯亮,第四条和第二条一模一样,也是延时,第五条应当是转去执行第一条指令。第二和第四条实现的原理稍后谈,先看第五条,ljmp是一条指令,意思是转移,往什么地方转移呢?后面跟的是loop,看一下,什么地方还有loop,对了,在第一条指令的前面有一个loop,所以很直观地,我们可以认识到,它要转到第一条指令处。这个第一条指令前面的loop被称之为标号,它的用途就是给这一行起一个名字,便于使用。是否一定要给它起名叫loop呢?当然不是,起什么名字,完全由编程序的人决定,可以称它为a,x等等,当然,这时,第五条指令ljmp后面的名字也得跟着改了。
http://www.hificat.com
一、 程序的完善
上一次我们的程序实在是没什么用,要灯亮还要重写一下片子,下面我们要让灯不断地闪烁,这就有一定的实用价值了,比如可以把它当成汽车上的一个信号灯用了。怎样才能让灯不断地闪烁呢?实际上就是要灯亮一段时间,再灭一段时间,也就是说要p10不断地输出高和低电平。怎样实现这个要求呢?请考虑用下面的指令是否可行:
setb p10
clr p10
……
这是不行的,有两个问题,第一,计算机执行指令的时间很快,执行完setb p10后,灯是灭了,但在极短时间(微秒级)后,计算机又执行了clr p10指令,灯又亮了,所以根本分辨不出灯曾灭过。第二,在执行完clr p10后,不会再去执行setb p10指令,所以以后再也没有机会让灭了。
为了解决这两个问题,我们可以做如下设想,第一,在执行完setb p10后,延时一段时间(几秒或零点几秒)再执行第二条指令,就可以分辨出灯曾灭过了。第二在执行完第二条指令后,让计算机再去执行第一条指令,不断地在原地兜圈,我们称之为"循环",这样就可以完成任务了。
以下先给出程序(后面括号中的数字是为了便于讲解而写的,实际不用输入):
;主程序:
loop: setb p10 ;(1)
lcall delay ;(2)
clr p10 ;(3)
lcall delay ;(4)
ajmp loop ;(5)
;以下子程序
delay: mov r7,#250 ;(6)
d1: mov r6,#250 ;(7)
d2: djnz r6,d2 ;(8)
djnz r7,d1 ;(9)
ret ;(10)
end ;(11)
按上面的设想分析一下前面的五条指令。
第一条是让灯灭,第二条应当是延时,第三条是让灯亮,第四条和第二条一模一样,也是延时,第五条应当是转去执行第一条指令。第二和第四条实现的原理稍后谈,先看第五条,ljmp是一条指令,意思是转移,往什么地方转移呢?后面跟的是loop,看一下,什么地方还有loop,对了,在第一条指令的前面有一个loop,所以很直观地,我们可以认识到,它要转到第一条指令处。这个第一条指令前面的loop被称之为标号,它的用途就是给这一行起一个名字,便于使用。是否一定要给它起名叫loop呢?当然不是,起什么名字,完全由编程序的人决定,可以称它为a,x等等,当然,这时,第五条指令ljmp后面的名字也得跟着改了。