单片机汇编语言程序设计实验报告
- 格式:doc
- 大小:632.50 KB
- 文档页数:23
单片机汇编语言程序设计实验报告单片机实验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寄存器SFR4 单步执行:执行---单步执行(F8),每执行一步,查看每条语句涉及到的寄存器和存储器内容的变化结果,是否是指令所要得到的结果,如不是,检查错误原因,修改。
5利用多种执行方法和观察各种窗口调试程序,直至程序满意为止。
编译器默认设置:程序框图参考例程序:Block equ 4000hmov dptr, #Block ; 起始地址mov r0, #10 ; 清10个字节mov a, #33h ; 将33H赋值给aLoop:movx @dptr, a 将a写入外部RAMinc dptr ; 指向下一个地址djnz r0, Loop ; 记数减一ljmp $ ; $当前程序指针相当于一直执行自己;ljmp $end说明:$:是当前语句的程序指针(地址)相当于一直执行自己:ljmp $,程序死循环要求赋值数据为10,9,8,7,6,5,4,3,2,1则以上程序该如何改动? 自己修改程序实现。
修改后的程序:Block equ 4000hmov dptr, #Block ; 起始地址mov r0, #10 ; 清10个字节mov a, #0ah ;将0ah赋值给aLoop:movx @dptr, a ;将a写入外部RAMinc dptr ; 指向下一个地址dec a ;a值减一djnz r0, Loop ; 记数减一ljmp $ ; $当前程序指针相当于一直执行自己;ljmp $ end单片机实验2 存储块移动一.实验目的1 熟悉51汇编语言程序结构。
2 熟悉循环结构程序的编写,进一步熟悉指令系统。
3 熟悉编程环境和程序的调试。
二.实验内容将指定源地址(3000H)和长度(10字节)的存储块移动到目的地址(3050H)。
需要先对3000H开始的源数据块赋值为10,9 , 8.......1。
三.实验仪器微机、WAVE6000软件,(单片机实验箱)微机、VW,WAVE6000编程环境软件,(单片机实验箱)仿真器--仿真器设置-选择仿真器选择仿真头选择CPU Lab8000/Lab6000通用微控制器 MCS51实验 8051注意:在编程环境中,可以通过软件仿真,观察程单片机运行情况。
四实验步骤参考程序与流程图参考程序移动3000H --> 3050H, 10字节由于源地址和目的地址的内容都一样(FF),调试时看不到内容的变化,所以需要给源地址内容赋值。
如要求赋值内容为10,9,8,7,6,5,4,3,2,1。
有多种赋值方式,如以下两种分别独立完成:1 在搬移循环体内赋值一个搬移一个,请在参考程序1的?处补充程序2 循环体外赋值,先全部赋值再搬移,请在参考程序 2 的?处添加赋值程序。
参考程序1mov r0, #30hmov r1, #00hmov r2, #30hmov r3, #50hmov r7, #10Loop:mov dph, r0 ;将dptr高八位给r0mov dpl, r1 ;将dptr低八位给r1mov a, r7 ;将r7的值赋给amovx @dptr, a ;将a写入RAM/IO口movx a, @dptr ;读外部RAM/IO口dec r7 ;r7减一mov dph, r2 ;将dptr高八位给r2mov dpl, r3 ;将dptr低八位给r3movx @dptr, a ;将a写入RAM/IO口inc r1 ;r1加一inc r3 ;r3加一djnz r7, Loop ;计数减一ljmp $ ; $当前程序指针相当于一直执行自己;ljmp $参考程序2mov r0, #30hmov r1, #00hmov r2, #30hmov r3, #50hmov r7, #10Block equ 3000hMov dptr,#Block ;起始地址mov r4, #10 ;清10个字节mov a, #0ah ;将oah赋值给aNext: movx @dptr, a ;将a写入RAM/IO口inc dptr ;指向下一个地址dec a ;a旳值减一djnz r4, Next ;计数减一Loop: mov dph, r0 ;将dptr高八位给r0mov dpl, r1 ;将dptr低八位给r1movx a, @dptr ;读外部RAM/IO口mov dph, r2 ;将dptr高八位给r2mov dpl, r3 ;将dptr低八位给r3movx @dptr, a ;将a写入RAM/IO口inc r1 ;r1加一inc r3 ;r3加一djnz r7, Loop ;计数减一ljmp $ ; $当前程序指针相当于一直执行自己;ljmp $单片机实验3 数据排序一.实验目的1了解数据排序的常用算法,掌握冒泡算法。
2进一步熟悉编程环境和调试方法。
3熟悉汇编程序设计。
二.实验内容使用冒泡算将法50H开始的10个随机数按从小到大的顺序排列。
三.实验仪器微机、WA VE6000编程环境四实验步骤注意:由于上电后数据都一样,所以需要手动修改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 接着开始第二次内层循环……参考程序:Size equ 10 ; 数据个数Array equ 50h ; 数据起始地址,需要自己设置10个比较数的值Change equ 0 ; 交换标志Sort: ; 外层循环mov r0, #Arraymov r7, #Size-1clr Change ;清零ChangeGoon: ; 内层循环mov a, @r0mov r2, ainc r0mov B, @r0cjne a, B, NotEqual ;比较a,B不相等转移sjmp Next ;跳转到NextNotEqual: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考虑效率问题,每次从外层循环进入内层循环(Goon),相邻数两两比较的次数可以少一次,理论上提高效率一倍。
参考程序如下:Size equ 10 ; 数据个数Array equ 50h ; 数据起始地址Change equ 0 ; 交换标志mov r7, #Size-1Sort: ; 外层循环mov r0, #Arraymov a, r7mov r6, aclr Change ;清零ChangeGoon:; 内层循环mov a, @r0mov r2, ainc r0mov B, @r0cjne a, B, NotEqual ;比较a,B不相等转移sjmp Next ;跳转到NextNotEqual:jc Next ; 前小后大, 不交换setb Change ; 前大后小, 置交换标志xch a, @r0 ; 交换dec r0 ;r0减一xch a, @r0 ; 交换inc r0 ;r0加一Next:djnz r6, Goon ;计数减一dec r7 ;r7减一jb Change, Sort ;直接寻址位=1,则转移ljmp $ ;$当前程序指令指针end单片机实验4 P1口输入输出实验一.实验目的1.熟悉P1 口的功能。
2.熟悉延时子程序或定时中断程序的编写和使用。
3.初步熟悉单片机软硬件设计方法。
二.实验内容(两内容分开做)1.P1口做输出口接八只发光二极管,编写程序,使发光二极管循环亮灭。
注意:实验箱(LAB6000)的发光二级管LED是高电平点亮,低电平灭。
2.P1.0,P1.1作输入口接两个拨动开关,P1.2,P1.3作输出口,接两个发光二极管。
编写程序读取开关状态,将此状态在发光二极管上显示出来。
三.实验仪器微机,WAVE6000/VW编程环境、实验箱硬件实验需要连接硬件仿真器,连接方式如下:实验箱的仿真器/仿真器设置:选择仿真器选择仿真头选择CPU LAB6000通用微控制器/LAB8000 MCS51实验 8031/51 注意:当P1口用作输入口时,必须先对它置”1”。
编程时应注意P1.0,P1.1作为输入时应先置1,才能正确读入值。
四实验步骤(1)流程图:(2)实验程序及注释:参考程序:注:实验箱LED灯 1 亮0 灭内容1参考程序:Loop:mov a, #01h (0FEH)将01H赋值给累加器Amov r2, #8 将常数8赋值给给R2 Output: 输出函数子程序mov P1, a 将A中01H在p1口输出rl a 将累加器A的值左移一位call Delay 调用延时子程序延时djnz r2, Output 判断循环是否结束ljmp Loop 进行下一次循环Delay: 延时子程序mov r6, #0 89C51中使用一次djnzmov r7, #0 指令耗时2us,用该原理进DelayLoop: 延时程序的设计,可以子djnz r6, DelayLoop 程序嵌套来增加延时时间。