您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 其它行业文档 > 51单片机之数组的应用
【实验题目】数组【目的要求】1.学习一维和二维数组的定义,初始化,引用。2.利用数组做流水灯。3.要求三个学时完成。【实验平台】电脑,伟福,Proteus7等仿真软件。【实验原理】我们在数学上学过数列,用一大括号将一组数字括起来,就变成一个整体,用一个大写字母来表示,数列具有无序性,不重复性。且根据数列中数的类型来判断数列的类型。如果将数列的不重复性去掉,并用a[10]来代表,10为整数代表数的个数,a[0],a[1]...a[9]来表示数列中的数,这就变成了我们今天要说的数组。定义数组:类型符数组名[常量表达式];数组名即为变量名,定义数组时须指定元素的个数,即方括号中的数,即为数组长度,注意数组长度和数组元素的表示,a[10]表示数组有十个元素,储存形式为:a[0]a[1]a[2]a[3]a[4]a[5]a[6]a[7]a[8]a[9]特别注意没有a[10]。常量表达式中可以包括常量和符号常量,例如“a[3+5]”,如果是在被调用的函数中定义数组,其长度可以是变量或变量表达式,例如:voidfunc(intn){inta[2*n];//n的值从实参传来......}一维数组的初始化:为了使程序简洁,,常在定义数组的同时,给各数组元素赋值,这称为数组的初始化。将数组各元素的初值顺序放在一对花括号内,数据间用逗号隔开。例如:inta[10]={0,1,2,3,4,5,6,7,8,9};则a[0]=0,a[1]=1,a[2]=2......a[8]=8,a[9]=9。也可以给数组的一部分赋值,例如:a[10]={1,2,3,4,5};则只给前五个赋初值,剩下的系统自动给后面元素赋值为0。在对全部数组元素赋初值时,由于数据的个数已确定,因此可以不指定数组长度。例如:inta[]={1,2,3,4,5};二维数组:我们都学过平面坐标,利用平面上两个垂直的坐标轴,用到两坐标轴的距离来确定平面的位置。二维数组也是这个原理,二维数组常称为矩阵。把二维数组写成行和列的排列形式。定义二维数组:类型说明符数组名[常量表达式(行)][常量表达式(列)]例如:inta[3][4]a[0][0]a[0][1]a[0][2]a[0][3]a[1][0]a[1][1]a[1][2]a[1][3]a[2][0]a[2][1]a[2][2]a[2][3]二维数组的初始化:分行赋值,可以将所有数据写在一个大括号中,系统会自动按顺序赋值。也可对部分元素赋值。其实与一维数组类似,只要以一维数组类推便可得出,由于单片机中对二维数组运用较少,便不做具体讲述。字符型数组:用来存放字符串,定义类型为char型。规定以“\0”为结束符,在此先不做详解。【实验过程】针对单片机的编程#includereg51.hmain(){inti,x,y,a[2]={0x00;0xff};//定义变量与整型数组含两个元素for(i=0;i2;i++)//由于中括号内为变量利用for循环语句给P1口变换赋值使灯变灭变换{P1=a[i];//数组的引用for(x=0;x200;x++)for(y=0;y200;y++);//利用for语句的延时}}思考:数组就是一个数据源,我们不断的从中取出值来利用,如果数据源是能够让二极管单个闪亮的数据,那么我们将这些数据按一定规律引用,那么就能做出流水灯的效果。#includereg51.hmain(){inti,x,y,a[8]={0xfe,oxfd,oxfb,oxf7,oxef,oxdf,oxbf,ox7f};//此初始化数值分别让灯从上至下一个个闪亮for(i=0;i8;i++){P1=a[i];//数组的引用for(x=0;x200;x++)for(y=0;y200;y++);}}思考:用数组跟前面用位移动做流水灯相似,但用数组还能达到更大的功能,让灯更多样式的闪亮。#includereg51.hmain(){inti,x,y,a[10]={0x7e,0x3c,0x99,0xc3,0xe7,0xc3,0x99,0x3c,0x7e,0xff};for(i=0;i10;i++){P1=a[i];for(x=0;x500;x++)for(y=0;y200;y++);}}此程序可以实现从上至下,从下至上以两个灯共同闪亮的流动,我们可以发挥自己的想像力,创造更多的闪亮方式。【实验扩展】1.思考:如果我们把七个二极管做成长形的,摆放成“”的形状并根据各二极管与单片机接口的顺序编排出让其显示从0到9所对应的十六进制数,并对一定义的数组初始化,我们就做出了“数码管”此想法在第二次实验中就已提到。根据上图中二极管的连接顺序我们可以编排出让其显示0到9数字对应的十六进制数分别为:0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f。由此我们可进行如下编程:#includereg51.hvoiddelay();//对delay函数的声明main(){inti;//定义一循环变量inta[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//用编排出的数对数组初始化for(i=0;i10;i++){P1=a[i];//利用for循环给P1口赋值delay();//对延时函数的调用}}voiddelay()//延时函数{intj,k;for(j=0;j400;j++)for(k=0;k600;k++);}具体的显示方式以视频格式在附件,“数形灯”2.思考:上边我们用二极管做出数码管的显示,只是一种近似于流水灯的形式,一种固定死的显示方式,如果我们在程序中多加入一些逻辑思维,就更加接近于真正的数码管。#includereg51.hvoiddelay(int);//对含参delay函数的声明main(){inti,s=0;//定义两个变量并赋值inta[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};while(1){i=s%10;//s除10求余数并赋予iP1=a[i];//i作为一变量改变引用数组元素s++;//S值逐步加1if(s==10)s=0;//s值判断条件使s值在0至10间循环delay(200);//delay函数的调用}}}voiddelay(intt){intj,k;for(j=0;j200;j++)for(k=0;kt;k++);}对程序的解悉:通过变量s对10的求余运算可得出余数0至9;把此值赋予变量i,改变赋予P1的数组元素值来显示数字。
本文标题:51单片机之数组的应用
链接地址:https://www.777doc.com/doc-2927813 .html