(玩电子) 电子技术学习与研讨
当时方位:单片机教程网 >> 根底教程 >> 阅览文章

4课:榜首个单片机小程序

作者:佚名   来历:本站原创   点击数:x  更新时刻:2007年08月16日   【字体:

  上一次咱们的程序实在是没什么用,要灯亮还要重写一下片子,下面咱们要让灯继续地闪耀,这就有必定的实用价值了,比方能把它当成汽车上的一个信号灯用了。怎样才能让灯继续地闪耀呢?实践上便是要灯亮一段时刻,再灭一段时刻,也便是说要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: MOV R7,#250 ;(6)
D1: MOV 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 <at89x52.h>

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

void 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)……永久不断的履行下去。这样灯就会继续的亮灭再亮再灭完成了闪耀作用,关于延时函数下节课再叙。有什么不明白的我们能够在下面发问

宣布谈论】【告知老友】【保藏此文】【封闭窗口

文章谈论