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

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

•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循环点亮•ORG0000H•AJMPSTART;转移至标号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秒钟延时子程序*************************************•DEL1S:MOVR3,#5•DEL:MOVR4,#100•DEL1:MOVR5,#250•DEL2:NOP•DJNZR5,DEL2•DJNZR4,DEL1•DJNZR3,DEL•RET•END任务9用自制的跑马灯电路实现8只LED循环点亮程序分析讲解

1 / 11
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功