第5讲单片机C语言程序设计

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

单片机原理与应用SingleChipComputerPrincipleandApplication滁州学院计算机与信息工程学院于红利12一、C51语言的基本运算与流程控制语句二、C51语言的构造函数类型三、C51语言设计的其他问题第五讲单片机C语言程序设计(3)3教学目标掌握:C51语言的基本运算与流程控制语句理解:C51语言的基本结构与构造数据类型了解:C51语言程序设计的其他问题41、C51的基本运算一、C51语言的基本运算与控制语句与标准C语言类似,C51的基本运算包括算术运算、关系运算、逻辑运算、位运算和幅值运算及表达式等。(1)算术运算符C51中支持的算术运算符有:运算符号功能+加或取正值运算符-减或取负值运算符*乘运算符/除运算符%取余运算符++自增加运算符--自减运算符注:①若相除两个数为浮点数,则结果也为浮点数,若相除的两个数为整数,则结果也为整数。如25.0/20.0=1.25,而25/20=1。②对于取余运算,则要求参加运算的两个数必须为整数,如:5%3=2。5关系运算用于比较两个数的大小,关系表达式的值为逻辑值0,1之一。运算符号功能小于=小于等于大于=大于等于==等于!=不等于(2)关系运算符C51中有6种关系运算符:C51有3种逻辑运算符:||(逻辑或)、&&(逻辑与)、!(逻辑非)(3)逻辑运算符逻辑运算符则用于求条件式的逻辑值,用逻辑运算符将关系表达式或逻辑量连接起来的式子就是逻辑表达式。注:C51中位运算符只能对整和字符型数据操作,不能对浮点数进行操作。位运算是按位对变量进行运算,并不改变参与运算的变量的值。(4)位运算符运算符号功能&按位与|按位或^按位异或!按位取反位左移位右移(5)赋值运算符在C51中,赋值运算符“=”,将一个数据的值赋给一个变量。变量=表达式;执行时先计算出右边表达式的值,然后赋给左边的变量。例如:x=8+9;/*将8+9的值赋绐变量x*/赋值符号前加上其他运算符构成符合运算符号,如下:赋值运算中,若“=”两侧数据类型不一致,系统自动将右侧表达式换成左侧类型。81、C51的基本结构(1)顺序结构顺序结构是最基本、最简单的结构,在这种结构中,程序由低地址到高地址依次执行,如图给出顺序结构流程图,程序先执行A操作,然后再执行B操作。AB顺序结构流程图二、C51程序基本结构与构造函数类型【例1】计算半径为r的圆面积、球体积。#includestdio.h#definePI3.1415926Voidmain(){floatr,s,v;scanf(“%f”,&r);S=PI*r*r;V=4.0/3.0*r*r*r;Printf(“圆面积:%f”,s);Printf(“球体积:%f”,v);}10分支结构可使程序根据不同的情况,选择执行不同的分支,在选择结构中,程序先都对一个条件进行判断。当条件成立,即条件语句为“真”时,执行一个分支,当条件不成立时,即条件语句为“假”时,执行另一个分支,如图4.4。分支结构语句有if和switch两种。(2)分支结构条件P语句A语句B成立不成立在C51中,实现选择结构的语句为if/else,if/elseif语句。另外在C51中还支持多分支结构,多分支结构既可以通过if和elseif语句嵌套实现,可用swith/case语句实现。if语句if语句的几种形式:if形式、if…else形式、多选择if语句形式。(1)if(表达式)语句;若表达式为真,则运行if语句,否则,接着执行。(2)if(表达式)语句1;else语句2;例如:输入一个整数,判断是奇数还是偶数。(3)if(表达式)语句1;elseif语句2;…[例2]计算如下分段函数。#includestdio.hintmain(void){doublex,y;printf(Enterx:);scanf(%lf,&x);printf(f(%.2f)=%.2f\n,x,y);return0;}switch语句switch(表达式){case常量表达式1:语句段1;case常量表达式2:语句段2;....…case常量表达式n:语句段n;default:语句段n+1;}14在程序处理过程中,有时需要某一段程序重复执行多次,这时就需要循环结构来实现,循环结构就是能够使程序段重复执行的结构。循环结构又分为两种:当(while)型循环结构和直到(do...while)型循环结构。(1)当型循环结构当型循环结构如右图,当条件P成立(“真”)时,重复执行语句A,当条件不成立(“假”)时才停止重复,执行后面的程序。(3)循环结构条件P语句A成立不成立当型循环结构15(2)直到型循环结构直到型循环结构如右图,先执行语句A,再判断条件P,当条件成立(为“真”)时,再重复执行语句A,直到条件不成立(为“假”)时才停止重复,执行后面的程序。条件P语句A成立不成立直到型循环结构此外,循环结构的语句还有:for、goto等。【例3】编程序用do…while语句,求2+4+6…+100的和。#includestdio.hVoidmain(){intk=2,s=0;do{s=s+k;k=k+2;}while(k=100);printf(“2+4+…+100=%d”,s);}172.C51构造数据类型1数组一.一维数组一维数组只有一个下标,定义的形式如下:数据类型说明符数组名[常量表达式][={初值,初值……}]数组中各元素类型数组的标识符数组长度,元素个数给数组元素赋初值例如:下面是定义数组的两个例子。①unsignedcharx[5];②unsignedinty[3]={1,2,3};①定义了一个无符号字符数组,数组名为x,数组中的元素个数为5。②定义了一个无符号整型数组,数组名为y,数组中元素个数为3,定义的同时给数组中的三个元素赋初值,赋初值分别为1、2、3。注意:C51语言中数组的下标是从0开始的,①的5个元素分别是:x[0]…x[4]。②的3个元素分别是:y[0]=1;y[1]=2;y[2]=3。C51规定在引用数组时,只能逐个引用数组中的各个元素,而不能一次引用整个数组。但如果是字符数组则可以一次引用整个数组。18Fibonacci数列在数学和计算机算法中十分有用。Fibonacci数列是这样的一组数:第一个数字为0,第二个数字为1,之后每一个数字都是前两个数字之和。设计时通过数组存放Fibonacci数列,从第三项开始可通过累加的方法计算得到。程序如下:#includereg52.h//包含特殊功能寄存器库#includestdio.h//包含I/O函数库main(){intfib[20],i;fib[0]=0;fib[1]=1;for(i=2;i20;i++)fib[i]=fib[i-2]+fib[i-1];for(i=0;i20;i++)[例4]用数组计算并输出Fibonacci数列的前20项。19{if(i%5==0)printf(“\n”);printf(“%6d”,fib[i]);}while(1);}程序执行结果:0112358132134558914423337761098715972584414820例如:charstring1[10];charstring2[20];上面定义了两个字符数组,分别定义了10个元素和20个元素。用来存放字符数据的数组称为字符数组,是一种常用的数组。在C51语言中,字符数组用于存放一组字符或字符串,字符串以“\0”作为结束符,只存放一般字符的字符数组的赋值与使用和一般的数组完全相同2.字符数组213.指针变量的定义指针变量的定义与一般变量的定义类似,定义的一般形式为:数据类型说明符[存储器类型]*指针变量名;下面是几个指针变量定义的例子:int*p1;/*定义一个指向整型变量的指针变量p1*/char*p2;/*定义一个指向字符变量的指针变量p2*/chardata*p3;/*定义一个指向字符变量的指针变量p3,该指针访问的数据在片内数据存储器中,该指针在内存中占一个字节*/floatxdata*p4;/*定义一个指向字符变量的指针变量p4,该指针访问的数据在片外数据存储器中,该指针在内存中占两个字节*/指针变量所指向的变量类型可选项,是C5l编译器的一种扩展。若带此选项,指针被定义为基于存储器的指针。否则定义为一般指针,这两种指针的区别在于它们占的存储字节不同。224.指针变量的引用指针变量是存放另一变量地址的特殊变量,指针变量只能存放地址。指针变量使用时注意两个运算符:&和*。其中:“&”是取地址运算符,“*”是指针运算符。通过“&”取地址运算符可以把一个变量的地址送给指针变量,使指针变量指向该变量;通过“*”指针运算符可以实现通过指针变量访问它所指向的变量的值。指针变量经过定义之后可以象其他基本类型变量一样引用。例如:intx,*px,*py;/*变量及指针变量定义*/px=&x;/*将变量x的地址赋给指针变量px,使px指向变量x*/*px=5;/*等价于x=5*/py=px;/*将指针变量px中的地址赋给指针变量py,使py也指向x*/23#includereg52.h//包含特殊功能寄存器库#includestdio.h//包含I/O函数库externserial_initial();main(){intx,y;int*p,*p1,*p2;serial_initial();printf(“inputxandy:\n”);scanf(“%d%d”,&x,&y);p1=&x;p2=&y;if(xy){p=p1;p1=p2;p2=p;}printf(“max=%d,min=%d\n”,*p1,*p2);while(1);}程序执行结果:inputxandy:48max=8,min=4[例5]输入两个整数x与y,经比较后按大小顺序输出。几类重要的库函数①专用寄存器包文件reg51.h(reg52.h):②绝对地址包含文件absacc.h:③动态内存分配函数,位于stdlib.h文件中。④缓冲区处理函数,位于string.h文件中,包括复制、移动、比较等函数,这样便于对缓冲区进行处理。⑤输入/输出流函数,位于stdio.h文件中,流函数通过51单片机的串口或用户定义的I/O读写数据,默认为51单片机的串口。三、C51语言设计的其他问题小结25C51语言设计的其他问题C51语言的构造函数类型C51语言的基本运算与流程控制语句C语言程序设计作业思考题及练习:1.C51在标准C的基础上,扩展了哪几种数据类型?2.C51有哪几种数据存储类型?其中数据类型“idata,code,xdata.,pdata”各对应AT89C51单片机的哪些存储空间?3.说明3中数据存储模式的区别,SMALL模式、COMPACT模式、LARGE模式。4.编写C51程序,将片外2000H为首地址的连续10个单元的内容,读入到片内40H到49H单元中。5.do-while构成的循环与while循环有什么区别?6.使用C51语言,编写代码将8个流水灯依次点亮,再依次熄灭。

1 / 26
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功