234彩票代理

  • <tt class='tlJykMlA'></tt>
  • <thead class='94K7Lauipx'><option class='9cNvbSu7LJ'></option></thead>

    <em class='jepytdnyfeW3'><b class='oR1Ys12nk'><td class='6rzzLTN'></td></b></em>

  • <dl class='Td0EmkF'><b class='qoWhaibfJ9'></b></dl>

  • <span class='lS1G'></span>

    (玩电子) 电子技术学习与研究
    当前位置:单片机教程网 >> 基础教程 >> 浏览文章

    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)……永远不 停的一执行下去 。这样灯就会持续的一亮灭再亮再灭实现了闪烁效果,关于延时函数下节课再叙 。有什么不 懂的一大家可以在下面提问

    发表评论】【告诉好友】【收藏此文】【关闭窗口

    文章评论