微机原理及应用实验报告班级:姓名:学号:中南大学机电工程学院精密测控实验室1实验二软件程序设计1.实验目的:1、掌握MCS-51单片机指令系统及用汇编语言编程技巧;2、了解和熟悉用MCS-51单片机仿真开发机调试程序的方法。2.实验内容:1、编写排序程序并上机调试通过。已知8031内部RAM60H~69H单元中,依次存放了FFH,99H,77H,CCH,33H,DDH,88H,BBH,44H,EEH,它们均为无符号数,编程将它们按递减次序排序,即最大数放在60H中,最小数放在69H中。2.、编写多字节加法程序并上机调试通过。8031内部RAM20H~22H单元中,存放了3字节被加数(低字节在前),在2AH~2CH单元中存放3字节加数(低字节在前),求两数之和,并将结果存入以20H为起始地址的区域中(低字节在前)。3.实验设备名称、型号:台式微型计算机MCS-51仿真开发机THKSCM-2A4.画出软件程序流程图,写出上机调试通过的汇编语言程序清单:程序1、编写排序程序并上机调试通过。已知8031内部RAM60H~69H单元中,依次存放了FFH,99H,77H,CCH,33H,DDH,88H,BBH,44H,EEH,它们均为无符号数,编程将它们按递减次序排序,即最大数放在60H中,最小数放在69H中。解:本设计采用冒泡排序法,使用双重循环,并在内循环中进行比较如果合乎从大到小的顺序则不动,否则两两交换,这样比较下去,比较9次后,最小的那个数就会沉底,在下一次比较时将减少一次比较次数。如果一次比较完毕,没有发生交换,说明已经按照从大到小的顺序排列了。则可以退出循环,结束程序。程序结构框图和程序代码如下:23ORG1000HTEMDATA50HMOVR7,#9MOV60H,#0FFHMOV61H,#99HMOV62H,#77HMOV63H,#0CCHMOV64H,#33HMOV65H,#0DDHMOV66H,#88HMOV67H,#0BBHMOV68H,#44HMOV69H,#0EEHLOOP0:CLRF0MOVA,R7MOVR6,AMOVR0,#60HMOVR1,#60HINCR1LOOP1:MOVA,@R0MOVTEM,AMOVA,@R1CJNEA,TEM,NEXTSJMPNOCHANEXT:JCNOCHASETBF0MOV@R0,AXCHA,TEMMOV@R1,ANOCHA:INCR0INCR1DJNZR6,LOOP1JNBF0,HALDJNZR7,LOOP0HAL:SJMP$END程序2:编写多字节加法程序并上机调试通过。8031内部RAM20H~22H单元中,存放了3字节被加数(低字节在前),在2AH~2CH单元中存放3字节加数(低字节在前),求两数之和,并将结果存入以20H为起始地址的区域中(低字节在前)。4解:改程序由三个字节数相加,其结果不会超过4个字节,可以采用循环求和的办法,吧加数和被加数依次从低位带进位相加,当然加最低位时必须先对进位位清零。可以采用线性结构,也可以采用循环结构。我在设计该程序采用单重循环,结构简单,特别是当相加的数较长时,优势更加明显。程序结构框图和源代码如下:ORG1000HMOV20H,#××HMOV21H,#××HMOV22H,#××HMOV2AH,#××HMOV2BH,#××H5MOV2CH,#××HMOVR0#20HMOVR1#2AHMOVR7#03HCLRCLOOP0:MOVA,@R0MOVB,@R1ADDCA,BMOV@R0,AINCR0INCR1DJNZR7,LOOP0NEXT:JNCHALINCR0MOV@R0,#01HHAL:SJMP$END5.思考题1、如果题目1改为递增排序,如何修改程序,为什么?答:将NEXT中的指令中的JC指令换为JNC指令即可2、如果题目1改为从30H单元开始的16个单元中无符号数排序,改哪几条指令?答:改变R7的值为15,将值赋予30H到3FH上就可以了3、如果题目2改为从50H开始的4字节数与60H开始的四字节数相加,如何修改?答:MOVR0#20H改为MOVR0#50HMOVR1#2AH改为MOVR1#60HMOVR7#03H改为MOVR7#04H4、写出题目2中你处理最高位进位的相应指令。答:NEXT:JNCHALINCR0MOV@R0,#01HHAL:SJMP$5、循环程序中为何常用间接寻址方式(@Ri,@DPTR)?答:因为间接寻址可以实现程序的循环,便于编写程序。66.心得体会:通过实际模拟操作,加深了对单片机的理解,更好的理解编程语言,本次实验较为简单,我是独立按时完成,当我看到发光二极管一次亮时别提我的兴奋劲了。在试验的编程过程中弄清了定时器的使用方法,以及延时的计算。审阅:7实验三定时/计数器实验1.实验目的:1、掌握MCS-51单片机内部定时/计数器的功能与特点,工作方式选择和编程方法,中断功能的使用和中断服务程序的设计;2、解和熟悉MCS-51单片机实验板的功能。2.实验内容:1、用MCS-51单片机的内部定时器定时中断,通过P1口控制实验板上八个LED发光二极管轮流循环显示发光,每个LED发光二极管显示时间为0.5秒;2、用MCS-51单片机的内部定时器定时中断,编写一段电子秒表程序。(选做)3.实验设备名称、型号:台式微型计算机MCS-51仿真开发机THKSCM-2A4.画出软件程序流程图写出上机调试通过的汇编语言程序清单:1、用MCS-51单片机的内部定时器定时中断,通过P1口控制实验板上八个LED发光二极管轮流循环显示发光,每个LED发光二极管显示时间为0.5秒.分析:采用的晶振为11.0592MHz,所以时间周期T=1.085069μs。采用方式一计时需要460800次,超过了计时范围,故在采用一个内循环,取为10,则共需460800÷10=46080。X=2^(16)-46080=19456=4C00H编程:START:MOVTMOD,#01HMOVTH0,#4CHMOVTL0,#00HSETBTR0SETBEASETBET0MOVA,#F7HMOVP1,AMOV40H,#0AHSJMP$ORG0000HLJMPSTARTORG00BH8MOVTH0,#4CHMOVTL0,#00HDJNZ40H,OVERMOV40H,#0AHMOVP1,ARRAOVER:RETI5.思考题1、你采用的是定时器0还是定时器1?如果换用另外一个定时器,需要修改那些语句?为什么?答:采用定时器0,若用另一个则要替换的语句是MOVTMOD,#01H换为MOVTMOD,#10HMOVTH0,#4CH换为MOVTH1,#4CHMOVTL0,#00H换为MOVTL1,#00HSETBTR0换为SETBTR12、如果将延时时间变为1秒,如何修改程序,为何?答:两个程序均是将MOV40H,#0AH改为MOV40H,#14H3、改变发光二极管循环点亮方向,如何修改程序?如果间隔闪亮(亮一个,黑一个,亮一个……)如何修改程序?你还能做哪些花样?答:将RLA改为RRA如果要间隔闪亮可以将A连续两次左移即RLA变为RLA再加RLA就可以了。我还可以要其两同时亮,将累加器A的值变为0FDH就可以了语言是MOVA#0FEH变为MOVA,#0FDH7.心得体会:通过实际模拟操作,加深了对单片机的理解,更好的理解编程语言,本次实验较为简单,我是独立按时完成,当我看到发光二极管一次亮时别提我的兴奋劲了。在试验的编程过程中弄清了定时器的使用方法,以及延时的计算。审阅:9实验四串行数据传送实验1.实验目的:1、掌握七段LED数码管显示器工作原理,以及用动态扫描方法编程实现8位LED数码管显示的方法;2.进一步了解和熟悉MCS-51单片机实验板的功能。2.实验内容:1.用MCS-51的P1、P2输出段码和位码,编程实现8位LED数码管循环显示出“1”“2”“3”“4”“5”“6”间隔时间0.5秒。2.缩短间隔时间,直至显示效果为稳定的“123456”3.实验设备名称、型号:台式微型计算机MCS-51仿真开发机THKSCM-2A4.画出软件程序流程图,写出上机调试通过的汇编语言程序清单:说明:采用的晶振为11.0592MHz,所以时间周期T=1.085069μs。执行一次DJNZ指令需要2T,要间隔0.5s。故需要执行0.5÷(2T)=230400次。取三次循环,第一次为4,第二次为256,第三次为230400÷4÷256=225=0E1H。代码如下:ORG0000HMOV40H,#00HMOV41H,#01HMOV42H,#02HMOV43H,#03HMOV44H,#04HMOV45H,#05HSTART:MOVR0,#40HMOVR2,#06HMOVR7,#7FHLOOP:MOVA,@R0MOVDPTR,#DISTABMOVCA,@A+DPTRMOVP1,AMOVA,R7MOVP2,ARRAMOVR7,A10MOVR3,#04HMOVR4,#00HMOVR5,#0E1HLOOP1:DJNZR5,LOOP1DJNZR4,LOOP1DJNZR3,LOOP1INCR0DJNZR2,LOOPLJMPSTARTDISTAB:DB06H;显示1DB5BH;显示2DB4FH;显示3DB66H;显示4DB6DH;显示5DB7DH;显示6END修改MOVR3,#04HMOVR4,#00HMOVR5,#0E1H可以缩短显示时间。当修改为MOVR3,#04HMOVR4,#04HMOVR5,#02H时从视觉看已经看不出变化。用定时器实现方法:采用的晶振为11.0592MHz,所以时间周期T=1.085069μs。采用方式一计时需要460800次,超过了计时范围,故在采用一个内循环,取为50,则共需460800÷50=9216。X=216-9216=56350=DC1EH源代码如下:MOVTMOD,#01HMOVTH0,#0DCHMOVTL0,#1EHSETBEASETBET0SETBTR0SJMP$0RGB000BHMOVR2,#32HDJNZR2,NEXTORG0050HMOV40H,#00HMOV41H,#01HMOV42H,#02HMOV43H,#03HMOV44H,#04HMOV45H,#05HSTART:MOVR0,#40H11MOVR2,#06HMOVR7,#EFHLOOP:MOVA,@R0MOVDPTR,#DISTABMOVCA,@A+DPTRMOVP1,AMOVA,R7MOVP2,ARRAMOVR7,AINCR0NEXT:RETIDISTAB:DB06H;显示1DB5BH;显示2DB4FH;显示3DB66H;显示4DB6DH;显示5DB7DH;显示6END5.思考题1、要显示实验当天的日期(如20100509),怎样调试?答:将MOVR2,#06H改为MOVR2,#08HDISTAB:DB06H;显示1改为DISTAB:DB5BH;显示2DB5BH;显示2DB3FH;显示0DB4FH;显示3DB06H;显示1DB66H;显示4DB3FH;显示0DB6DH;显示5DB3FH;显示0DB7DH;显示6DB6DH;显示5DB3FH;显示0DB6FH;显示92、用其中4位数码管显示“good”,程序如何修改?答:将MOVR2,#06H改为MOVR2,#04HDISTAB:DB06H;显示1改为DISTAB:DB6FH;显示gDB5BH;显示2DB3FH;显示0DB4FH;显示3DB3FH;显示0DB66H;显示4DB5EH;显示dDB6DH;显示5DB7DH;显示6127.心得体会:通过实际模拟操作,加深了对单片机的理解,更好的理解编程语言,本次实验我能够根据老师给出的代码理解完成,并且取得满意的结果。在试验的编程过程中弄清了很多在课堂上没有理解的操作码的含义。熟悉了各个操作码的使用方法及为什么如此用。审阅: