软件实验报告.docx
《软件实验报告.docx》由会员分享,可在线阅读,更多相关《软件实验报告.docx(20页珍藏版)》请在冰豆网上搜索。
![软件实验报告.docx](https://file1.bdocx.com/fileroot1/2023-2/6/476a7c19-6154-4475-af70-8cfdaba1a5e6/476a7c19-6154-4475-af70-8cfdaba1a5e61.gif)
软件实验报告
本科实验报告
课程名称:
微机原理与接口技术
姓名:
邵芳琳
学院(系):
控制学院
专业:
自动化
学号:
3140103307
指导教师:
曹峥
2016年11月11日
实验一存储器块操作实验
一、实验目的
1.熟悉KEIL集成调试环境和汇编程序的调试方法。
2.掌握存储器读写方法;
3.了解内存块的移动方法;
二、实验说明
实验1指定某块存储器的起始地址和长度,要求能将其内容赋值。
通过该实验学生可以了解单片机读写存储器的方法,同时也可以了解单片机编程、调试方法。
块移动是单片机常用操作之一,多用于大量的数据复制和图象操作。
例程2给出起始地址,用地址加一方法移动块,将指定源地址和长度的存储块移到指定目标地址为起始地址的单元中去。
移动3000H起始的256个字节到4000H起始的256个字节。
思考题
1.如何将存储器块的内容置成某固定值(例全填充为0FFH)?
请用户修改程序,完成此操作。
将MOVA,#1H改为MOVA,#FFH
2.若源块地址和目标块地址有重叠,该如何避免?
源块地址和目标块地址重叠部分数据压制堆栈中,当要使用重叠部分源数据时,直接从堆栈中弹出。
实验内容
1.试编程将片内RAM中的数据依次复制到片外RAM。
假设源数据区的首地址为40H,目的数据区的首地址为1000H,数据块长度为10H。
ORG0000H
MOVR0,#40H
MOVA,#01H
MOVR5,#10H
LOOP:
MOV@R0,A
INCR0
DJNZR5,LOOP
MOVR0,#40H;起始地址
MOVR2,#10H
MOVR3,#00H
MOVR7,#10H;循环次数
LOOP1:
MOVA,@R0
MOVDPH,R2
MOVDPL,R3
MOVX@DPTR,A
INCR0
INCR3
DJNZR7,LOOP1
LJMP$
END
运行结果:
2.两个16位无符号二进制数分别存放在片外RAM首址为2000H和2002H单元内,将它们相加,结果存入片内RAM30H(低8位)、31H(高8位)。
ORG0000H
MOVA,#11H
MOVDPTR,#2000H
MOVX@DPTR,A
MOVDPTR,#2003H
MOVX@DPTR,A
MOVR0,A
MOVDPTR,#2002H
MOVXA,@DPTR
ADDA,R0
MOV30H,A
MOVDPTR,#2001H
MOVXA,@DPTR
MOVR0,A
MOVDPTR,#2003H
MOVXA,@DPTR
ADDCA,R0
MOV31H,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.把R3中的8位二进制整数转换为压缩BCD码,存放在R4,R5中。
ORG0000H
MOVR3,##10111011B
MOVA,R3
MOVB,#100
DIVAB
MOVR4,A
MOVA,B
MOVB,#10
DIVAB
MOVR5,A
SWAPA
ADDA,B
MOVR5,A
寄存器结果:
2.设4位BCD码abcd依次存放在内部RAM中50H~53H单元的低4位,(高4位为0)。
试编程将其转换成二进制数并存入R6R7中。
ORG0000H
MOV50H,#01
MOV51H,#02
MOV52H,#03
MOV53H,#04
MOVA,50H
MOVB,#10
MULAB
MOVB,#100
MULAB
MOVR1,B
MOVR0,A
MOVB,#100
MOVA,51H
MULAB
ADDA,R0
MOVR0,A
MOVA,B
ADDCA,R1
MOVR1,A
MOVB,#10
MOVA,52H
MULAB
ADDA,R0
MOVR0,A
MOVA,R1
ADDCA,#0
MOVR1,A
MOVA,R0
ADDA,53H
MOVR0,A
MOVA,R1
ADDCA,#0
MOVR6,A
MOVA,R0
MOVR7,A
执行结果:
4位BCD码为1234,转换为2进制数为4d2与实际相符。
实验三程序跳转表实验
一、实验目的
1.熟悉KEIL集成调试环境和汇编程序的调试方法。
2.了解简单的函数计算。
3.掌握多分支结构程序的编程方法
二、实验说明
多分支结构是程序中常见的结构,在多分支结构的程序中,能够按调用号执行相应的功能,完成指定操作。
若给出调用号来调用子程序,一般用查表方法,查到子程序的地址,转到相应子程序。
三、思考题
1.写跳转程序时要注意些什么?
1)子程序的第1条指令前必须有标号,即表明子程序的名称,也作为调用指令的符号地址。
2)要有入口条件,用来说明入子程序时,它所要处理的数据如何得到。
另外,要有出口条件,即处理的结果是如何存放的。
3)注意保护现场和恢复现场,即在调用子程序前将不允许被破坏的内容保存起来;恢复现场即在子程序执行完毕返回主程序前,将保存的内容恢复到保护现场前的状况;
4)子程序必须以RET结束。
子程序中,对堆栈的入栈和出栈操作次数必须相同,以保证返回后堆栈指针SP的值与调用时一直。
2.可以避免重复书写相同的程序;
可以简化程序的逻辑结构;
使程序模块化,通用化。
3、实验内容
ORG0000H
MOVR0,#0FCH
CJNER0,#0,NEXT0
MOVR0,#2
MOVA,R0
SJMPNEXT3
NEXT0:
CJNER0,#80H,NEXT1
MOVR0,#2
MOVA,R0
SJMPNEXT3
NEXT1:
JCNEXT2
SETBC
MOVA,R0
RRCA
SJMPNEXT3
NEXT2:
MOVA,R0
MOVB,#2
MULAB
NEXT3:
MOV30H,A
END
测试结果:
X<0
X=0
X>0
实验四数据排序实验
一、实验目的
1.熟悉KEIL集成调试环境和汇编程序的调试方法。
2.掌握排序程序的设计方法。
二、实验说明
本例程采用交换排序法将内部RAM中的50~59H单元中的10个单字节无符号二进制数按从小到大的次序排列,并将这一列排序后的数据从小到大依次存贮到外部RAM1000H开始处。
初始:
结果:
三、实验内容
画出本实验程序的流程图。
实验五键盘显示仿真实验
一、实验目的
1.熟悉KEIL集成调试环境和汇编程序的调试方法。
2.学习使用外围接口工具调试程。
3.熟悉键盘显示接口电路及程序设计。
提高实验
1.根据键盘、LED仿真板,设计一个走马灯程序,通过按键实现启停、速率及方向的控制
UpDownBIT00H
StartEndBIT01H
LAMPCODEEQU21H
ORG0000H
AJMPMAIN
ORG30H
MAIN:
MOVSP,#5FH
MOVP1,#0FFH
CLRUpDown;启动时处于向上的状态
CLRStartEnd;启动时处于停止状态
MOVLAMPCODE,#01H;单灯流动的代码
LOOP:
ACALLKEY;调用键盘程序
JNBF0,LNEXT;如果无键按下,则继续
ACALLKEYPROC;否则调用键盘处理程序
LNEXT:
ACALLLAMP;调用灯显示程序
AJMPLOOP
DELAY:
MOVR7,#100
D1:
MOVR6,#100
DJNZR6,$
DJNZR7,D1
RET
KEYPROC:
MOVA,B;从B寄存器中获取键值
JBACC.2,KeyStart;分析键的代码,某位被按下,则该位为1
JBACC.3,KeyOver
JBACC.4,KeyUp
JBACC.5,KeyDown
AJMPKEY_RET
KeyStart:
SETBStartEnd;第一个键按下后的处理
AJMPKEY_RET
KeyOver:
CLRStartEnd;第二个键按下后的处理
AJMPKEY_RET
KeyUp:
SETBUpDown;第三个键按下后的处理
AJMPKEY_RET
KeyDown:
CLRUpDown;第四个键按下后的处理
KEY_RET:
RET
KEY:
CLRF0;清F0,表示无键按下。
ORLP3,#00111100B;将P3口的接有键的四位置1
MOVA,P3;取P3的值
ORLA,#11000011B;将其余4位置1
CPLA;取反
JZK_RET;如果为0则一定无键按下
CALLDELAY;否则延时去键抖
ORLP3,#00111100B
MOVA,P3
ORLA,#11000011B
CPLA
JZK_RET
MOVB,A;确实有键按下,将键值存入B中
SETBF0;设置有键按下的标志
K_RET:
ORLP3,#00111100B;此处循环等待键的释放
MOVA,P3
ORLA,#11000011B
CPLA
JZK_RET1;读取的数据取反后为0说明键释放了
AJMPK_RET
K_RET1:
CALLDELAY;消除后沿抖动
RET
D500MS:
;流水灯的延迟时间
MOVR7,#255
D51:
MOVR6,#255
DJNZR6,$
DJNZR7,D51
RET
LAMP:
JBStartEnd,LampStart;如果StartEnd=1,则启动
MOVP1,#0ffH
LampStart:
AJMPLAMPRET;否则关闭所有显示,返回LampStart:
JBUpDown,LAMPUP;如果UpDown=1,则向上流动
MOVA,LAMPCODE
RLA;左移位而
MOVLAMPCODE,A
MOVP1,A
LCALLD500MS
LCALLD500MS
AJMPLAMPRET
LAMPUP:
MOVA,LAMPCODE
RRA;向下流动实际就是右移
MOVLAMPCODE,A
MOVP1,A
LCALLD500MS
LAMPRET:
RET
END
2.根据实验仿真板2设计一个按键显示数字的程序,即按0显示0,依次类推。
ORG0000H
START:
MOVP2,#0FEH
MOVP3,#0EFH
JBP3.0,NEXT1
MOVP0,#0C0H
LJMPFINAL
NEXT1:
MOVP3,#0EFH
JBP3.1,NEXT2
MOVP0,#0F9H
LJMPFINAL
NEXT2:
MOVP3,#0EFH
JBP3.2,NEXT3
MOVP0,#0A4H
LJMPFINAL
NEXT3:
MOVP3,#0EFH
JBP3.3,NEXT4
MOVP0,#0B0H
LJMPFINAL
NEXT4:
MOVP3,#0DFH
JBP3.0,NEXT5
MOVP0,#99H
LJMPFINAL
NEXT5:
MOVP3,#0DFH
JBP3.1,NEXT6
MOVP0,#92H
LJMPFINAL
NEXT6:
MOVP3,#0DFH
JBP3.2,NEXT7
MOVP0,#82H
LJMPFINAL
NEXT7:
MOVP3,#0DFH
JBP3.3,NEXT8
MOVP0,#0F8H
LJMPFINAL
NEXT8:
MOVP3,0CFH
JBP3.0,NEXT9
MOVP0,#80H
LJMPFINAL
NEXT9:
MOVP3,#0CFH
JBP3.1,FINAL
MOVP0,#90H
LJMPFINAL
FINAL:
END
显示结果: