立即注册 登录
返回首页

uid:126287的个人空间

日志

章4 80C51的汇编语言程序设计

已有 764 次阅读2016-6-11 22:34

4   80C51的汇编语言程序设计

 

180C51单片机汇编语言有何特点?

答:

汇编语言结构紧凑、灵活,汇编成的目标程序效率高,具有占存储空间少、运行速度快、实时性强等优点。它是面向机器的语言,对于单片机硬件的操作直接、方便,有利于初学者对单片机结构的认知。

但它与高级语言相比移植性不好、编程复杂、对编程人员的基础要求高。

2.利用80C51单片机汇编语言进行程序设计的步骤如何?

答:

一、任务分析

首先,要对单片机应用系统的设计目标进行深入分析,明确系统设计任务:功能要求和技术指标。然后对系统的运行环境进行调研。这是应用系统程序设计的基础和条件。

二、算法设计

经过任务分析和环境调研后,已经明确的功能要求和技术指标可以用数学方法(或模型)来描述,进而把一个实际的系统要求转化成由计算机进行处理的算法。并对各种算法进行分析比较,并进行合理的优化。

三、流程描述

程序的总体构建。先要确定程序结构和数据形式,资源分配和参数计算等。然后根据程序运行的过程,规划程序执行的逻辑顺序,用图形符号将程序流程绘制在平面图上。应用程序的功能通常可以分为若干部分,用流程图将具有一定功能的各部分有机地联系起来。

流程图可以分为总流程图和局部流程图。总流程图侧重反映程序的逻辑结构和各程序模块之间的相互关系;局部流程图反映程序模块的具体实施细节。

3.常用的程序结构有哪几种?特点如何?

答:

顺序程序:无分支、无循环结构的程序,其执行流程是依指令在存储器中的存放顺序进行的;

分支程序:可以改变程序的执行顺序;

循环程序:按某种控制规律重复执行的程序,控制一部分指令重复执行若干次,以便用简短的程序完成大量的处理任务。

4子程序调用时,参数的传递方法有哪几种?

答:

利用累加器或寄存器;

利用存储器;

利用堆栈。

5什么是伪指令?常用的伪指令功能如何?

答:

伪指令是汇编程序能够识别并对汇编过程进行某种控制的汇编命令。常用的伪指令包括:

ORG功能是向汇编程序说明下面紧接的程序段或数据段存放的起始地址

END功能是结束汇编

DB功能从标号指定的地址单元开始,在程序存储器中定义字节数据

DW功能从标号指定的地址单元开始,在程序存储器中定义字数据空间

EQU功能是将表达式的值或特定的某个汇编符号定义为一个指定的符号名

BIT功能位地址赋给指定的符号名

6设被加数存放在内部RAM20H21H单元,加数存放在22H23H单元,若要求和存放在24H25H中,试编写出16无符号数相加的程序(采用大端模式存储)

答:程序如下:

ORG   0000H

MOV   R0,21H

MOV   R1,23H

MOV   A,@R0

ADD   A,@R1

MOV   25H,A

DEC    R0

DEC    R1

MOV   A,@R0

ADDC  A,@R1

MOV   24H,A

SJMP   $

END

7编写程序,把外部RAM1000H~101FH的内容传送到内部RAM30H~4FH中。

答:

ORG  0000H

      MOV  DPTR,#1000H

      MOV  R0,#30H

      MOV  R7,#32

LOOP:MOVX  A,@DPTR

      MOV  @R0,A

      INC  R0

      INC  DPTR

      DJNZ  R7,LOOP

      RET

8编写程序,实现双字节无符号数加法运算,要求 R0R1+R6R760H61H

答:

ORG  0000H

MOV   A,R1

ADD   A,R7

MOV   61H,A

MOV   A,R0

      ADDC  A,R6

      MOV   60H,A

      SJMP  $

      END

980C51的晶振频率为6MHz,试计算延时子程序的延时时间。

DELAY:MOV   R7,#0F6H

     LP:MOV   R6,#0FAH

        DJNZ  R6,$

        DJNZ  R7,LP

        RET

答:延时时间: 2μs*{[1+(1+2*250+2*246)+2]+2}=0.247486秒(含调用指令2个机器周期)

 

10在内部RAM 30H~37H单元存有一组单字节符号数要求找出最大数存入BIG单元。试编写程序实现。

