1. <em id="3qmea"><ol id="3qmea"></ol></em>
    2. <em id="3qmea"></em>
      (玩电子) 电子技术学习与研究
      当前位置£º单片机教程网 >> 基础教程 >> 浏览文章

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

      作者:佚名   来源:本站原创   点击数:x  更新时间£º2007年08月16日   ¡¾字体£º ¡¿

      ¡¡¡¡上一次我们的程序实在是没什么用£¬要灯亮还要重写一下片子£¬下面我们要让灯?#20013;?#22320;闪烁£¬这就有一定的实用价值了£¬比如能把它当成汽车?#31995;?#19968;个信号灯用了¡£怎样才能让灯?#20013;?#22320;闪烁呢£¿实际上就是要灯亮一段时间£¬再灭一段时间£¬也就是说要P10?#20013;?#22320;输出高和低电平¡£怎样实现这个要求呢£¿请考虑用下面的指令是否可行£º

      SETB P1.0

      CLR P1.0 ……

      这是不行的£¬有两个问题£¬第一£¬计算机执行指令的时间很快£¬执行完SETB P1.0后£¬灯是灭了£¬但在极短时间£¨微秒级£©后£¬计算机又执行了CLR P1.0指令£¬灯又亮了£¬所以根本分辨不出灯曾灭过¡£第二£¬在执行完CLR P10后£¬不会再去执行SETB P1.0指令£¬所以以后再也没有机会让灭了¡£

      ¡¡¡¡为了解决这两个问题£¬我们能做如下设想£¬第一£¬在执行完SETB P1.0后£¬延时一段时间£¨几秒或零点几秒£©再执行第二条指令£¬就能分辨出灯曾灭过了¡£第二在执行完第二条指令后£¬让计算机再去执行第一条指令£¬?#20013;?#22320;在原地兜圈£¬我们称之为"循环"£¬这样就能完成任务了¡£

      以下先给出程序£¨后面括号中的数字是为了便于讲解而写的£¬实?#20160;?#29992;输入£©£º

      ;主程序:
      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£¬所以很直观地£¬我们能认?#20828;„¦?#23427;要转到第一条指令处¡£这个第一条指令前面的LOOP被称之为标号£¬它的用途就是给这一行起一个名字£¬便于使用¡£是否一定要给它起名叫LOOP呢£¿当然不是£¬起什么名字£¬完全由编程序的人决定£¬能称它为A£¬X等等£¬当然£¬这个时候£¬第五条指令AJMP后面的名字也得跟着改了¡£

      ¡¡¡¡第二条和第四条指令的用途是延时£¬它是怎样实现的呢£¿指令的?#38382;?#26159;LCALL£¬这条指令称为调用子程序指令£¬看一下指令后面跟的是什么£¬DELAY£¬找一下DELAY£¬在第六条指令的前面£¬显然£¬这也是一个标号¡£这条指令的作用是这样的£º当执行LCALL指令时£¬程序就转到LCALL后面的标号所标定的程序处执行£¬如果在执行指令的过程中遇到RET指令£¬则程序就返回到LCALL指令的下面的一条指令继续执行£¬从第六行开始的指令中£¬能看到确实有RET指令¡£在执行第二条指令后£¬将转去执行第?#30701;?#25351;令£¬而在执行完£¶£¬£·£¬£¸£¬£¹条指令后将遇到第?#20445;?#26465;令£ºRET£¬执行该条指令后£¬程序将回来执行第三条指令£¬即将P10清零£¬使灯亮£¬然后又是第四条指令£¬执行第四条指令就是转去执行第6£¬7£¬8£¬9£¬10条指令£¬然后回来执行第5条指令£¬第5条指令就是让程序回到第1条开始执行£¬如此周而复始£¬灯就在?#20013;?#22320;亮¡¢灭了¡£

      ¡¡¡¡在标号DELAY标志的这一行到RET这一行中的所有程序£¬这是一段延时程序£¬大概延时零点几秒£¬至于具体的时间£¬以后我们再学习如何计算¡£ 程序的最后一行是END£¬这不是一条指令£¬它只是告诉我们程序到此结束£¬它被称为"伪指令"¡£

         单片机内部结构分析£º为了知道延时程序是如何工作的£¬我们必需首先了解延时程序中出现的一些符号£¬就从R1开始£¬R1被称之为工作寄存器¡£什么是工作寄存器呢£¿让我们从现实生活中来找找答案¡£如果出一道数学题£º123+567£¬让你回答结果是多少£¬你会马上答出是690£¬再看下面一道题£º123+567+562£¬要让你要上回答£¬就不这么不难了吧?#35838;?#20204;会怎样做呢£¿如果有张纸£¬就不难了£¬我们先算出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)……永远不停的执行下去¡£这样灯就会?#20013;?#30340;亮灭再亮再灭实现了闪烁效果£¬关于延时函数下节课再叙¡£有什么不懂的大家可以在下面提问

      ¡¾发表评论¡¿¡¾告诉好友¡¿¡¾收藏此文¡¿¡¾关闭窗口¡¿

      文章评论

      Çຣ11Ñ¡5appÏÂÔØ

        
        
        1. <em id="3qmea"><ol id="3qmea"></ol></em>
        2. <em id="3qmea"></em>

            
            
            1. <em id="3qmea"><ol id="3qmea"></ol></em>
            2. <em id="3qmea"></em>