软件实验报告详细版

 本科实验报告

  课程名称:

 微机原理与接口技术 姓

 名:

 邵芳琳 学 院(系):

 控制学院 专

 业:

 自动化 学

 号:

 3140103307 指导教师:

  曹峥

  2016 年 11 月 11 日

  实验一 存储器块操作实验

 一、实验目的 1. 熟悉 KEIL 集成调试环境和汇编程序的调试方法。

 2. 掌握存储器读写方法; 3. 了解内存块的移动方法; 二、实验说明 实验 1 指定某块存储器的起始地址和长度,要求能将其内容赋值。通过该实验学生可以了解单片机读写存储器的方法,同时也可以了解单片机编程、调试方法。

 块移动是单片机常用操作之一,多用于大量的数据复制和图象操作。例程 2 给出起始地址,用地址加一方法移动块,将指定源地址和长度的存储块移到指定目标地址为起始地址的单元中去。移动 3000H 起始的 256 个字节到 4000H 起始的 256 个字节。

 思考题 1. 如何将存储器块的内容置成某固定值(例全填充为 0FFH)? 请用户修改程序,完成此操作。

 将 MOV A,#1H

  改为 MOV A,#FFH

 2. 若源块地址和目标块地址有重叠,该如何避免? 源块地址和目标块地址重叠部分数据压制堆栈中,当要使用重叠部分源数据时,直接从堆栈中弹出。

 实验内容 1.

 试编程将片内 RAM 中的数据依次复制到片外 RAM。假设源数据区的首地址为 40H,目的数据区的首地址为 1000H,数据块长度为 10H。

 ORG 0000H

  MOV R0,#40H

  MOV A,#01H

  MOV R5,#10H LOOP:

 MOV @R0,A

  INC R0

  DJNZ R5,LOOP

  MOV R0,#40H ;起始地址

  MOV R2,#10H

 MOV R3,#00H

  MOV R7,#10H ;循环次数 LOOP1:

 MOV A,@R0

  MOV DPH,R2

  MOV DPL,R3

  MOVX @DPTR,A

  INC R0

  INC R3

  DJNZ R7,LOOP1

  LJMP $

  END

 运行结果:

  2.

 两个 16 位无符号二进制数分别存放在片外 RAM 首址为 2000H 和 2002H 单元内,将它们相加,结果存入片内 RAM 30H(低 8 位)、31H(高 8 位)。

  运行前:

  运行后:

 ORG 0000H

  MOV A,#11H

  MOV DPTR,#2000H

  MOVX @DPTR,A

  MOV DPTR,#2003H

  MOVX @DPTR,A

  MOV

 R0,A

  MOV DPTR,#2002H

  MOVX A,@DPTR

  ADD A,R0

  MOV 30H,A

  MOV DPTR,#2001H

  MOVX A,@DPTR

  MOV R0,A

  MOV DPTR,#2003H

  MOVX A,@DPTR

  ADDC A,R0

  MOV 31H,A

  END

 1100+0011=1111 运行结果正确。

 实验二 数值转换实验 一、实验目的 1. 熟悉 KEIL 集成调试环境和汇编程序的调试方法。

 2. 掌握简单的数值转换算法。

 3. 基本了解数值的各种表达方法。

 4. 掌握数值的加减法运算。

 5. 掌握用查表的方法将 BCD 值转换成 ASCII 值。

 二、实验说明 单片机系统内部运算用二进制,而输入输出常用十进制,以符合日常习惯,因此,数制转换是仪表设计中常用的程序之一。

 单片机中的数值有各种表达方式,这是单片机的基础。掌握各种数制之间的转换是一种基本功。我们将给定的一字节二进制数,转换成二十进制(BCD)码。将累加器 A 的值拆为三个 BCD 码,并存入 RESULT 开始的三个单元,例程 A 赋值#123。

 实验 2 主要让学生了解数值的 BCD 码和 ASCII 码的区别,利用查表方法快速地进行数值转换。进一步掌握数值的各种表达方式。现在我们给出一个 BCD 数,将其转换成 ASCII 值。如下:将累加器 A 的值转换为二个 ASCII 码,并存入 Result 开始的二个单元,例如 A 赋值#1AH。

 思考题 BCD 码转换成二进制数的算法是什么?例如:(91)

 BCD

 对应的二进制数是多少? 将 BCD 码写成权值相加的形式,再将各位转化为二进制。

 9×10^1+1×10^0=91=()B

 实验内容 1.

 把 R 3 中的 8 位二进制整数转换为压缩 BCD 码,存放在 R4, R5 中。

  ORG 0000H MOV R3,##10111011B MOV A,R3 MOV B,#100 DIV AB MOV R4,A MOV A,B MOV B,#10 DIV AB MOV R5,A SWAP A ADD A,B MOV R5,A

 寄存器结果:

 2.

 设 4 位 BCD 码 abcd 依次存放在内部 RAM 中 50H~53H 单元的低 4 位,(高 4 位为 0)。试编程将其转换成二进制数并存入 R6R7 中。

  ORG 0000H

 MOV 50H,#01 MOV 51H,#02

 MOV 52H,#03

  MOV 53H,#04

 MOV A,50H

  MOV B,#10 MUL AB MOV B,#100 MUL AB MOV R1,B

  MOV R0,A

 MOV B,#100 MOV A,51H MUL AB ADD A,R0 MOV R0,A

  MOV A,B ADDC A,R1 MOV R1,A

  执行结果:

  4 位 BCD 码为 1234,转换为 2 进制数为 4d2 与实际相符。

 MOV B,#10 MOV A,52H MUL AB ADD A,R0 MOV R0,A MOV A,R1 ADDC A,#0 MOV R1,A

 MOV A,R0 ADD A,53H MOV R0,A MOV A,R1 ADDC A,#0

 MOV R6,A MOV A,R0 MOV R7,A

 实验三 程序跳转表实验 一、实验目的 1. 熟悉 KEIL 集成调试环境和汇编程序的调试方法。

 2. 了解简单的函数计算。

 3. 掌握多分支结构程序的编程方法 二、实验说明 多分支结构是程序中常见的结构,在多分支结构的程序中,能够按调用号执行相应的功能,完成指定操作。

 若给出调用号来调用子程序,一般用查表方法,查到子程序的地址,转到相应子程序。

 三、思考题 1. 写跳转程序时要注意些什么? 1)子程序的第 1 条指令前必须有标号,即表明子程序的名称,也作为调用指令的符号地址。

 2)要有入口条件,用来说明入子程序时,它所要处理的数据如何得到。另外,要有出口条件,即处理的结果是如何存放的。

 3)注意保护现场和恢复现场,即在调用子程序前将不允许被破坏的内容保存起来;恢复现场即在子程序执行完毕返回主程序前,将保存的内容恢复到保护现场前的状况; 4)子程序必须以 RET 结束。子程序中,对堆栈的入栈和出栈操作次数必须相同,以保证返回后堆栈指针 SP 的值与调用时一直。

 2. 可以避免重复书写相同的程序; 可以简化程序的逻辑结构; 使程序模块化,通用化。

 三、实验内容

  ORG 0000H MOV R0,#0FCH

 CJNE

 R0,#0,NEXT0

  MOV R0,#2

  MOV A,R0

  SJMP NEXT3 NEXT0:CJNE R0,#80H,NEXT1

  MOV R0,#2

  MOV A,R0

  SJMP NEXT3

 NEXT1:JC NEXT2

  SETB C

  MOV A,R0

  RRC A

  SJMP NEXT3

  测试结果:

 X<0

 X=0

  NEXT2:MOV A,R0

  MOV B,#2

  MUL AB NEXT3:MOV 30H,A END

  X>0

 实验四 数据排序实验 一、实验目的 1. 熟悉 KEIL 集成调试环境和汇编程序的调试方法。

 2. 掌握排序程序的设计方法。

 二、实验说明 本例程采用交换排序法将内部 RAM 中的 50~59H 单元中的 10 个单字节无符号二进制数按从小到大的次序排列,并将这一列排序后的数据从小到大依次存贮到外部 RAM 1000H 开始处。

 初始:

 结果:

 三、实验内容 画出本实验程序的流程图。

 实验五 键盘显示仿真实验 一、实验目的 1. 熟悉 KEIL 集成调试环境和汇编程序的调试方法。

 2. 学习使用外围接口工具调试程。

 3. 熟悉键盘显示接口电路及程序设计。

 提高实验 1. 根据键盘、LED 仿真板,设计一个走马灯程序,通过按键实现启停、速率及方向的控制

 UpDown

 BIT 00H

 StartEnd BIT 01H

 LAMPCODE EQU 21H ORG 0000H

  AJMP MAIN

  ORG 30H

 MAIN:

  MOV SP,#5FH

  MOV P1,#0FFH

  CLR UpDown

 ;启动时处于向上的状态

  CLR StartEnd ;启动时处于停止状态

  MOV LAMPCODE,#01H ;单灯流动的代码

  LOOP: ACALL KEY ;调用键盘程序

  JNB F0,LNEXT ;如果无键按下,则继续

  ACALL KEYPROC

 ;否则调用键盘处理程序

 LNEXT:

 ACALL LAMP ;调用灯显示程序

 AJMP LOOP

 DELAY:

 MOV R7,#100

 D1:

 MOV R6,#100

  DJNZ R6,$

  DJNZ R7,D1

  RET

 KEYPROC:

  MOV A,B

 ;从 B 寄存器中获取键值

  JB ACC.2,KeyStart ;分析键的代码,某位被按下,则该位为 1

  JB ACC.3,KeyOver

  JB ACC.4,KeyUp

  JB ACC.5,KeyDown

  AJMP KEY_RET

 KeyStart:

  SETB StartEnd ;第一个键按下后的处理

  AJMP KEY_RET

 KeyOver:

 CLR StartEnd ;第二个键按下后的处理

  AJMP KEY_RET

 KeyUp:

  SETB UpDown

 ;第三个键按下后的处理

  AJMP KEY_RET KeyDown:

  CLR UpDown

 ;第四个键按下后的处理

 KEY_RET:

  RET

 KEY:

 CLR F0

 ;清 F0,表示无键按下。

  ORL P3,#00111100B

 ;将 P3 口的接有键的四位置 1

  MOV A,P3

 ;取 P3 的值

  ORL A,#11000011B

 ;将其余 4 位置 1

  CPL A ;取反

  JZ K_RET ;如果为 0 则一定无键按下

  CALL DELAY ;否则延时去键抖

  ORL P3,#00111100B

  MOV A,P3

  ORL A,#11000011B

  CPL A

 JZ K_RET

  MOV B,A ;确实有键按下,将键值存入 B 中

  SETB F0 ;设置有键按下的标志

 K_RET:

 ORL P3,#00111100B ;此处循环等待键的释放

  MOV A,P3

  ORL A,#11000011B

  CPL

 A

  JZ

 K_RET1

  ;读取的数据取反后为 0 说明键释放了

  AJMP K_RET

  K_RET1:CALL DELAY

  ;消除后沿抖动

  RET D500MS:

  ;流水灯的延迟时间

  MOV R7,#255

 D51:

 MOV R6,#255

  DJNZ R6,$

  DJNZ R7,D51

  RET

  LAMP:

  JB

 StartEnd,LampStart; 如果 StartEnd=1,则启动

  MOV

 P1,#0ffH

  2. 根据实验仿真板 2 设计一个按键显示数字的程序,即按 0 显示 0,依次类推。

  ORG 0000H START: MOV P2,#0FEH

 MOV P3,#0EFH

 JB P3.0,NEXT1

 MOV P0,#0C0H

 LJMP FINAL NEXT1: MOV P3,#0EFH

 JB P3.1,NEXT2

 MOV P0,#0F9H

 LJMP FINAL NEXT2:

 MOV P3,#0EFH

 JB P3.2,NEXT3

 MOV P0,#0A4H

 LJMP FINAL NEXT3:

 MOV P3,#0EFH

 JB P3.3,NEXT4

 MOV P0,#0B0H

 LJMP FINAL NEXT4:

 MOV P3,#0DFH

 JB P3.0,NEXT5

 MOV P0,#99H

 LJMP FINAL LampStart:

 AJMP

 LAMPRET

 ;否则关闭所有显示,返回 LampStart:

 JB

 UpDown,LAMPUP

 ;如果 UpDown=1,则向上流动

  MOV

 A,LAMPCODE

  RL

 A ;左移位而 MOV

 LAMPCODE,A

 MOV

 P1,A

  LCALL

 D500MS

  LCALL

 D500MS

  AJMP

 LAMPRET

 LAMPUP:

 MOV

 A,LAMPCODE

  RR A

 ;向下流动实际就是右移

  MOV LAMPCODE,A

  MOV

 P1,A

  LCALL

 D500MS

 LAMPRET:

 RET

  END

  显示结果:

  NEXT5:

 MOV P3,#0DFH

 JB P3.1,NEXT6

 MOV P0,#92H

 LJMP FINAL NEXT6:

 MOV P3,#0DFH

 JB P3.2,NEXT7

 MOV P0,#82H

 LJMP FINAL NEXT7:

 MOV P3,#0DFH

 JB P3.3,NEXT8

 MOV P0,#0F8H

 LJMP FINAL NEXT8:

 MOV

 P3,0CFH

 JB P3.0,NEXT9

 MOV P0,#80H

 LJMP FINAL NEXT9:

 MOV P3,#0CFH

  JB P3.1,FINAL

 MOV P0,#90H

 LJMP FINAL FINAL:

 END