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

发布者:云淡风轻2014最新更新时间:2016-09-09 来源: eefocus关键字:单片机  基本I  O口试  跑马灯 手机看文章 扫描二维码
随时随地手机看文章
一、试验现象:

 

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

 

二、试验目的:

 

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,图示如下:

 

 

单片机学习之六:基本I/O口试验二:跑马灯 - 北极星 - 要做一粒好的种子

 

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字节的地址分配如下图所示:

 

                 单片机学习之六:基本I/O口试验二:跑马灯 - 北极星 - 要做一粒好的种子

 

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

 

大家可能会问,既然四个工作寄存器组的名字都叫R0~R7,那么,上面的程序中间用的寄存器到底是哪个呢?

 

当前程序使用的工作寄存器区是有程序状态字PSW决定的。

 

那么PSW又在哪里呢?

 

刚才我们说到80h~ffh的高128字节是特殊功能寄存器区,PSW就在这个区里面。这个区域还有很多别的特殊功能寄存器,大家可以参考相关资料。

 

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

 

 

 单片机学习之六:基本I/O口试验二:跑马灯 - 北极星 - 要做一粒好的种子

 

 

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

 

大家可能会问,程序中间并没有给这个寄存器赋值,那么它到底选择哪个区域呢?

 

由于单片机被复位后,所有的寄存器请零,所以在本程序中,缺省的使用的是0区的寄存器组。

 

 

 

5、课后练习

 

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

 

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

关键字:单片机  基本I  O口试  跑马灯 引用地址:单片机学习之六:基本I/O口试验二:跑马灯

上一篇:单片机学习之五:基本I/O口试验-点亮二极管
下一篇:单片机学习之四:MCS-51单片机引脚说明

推荐阅读最新更新时间:2024-03-16 15:09

为什么推荐数字电源和电机控制项目要选择第三代C2000 MCU
德州仪器C2000实时控制系列产品即将新添F28003X成员,F28003X比F28002X/F28004X提供更高的运算性能以及更大的FLASH空间。日前,德州仪器嵌入式现场应用工程师Dean在EEWORLD直播间,详细介绍了F28003X的特性及其应用。 从第三代C2000说起 C2000微控制器是专为实时控制而设计的微控制器,主要应用领域有两大方面,包括数字电源控制(比如太阳能风能的电源控制,通信和服务器电源),以及电机类控制(家电类的电子产品:空调、冰箱、洗衣机、无人机、电动车、水泵等等,工业类伺服驱动器:如工业机器人、伺服驱动器、变频器等等。)此外,由于其具有车规级认证要求,因此也适合诸多汽车上的应用,包括电源
[单片机]
为什么推荐数字电源和电机控制项目要选择第三代C2000 <font color='red'>MCU</font>?
PIC单片机中预分频器的作用
预分频器是一个分频倍数可编程的8位计数器。其结构如图所示上节对预分频参数已有描述,这里不赘述。 预分频器的分配对象完全由程序控制。可以在程序中改变预分频器分配对象。 1、从RTCC到WDT的改变 MOVLW B‘XX0X0XXX’ ;选择内部时钟和新的预分频值 OPTION ;如果新的预分频值=“000”或者 CLRF RTCC ;=“001”,则暂时先选一个另外的值 MOVLW B‘XXXX1XXX’ ;清零RTCC和预分频器 OPTION ;选择WDT为对象,但不要改变预分频值 CLRWDT ;清WDT和预分频器 MOVLW B‘XXXX1XXX’ ;选择新的预分频值 2、从WDT到RTCC的改变 CLRWDT ;清
[单片机]
PIC<font color='red'>单片机</font>中预分频器的作用
STM8单片机学习总结初步02
之前做的PCB板回来前,需构建“驱动代码”的“架构”问题,相对简单,按流程图整理出的文件截图共2页,具体如下: 第1页: 第2页: --------------------------华丽分割线 1------------------------- 编程使用的“版本”为“IAR for STM8 1401”,使用还不错,比较顺手,由于已经完成过部分驱动,并将所有头文件封装进 includes.h 中,包含的头文件如下: #ifndef __INCLUDES_H_FOR_STM8 #define __INCLUDES_H_FOR_STM8 #include ultra_maps.h #include ultra_edi
[单片机]
STM8<font color='red'>单片机</font>学习总结初步02
基于A3967SLB的步进电机细分驱动系统设计
步进电机精度高,惯性小,在不失步的情况下没有步距误差积累,特别适用于数字控制的定位系统。传统的细分驱动电路由细分环行分配器、放大器和合成器等部分组成。这种电路应用复杂,灵活性差。本文利用A3967SLB作为步进电机微控芯片,简化了步进电机的控制实现。由于单片机资源没有PC丰富,人机界面也没有PC友好,因此,本文采用了主从式结构,即PC用于管理,单片机用于执行。 由A3967SLB构成步进电机的驱动部分 A3967SLB是美国Allegro公司生产的PWM恒流控制微步距驱动二相步进电机专用驱动器。它的工作电压可达30V,驱动电流达750mA,一个A3967SLB即可驱动一台二相步进电机,可实现8细分驱动。芯片内部的PWM电流控制电
[应用]
构造一个51单片机的实时操作系统的方法
目前,大多数的产品开发是在基于一些小容量的单片机上进行的。51系列单片机,是我目前使用最多的单片机系列之一,有非常广大的应用环境与前景,多年来的资源积累,使51系列单片机仍是许多开发者的首选。针对这种情况,近几年涌现出许多基于51内核的扩展芯片,功能越来越齐全,速度越来越快,也从一个侧面说明了51系列单片机在国内的生命力。 多年来我们一直想找一个合适的实时操作系统,作为自己的开发基础。根据开发需求,整合一些常用的嵌入式构件,以节约开发时间,尽最大可能地减少开发工作量;另外,要求这个实时操作系统能非常容易地嵌入到小容量的芯片中。毕竟,大系统是少数的,而小应用是多数而广泛的。显而易见,μC/OS—II是不太适合于以上要求的,而Keil
[单片机]
用一个微控制器输入端读取多个开关与一只电位计的设置
  本例中的电路给出了一种方法,用一个输入端,将混合的模拟与数字输入传送给一个微控制器。电路输出被连接到一个微控制器的ADC输入端。电路包括一个可变电阻和几个SPST(单刀单掷)开关(图1)。用户可以用按键来选择模式、状态或选项,而模拟输入提供了一种传送可调节参数的方法。这个实现要求分析一个并行电阻电路和一个分压器。如果仔细选择了电阻值,则电路就能提供一个可识别的模拟输入,以及一系列分立的按键输入状态。   图1,本电路可用一只微控制器管脚,读出多个开关和一只电位器的值。   电阻值的选择是一个多步的过程,用一个电子表可帮助完成这个计算。例如,假设你想要用5 kΩ的电位器RADJ,为微控制器产生一个0至100%的值。通
