单片机(汇编)语言程序设计实验报告

  • 格式:doc
  • 大小:643.50 KB
  • 文档页数:19

word完美格式 精心整理 学习帮手 单片机实验1 汇编语言程序设计实验 ---- 存储器块赋值

一.实验目的 1 熟悉存储器的读写方法,熟悉51汇编语言结构。 2 熟悉循环结构程序的编写。 3 熟悉编程环境和程序的调试。 二.实验内容 指定存储器中某块的起始地址和长度,要求将其内容赋值。例如将4000H开始的100个字节内容清零或全部赋值为33H(参考程序), 要求根据参考程序修改: 修改程序,赋值内容为(10,9,8,7,6,5,4,3,2,1。) 三.实验仪器 微机、VW,WAVE6000编程环境软件,(单片机实验箱) 仿真器--仿真器设置- 选择仿真器 选择仿真头 选择CPU Lab8000/Lab6000通用微控制器 MCS51实验 8051

前3个软件实验 勾选 √ 使用伟福软件模拟器 四 实验步骤 注意: 1 文件不要用中文名称保存时不要用中文路径(目录),不要放在“桌面”上,源文件和工程要放在同一个文件夹下,文件名称和路径名称不要太长。 2 查看存储器菜单使用:窗口---数据窗口---XDATA 观察存储器内容 3 查看SFR:窗口---CPU窗口 查看CPU寄存器SFR 4 单步执行:执行---单步执行(F8),每执行一步,查看每条语句涉及到的寄存器和存储器内容的变化结果,是否是指令所要得到的结果,如不是,检查错误原因,修改。 5利用多种执行方法和观察各种窗口调试程序,直至程序满意为止。 编译器默认设置:

程序框图 word完美格式

精心整理 学习帮手 参考例程序: Block equ 4000h mov dptr, #Block ; 起始地址 mov r0, #10 ; 清10个字节 mov a, #33h ; 将33H赋值给a Loop: movx @dptr, a 将a写入外部RAM inc dptr ; 指向下一个地址 djnz r0, Loop ; 记数减一 ljmp $ ; $当前程序指针 相当于一直执行自己;ljmp $ end 说明: $:是当前语句的程序指针(地址) 相当于一直执行自己:ljmp $,程序死循环

要求赋值数据为10,9,8,7,6,5,4,3,2,1 则以上程序该如何改动? 自己修改程序实现。 修改后的程序: Block equ 4000h mov dptr, #Block ; 起始地址 mov r0, #10 ; 清10个字节 mov a, #0ah ;将0ah赋值给a Loop: movx @dptr, a ;将a写入外部RAM inc dptr ; 指向下一个地址 dec a ;a值减一 djnz r0, Loop ; 记数减一 ljmp $ ; $当前程序指针 相当于一直执行自己;ljmp $ end word完美格式

精心整理 学习帮手 单片机实验2 存储块移动 一.实验目的 1 熟悉51汇编语言程序结构。 2 熟悉循环结构程序的编写,进一步熟悉指令系统。 3 熟悉编程环境和程序的调试。 二.实验内容 将指定源地址(3000H)和长度(10字节)的存储块移动到目的地址(3050H)。 需要先对3000H开始的源数据块赋值为10,9 , 8.......1。 三.实验仪器微机、WAVE6000软件,(单片机实验箱) 微机、VW,WAVE6000编程环境软件,(单片机实验箱) 仿真器--仿真器设置- 选择仿真器 选择仿真头 选择CPU Lab8000/Lab6000通用微控制器 MCS51实验 8051

注意:在编程环境中,可以通过软件仿真,观察程单片机运行情况。 四 实验步骤 参考程序与流程图

word完美格式