答:

       ORG   0000H

       BIG  DATA  2FH

       ONE  DATA  2AH

       TWO  DATA  2BH

 

START:MOV   R7,#7     ;比较次数

      MOV   R0,#30H  

 LOOP:MOV   A,@R0    

      MOV   ONE,A   

      INC   R0

      MOV   TWO,@R0 

      CLR   C

      SUBB  A,@R0  

      JC    NEXT        ;ONE小,TWO大继续比下一对数

      MOV   @R0,ONE     ;ONE大放后面(交换)

      DEC   R0              

      MOV   @R0,TWO     ;TWO小放前面

      INC   R0          ;

 NEXT:DJNZ  R7,LOOP

      MOV   BIG,37H

      SJMP  $

      END

11编写程序,把累加器A中的二进制数变换成3BCD码,并将百、十、个位数分别存放在内部RAM50H51H52H中。

答:单字节二进制数转换为压缩的BCD仅需要2个字节;在将压缩的BCD码拆分存于3个单元。

         org   0

         MOV   52H,#0

         MOV   51H,#0

         MOV   50H,#0

         MOV   A,#0FDh

         LCALL DCDTH

         SJMP  $

 

   DCDTH:MOV   R7,#8

         MOV   R0,A   ;暂存于R0  

    LOOP:CLR   C    

         MOV   A,R0

         RLC   A

         MOV   R0,A

         MOV   R1,#51H;

        

         MOV   A,@R1  ;  

         ADDC  A,@R1  ;

         DA    A      ;

         MOV   @R1,A  ;

         DEC   R1

         MOV   A,@R1  

         ADDC  A,@R1  

         DA    A      

         MOV   @R1,A   

         DJNZ  R7,LOOP 

         INC   R1      ;50H已是结果,R1指向51H51H单元需拆分

         MOV   A,#00H

         XCHD  A,@R1

         MOV   52H,A

         MOV   A,@R1

         SWAP  A

         MOV   @R1,A         

         RET

         END

12编写子程序,将R1中的2个十六进制数转换为ASCII码后存放在R3R4中。

答:

      ORG     0

      MOV     R1,#5BH   

      MOV     A,R1

      ANL     A,#0F0H

      SWAP    A

      ACALL   ASCII

      MOV     R3,A   

      MOV     A,R1

      ANL     A, #0FH

      ACALL   ASCII

      MOV     R4, A

      SJMP     $

ASCII:PUSH    ACC

      CLR     C

      SUBB    A, #0AH

      POP     ACC

      JC      LOOP

      ADD     A, #07H

LOOP: ADD     A, #30H

      RET

      END

13编写程序,求内部RAM50H~59H十个单元内容的平均值,并存放在5AH单元。

答:

      ORG   0000H

      MOV   R7,#10

      MOV   R0,#50H

      MOV   B,#10

      CLR   C

      CLR   A

 LOOP:ADDC  A,@R0

      INC   R0

      DJNZ  R7,LOOP

      DIV   AB

      MOV   5AH,A

      SJMP  $

     END

144.10所示,编制程序实现:上电后显示“P”,有键按下时显示相应的键号“0~7

答:

实现程序如下:

TEMP  EQU   30H

      ORG   0000H

      JMP   START

    ORG   0100H

START:MOV   SP,#5FH

      MOV   P0,#8CH          ;正序显示"P"

      MOV   P3,#0FFH         ;输入方式

      CLR   CY

NOKEY:MOV   A,P3

      CPL   A

      JZ    NOKEY            ;无键按下

      MOV   TEMP,P3          ;有键按下

      CALL  D10ms

      MOV   A,P3

      CJNE  A,TEMP,NOKEY       ;去抖动

      MOV   R2,#0            ;键号计数器复位

      MOV   A,TEMP

   LP:RRC   A

     JNC   DONE

      INC   R2

      SJMP  LP

  DONE:MOV   A,R2

      MOV   DPTR,#CODE_P0

      MOVC  A,@A+DPTR

      MOV   P0,A

     JMP   NOKEY

D10ms:MOV   R5,#10    ;10MS

D1ms:MOV   R4,#249   

     DL:NOP

        NOP

DJNZ  R4,DL

        DJNZ  R5,D1ms

        RET

 CODE_P0:

        DB    0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H

        DB    80H,90H,88H,83H,0C6H,0A1H,86H,8EH

        END    


路过

鸡蛋

鲜花

握手

雷人

评论 (0 个评论)

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

返回顶部