一次咱们的程序实在是没什么用,要灯亮还要重写一下片子,下面咱们要让灯不断地闪耀,这就有必定的实用价值了,比方能够把它当成轿车上的一个信号灯用了。怎样才能让灯不断地闪耀呢?实践上便是要灯亮一段时刻,再灭一段时刻,也便是说要P10不断地输出高和低电平。怎样完成这个要求呢?请考虑用下面的指令是否可行:
SETB P1.0
CLR P1.0
……
这是不可的,有两个问题,榜首,核算机履行指令的时刻很快,履行完SETB P10后,灯是灭了,但在极短时刻(微秒级)后,核算机又履行了CLR P10指令,灯又亮了,所以底子分辩不出灯曾灭过。第二,在履行完CLR P10后,不会再去履行SETB P10指令,所以今后再也没有机会让灭了。
为了处理这两个问题,咱们能够做如下想象,榜首,在履行完SETB P10后,延时一段时刻(几秒或零点几秒)再履行第二条指令,就能够分辩出灯曾灭过了。第二在履行完第二条指令后,让核算机再去履行榜首条指令,不断地在原地兜圈,咱们称之为”循环”,这样就能够完成任务了。
以下先给出程序(后边括号中的数字是为了便于解说而写的,实践不必输入):
;主程序:
LOOP: SETB P1.0 ;(1)
LCALL DELAY ;(2)
CLR P1.0 ;(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后边的姓名也得跟着改了。
第二条和第四条指令的用处是延时,它是怎样完成的呢?指令的方式是LCALL,这条指令称为调用子程序指令,看一下指令后边跟的是什么,DELAY,找一下DELAY,在第六条指令的前面,明显,这也是一个标号。这条指令的作用是这样的:当履行LCALL指令时,程序就转到LCALL后边的标号所标定的程序处履行,假如在履行指令的过程中遇到RET指令,则程序就返回到LCALL指令的下面的一条指令持续履行,从第六行开端的指令中,能够看到的确有RET指令。在履行第二条指令后,将转去履行第6条指令,而在履行完6,7,8,9条指令后将遇到第10条令:RET,履行该条指令后,程序将回来履行第三条指令,行将P10清零,使灯亮,然后又是第四条指令,履行第四条指令便是转去履行第6,7,8,9,10条指令,然后回来履行第5条指令,第5条指令便是让程序回到第1条开端履行,如此循环往复,灯就在不断地亮、灭了。
在标号DELAY标志的这一行到RET这一行中的一切程序,这是一段延时程序,大约延时零点几秒,至于详细的时刻,今后咱们再学习怎么核算。 程序的终究一行是END,这不是一条指令,它仅仅告知咱们程序到此结束,它被称为”伪指令”。
单片机内部结构剖析:
为了知道延时程序是怎么作业的,咱们必需首要了解延时程序中呈现的一些符号, 就从R1开端,R1被称之为作业寄存器。什么是作业寄存器呢?让咱们从现实生活中来找找答案。假如出一道数学题:123+567,让你答复成果是多少,你会立刻答出是690,再看下面一道题:123+567+562,要让你要上答复,就不这么简单了吧?咱们会怎样做呢?假如有张纸,就简单了,咱们先算出123+567=690,把690写在纸上,然后再算690+562得到成果是1552。这其间1552是咱们想要的成果,而690并非咱们所要的成果,可是为了得到终究成果,咱们又不得不先算出690,并记下来,这其实是一个中心成果,核算机中做运算和这个相似,为了要得到终究成果,往往要做很多步的中心成果,这些中心成果要有个当地放才行,把它们放哪呢?放在前面提到过的ROM中能够吗?明显不可,由于核算机要将成果写进去,而ROM是不能够写的,所以在单片机中还有一个区域称为RAM区(RAM是随机存取存储器的英文缩写),它能够将数据写进去。
特别地,在MCS-51单片机中,将RAM中分出一块区域,称为作业寄存器区。
以下是它的a51文件:咱们把它的姓名叫作sy2.asm
LOOP: SETB P1.0
LCALL DELAY
CLR P1.0
LCALL DELAY
AJMP LOOP
DELAY: MOV R7,#250
D1:MOV R6,#250
D2:DJNZ R6,D2
DJNZ R7,D1
RET
END
以下是咱们用编译器编译过的HEX文件, 它就能够烧写啦。
:10000000D29012000CC29012000C01007FFA7EFA0E
:05001000DEFEDFFA2214
:00000001F