1、项目 2 灯光闪烁学习目标及要求1学用程序方框图;2重点掌握 MOV、LCALL、LJMP、DJNZ、RET 等指令(12 条) ;3了解 ORG、END 伪指令的用法;4初步理解单片机内部结构资源:工作寄存器(R0R7) ; 5掌握软件延时程序的编程方法;(难点)6理解机器周期的相关概念。示范与模仿 “灯光闪烁”操作任务 如图 2-5所示:在 P1.0端口上接一个发光管 L1,使 L1在不停地一亮一灭;一亮一灭的时间间隔为 0.2秒。图 2-5“灯光闪烁”硬件电路操作步骤实验箱的使用与 Keil软件的基本使用同前,不在重复。统板上硬件连线:把“单片机系统”区域中的 P1.0端口用导线连接到“
2、八路发光二极管指示模块”区域中的 L1端口上。编写汇编源程序:;“灯光闪烁”汇编源程序-dgss.asmORG 00 ;新涉及的伪指令START: SETB P1.0LCALL DELAY ;新涉及的指令CLR P1.0LCALL DELAYLJMP START ;新涉及的指令DELAY: MOV R5,#20 ;新涉及的指令D1: MOV R6,#20D2: MOV R7,#248DJNZ R7,$ ;新涉及的指令DJNZ R6,D2DJNZ R5,D1RET ;新涉及的指令END ;新涉及的伪指令编译、连接、调试与运行,并观察实际结果。项目 2-2相关知识与技能点1、程序中所涉及的新指令(
3、参照“MCS-51 汇编指令简表” )新指令指令格式:LCALL addr16功能:控制转移类指令;是长调用子程序指令,可表示为 addr16PC;字节数为 3,周期数为 2。说明:addr16 为子程序起始地址(又叫入口地址) 。PC是单片机中的一个 16位程序计数器,里面存放的是将要执行指令的地址,又叫程序指针。LCALL addr16执行过程见图 2-6。图 2-6 调用子程序示意图该指令为程序存储器 64KB地址范围内的调用子程序指令,子程序可在64KB地址空间的任一处。堆栈:实际上就是数据存储器(RAM)里的一块,只不过存取数据时有个特点,即“先进去的数据后出来,后进去的数据先出来”
4、 ,数据是一个压着一个堆起来的。上面的数据不取出,下面的数据也出不来。类似的指令有:ACALL。指令格式:ACALL addr11功能:控制转移类指令;是短调用子程序指令,可表示为 addr11PC;字节数为 2,周期数为 2。说明:基本作用同 LCALL addr16,只是该指令为 2KB地址范围内的调用子程序指令,子程序入口地址距当前 PC不得超过 2KB地址范围。注:在使用调用子程序指令时,如不清楚地址范围,可以全用 LCALL指令,功能是一样的,地址范围是最大的,只是多用一个字节的程序存储空间。而在实际编程时,其子程序的入口地址往往是用一个标号来实现,如本程序中的DELAY标号,而不用
5、管它的具体地址值是多少。指令格式:RET功能:控制转移类指令;是子程序返回指令;字节数为 1,周期数为 2。说明:每个子程序必须以 RET指令结束。其作用是从堆栈中自动取出断点的地址值送到 PC,从子程序返回到主程序。指令格式:Ljmp addr16功能:控制转移类指令;是一个长转移指令,可表示为 addr16PC;字节数为 3,周期数 2。说明:该指令被执行后,其后的 addr16地址值送到 PC,然后,程序跳转到 addr16处去执行。跳转范围为 64KB程序存储器的全部地址。类似的指令还有:AJMP、SJMP。指令格式:Ajmp addr11功能:控制转移类指令;是一个短转移指令,可表示
6、为 addr11PC;字节数为 2,周期数 2。说明:功能同 LJMP,只是用于 2KB地址范围内的转移。指令格式:Sjmp rel功能:控制转移类指令;是一个无条件相对转移指令,可表示为PC+relPC;字节数为 2,周期数 2。说明:rel 为相对当前地址的用一个有符号字节数表示的偏移量,其偏移范围为-127+127,转移可以向前转移(目的地址小于当前地址) ,也可向后转移(目的地址大于当前地址) 。注:在使用转移指令时,如不清楚地址范围,可以全用 LJMP指令,功能是一样的,地址范围是最大的,只是多占用一个字节的程序存储空间。而在实际编程时,其目的地址(不论是 16位地址,还是 11位地
7、址或是 rel)往往是用一个标号来实现,如本程序中的 START标号,而不用管它的具体地址值是多少。指令格式:Djnz Rn,rel功能:控制转移类指令;是一个条件转移指令,可表示为 Rn-1Rn,Rn0 时,则 PC+relPC;字节数为 2,周期数 2。说明:该指令是寄存器自动减 1不为零转移的指令;Rn 为单片机中的工作寄存器(R0R7)。该指令的作用是先对 Rn中的值自动减 1,然后判断 Rn中的值是否为零?如果为零,程序则顺序往下执行;如果不为零,程序则转移到目标地址处执行。类似的指令有:指令格式:Djnz direct,rel功能:控制转移类指令;是一个条件转移指令,可表示为(di
8、rect)-1(direct) , (direct)0 时,则 PC+relPC;字节数为 3,周期数 2。说明:direct 是一个 8位直接地址, (direct)是表示这个地址中的字节内容(数值) ;该指令的作用是直接寻址单元内容减 1不为零转移,功能同上一条指令类似。指令格式:MOV Rn,#data功能:数据传送类指令;为立即数送寄存器指令,其功能可表示为dataRn,字节数为 2,周期数为 1。说明:该指令是将立即数 data送寄存器 Rn。指令中的操作数我们给出了三种方式:#data(立即数) 、direct(直接地址)和 Rn(工作寄存器)。与这三种操作数有关的 MOV指令还有
9、:MOV direct,Rn;MOV Rn,direct;MOV direct2,direct1。分述如下:指令格式:MOV direct,Rn功能:数据传送类指令;为寄存器送直接寻址单元指令,其功能表示为Rn(direct);字节数为 2,周期数为 2。说明:该指令是将工作寄存器里的数送直接寻址单元。指令格式:MOV Rn,direct功能:数据传送类指令;为直接寻址单元送寄存器指令,其功能表示为(direct)Rn;字节数为 2,周期数为 2。说明:该指令是将直接寻址单元里的数送工作寄存器。指令格式:MOV direct2,direct1功能:数据传送类指令;为直接寻址单元 1送直接寻址单
10、元 2指令,其功能表示为(direct1)(direct2);字节数为 3,周期数为 2。说明:该指令是将直接寻址单元 1里的数送直接寻址单元 2。注:由于 MOV在这些指令中最大只能传送一个字节的数,所以传送的最大数不能大于 255(十进制)。伪指令起始指令:ORG nn功能:为机器汇编时,指示此语句后面的程序或数据块以 nn为起始地址连续存放在程序存储器中。说明:nn 为起始地址值。如在本程序例中:ORG 00START: SETB P1.0指示 START标号的指令地址从程序存储器的 00地址开始连续存放。汇编结束指令:END功能:指示源程序段结束。说明:通常程序都是以 END伪指令作结
11、束指令。如本程序例:.END伪指令不是控制单片机操作的指令,因此不是可执行指令。它只是在机器自动把源程序翻译成机器语言时,必须为汇编程序提供辅助信息的一些指令。2、程序的编程思路与解读程序方框图:编程时,首先要养成理清编程思路的好习惯,就是在具体编写程序前,要根据任务的要求,构画出程序的主架构及关系,即程序方框图(由一些方框、菱形和箭头线组成) 。解读程序也是这样。本程序方框图见图2-7。图 2-7 “灯光闪烁”程序方框图程序解读:整个程序分为两大部分:主程序段和延时子程序段。主程序段:ORG 00 ;伪指令,指示后面的程序段起始地址从 00开始START: SETB P1.0 ;P1.0 输
12、出”1”,L1 灯灭LCALL DELAY ;调用标号为 DELAY的延时子程序, 延时0.2秒CLR P1.0 ;P1.0 输出”0”,L1 灯亮LCALL DELAY ;调用标号为 DELAY的延时子程序, 延时 0.2秒LJMP START ;跳转到标号为 START处的指令循环执行延时子程序段:延时 0.2秒DELAY: MOV R5,#20 ;将十进制的立即数 20送到 R5工作寄存器D1: MOV R6,#20 ;将十进制的立即数 20送到 R6工作寄存器D2: MOV R7,#248 ;将十进制的立即数 248送到 R7工作寄存器DJNZ R7,$ ;R7 减 1不为零转移到本指
13、令地址(用$表示)DJNZ R6,D2 ;R6 减 1不为零转移到标号 D2处DJNZ R5,D1 ;R5 减 1不为零转移到标号 D1处RET ;子程序结束,返回到主程序整个程序运行的结果,实现了 L1灯不停地亮和灭,其间隔为 0.2秒。3、延时程序的设计方法延时程序是如何设计的呢?下面具体介绍其原理:如图 2-5所示的石英晶体为 12MHz,因此,1 个时钟振荡周期为1/f=1/12MHz秒=1/(1210 6)秒。一个机器周期=12 个时钟周期=121/12M=1/1000000 秒=1 微秒。则延时子程序:;机器周期数 所用时间DELAY: MOV R5,#20 ; 2 2usD1:
14、MOV R6,#20 ; 2 2usD2: MOV R7,#248 ; 2 2usDJNZ R7,$ ; 2 2us 重复执行 248次DJNZ R6,D2 ; 2 2us 重复执行 20次DJNZ R5,D1 ; 2 2us 重复执行 20次执行完后,所用的时间为:第 4条指令执行完所用的时间为:2248=496(微秒)=0.496ms;第 3条至第 5条指令重复执行 20次所用时间为:20(2+496+2)=10000微秒=10ms;第 2条至第 6条指令重复执行 20次所用时间为:20(2+10000+2)=200080(微秒)=200.08ms;再加上第 1条指令所用的时间,因此,上面
15、的延时程序总时间为 200.082 ms,近似为 0.2秒。套用上述编程格式,当 R7248 时,其延时公式为:t=0.5msR6R5。根据不同的延时要求,适当调整 R5与 R6的值的乘积即可。如本程序要求延时 0.2秒200ms,即 0.5msR6R5=200ms,则R5R6=400。R5=10,R6=40 可以实现;R5=4,R6=100 也可以实现。在实际延时编程时,如需要的延时时间较大,可增加工作寄存器;如需要的延时时间较小,也可减少工作寄存器,灵活应用。注:MOV 传送的最大数不能超过 255。4、工作寄存器(R0R7)工作寄存器在内部数据存储器中,见 MCS-51内部 RAM存储器
16、结构及寄存器和 RAM地址对照表。数据缓冲区地址范围 30H7FH位寻址区(007F)地址范围 20H2FH工作寄存器区 3(R0R7)地址范围18H1FH工作寄存器区 2(R0R7)地址范围10H17H工作寄存器区 1(R0R7)地址范围08H0FH工作寄存器区 0(R0R7)地址范围00H07HMCS-51内部 RAM存储器结构0区 1区 2区 3区00H R0 08H R0 10H R0 18H R001H R1 09H R1 11H R1 19H R102H R2 0AH R2 12H R2 1AH R203H R3 0BH R3 13H R3 1BH R304H R4 0CH R4
17、14H R4 1CH R405H R5 0DH R5 15H R5 1DH R506H R6 0EH R6 16H R6 1EH R607H R7 0FH R7 17H R7 1FH R7寄存器和 RAM地址对照表工作寄存器有四组,每组 8个(R0R7)寄存器。可以由用户通过特殊功能寄存器 PSW的 D4和 D3位来自行定义使用哪个组。见工作寄存器区选择表。PSW.4(RS1) PSW.3(RS0) 当前工作寄存器(R0R7)0 0 0区0 1 1区1 0 2区1 1 3区工作寄存器区选择使用工作寄存器时应注意:初始化或复位时,自动选中 0组;寄存器的选组用程序状态字 PSW的 RS1和 RS
18、0位决定;一旦选中了一组寄存器,其它三组只能作为数据存储器使用,而不能作为寄存器使用。应用性训练任务 1:要延时 0.5秒,延时程序如何设计?包括方框图。任务 2:用 R2、R3、R4 工作寄存器如何设计上述任务?任务 3:让 8只灯同时闪烁,程序如何设计?课后思考与总结1、本模块用了哪些指令?新学了哪些指令?2、本模块用了哪些伪指令?其作用是什么?3、工作寄存器有几个?各叫什么名字?分几组?它们各在内部 RAM中的地址范围是如何分配的?4、软件延时程序的编程原理和方法是怎样的?5、当晶振选用 12MHz时,单片机的一个机器周期是多少微秒?当晶振选用6MHz时,单片机的一个机器周期又是多少微秒?