第六章单片机系统综合实验6.1单片机基本实验实验6-1.存储器块清零程序设计(1)实验目的。1.掌握存储器读写方法;2.了解存储器的块操作方法。(2)实验内容:1.指定内部RAM中某块的起始地址和长度,要求能将其内容清零。2.指定外部RAM中某块的起始地址和长度,要求能将其内容清零。3.指定外部RAM中某块的起始地址和长度,要求能将其内容置为某固定值(如012H)。(3)实验说明。通过本实验,学生可以了解单片机的存储器结构及读写存储器的方法,同时也可以了解单片机编程、调试方法。(4)参考程序框图。1、程序参考流程如图6-1所示;2、参考程序如下:BLOCKEQU0400HORG0000HLJMPSTARTORG0030HSTART:MOVDPTR,#BLOCK;DPTR←起始地址MOVR0,#0FFH;R0←块长度MOVA,#0;A←0LOOP:MOVX@DPTR,A;当前地址内容清0INCDPTR;地址加1DJNZR0,LOOP;计数器减1,循环SJMP$;结束END图6-2程序窗口(存储器块赋值程序)图6-3外部数据存储器XDATA空间窗例如若要将从0400H开始的255个字节外部数据存储器块的内容置成12H值,请修改以上程序完成此操作,注意在程序调试过程中数据的变化情况。注意在程序调试过程中数据的变化情况。3、程序调试过程。程序窗口如图6-2所示。可通过观察外部数据存储器窗口XDATA了解程序运行结果,运行结果如图6-3所示。图6-1程序流程图(5)思考题。如何将存储器块的内容置成某固定值(例全填充为0FFH)?请用户修改程序,完成此操作。实验6-2二进制到BCD转换程序设计(1)实验目的。掌握简单的数值转换算法。基本了解数值的各种表达方法。(2)实验内容。1、将给定的一个单字节二进制数,转换成非压缩的二—十进制(BCD)码;2、将给定的一个单字节二进制数,转换成压缩的二—十进制(BCD)码。(3)实验说明。计算机中的数值有各种表达方式,这是计算机的基础。掌握各种数制之间的转换是一种基本功。有兴趣的同学可以试试将BCD转换成二进制码。五、参考程序框图。(1)程序参考流程如图6-4所示;(2)参考程序通过本实验学习简单的数值转换算法,了解数值的各种表达方法。同时进一步熟悉单片机实验集成开发软件环境的使用方法。学习“单步”、“跟踪”、“执行到光标处”等调试功能。启动程序运行到最后一条指令处,打开8051内部数据存储器空间,观察程序执行结果。若A中原来的内容“123”(7BH)转换为三个BCD码“01”、“02”和“03”,并分别存入了从(30H)开始的三个单元中,如图6-5所示。程序执行后的结果:图6-5内部数据存储器DATA空间窗口实验6-3十六进制到ASCII码转换程序设计(1)实验目的。1.了解十六进制数和ASCII值的区别。2.了解如何将十六进制数转换成ASCII值。3.了解如何查表进行数值转换及快速计算。(2)实验内容。给出一个十六进制数,分别用查表法和逻辑运算方法将其转换成ASCII值。(3)实验说明。此实验主要让学生了解数值的十六进制数和ASCII码的区别,学会用查表法快速地进行数值转换并进一步了解数值的各种表达方式。(4)参考程序框图(查表法)方法一:(通过查表实现数制转换)。程序流程图如图6-6所示。入口条件:待转换的8位二进制数在累加器A中。出口信息:高四位的ASCII码在31H中,低四位的ASCII码在30H中。方法2:逻辑运算方法。HASC功能:8位二进制数转换成双字节ASCII码。入口条件:待转换的8位二进制数在累加器A中。出口信息:高四位的ASCII码在A中,低四位的ASCII码在B中。HASC:MOVB,A;暂存待转换的单字节十六进制数LCALLHAS1;转换低四位XCHA,B;存放低四位的ASCII码SWAPA;准备转换高四位HAS1:ANLA,#0FH;将累加器的低四位转换成ASCII码ADDA,#90HDAAADDCA,#40HDAARET实验6-4存储块移动程序设计(1)实验目的。1.了解内存的移动方法;2.加深对存储器读写的认识。(2)实验内容。将指定源地址和长度的存储块移到指定目标位置。(3)实验说明。块移动是计算机常用操作之一,多用于大量的数据复制和图象操作。本程序是给出起始地址,用地址加一方法移动块,请思考给出块结束地址,用地址减一方法移动块的算法。另外,若源块地址和目标块地址有重叠,该如何避免?(4)参考程序框图。1、程序流程图如图6-7所示;2、参考程序。将外部RAM存储器XDATA中3000H开始的256B数据移动到4000H开始的存储单元中。参考程序如上:(5)思考题。1.若源块地址和目标块地址有重叠,该如何避免?2.请思考给出块结束地址,用地址减一方法移动块的算法。3.如何将存储器块的内容置成某固定值(例全填充为0FFH)?请用户修改程序,完成此操作。实验6-5多分支程序(1)实验目的。1.了解程序的多分支结构。2.了解多分支结构程序的编程方法。(2)实验内容。在多分支结构的程序中,能够按调用号执行相应的功能。(3)实验说明。多分支结构是程序中常见的结构,若给出调用号来调用子程序,一般用查表方法,查到子程序的地址,转到相应子程序,完成指定操作。分支结构程序设计也是最基本的程序设计技术。在实际的程序设计中,有很多情况往往还需要程序按照给定的条件进行分支。这时就必须对某一个变量所处的状态进行判断,根据判断结果来决定程序的流向。在编写分支程序时,关键是如何判断分支的条件。在MCS—51单片机指令系统中有JZ(JNZ)、CJNE、JC(JNC)、DJNZ及JB(JNB)等丰富的控制转移指令,他们是分支结构程序设计的基础,可以完成各种各样的条件判断、分支。常用的分支结构有以下几种:1、统计:例1:统计全班60名同学不及格人数,成绩以BCD码放在30H起,结果放入R7。2、分类:例2:统计全班60名同学的成绩,大于等于90分的、大于等于75分的、大于等于60分的及小于60分的人数,分别放入R3、R4、R5、R6中。例1例23.程序散转:可以有多种方法实现程序散转。(1)方法1:利用地址偏移量表实现散转。将转移目标地址与表首地址差列表,作为转移目标地址。利用了伪指令的数学计算功能,标首地址加上处理程序与标首地址差转到处理程序。实验内容:有5个按键0,1,2,3,4,根据按下的键转向不同的处理程序,分别为PR0,PR1,PR2,PR3,PR4。(2)方法2:利用转移指令表实现转移。将转移到不同程序的转移指令列成表格,判断条件后查表,执行表中的转移指令。用直接转移指令组成一个转移表,然后把菜单号读入累加器(A),转移表首地址放入DPTR中,利用JMP@A+DPTR实现散转。【入口参数】(R3)=存输入键盘码1~9。【出口参数】转移到相应的子程序入口。ORG0030HKEY_JMP:MOVDPTR,#TAB1;子程序入口首地址送DPTRMOVA,R3;把键盘输入缓冲区内容送累加器(A)DECA;由于输入数码为1~9,因此需减1MOVB,#03HMULAB;由于长跳转指令LJMP占用3B,;各子程序入口地址相距3BJMP@A+DPTR;根据输入码,执行相应的子程序ORG0500H;程序入口地址表TAB1:LJMPNO1LJMPNO2LJMPNO3LJMPNO4LJMPNO5LJMPNO6LJMPNO7LJMPNO8LJMPNO9END(3)方法3:利用转向地址表实现转移。将转移地址列成表格,将表格的内容作为转移的目标地址。根据R3(0~n)的内容转向对应的程序;处理程序的入口符号地址分别为PR0~PRn(n<256)①将PR0~PRn入口地址列在表格中,每一项占两个单元;②PRn在表中的偏移量为2n,因此将R3的内容乘“2”即得PRn在表中的偏移地址;③从偏移地址2n和2n+1两个单元分别取出PRn的高8位地址和低8位地址送DPTR寄存器,用JMP@A+DPTR指令(A先清零)即转移到PRn入口执行。【入口参数】(R3)=0~n转移序号。【出口参数】转移到相应的子程序入口。ORG0030HKEY_JMP:MOVDPTR,#TABMOVA,R3ADDA,R3;(A)←(R3)*2JNCNADDINCDPH;(R3*2)256NADD:MOVR3,AMOVCA,@A+DPTRXCHA,R3;转移地址高8位INCAMOVCA,@A+DPTRMOVDPL,A;转移地址低8位MOVDPH,R3CLRAJMP@A+DPTRTAB:DWPR0,PR1,PR2,···········PRnPR0:处理程序0PR1:处理程序1……PRn:处理程序nEND实验要求:根据以上实例程序,按以下要求编写程序1、全班30个人的成绩放在1000H起,统计及格和不及格的情况,30H放及格人数,31H开始放成绩,50H放不及格人数,51H起放成绩。2、统计全班30名同学的成绩(20H起),大于等于90分的、大于等于75分的、大于等于60分的及小于60分的人数,分别放入R3、R4、R5、R6中,找出成绩最高的放入50H起的单元。(4)实验报告要求1.根据实验实例程序,完成实验要求中的程序以及程序的流程图。2.观察数据窗口中数据的变化过程。记录实验过程中遇到的问题和解决方法。四、(5)思考题。1、分类程序中,如何设计判断的次序使90分、75分、60分合理的归档?2、针对不同的判断条件,相应的流程图应如何正确画出以使程序的编写更为清晰?实验6-6数据排序程序设计(1)实验目的。1.了解数据排序的简单算法。2.了解数列的有序和无序概念。(2)实验内容。给出一组随机数,编写程序将此组数据排序,使之成为有序数列。有序的数列更有利于查找。(3)实验说明。有序的数列更有利于查找。本程序用的是“冒泡排序”法,算法是将一个数与后面的数相比较,如果比后面的数大,则交换,如此将所有的数比较一遍后,最大的数就会在数列的最后面。再进行下一轮比较,找出第二大数据,直到全部数据有序。通过本实验可以了解数据有序和无序的概念以及数据排序的简单算法。(4)参考程序框图。1、程序参考流程如图6-9所示。2、参考程序:将片内RAM50H-59H中的数据按从小到大的顺序排序3、调试步骤①设置待排序数字。点击存储器空间菜单中的“DATA”选项,打开单片机内部数据存储器空间DATA,将鼠标指向其中从50H开始的单元,单击右键,将其中内容修改为一组无序的数据,如图6-10所示,②运行程序。点击程序运行键,再用“执行到光标处”功能,启动程序运行到最后一条指令处,可以看到此时数据已经按从小到大的顺序排列了,如图6-11所示。图6-10未排序数据图6-11排序后的数据实验6-7P1口输入、输出实验(1)实验目的。1.学习Pl口的使用方法。2.学习延时子程序的编写和使用。(2)实验内容。P1口做输出口,接八只发光二极管(其输入端为高电平时发光二极管点亮),编写程序,使发光二极管循环点亮。P1.0、P1.1作输入口接两个拨动开关S0、S1;P1.2,P1.3作输出口,接两个发光二极管,编写程序读取开关状态,将此状态在发光二极管上显示出来。编程时应注意P1.0、P1.1作为输入口时应先置1,才能正确读入值。(3)实验电路连线。(4)实验说明。P1口是准双向口。它作为输出口时与一般的双向口使用方法相同。由准双向口结构可知当P1口用作输入口时必须先对它置“1”。若不先对它置“1”,读入的数据是不正确的。延时子程序的延时计算问题(5)参考程序框图图6-12P1循环点灯流程图图6-13P1口输入输出流程图图6-14P1端口输出情况图6-15P1端口输入/输出(6)程序调试。在WAVE集成软件调试环境下,输入以上程序,编译通过后,打开外设端口,单步运行,观察P1口的输出情况,实验1运行情况如图6-14所示。调试实验2程序时,采用单步运行方式,用鼠标点击P1.0和P1.1改变其输入状态,观察P1.2和P1.3的输出情况,实验2运行情况如图6-15所示。实验6-8交通灯控制(软件