[电源管理]
用一个<font color='red'>微控制器</font>输入端读取多个开关与一只电位计的设置
单片机攻略4——中断和串口
一、中断 首先要明白什么是中断程序。 书上说:中断程序是一种特殊的程序运行方式,中断向量是这个中断程序运行的入口,一个中断程序包括中断请求,中断响应,中断关闭三步走。定义很严谨,用我的理解来讲中断其实可以类比我们日常生活中的“随时响应” 比如说:目前正在努力学习(主函数执行其任务),突然肚子咕咕叫起来(中断请求),肚子叫是随时都有可能发生的,也有可能是每次饭后隔3个小时又饿了,反正就是在满足肚子饿了的条件下才会叫(中断开关和条件),提醒我们要进食了(中断响应)。吃完饭后我们回去继续学习(中断返回)。 从程序的角度来看,一旦打开中断开关,中断就会开始判断条件,满足条件之后执行中断里面的程序内容。理清楚先后顺序对于理解
[单片机]
基于STM32单片机的数据记录装置设计
引言 本文针对电动汽车研究的实际需求,设计一款数据记录装置,该数据记录装置是搭建在电池能量管理系统基础上的,通过与能量管理系统通信,记录电动汽车实际运行时电池的外部状态(如:电池电压、电流、温度等),一方面为了研究电池的工作特性,另一方面为了对能量管理系统的工作情况做验证,为电动汽车动力电池的理论研究提供数据支持。 1 系统总体设计 本数据记录装置的设计包括硬件设计与软件设计两方面,软件设计主要包括数据接收的编程以及数据存储的编程,而硬件设计主要有几个方面:主控芯片的选择、复位功能的实现、电源模块、实时时钟、通信模块以及SD卡连接等。主控芯片是控制系统的核心,它内部所集成的模块越多,就能省去更多的外部电路,使得电路的设
[电源管理]
基于STM32<font color='red'>单片机</font>的数据记录装置设计
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved