任务9-用自制的跑马灯电路实现8只LED循环点亮_第1页
任务9-用自制的跑马灯电路实现8只LED循环点亮_第2页
任务9-用自制的跑马灯电路实现8只LED循环点亮_第3页
任务9-用自制的跑马灯电路实现8只LED循环点亮_第4页
任务9-用自制的跑马灯电路实现8只LED循环点亮_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

9.1.1明确工作任务用任务3制作的8位LED跑马灯电路,通过编写程序控制与P0口相连的8个LED灯循环点亮,每个灯点亮的时间为0.5秒。任务9用自制的跑马灯电路实现8只LED循环点亮

9.1.2跟我想

1.编写跑马灯程序思路该任务要求通过编写程序,使连接P0口的8个LED灯循环点亮(跑马灯),每个灯点亮的时间为0.5秒。怎样来编写程序呢?我们用一个寄存器R1存储用于点亮P0口的LED灯的数据,R1首先存储点亮与P0.0相连的LED灯D0(数据为:0000001H),可以通过指令MOVP0,R1将与P0.0相连的LED0点亮,然后调用延时0.5秒的程序,延时时间到后,可以带进位位左移指令RRA,将R1中的数据左移一位(数据为:00000010),再送给P0口,点亮与P0.1相连的LED灯D1,依次类推;用寄存器R2存储LED灯从D0移动到D7的移动次数为8次,每移一次减1,R2的值为0时,表示第1次循环结束,接下来又从点亮D0开始下一个循环,就这样反复循环点亮,达到跑马灯的效果。在编写程序之前,让我们学一学相关指令的功能和用法。任务9用自制的跑马灯电路实现8只LED循环点亮

9.1.3跟我学1)减1不为零循环转移指令DJNZDJNZRn,rel;PC←PC+2,Rn←(Rn)-1,若(Rn)≠0,则PC←PC+relDJNZdirect,rel;PC←PC+2,direct←(direct)-1,若(direct)≠0,则

PC←PC+rel;每执行一次循环转移指令,第一操作数(Rn或direct中的数)减1,并保存,若减1后结果不为零,则转移至目的地(标号处);若减1后结果为零,则程序按顺序执行下一条指令。

任务9用自制的跑马灯电路实现8只LED循环点亮

2)移位指令移位指令的功能是对累加器A的内容进行循环移位,除了带进位标志位CY的移位指令会影响CY外,其它指令都不影响CY、AC、OV等标志位。

RLA;循环左移指令;

RLCA;带进位位循环左移指令;图6-1RLA指令示意图图6-2RLCA指令示意图任务9用自制的跑马灯电路实现8只LED循环点亮

RRA;循环右移指令;RRCA;带进位位循环右移指令;

任务9用自制的跑马灯电路实现8只LED循环点亮

3)堆栈操作指令(1)堆栈的概念堆栈就是按照堆放货物(先堆下面,先搬上面,即后进先出)的思路,设计一种按后进先出原则组成的存储区,称为堆栈区。在51单片机中,片内RAM都可用做堆栈区。在使用堆栈前,应设置一个栈底,告诉CPU从那个地址单元开始堆放数据,如栈底为40H单元,第1个数(设:#30H)存放在栈底的上一个单元41H中,则第2个数存放42H单元中,如果有多个数要堆放在堆栈区中,以此类推,当用户取数时,则先从最顶部开始,即最后存的数先取出。在51单片机中有一个专门的堆栈指针寄存器SP,用于存放栈顶单元的地址。任务9用自制的跑马灯电路实现8只LED循环点亮

(2)堆栈的作用堆栈的作用是在子程序调用与中断时,用于保存断点地址及片内数据单元的内容。(3)堆栈的使用方法需要用到堆栈时,首先通过MOVSP,#data指令设置栈底,如:MOVSP,#60H.

注意:51单片机复位后,默认的栈底为07H,即SP的默认值为07H。因07H地址在RAM的工作寄存器区,所以用07H作为栈底,不是很合适,使用时必须另设栈底。在子程序调用或响应中断后,CPU会直接将断点地址压入堆栈区,但是要将某个数据保存在堆栈区就必须用压栈指令PUSH和出栈指令POP。任务9用自制的跑马灯电路实现8只LED循环点亮

压栈指令格式为:PUSHdirect;SP←SP+1

;(SP)←(direct)执行时堆栈指针SP先加1,然后将直接地址direct中的数据压至SP所指定的地址单元。如:MOVSP,#50H;设置栈底为50H单元

MOV30H,#25H;将立即数25H送30H单元

PUSH30H;将30H中的数据25H压入堆栈区51H单元出栈指令格式为:POPdirect;(direct)←(SP);SP←SP-1该指令执行时先将SP所指单元数据弹出至direct所指的地址单元,然后SP减1指向新的栈顶单元地址。4)子程序调用指令子程序调用指令的功能调用子程序,执行时先将断点地址(调用指令的下一条指令的首地址)压入堆栈区,然后将子程序的首地址送PC,执行子程序。(1)长调用指令LCALLaddr16;PC←PC+3

;SP←SP+1

;(SP)←PC7-0

;SP←SP+1

;(SP)←PC15-8

;PC←addr16这条指令调用地址为addr16(在写程序时都用子程序标号)处的子程序。执行时,先将PC+3(因为该指令是3字节指令)以获得下一条指令的首地址(断点地址),并把它压入SP所指定的堆栈区,然后将子程序标号所在的16位地址送PC指针,使CPU转去执行子程序。LCALL中的addr16取值范围为16位地址,所以子程序可位于程序存储器64KB空间的任何一处。(2)短调用指令ACALLaddr11;;PC←PC+2

;SP←SP+1

;(SP)←PC7-0

;SP←SP+1

;(SP)←PC15-8

;PC10-0←addr10-0

执行该指令时,先将PC+2得到下一条指令的16位首地址,并将其压入堆栈,最后子程序标号所在的子程序入口地址送给PC,CPU转入子程序执行。由于短调用指令中的PC高5位地址不变,所以其转移的范围为2KB。任务9用自制的跑马灯电路实现8只LED循环点亮

ORG0000HAJMPSTART;转移至标号START ORG0030H;以下程序下载到单片机的ROM时,从ROM的0030地址开始存储

START:MOVR1,#00000001B;将立即数01H送R1 MOVR2,#08;将立即数8送R2,循环8次(8个灯)LOOP:MOVA,R1;将R1中的数送A MOVP0,A;将A中的数送P0口,点亮LED灯

CALLDEL1S;调用延时子程序,控制亮灯时间

RLA;A中的数据左移一位,为下一次亮灯作准备

MOVR1,A;左移后的数据存放在R1 DJNZR2,LOOP;循环了8次吗?没有则继续

AJMPSTART;完成8次循环,转移至START重新开始

;***************1秒钟延时子程序***********************

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论