您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 咨询培训 > 山东大学单片机原理与应用第一次实验报告
、单片机原理与应用实验报告单片机原理与应用第一次实验报告第一章软件仿真实验1.1实验1:汇编程序实验1①示例程序实验(1)实验内容在Keil环境下建立工程,并将以下程序加入工程,构造工程,并运行可执行程序,记录执行结果。分析程序功能。(2)添加注释后的程序ORG0000HAJMPMAINORG0030HMAIN:MOVSP,#60H;堆栈底设置在60HMOVA,#0H;A置零MOVR1,#30H;起始单元地址为30HMOVR7,#10H;R7用于计数,初值为10HLOOP1:;将30H开始的16个内存单元置零MOV@R1,AINCR1DJNZR7,LOOP1NOPMOVR1,#30HMOVR7,#10H;重新赋计数初值和起始单元地址LOOP:;将0到F赋给30H开始的16个单元中;MOV@R1,AINCR1;地址自增INCA;A自增DJNZR7,LOOPSJMP$END(3)示例程序的功能将30H开始的16个内存单元清0,然后将值0到F赋给30H开始的16个单元。(4)运行结果截图②自我完成实验(1)实验内容将片内RAM30H单元中的8位二进制数转换成10进制数。希望转换后的结果保存于31H和32H,31H低4位存放个位,高4位存放十位,32H低4位存放百位,高4位为0。程序流程图:(2)程序及其注释org0000hajmpmainorg0030hmain:mov30h,#68h;待转化的数存于30H单元mova,30h;取数movb,#64h;100赋给Bdivab;待转化的数除以100clr32h;清32H单元mov32h,a;商为十进制百位,存于32Hmova,bmovb,#0ahdivab;余数赋给A,余数除以10swapa;商为个位,自交换后存于A高四位adda,bmov31h,a;A,B相加可以将十进制数个位十位存于31H单元sjmp$end(3)实验过程1、新建工程:二进制十进制转化.uV2;2、设置工程:二进制十进制转化.uV2属性,将其晶振频率设置为12MHz,选择输出可执行文件,仿真方式为“UseSimulator”;3、建立源程序,编写程序,程序编写思路:将待转化数存于30H单元,取出待转化的数给A,将待转化的数除以100,商位于A,余数在B。32H单元清零,前一步所得的商为十进制百位,将其存于32H单元,取余数除以10,A中的商为待转化十进制数的十位。A自交换,十位的值存于A高四位,将其和B中的值相加,和存于31H单元,即实现了十进制数个位十位存于31H单元。4、将源程序保存为:二进制十进制转化.asm,并且添加到工程中;5、编译源程序,如果输入有误进行修改,直至编译通过,生成可执行程序:二进制十进制转化.hex;6、运行程序,并用存储器观察窗口,观察内部RAM30H,31H,32H单元的值。(4)程序运行结果截图1.2实验2:汇编程序实验2①示例程序实验(1)实验内容在Keil环境下建立工程,并将以下程序加入工程,构造工程,并运行可执行程序,记录执行结果。分析程序功能。(2)程序及其注释ORG0000HAJMPMAINORG0030HMAIN:MOV30H,#45H;待操作数存于30H单元MOVA,30H;30H单元中的数送AANLA,#0FH;高四位清零,保留低四位MOV31H,A;结果存于31H单元MOVA,30H;重新取待操作数至AANLA,#0F0H;低四位清零,保留高四位SWAPA;自交换实现待操作数的高四位表示的二进制数存于AMOVB,#10MULAB;待操作数的高四位表示的二进制数乘以10ADDA,31H;待操作数的高四位表示的二进制数乘以10后和低四位表示的二进制数相加MOV31H,A;存结果于31H单元SJMP$END(3)示例程序的功能:实现求得一个八位二进制数高四位表示的二进制数乘以10和低四位表示的二进制数的和。如为两位压缩BCD码,则实现求得相应十进制数值,并以二进制形式存于内存单元中。(4)运行结果截图②自我完成实验(1)实验内容将片内RAM30H开始的32个单元中分布着随机的有符号8位二进制数,请按从小到大的顺序进行排序,排序后的数据仍然保存到30H开始的32个单元中(低地址存放小数据)。编程思路:首先,在程序存储器中构建一个表格,该表格具有32个随机产生的8位二进制数,如:TABLE:DB1,3,9,2,17,4,11,6DB5,20,100,64,21,14,79,35DB92,7,91,23,65,16,13,18DB18,73,65,101,27,19,62,69然后利用查表指令“MOVCA,@A+DPTR”将它们读取到30H-4FH单元中,然后再利用“冒泡法排序法”将它们排序即可。“冒泡法排序法”的基本原理是:遍历所有32个数据找出其中的最大者,并记下最大数据所在的存储位置,然后将这个最大的数据放置在最后一个单元,同时,将最后一个单元原来的数据保存到这个最大值原来所处的位置,完成第一轮的排序。然后,再遍历除了最后一个单元以外的前面31个单元的数据并找出其中最大者,并记下其所在位置,遍历完这一遍后将找到的最大数据保存在倒数第二个单元(对于所有数据来说它是次最大数据,所以保存在倒数第二个单元),并将倒数第二个单元原来的数据保存在刚刚找到的那个最大值原来所在的位置处,完成第二轮的排序。依次类推,用同样的方法把所有的数据排好序即可。(2)程序及其注释ORG0000HAJMPMAINORG0030HMAIN:MOVR0,#20H;R0用于计数,20H=32MOVR1,#30H;R1为数据指针MOVDPTR,#TABLE;DPTR指向表首MOVR2,#00H;偏移量赋值MOVA,R2STO:MOVCA,@A+DPTR;取出表中数据,存入30H开始的内存单元MOV@R1,A;取出数据存入R1中存储地址指向的内存单元INCR1;指向下一个单元INCR2;偏移量增一MOVA,R2DJNZR0,STO;判断表中数据是否全部取出并存入内存MOVR3,#1FH;内循环计数(31)MOVR4,#1FH;外循环计数(31)MOVR1,#30HLOOP1:CLRC;C清0MOVA,@R1INCR1MOVR5,ASUBBA,@R1;取出两个数相减置C来比较大小MOVA,R5JCLOOP2;第一个数小于第二个数,跳转LOOP3XCHA,@R1;否则交换两单元中数的位置,小的在前大的在后DECR1MOV@R1,AINCR1;指向下一单元LOOP2:DJNZR3,LOOP1;判断在一轮中是否比较完了所有的数DECR4MOVA,R4MOVR3,A;内外循环计数值分别自减MOVR1,#30HADDA,#1MOVR4,ADJNZR4,LOOP1;判断外循环是否进行完毕,即排列完所有的数,否则跳回继续比较ORG3000H;另外开辟空间,建立待排序数的表格TABLE:DB1,3,9,2,17,4,11,6DB5,20,100,64,21,14,79,35DB92,7,91,23,65,16,13,18DB18,73,65,101,27,19,62,69HERE:SJMPHEREEND(3)实验过程1、新建工程:冒泡法排序.uV2;2、设置工程:冒泡法排序.uV2属性,将其晶振频率设置为12MHz,选择输出可执行文件,仿真方式为“UseSimulator”;3、建立源程序,编写程序,按照冒泡法排序的思路编写程序,大体思路可见源程序注释。4、将源程序保存为:冒泡法排序.asm,并且添加到工程中;5、编译源程序,如果输入有误进行修改,直至编译通过,生成可执行程序:冒泡法排序.hex;6、运行程序,并用存储器观察窗口,观察内部RAM30H-4FH单元排序前后的数值。(4)程序运行结果截图
本文标题:山东大学单片机原理与应用第一次实验报告
链接地址:https://www.777doc.com/doc-7141265 .html