您的位置 首页 汽车

单片机学习之六:根本I/O口实验二:跑马灯

一、试验现象:二极管从右至左依次发光。二、试验目的:l 掌握寄存器A,Rn的使用方法l 掌握左移指令l 掌握延时程序的编写三、任务分析:电路

  一、实验现象:

  二极管从右至左顺次发光。

  二、实验意图:

  l 把握寄存器A,Rn的运用方法

  l 把握左移指令

  l 把握延时程序的编写

  三、任务剖析:

  电路图同实验1,有了上一个实验的根底,这个程序对咱们就没有什么难度啦。咱们能够这样作:

  首要:mov p0,#ofeh(让最右边的灯亮),然后通过一段延时,再:mov p1,#ofdh,这样顺次赋值,直到:mov p0,#07fh(最左面的灯亮)。然后用ajmp指令回来,让灯火再从头开始循环。

  这样当然能够,可是程序不行简略明了,咱们要写8个mov句子。想象一下,假如有几十个灯,那写起来不是麻烦死啦?

  好在单片机有一条左移指令rl a,它的作用是把累加器a中的数循环左移。

  趁便说一下累加器a,它是单片机中的最常用的寄存器,大部分单操作数的指令都以a作为操作目标(例如rl a);也有许多双操作数指令的一个操作数取自a(例如mov a,#00h);还有加、减、乘、除等管用指令的运算成果也常常保留在a中,或许ab寄存器对中。

  所以咱们的程序就能够这样来完成啦:首要给a赋值,再输出到p0;然后延时;接下来把a中的数进行左移。然后重复上面的进程就能够啦。

  四、实验程序

  org 0000h

  start: clr p1.5

  mov a,#0feh ;给a赋当即数,履行之后,a中的数据是11111110

  loop: mov p0,a ;把a中的数据传输到p0

  lcall delay ;(1)

  rl a ;(2)

  ajmp loop ;回来标号为loop的指令

  delay: mov r6,#02h ;(3)

  del1: mov r5,#0ffh ;(4)

  del2: djnz r5,del2 ;(5)

  djnz r6,del1 ;(6)

  ret ;(7)

  end

  注释:

  1、这是一个子程序调用指令。在程序设计中,常常把具有必定功用的共用程序编成子程序,以便让主程序调用。

  该指令的履行进程是这样的:当履行lcall指令后,程序就转到lcall后边标号delay指定的程序处往下履行,当履行遇到ret指令时,就回来lcall指令下面的一条指令,即rl a指令。

  从上面的剖析,咱们能够知道:标号为delay的程序应该是一段延时程序,那么它究竟延时了多长时刻呢?咱们一会给咱们解说这个时刻的计算方法,先往下看吧。

  相同,子程序调用也有两条指令:acall和lcall。两者的区别是:acall指令调用的子程序开始地址有必要和acall后边的第一条指令在同一个2k区域的程序存储器内;而lcall指令能够调用寄存在程序存储器中64K字节规模内的任何地方的子程序。简略的说便是acall调用的规模小,而lcall的规模大。假如你拿不准的话,就用lcall吧。

  2、这条指令的功用是:把累加器a中的内容向左移动一位,最高位的内容A7被移动到最低位A0,图示如下:

  

 

  3、现在咱们来剖析delay子程序的延时时刻:

  咱们先看(3)(4)(5)(6)(7)这样几个句子:

  (3)的意思是给r6赋值02h。r6是什么?咱们如同曾经没有说过。咱们先知道它也是一个8位的寄存器就行啦,关于它的内容,咱们下面在介绍。

  (4)的意思和(3)相似,不再赘述。

  (5)应用了djnz指令,这个指令的意思是:减1不为0搬运。因而句子(6)的意思是:把r5中心存的内容减去1,假如不是0,就持续履行该条句子,不然,履行下面的句子。

  (6)依据上面的剖析咱们知道:(6)的意思是:把r6中的内容减1,假如不是0,就回来标号为del1的程序,从头给r5赋值0ffh,然后在对r5进行减1运算。

  从剖析可见,假如延时程序履行完,djnz指令总的履行次数是:02h×0ffh,即2×255=510次。

  可见,假如咱们知道履行一次djnz指令的时刻,咱们就能够算出这个程序的延时时刻了。那么履行一次djnz指令需求多少时刻呢?

  单片机的指令履行起来所花费的时刻是不一样的,有的指令履行时刻短,只需求1个机器周期,而有的指令履行时刻长,需求4个机器周期。Djnz指令的履行时刻是2个机器周期。

  每一个机器周期又是多长呢?从相关教材上,咱们知道1个机器周期是振动周期的12倍。

  而振动周期T=1/振动频率=1/12MHZ

  所以延时程序的总的延时时刻是:2×255×2×12×(1/12MHZ)=1ms

  好啦,现在把上面的程序下载到单片机中,你看到了什么?

  怎么回事,一切的灯都亮啦!

  当然啦,因为咱们的延时太短啦,只要1ms,所以咱们的眼睛底子分辩不出来。咱们现在把延时增加为100ms,程序修改如下:

  org 0000h

  start: clr p1.5

  mov a,#0feh

  loop: mov p0,a

  lcall delay

  rl a

  ajmp loop

  delay: mov r7,#100 ;把1ms延时子程序履行100次

  del1: mov r6,#02h

  del2: mov r5,#0ffh

  del3: djnz r5,del3

  djnz r6,del2

  djnz r7,del1

  ret

  end

  现在再看看,一切正常啦,ok!

  4、现在来看看寄存器R的问题

  单片机的存储器结构和常见的微型计算机的装备方法不同,把程序存储器和数据存储器分隔。程序存储器用来寄存程序,数据存储器用来寄存程序运转需求的常数和变量。

  单片机的数据存储器分为内部存储器和外部存储器,用mov拜访内部数据存储器,用movx拜访外部数据存储器。

  内部数据存储器是最灵敏的地址空间,一共有256字节。这256个字节被分为两组:00h~7fh的低128字节是内部RAM区;80h~ffh的高128字节为特别功用寄存器区。其间低128字节的地址分配如下图所示:

  

 

  从图上可见,低128字节中,从00h~1fh共32个字节是四个通用的作业寄存器区,每一个区有8个作业寄存器,编号均为从R0~R7。

  咱们可能会问,已然四个作业寄存器组的姓名都叫R0~R7,那么,上面的程序中心用的寄存器究竟是哪个呢?

  当时程序运用的作业寄存器区是有程序状态字PSW决议的。

  那么PSW又在哪里呢?

  方才咱们提到80h~ffh的高128字节是特别功用寄存器区,PSW就在这个区里边。这个区域还有许多其他特别功用寄存器,咱们能够参阅相关材料。

  PSW是一个8位的寄存器,它各位的阐明如下:

  

 

  其间,决议挑选哪个寄存器区的是RS1和RS0这两位,为00时,挑选0区;01时挑选1区;10时挑选2区;11时挑选3区。

  咱们可能会问,程序中心并没有给这个寄存器赋值,那么它究竟挑选哪个区域呢?

  因为单片机被复位后,一切的寄存器请零,所以在本程序中,缺省的运用的是0区的寄存器组。

  5、课后练习

  (1)、学习该实验中呈现的理论知识,包含程序存储器,数据存储器的地址分配,和相关指令。

  (2)、编写一个跑马灯程序,让二极管从左至右发光,延迟时刻是1s,即1000ms。留意,可不是把上面程序中的mov r7,#100,改成mov r7,#1000,那么简略哦。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/qiche/299142.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部