精心整理 学习帮手 参考程序 移动 3000H --> 3050H, 10字节 由于源地址和目的地址的内容都一样(FF),调试时看不到内容的变化,所以需要给源地址内容赋值。如要求赋值内容为10,9,8,7,6,5,4,3,2,1。 有多种赋值方式,如以下两种分别独立完成: 1 在搬移循环体内赋值一个搬移一个,请在参考程序1的?处补充程序 2 循环体外赋值,先全部赋值再搬移,请在参考程序2 的 ?处添加赋值程序。 参考程序1 mov r0, #30h mov r1, #00h mov r2, #30h mov r3, #50h mov r7, #10 Loop: mov dph, r0 ;将dptr高八位给r0 mov dpl, r1 ;将dptr低八位给r1 mov a, r7 ;将r7的值赋给a movx @dptr, a ;将a写入RAM/IO口 movx a, @dptr ;读外部RAM/IO口 dec r7 ;r7减一 mov dph, r2 ;将dptr高八位给r2 mov dpl, r3 ;将dptr低八位给r3 movx @dptr, a ;将a写入RAM/IO口 inc r1 ;r1加一 inc r3 ;r3加一 djnz r7, Loop ;计数减一 ljmp $ ; $当前程序指针 相当于一直执行自己;ljmp $ word完美格式 精心整理 学习帮手 参考程序2 mov r0, #30h mov r1, #00h mov r2, #30h mov r3, #50h mov r7, #10 Block equ 3000h Mov dptr,#Block ;起始地址 mov r4, #10 ;清10个字节 mov a, #0ah ;将oah赋值给a Next: movx @dptr, a ;将a写入RAM/IO口 inc dptr ;指向下一个地址 dec a ;a旳值减一 djnz r4, Next ;计数减一 Loop: mov dph, r0 ;将dptr高八位给r0 mov dpl, r1 ;将dptr低八位给r1 movx a, @dptr ;读外部RAM/IO口 mov dph, r2 ;将dptr高八位给r2 mov dpl, r3 ;将dptr低八位给r3 movx @dptr, a ;将a写入RAM/IO口 inc r1 ;r1加一 inc r3 ;r3加一 djnz r7, Loop ;计数减一 ljmp $ ; $当前程序指针 相当于一直执行自己;ljmp $ word完美格式

精心整理 学习帮手 单片机实验3 数据排序 一.实验目的 1了解数据排序的常用算法,掌握冒泡算法。 2 进一步熟悉编程环境和调试方法。 3 熟悉汇编程序设计。 二.实验内容 使用冒泡算将法 50H开始的10个随机数按从小到大的顺序排列。 三.实验仪器 微机、WAVE6000编程环境 四 实验步骤

注意:由于上电后数据都一样,所以需要手动修改50H后10个数据(要排序的数)方法是:窗口---数据窗口---DATA 找到50H开始的10个2位16进制数,双击,修改其数值如(6,2,9,4,3,7,1,5,8,0)之后编译(下载),单步执行,查看排序执行过程 冒泡算法(两层循环,以下是内层循环开始……)。 6,2,9,4,3,7,1,5,8,0 前大后小交换位置如下: 2,6,9,4,3,7,1,5,8,0 前小后大不交换位置如下; 2,6,9,4,3,7,1,5,8,0 前大后小交换位置如下; 2 ,6 ,4, 9, 3, 7,1 ,5,8,0…第一次内层循环结束顺序如下:最大的数9先冒出来 2,6,4,3,7,1,5,8,0,9 接着开始第二次内层循环…… word完美格式

精心整理 学习帮手 参考程序: Size equ 10 ; 数据个数 Array equ 50h ; 数据起始地址,需要自己设置10个比较数的值 Change equ 0 ; 交换标志 Sort: ; 外层循环 mov r0, #Array mov r7, #Size-1 clr Change ;清零Change

Goon: ; 内层循环 mov a, @r0 mov r2, a inc r0 mov B, @r0 cjne a, B, NotEqual ;比较a,B不相等转移 sjmp Next ;跳转到Next NotEqual: jc Next ; 前小后大, 不交换 setb Change ; 前大后小, 置交换标志;排序是否结束标志 ? xch a, @r0 ; 交换 dec r0 ;r0减一 xch a, @r0 ; 交换 inc r0 ;r0加一 Next:

djnz r7, Goon ;计数减一 jb Change, Sort ;直接寻址位=1,则转移 ljmp $ ; $:当前程序指针 相当于一直执行自己;ljmp $ end