4课:第一个单片机小程序

  上一次咱们的步调切真是没什么用,要灯亮还要重写一下片子,下面咱们要让灯连续地闪烁,那就有一定的真用价值了,比如能把它当成汽车上的一个信号灯用了。怎么威力让灯连续地闪烁呢?真际上便是要灯亮一段光阳,再灭一段光阳,也便是说要P10连续地输出高和低电平。怎么真现那个要求呢?请思考用下面的指令能否可止:

SETB P1.0

CLR P1.0 ……

那是不止的,有两个问题,第一,计较机执止指令的光阳很快,执止完SETB P1.0后,灯是灭了,但正在极短光阳(微秒级)后,计较机又执止了CLR P1.0指令,灯又亮了,所以根基甄别不出灯曾灭过。第二,正在执止完CLR P10后,不会再去执止SETB P1.0指令,所以以后再也没有机缘让灭了。

  为理处置惩罚惩罚那两个问题,咱们能作如下构想,第一,正在执止完SETB P1.0后,延时一段光阳(几多秒或零点几多秒)再执止第二条指令,就能甄别出灯曾灭过了。第二正在执止完第二条指令后,让计较机再去执止第一条指令,连续地正在本地兜圈,咱们称之为"循环",那样就能完成任务了。

以下先给出步调(背面括号中的数字是为了便于解说而写的,真际不用输入):

;主步调:
LOOP: SETB P1.0    ;(1)熄灭灯
LCALL DELAY        ;(2)延时一段光阳
CLR P1.0           ;(3)点亮灯
LCALL DELAY        ;(4)延时一段光阳
AJMP LOOP          ;(5)跳转到第一句LOOP处

;以下子步调
DELAY: MOx R7,#250 ;(6)
D1: MOx R6,#250    ;(7)
D2: DJNZ R6,D2     ;(8)
       DJNZ R7,D1  ;(9)
       RET         ;(10)
END                ;(11)

原例keil工程文件点击那里下载

按上面的构想阐明一下前面的五条指令。

  第一条是让灯灭,第二条应该是延时,第三条是让灯亮,第四条和第二条一模一样,也是延时,第五条应该是转去执止第一条指令。第二和第四条真现的本理稍后谈,先看第五条,AJMP是一条指令,意思是转移,往什么处所转移呢?背面跟的是LOOP,看一下,什么处所另有LOOP,对了,正在第一条指令的前面有一个LOOP,所以很曲不雅观地,咱们能认识到,它要转到第一条指令处。那个第一条指令前面的LOOP被称之为标号,它的用途便是给那一止起一个名字,便于运用。能否一定要给它起名叫LOOP呢?虽然不是,起什么名字,彻底由编步调的人决议,能称它为A,X等等,虽然,那个时候,第五条指令AJMP背面的名字也得随着改了。

  第二条和第四条指令的用途是延时,它是怎么真现的呢?指令的模式是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获得结果是1252。那此中1252是咱们想要的结果,而690并非咱们所要的结果,但是为了获得最末结果,咱们又不能不先算出690,并记下来,那其真是一个中间结果,计较机中作运算和那个类似,为了要获得最末结果,正常要作不少步的中间结果,那些中间结果要有个处所放才止,把它们放哪呢?放正在前面提到过的ROM中能吗?显然不止,因为计较秘密将结果写进去,而ROM是不能写的,所以正在单片机中还有一个区域称为RAM区(RAM是随机存与存储器的英文缩写),它能将数据写进去。 出格地,正在MCS-51单片机中,将RAM中分出一块区域,称为工做存放器区,上面步调用到的R6,R7便是正在那个区里面,那咱们会正在第7课有具体的引见。其真假如咱们用C语言来写步调的话用根基不用理解工做存放器那个观念了因为C编译器会主动办理.看上面的步调假如用c来写便是

#include <at89V52.h>

ZZZoid DELAY()   //延时函数
{ unsigned char i,j;
    for(i=0;i<250;i++)
    {
        for(j=0;j<200;j++);
    }
}

ZZZoid main() //步调从那里初步执止
{
while(1) //那句的做用便是反复的执止下面那个{}中包孕的4句
    {
     P1_0=1;  //(1)熄灭灯
     DELAY(); //(2)延时一段光阳
     P1_0=0;  //(3)点亮灯
     DELAY(); //(4)延时一段光阳
    }
}

正在汇编例子中步调是从第一条语句初步执止的,而c差异正在c语言里步调是从main() 那里初步执止的,对于(1)(2)(3)(4) 那几多句的评释和上面的汇编一样,不再敖述。循环局部那里是用了一个while(1) 语句下面打了一个大括号,那样大括号中的那4条语句就会按(1)->(2)->(3)->(4) ->(1)->(2)->(3)->(4) ->(1)->(2)->(3)->(4)……永暂不竭的执止下去。那样灯就会连续的亮灭再亮再灭真现了闪烁成效,对于延时函数下节课再叙。有什么不懂的各人可以正在下面提问

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://ai50.cn