分支和循环程序设计

分支和循环程序设计

ID:14025996

大小:159.00 KB

页数:8页

时间:2018-07-25

上传者:U-3772
分支和循环程序设计_第1页
分支和循环程序设计_第2页
分支和循环程序设计_第3页
分支和循环程序设计_第4页
分支和循环程序设计_第5页
资源描述:

《分支和循环程序设计》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

《微处理器原理与应用》实验报告 实验四一、实验名称:分支和循环程序设计二、实验目的:1、掌握分支程序编写方法2、掌握循环程序设计的方法和技巧3、学习程序调试的基本过程和方法三、实验内容:1.分支程序设计:(1)有两个8位无符号数NA、NB分别存放在内部RAM的40H,41H单元,当NA=NB时将该单元置0xff。源程序如下:汇编语言程序:ORG0000HAJMPSTARTORG0100HSTART:MOVA,40H//把(40H)中的值赋给累加器ACJNEA,41H,LOOP1//判断累加器A与41H中数。如果A=(41H),则顺序执行,如果A>=(41H),则Cy=0,否则Cy=1。如果A<(41H),则执行跳转语句LOOP1。AJMPLOOP2//跳转到LOOP2LOOP1:JCLOOP3//如果Cy=0,顺序执行,如果Cy=1,跳转到LOOP3LOOP2:MOV42H,#0FFH//(42H)中赋值0xffAJMPLOOP//跳转到LOOPLOOP3:MOV42H,#88H//(42H)中赋值0x88 LOOP:AJMPLOOPENDC51程序如下:#include#includevoidmain(){unsignedcharna,nb,f; na=DBYTE[0x0040];       //把(0x0040)中的数赋给na nb=DBYTE[0x0041];//把(0x0041)中的数赋给nbif(na=NB时将该单元置0xff。NA、NB分别存放在内部RAM的40H,41H及50H,51H单元。提示:MCS-51指令系统没有16位比较指令,只能使用8位比较指令,于是应先比较两数的高8位,若NA的高8位小于NB的高8位,则说明NANB;将42H单元置0xff。若NA的高8位等于NB的高8位,则再比较两者的低8位,方法同上(当NA=NB时,也将42H单元置0xff)。2.循环程序设计(1)在片内RAM的10H单元存放一个8位无符号二进制数,要求将其每一位转换成相应的ASCII码,并以高位在前,低位在后的顺序依次存放到片内RAM以11H单元为首的连续单元中,编制相应的程序。分析:用带进位的循环左移指令RLC,通过对C标志的判断,可知该位为1还是0。ORG0000HAJMPSTARTORG0100HSTART: MOVR2,#08H//R2中赋值08H,控制八位二进制数的转换MOVR0,#10H//R0中赋值(10H)这个地址,MOVA,@R0//把地址(10H)中的数送到累加器A中INCR0//R0中的地址变量加一XUNHUAN:RLCA//带标志位Cy左移一位JCLOOP1//判断标志位,如果Cy=0,顺序执行,如果Cy=1,跳转到LOOP1MOV@R0,#30H//对R0中的地址变量赋值AJMPLOOP2LOOP1:MOV@R0,#31H//对R0中的地址变量赋值LOOP2:INCR0//R0中的地址变量加一DJNZR2,XUNHUAN//判断R2-1!=0时跳转到XUNHUANLOOP:SJMPLOOPEND(2)编写该程序的C51程序。提示:要判断一个字节中第i位(i=7-0)的值是0或1,可用第i位值为1的字节数与之按位相与,若结果为0,表明该位为0,反之为1。例如:数0x82,即10000010,要判断第7位的值,可将0x82与0x80(即10000000,第7位为1)按位相与,结果不为0,所以0x82的第7位值为1。.要在片内RAM0x11地址连续存放转换后的ASCII码,可定义一个指向无符号单字节数的指针,将该指针的初值设为0x11,后在循环体内加1即可。四、实验步骤:1、分支程序的设计(1)阅读理解源程序的汇编语言代码和C语言代码。(2)在理解了8位数据的大小比较的基础上, 编写汇编程序和C语言程序对16位的数据的大小进行比较。2、循环程序的设计(1)对一个片内的地址中的8位二进制数,转换成ACSII码,并依次存放在一个连续的地址单元中。阅读理解这个汇编程序。(2)完成(1)的要求用C语言程序的编写代码。五、实验代码:16位数据的比较大小汇编语言代码:ORG0000HAJMPSTARTORG0100HSTART:MOVA,41H//把41H中的值赋给累加器ACJNEA,51H,LOOP1//判断累加器A与51H中数。如果A=(51H),则顺序执行,如果A>=(51H),则Cy=0,否则Cy=1。如果A<(51H),则执行跳转语句LOOP1。AJMPLOOP2//跳转到LOOP2.对地位进行比较LOOP1:JCLOOP3//如果Cy=0,顺序执行,如果Cy=1,跳转到LOOP3MOV42H,#0FFH//(42H)=0xff.AJMPLOOPLOOP2:MOVA,40H//把40H中的值赋给累加器ACJNEA,50H,LOOP1//断累加器A与50H中数。如果A=(50H),则顺序执行,如果A>=(50H),则Cy=0,否则Cy=1。如果A<(50H),则执行跳转语句LOOP1。LOOP3:MOV42H,#88H//(42H)=0x88.LOOP:AJMPLOOPEND16位比较大小的C语言代码:#include#includevoidmain(){unsignedcharna,nb,nc,nd,f;na=DBYTE[0x0041];//把(0x0040)中的数赋给nanb=DBYTE[0x0051];//把(0x0041)中的数赋给nbnc=DBYTE[0x0040];nd=DBYTE[0x0050];if(nanb)f=0xff;//判断高八位的大小,如果na>nb,f=0xffif(na==nb)//判断高八位的大小,{if(nc#includeunsignedchardsi[]={0x0011,0x0012,0x0013,0x0014,0x0015,0x0016,0x0017,0x0018};//定义一个储存地址的数组unsignedcharcodea[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};//定义一个数值数组voidmain(){unsignedcharna,nb;unsignedintm;inti;na=DBYTE[0x10];//把(0x10)中的数赋值给nafor(i=0;i<8;i++){nb=a[i];//取出数组a中的值赋值给nbm=dsi[i];//取出数组dsi中的地址赋给mDBYTE[0x21]=na&nb;//na和nb相与结果存在(0x21)中if(DBYTE[]==0x00)//判断如果(0x21)中的值等于0x00,地址m中的值赋为0x30,如果(0x21)中的值不等于0x00,地址m中就赋值为0x31DBYTE[m]=0x30;elseDBYTE[m]=0x31;}}六、实验结果:16位数据比较大小的汇编语言的结果: 16位数据比较大小的C语言的结果: 8位二进制转换成ACSII码的C语言程序:输入的8位二进制数为0x3a七、心得体会:通过本学期数周的上机实验操作,让我体会到平日在课堂学习理论知识的时候短暂的了解并不代表真正的掌握和熟练应用,要学好单片机就要把理论与操作结合起来,在实际操作中可以加深对理论知识的掌握,查漏补缺,发现自己的问题并加以改进。同时让我体会到,在真正的实际操作中自己还有不足之处,这个时候老师和同学的帮助是很有必要的,这样也会使大家共同进步。最后,这几次的实验课让我熟悉了Keil-C51这个开发平台,提高了自己的实际动手能力。这也为我今后继续深入研究单片机这门课程打下了坚实的基础。

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。
关闭