首页 > 应用 > qy002千赢国际应用
[导读]让我们先来复习一下我们学过的一些指令:MOV P1,#0FFH,MOV R7,#0FFH这些指令都是将一些数据送到对应的位置中去,为什么要送数据呢?第一个因为送入的数能让灯全灭掉,第二个是为了要实现延时,从这里我们能看出来
让我们先来复习一下我们学过的一些指令:MOV P1,#0FFH,MOV R7,#0FFH这些指令都是将一些数据送到对应的位置中去,为什么要送数据呢?第一个因为送入的数能让灯全灭掉,第二个是为了要实现延时,从这里我们能看出来,在用qy002千赢国际的编程语言编程时,经常要用到数据的传递,事实上数据传递是qy002千赢国际编程时的一项重要工作,一共有28条指令(qy002千赢国际共111条指令)。下面我们就从数据传递类指令开始吧。

分析一下MOV P1,#0FFH这条指令,我们不难得出结论,第一个词MOV是命令动词,也就是决定做什么事情的,MOV是MOVE少写了一个E,所以就是“传递”,这就是指令,规定做什么事情,后面还有一些参数,分析一下,数据传递必须要有一个“源”也就是你要送什么数,必须要有一个“目的”,也就是你这个数要送到什么地方去,显然在上面那条qy002千赢国际指令中,要送的数(源)就是0FFH,而要送达的地方(目的地)就是P1这个寄存器。在数据传递类指令中,均将目的地写在指令的后面,而将源写在最后。

这条指令中,送给P1是这个数本身,换言之,做完这条指令后,我们能明确地知道,P1中的值是0FFH,但是并不是任何时候都能直接给出数本身的。例如,在我们前面给出的qy002千赢国际延时程序例是这样写的:

MAIN: SETB P1.0     ;(1)

   LCALL DELAY ;(2)

    CLR P1.0      ;(3)

   LCALL DELAY   ;(4)

    AJMP MAIN    ;(5)

;以下子程序

DELAY: MOV R7,#250   ;(6)

D1: MOV R6,#250   ;(7)

D2: DJNZ R6,D2    ;(8)

   DJNZ R7,D1   ;(9)

   RET        ;(10)

   END        ;(11)

表1

-----------------------------------------------------

MAIN: SETB P1.0     ;(1)

   MOV 30H,#255

    LCALL DELAY ;

    CLR P1.0      ;(3)

    MOV 30H,#200

    LCALL DELAY   ;(4)

    AJMP MAIN    ;(5)

;以下子程序

DELAY: MOV R7,30H   ;(6)

D1: MOV R6,#250   ;(7)

D2: DJNZ R6,D2    ;(8)内容来自qy002千赢国际之家www.dpj100.com

   DJNZ R7,D1   ;(9)

   RET        ;(10)

   END        ;(11)

表2

 这样一来,我每次调用延时程序延时的时间都是相同的(大致都是0.13S),如果我提出这样的要求:灯亮后延时时间为0.13S灯灭,灯灭后延时0.1秒灯亮,如此循环,这样的程序还能满足要求吗?不能,怎么办?我们能把延时程序改成这样(见表2):调用则见表2中的主程,也就是先把一个数送入30H,在子程序中R7中的值并不固定,而是根据30H单元中传过来的数确定。这样就能满足要求。


从这里我们能得出结论,在数据传递中要找到被传递的数,很多时候,这个数并不能直接给出,需要变化,这就引出了一个概念:如何寻找操作数,我们把寻找操作数所在单元的地址称之为寻址。在这里我们直接使用数所在单元的地址找到了操作数,所以称这种办法为直接寻址。除了这种办法之外,还有一种,如果我们把数放在工作寄存器中,从工作寄存器中寻找数据,则称之为寄存器寻址。例:MOV A,R0就是将R0工作寄存器中的数据送到累加器A中去。提一个问题:我们知道,工作寄存器就是内存单元的一部份,如果我们选择工作寄存器组0,则R0就是RAM的00H单元,那么这样一来,MOV A,00H,和MOV A,R0不就没什么区别了吗?为什么要加以区别呢?的确,这两条指令执行的结果是完全相同的,都是将00H单元中的内容送到A中去,但是执行的过程不一样,执行第一条指令需要2个周期,而第二条则只需要1个周期,第一条指令变成最终的目标码要两个字节(E5H 00H),而第二条则只要一个字节(E8h)就能了。


这么斤斤计较!不就差了一个周期吗,如果是12M的晶体震荡器的话,也就1个微秒时间了,一个字节又能有多少?

不对,如果这条指令只执行一次,也许无所谓,但一条指令如果执行上1000次,就是1毫秒,如果要执行1000000万次,就是1S的误差,这就很可观了,qy002千赢国际做的是实时控制的事,所以必须如此“斤斤计较”。字节数同样如此。

再来提一个问题,现在我们已知,寻找操作数能通过直接给的方式(立即寻址)和直接给出数所在单元地址的方式(直接寻址),这就够了吗?

看这个问题,要求从30H单元开始,取20个数,分别送入A累加器。

就我们目前掌握的办法而言,要从30H单元取数,就用MOV A,30H,那么下一个数呢?是31H单元的,怎么取呢?还是只能用MOV A,31H,那么20个数,不是得20条指令才能写完吗?这里只有20个数,如果要送200个或2000个数,那岂不要写上200条或2000条命令?这未免太笨了吧。为什么会出现这样的状况?是因为我们只会把地址写在指令中,所以就没办法了,如果我们不是把地址直接写在指令中,而是把地址放在另外一个寄存器单元中,根据这个寄存器单元中的数值决定该到哪个单元中取数据,比如,当前这个寄存器中的值是30H,那么就到30H单元中去取,如果是31H就到31H单元中去取,就能解决这个问题了。怎么个解决法呢?既然是看的寄存器中的值,那么我们就能通过一定的办法让这里面的值发生变化,比如取完一个数后,将这个寄存器单元中的值加1,还是执行同一条指令,可是取数的对象却不一样了,不是吗。通过例程来说明吧。

MOV R7,#20

   MOV R0,#30H

LOOP:MOV A,@R0

   INC R0

   DJNZ R7,LOOP

这个例程中大部份指令我们是能看懂的,第一句,是将立即数20送到R7中,执行完后R7中的值应当是20。第二句是将立即数30H送入R0工作寄存器中,所以执行完后,R0单元中的值是30H,第三句,这是看一下R0单元中是什么值,把这个值作为地址,取这个地址单元的内容送入A中,此时,执行这条指令的结果就相当于MOV A,30H。第四句,没学过,就是把R0中的值加1,因此执行完后,R0中的值就是31H,第五句,学过,将R7中的值减1,看是否等于0,不等于0,则转到标号LOOP处继续执行,因此,执行完这句后,将转去执行MOV A,@R0这句话,此时相当于执行了MOV A,31H(因为此时的R0中的值已是31H了),如此,直到R7中的值逐次相减等于0,也就是循环20次为止,就实现了我们的要求:从30H单元开始将20个数据送入A中。

这也是一种寻找数据的办法,由于数据是间接地被找到的,所以就称之为间址寻址。注意,在间址寻址中,只能用R0或R1存放等寻找的数据。
本文引用地址: http://www.21ic.com/app/mcu/201901/779916.htm
换一批

延伸阅读

[qy002千赢国际应用] qy002千赢国际I/O口管脚内部结构

qy002千赢国际I/O口管脚内部结构 学习ARM嵌入式的时候,发现自己对以前学过的数模器件的知识遗忘了不少,按照我的进度本来应该继续学习ARM微处理器控制的课程,但想着后来势必还会遇到相同的问题所以就准备中断一下,杀回来把汇编和一些电路知识再总......关键字:qy002千赢国际 I O口管脚 内部结构

[qy002千赢国际应用] 关于qy002千赢国际串口发送和接收的问题

关于qy002千赢国际串口发送和接收的问题串口初始化过程:    1、确定T/C1的工作方式--TMOD    2、设置T/C初始值----------------------------TH1、TH2    3、启动T/C-----------------------------......关键字:qy002千赢国际 串口 发送和接收

[qy002千赢国际应用] 上位机控制qy002千赢国际LED

上位机控制qy002千赢国际LED整了一天程序,写了个上位机程序和qy002千赢国际程序。总结下。。。上位机部分:相关参考资料:http://wenku.baidu.com/view/5ea8670403d8ce2f00662322.html1.先添加各控件,添加后的对话框如下图:2.......关键字:上位机 控制qy002千赢国际 LED

[qy002千赢国际应用] 用qy002千赢国际做一个计算器

用qy002千赢国际做一个计算器  硬件电路程序#include T89X51.H>#define DIN P1_0#define CLK P1_2#define LOAD P1_1unsigned char key_h,key_l,key_code;unsigned ......关键字:qy002千赢国际 计算器

[qy002千赢国际应用] 串行口异步通信qy002千赢国际程序设计实例

串行口异步通信qy002千赢国际程序设计实例org 0000HAJMP STARTORG 30HSTART:mov SP,#5fh ;mov TMOD,#20h ;T1: 工作模式2mov PCON,#80h ;SMOD=1mov TH1,#0FDH ;初始化波特率(参见表)mov ......关键字:串行口 异步通信 qy002千赢国际

[qy002千赢国际应用] AVRqy002千赢国际(学习ing)—(十)、ATMEGA16的同步串行接口SPI—02

AVRqy002千赢国际(学习ing)—(十)、ATMEGA16的同步串行接口SPI—021)那就是在之前的介绍中说过,在说一遍~~主机和从机的两个移位寄存器可以被认为是一个公开的16位环形移位寄存器,当数据从主机移向从机时,同时从机饿数据也向相反的放向移向主机。这就意味着在一个以为周期内,主机......关键字:AVRqy002千赢国际 ATMEGA16 同步串行接口 SPI

[qy002千赢国际应用] qy002千赢国际轻松入门之三:蜂鸣器

qy002千赢国际轻松入门之三:蜂鸣器qy002千赢国际轻松入门之三蜂鸣器该电路较简单,用PNP型三极管驱动蜂鸣器,当P3.7为低电平时,PN结正向偏置,三极管导通,蜂鸣器发声。程序如下:#include#define uchar unsigned charsbit sounder=P3^......关键字:qy002千赢国际 蜂鸣器

[大数据] 雾计算成为工业物联网自主化关键

雾计算成为工业物联网自主化关键工业物联网(IIoT)将原本独立编程的各种装置,全结合在同一个智能网络系统。这些系统通常具备实时运算、数据互连、资安整合、高性能、可靠、可扩充等能力。由于当前采用的云端解决方案仍有不少限制,因此有越来越多先进且高价值的IIoT使用案例,开始......关键字:雾计算 工业物联网

我 要 评 论

网友评论

芯闻号

技术子站

更多

项目外包

更多

推荐博客