AVR单片机C语言编程课件.ppt_第1页
AVR单片机C语言编程课件.ppt_第2页
AVR单片机C语言编程课件.ppt_第3页
AVR单片机C语言编程课件.ppt_第4页
AVR单片机C语言编程课件.ppt_第5页
已阅读5页,还剩96页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

机电系统控制电路设计,张志安,南京理工大学,机电系统控制电路设计,2,2019/12/15,1C语言基础2数据类型、运算符和表达式3程序控制语句4函数及其调用5编译预处理6数组及指针,AVR单片机C语言编程基础,机电系统控制电路设计,3,2019/12/15,1C语言基础,例子1,机电系统控制电路设计,4,2019/12/15,例子2,1C语言基础,机电系统控制电路设计,5,2019/12/15,1C语言基础,例子3,机电系统控制电路设计,6,2019/12/15,1C语言基础,/*给定半径,求圆的面积*/#definePI3.14159/*编译预处理宏替换*/#include/*编译预处理文件包含*/#include/*编译预处理文件包含*/main()/*主函数*/floatr,s;/*定义变量r、s类型为单精度实型*/r=1.0;/*变量r赋初值*/s=PI*pow(r,2);/*计算圆面积s*/printf(半径R=%f时,面积S=%fn,r,s);/*输出结果*/,例4求圆面积程序area.c,机电系统控制电路设计,7,2019/12/15,关于编译预处理(宏定义),1C语言基础,#definePI3.14159-不带参数#defineS(a,b)a*b-带参数#define宏定义命令PI符号常量(宏名,最好用大写,以区别一般变量)3.14159宏体(可以是一个表达式,如3+4)作用:用简单符号代表宏体部份内容(编译时会先自动替换)意义:直观/多次使用/便于修改注意:#define可出现在程序的任一位置(作用范围:由此行到程序末尾)宏定义不是C语句,不必在行未加分号,否则会连分号一起置换。,机电系统控制电路设计,8,2019/12/15,1C语言基础,#includestdio.h“头文件”(标准前导文件)C语言是一种“装配式”语言,许多常规的工作如输入、输出、数学函数等,往往事先由人做成各种“程序模块”(库函数),存放在各种所谓“头文件”(.h)中。使用时只需进行以下处理#include“头文件名”或#include在程序的执行部分调用该库函数:函数名(参数)文件包含的作用,就是根据需要把相应的某个“头文件”的内容在编译时先整体嵌入所编的程序中。用户也可以将自己设计的程序模块等做成“头文件”,供其他程序“包含”。,关于编译预处理(文件包含),机电系统控制电路设计,9,2019/12/15,1C语言基础,标识符被#define命令定义过#ifdef标识符程序段1#else程序段2#endif,关于编译预处理(条件编译),标识符未被#define命令定义过#ifndef标识符程序段1#else程序段2#endif,#if表达式-表达式真执行程序段1,假执行程序段2程序段1#else程序段2#endif,机电系统控制电路设计,10,2019/12/15,1C语言基础,关于主函数main(),C语言是一种函数式语言,它的一个函数实际上就是一个功能模块C程序的基本组成是函数。一个C程序是由一个固定名称为main的主函数和若干个其他函数(可没有)组成。一个C程序必须有一个、也只能有一个主函数。主函数在程序中的位置可以任意,但程序执行时总是从主函数开始,在主函数内结束。主函数可以调用其他各种函数(包括用户自己编写的),但其他函数不能调用主函数。,机电系统控制电路设计,11,2019/12/15,主函数的一般形式:,main()说明部分程序段(定义数据类型)执行部分程序段(给出操作指令),说明部分(简单程序可能没有此部分):floatr,s;/*定义变量r、s类型为单精度实型*/inta,b;/*定义变量a、b类型为整型*/执行部份:输入、赋值、计算、控制、输出等:r=1.0;/*变量r赋初值*/s=PI*pow(r,2);/*计算圆面积s*/printf(半径R=%f时,面积S=%fn,r,s);/*输出结果*/,1C语言基础,机电系统控制电路设计,12,2019/12/15,其他函数,标准库函数只能调用。使用方法:先“包含”,即将该函数所在头文件包含在程序中。后调用。调用方式:函数名(参数),例:#include#includemain()s=PI*pow(r,2);printf(“半径R=%f时,面积S=%fn”,r,s);说明:pow(x,y)求xy(math.h中的标准数学函数)printf();(stdio.h中的标准输出函数),1C语言基础,机电系统控制电路设计,13,2019/12/15,其他函数,自编(定义)函数:先定义(规定函数类型、函数名和函数功能)后调用(使用所定义的函数实现其功能)定义函数:函数类型函数名(形式参数)(函数体)调用函数:函数名(参数),求三个数的平均值floataverage(floatx,floaty,floatz)/*定义函数average()*/floataver;aver=(x+y+z)/3;return(aver);main()/*主函数*/floata,b,c,ave;a=3.5;b=4.6;c=7.9;ave=average(a,b,c);/*调用自定义函数average()*/printf(average=%f,ave);,1C语言基础,机电系统控制电路设计,14,2019/12/15,关于语句:数据类型定义语句,语句形式变量类型关键字变量名;floatr,s;定义r、s为单精度实型变量intr,s;定义r、s为整型变量【注意】在C语言程序中,所有变量都要先定义后使用,否则就会出现编译错误提示,如:Error:UndefinedsymbolainfunctionmainLetstry,变量类型关键字字符型(描述文字性的数据)char数值型:整型(在机内是准确表示的)int实型(在机内一般是近似表示的)float(有效数字6位)double(有效数字16位),变量名C语言标识符(变量名、符号常量名、函数名等)命名:组成:字母、数字、下划线开头:字母、下划线长度:32字符【注意】大小写为不同字符(变量名一般小写,符号常量名一般大写),还要注意不得与关键字同名。,1C语言基础,机电系统控制电路设计,15,2019/12/15,关于语句:赋值语句,作用:使变量获得具体的运算值。语句形式变量名=表达式(常量、变量、函数、算式及其混合);r=1.0;/*变量r赋初值*/s=PI*pow(r,2);/*计算圆面积s*/变量赋初值亦可在数据类型定义时进行:floatr=1.0,s;把变量声明语句与赋值结合在一起的语句,术语上称为“初始化语句”。,1C语言基础,机电系统控制电路设计,16,2019/12/15,关于语句:输出语句,作用:将运算结果送到显示器屏幕显示出来语句形式printf();printf(半径R=%f时,面积S=%fn,r,s);printf(“Hello,everyone!”);【注意】C语言本身没有输入、输出语句,其功能要借用有关函数来实现。%f格式字符串n控制字符(转义字符)n表示回车换行引号中的其他部分照原样输出,1C语言基础,机电系统控制电路设计,17,2019/12/15,关于格式字符串,表示该处将用printf语句引号外对应表达式的值替换后输出例:若r=1,s=3.14printf(“半径R=%f时,面积S=%fn”,r,s);输出结果:半径R=1时,面积S=3.140000常用格式字符串:字符型:%c单字符%s字符串数值型:%d整数(十进制)%f实数(小数形式,默认为6位小数),例一intx=5;floaty=3;printf(a=%d,b=%f,c=%s,x,y,abcdefg);,输出结果:a=5,b=3.000000,c=abcdefg,例二intx=5;floaty=3;printf(a=%d,b=%f,c=%s,x+2,y*3,123defg);,输出结果:a=7,b=9.000000,c=123defg,1C语言基础,机电系统控制电路设计,18,2019/12/15,C语言程序的基本结构,一个C程序是由一个固定名称为main的主函数和若干个其他函数(可缺省)组成。其基本结构一般形式如右图所示。,1C语言基础,返回,机电系统控制电路设计,19,2019/12/15,2数据类型、运算符和表达式,机电系统控制电路设计,20,2019/12/15,2数据类型、运算符和表达式,机电系统控制电路设计,21,2019/12/15,2数据类型、运算符和表达式,可知对不同数据类型占用的存储空间:charshort=intlong=float=!=关系表达式:含有关系运算符的表达式特别注意aXb之类算式的正确写法:a5)printf(“m5”);elseprintf(“m=%d”,m-);printf(“m=%d”,m-);,运算结果:m5,机电系统控制电路设计,27,2019/12/15,2数据类型、运算符和表达式,运算符,逻辑运算(m=ab),运行结果:n=2,【例二】main()inta=1,b=2,m=2,n=2;(m=ba),运行结果:n=3,原因:在printf(“Inputx=”);scanf(“%d”,结果:x=3,y=1x=0,y=0 x=-5,y=-1,机电系统控制电路设计,29,2019/12/15,2数据类型、运算符和表达式,运算符,位操作运算符x=180;if(xy)/交换x和yz=x;x=y;y=z;rintf(x=%d,y=%dn,x,y);,#includemain()intx,y=100,z=0;x=180;if(x0,if语句,机电系统控制电路设计,35,2019/12/15,3程序控制语句,条件控制语句,switch语句,switch(变量或表达式P)case常量表达式C1:程序段S1break;case常量表达式C2:程序段S2break;.case常量表达式Cn:程序段Snbreak;default:程序段Sn+1break;,机电系统控制电路设计,36,2019/12/15,#includemain()charch;printf(inputthemark(A,B,C,D,EorF);scanf(%c,3程序控制语句,条件控制语句,switch语句,运行结果:inputthemark(A,B,C,D,EorF)D70,机电系统控制电路设计,37,2019/12/15,break子句可以省略,但是否省略break子句,要根据算法的逻辑而定。因为没有了break语句,switch语句会被执行到语句结束。,3程序控制语句,条件控制语句,switch语句,charch=N;switch(ch)caseY:printf(Yesn);break;caseN:printf(Non);break;caseA:printf(Alln);break;,charch=N;switch(ch)caseY:printf(Yesn);break;caseN:printf(Non);caseA:printf(Alln);break;,输出:No,输出:NoAll,机电系统控制电路设计,38,2019/12/15,3程序控制语句,循环控制语句,while语句,while语句的形式:while(表达式P)程序段S,inta;longsum;/sumshouldbelongtypesum=0;a=1;while(a=100)sum+=a;a+;printf(1+2+.+%d=%ldn,100,sum);,while语句的例子:计算1+2+3+100的值,通常情况下,程序中会利用一个变量来控制while语句的表达式P的值,这个变量被称为循环控制变量。在执行while语句之前,循环控制变量必须初始化,否则执行的结果将是不可预知的。上面的程序重新编写,其运行结果将是不可预知的,因为a未初始化:,inta;longsum;/sumshouldbelongtypesum=0;/ashouldbeinitializedherewhile(a=100)sum+=a;a+;printf(1+2+.+%d=%ldn,100,sum);,机电系统控制电路设计,39,2019/12/15,3程序控制语句,循环控制语句,while语句,有关while语句的几点说明,1、要在while语句的某处(表达式P或循环体内)改变循环控制变量的值,否则极易构成死循环。下面的while语句便是死循环:,x=2;while(x100)break;sum+=a;a+;,机电系统控制电路设计,41,2019/12/15,3程序控制语句,循环控制语句,while语句,有关while语句的几点说明,3、如果在执行循环体过程中,遇到了continue语句,则循环体中continue语句后面的其他语句将被跳过,而直接进入下一轮循环。,a=1;while(a=10)printf(%d,a);a+;if(a%5=1)continue;printf(*);,运行结果:12*3*4*5*67*8*9*10,机电系统控制电路设计,42,2019/12/15,3程序控制语句,循环控制语句,do-while语句,do-while语句的形式:do程序段Swhile(表达式P);,do-while语句的例子:计算1+2+3+100的值,inta;longsum;sum=0;a=1;dosum+=a;a+;while(a=100);printf(1+2+.+%d=%ldn,100,sum);,do-while语句与while语句大体相同,但要特别注意,while()后面的分号不要漏掉。此外,while语句的循环体可能永远不被执行,但do-while语句的循环体至少被执行一次。,机电系统控制电路设计,43,2019/12/15,3程序控制语句,循环控制语句,for语句,for语句的形式:必须是分号必须是分号for(表达式1;表达式2;表达式3)程序段S,机电系统控制电路设计,44,2019/12/15,3程序控制语句,循环控制语句,for语句,inta;longsum;sum=0;for(a=1;a(b)?(a):(b)intmain()intx=3,y=4,i=5,j=6,s,z;s=S1(x+y,x-y);/*s=x+y*x-y;s=11*/s=S2(x+y,x-y);/*s=(x+y)*(x-y);s=-7*/z=max(i+,j+);/*z=(i+)(j+)?(i+):(j+);*/*z=7,i=6,j=8*/,机电系统控制电路设计,74,2019/12/15,5编译预处理,文件包含,一般形式#includefilename#include说明把另一个源文件的全部内容包含进来预编译后,它们已成为一个文件头文件的扩展名一般用.h,但并非规定调用库函数一般使用,也可以使用调用用户编写的头文件应使用,机电系统控制电路设计,75,2019/12/15,条件编译,5编译预处理,条件编译对某些部分的源程序指定编译的条件可以减少被编译的语句,减少目标程序的长度,减少运行时间有利于移植程序,增加程序的灵活性命令形式#ifdef.#else.#endif#ifndef.#else.#endif#if.#else.#endif,机电系统控制电路设计,76,2019/12/15,如果标识符被定义过*如果标识符未被定义过#ifdef标识符#ifndef标识符程序段1程序段1/*编译此程序段*/#else#else/*#else部分可省略*/程序段2程序段2/*反之,编译此程序段*/#endif#endif*此处指标识符用#define等命令定义过。,条件编译,5编译预处理,#if表达式/*如果表达式为真*/程序段1/*编译程序段1*/#else程序段2/否则*编译程序段2*/#endif,机电系统控制电路设计,77,2019/12/15,5编译预处理,#defineDEBUG0main()inta=10,b=20,c;clrscr();c=a/b;#ifdefDEBUGprintf(a=%d,b=%dn,a,b);#endifprintf(c=%dn,c);,条件编译,结果:a=10,b=20c=0,如果没有#define行呢?,只输出c=0,返回,2019/12/15,78,6数组及指针,C语言可以根据用户需要,用基本数据类型定义特殊性质的数据类型,称为构造类型。构造类型有:数组、结构体、共同体。数组:相同数据类型变量的有序集合。有序表现在数组元数在内存中连续存放。数组用一个名字作为标识。为区分各元素,每个元素有一个用整型表示的序号,称之为下标。下标可以有多个,下标的个数称为数组的维数。,机电系统控制电路设计,2019/12/15,79,6数组及指针,1.一维数组的定义,typearray1常量表达式,arrayn常量表达式;,类型说明符,说明数组的类型。,数组名,用标识符命名。,数组的元素的个数,数组的下标从0变化到常量达式的值减一。,例:inta5;floatb20,c15;,机电系统控制电路设计,2019/12/15,80,6数组及指针,一维数组定义的几点说明:数组名命名规则和变量名相同,遵循标识符定名规则。数组名后是用方括弧括起来的常量表达式,不能用圆括弧.如:inta(10);ERROR!常量表达式表示元素的个数,即数组长度。如:a10有10个元素分别为:a0,a1,a2,a3,a4,a5,a6,a7,a8,a9;注意不能使用数组元素a10。常量表达式中可以包括常量和符号常量,不能包含变量。也就是说,C语言不允许对数组的大小作动态定义。例如,下面这样定义数组是不行的:intn;scanf(%d,ERROR!,机电系统控制电路设计,2019/12/15,81,6数组及指针,一维数组,2.一维数组的引用,原则:只能引用数组元素,而不能引用整个数组。引用方式:数组名下标下标可以是整型常量或整型表达式。每个数组元素,可以出现在简单变量能够出现的任何地方。,例:main()inti,a10;for(i0;i9;i+)aii;for(i9;i0;i-)printf(%d,ai);,机电系统控制电路设计,2019/12/15,82,6数组及指针,一维数组,3.一维数组的初始化,对数组元素的初始化可以用以下方法实现:在定义数组时对数组元素赋以初值。例如inta10=0,1,2,3,4,5,6,7,8,9;只给一部分元素赋值。例如inta100,1,2,3,4;这表示只给前面5个元素赋初值,后5个元素值为0。使一个数组中全部元素值为0inta10=0,0,0,0,0,0,0,0,0,0;或inta10=0;不能写成:inta10=0*10;,机电系统控制电路设计,2019/12/15,83,6数组及指针,一维数组,3.一维数组的初始化,在对全部数组元素赋初值时,可以不指定数组长度。例如:inta5=1,2,3,4,5;可以写成:inta1,2,3,4,5;如想定义数组长度为10,就不能省略数组长度的定义,而必须写成:inta101,2,3,4,5;只初始化前5个元素,后5个元素为0。,机电系统控制电路设计,2019/12/15,84,例:输入10个整数,分别按顺序和逆序输出。,#includemain()inti;staticinta10;printf(input10numbers:n);for(i=0;i=0;i-)printf(%d,ai);,程序的运行情况:input10numbers:123456789101234567891010987654321,机电系统控制电路设计,2019/12/15,85,6数组及指针,二维数组,1.二维数组的定义,定义方式:类型数组名表达式1表达式2;,例:floata34,b510;不能写成floata3,4,b5,10;,机电系统控制电路设计,2019/12/15,86,说明:二维数组可看作特殊的一维数组;元素在内存排列顺序为按行存放;多维数组定义亦类似于二维数组如:floata234;,1.二维数组的定义,6数组及指针,二维数组,a00a01a02a10a11a12,例:inta23;它的存储情况:按行存放,机电系统控制电路设计,2019/12/15,87,注意理解二维数组:把二维数组看作是一种特殊的一维数组:它的元素又是一个一维数组。例如,可以把a34看作是一个一维数组,它有3个元素,每个元素又是一个包含4个元素的一维数组:a0a00a01a02a03a1a10a11a12a13a2a20a21a22a23上面定义的二维数组可以理解为定义了三个一维数组,即相当于f1oata04,a14,a24此处把a0,a1,a2看作一维数组名。c语言的这种处理方法在数组初始化和用指针表示时显得很方便,这在以后会介绍。,机电系统控制电路设计,2019/12/15,88,2.二维数组的引用,6数组及指针,二维数组,数组名行下标列下标;如:a23,数组元素可出现在表达式中,也可被赋值如:a12=a02/2。注意:下标值应在已定义的数组大小的范围内。如:a23错了,其最大下标为1和2。,机电系统控制电路设计,2019/12/15,89,3.二维数组的初始化,6数组及指针,二维数组,1)分行初始化。如:staticinta34=1,2,3,4,5,6,7,8,9,10,11,12;,2)按数组排列的顺序将所有数据写在一个花括号内。如:staticinta34=1,2,3,4,5,6,7,8,9,10,11,12;,3)部分元素初始化。如:staticinta34=1,0,6,0,0,11;,4)如果对全部元素都赋初值,则定义数组时可以不指定第一维的长度。如:staticinta4=1,2,3,4,5,6,7,8,9,10,11,12;,机电系统控制电路设计,2019/12/15,90,6数组及指针,字符数组,C语言没有字符串变量,可以定义字符数组,每个元素存放一个字符,从而达到存放字符串的目的。,字符数组的定义,char数组名下标;chara10,b212;,字符数组的初始化,一维数组赋初值:用单个字符对每一个元数赋值。,charstr15=h,e,l,l,o;,把5个字符分别赋给str10str4这5个元素,机电系统控制电路设计,2019/12/15,91,注意:如果花括弧中提供的初值个数(即字符个数)大于数组长度,则作语法错误处理。如:charstr14=h,e,l,l,o;ERROR!如果初值个数小于数组长度,则只将这些字符赋给数组中前面那些元素,其余的元素自动为空字符(即0)。charstr110=h,e,l,l,o;如果初值个数与预定的数组长度相同,在定义时可以省略数组的长度,系统会自动根据初值个数确定数组长度。charstr1=h,e,l,l,o;等价于:charstr15=h,e,l,l,o;,Str1在内存中的存放形式:,注:一般情况下,说明数组时,长度指定应至少比实际长度大1,保证赋初值正确。,机电系统控制电路设计,2019/12/15,92,6数组及指针,字符数组,二维数组赋初值,二维数组的每一行可以存放一个字符串。charstr36=w,a,n,g,z,h,a,n,g,l,i,u;,str数组在内存中存储形式,机电系统控制电路设计,2019/12/15,93,6数组及指针,字符数组,3.字符数组的引用,可以引用字符数组中的一个元素,得到一个字符。例:输出一个钻石图形。,main()chardiamond5=,*,*,*,*,*,*,*,*;inti,j;for(i=0;i5;i+)for(j0;j5;j+)printf(%c,diamondij);printf(n);,*,机电系统控制电路设计,2019/12/15,94,4.字符串和字符串结束标志,在C语言中,将字符串作为字符数组来处理。有效字符串的长度:为测定字符串的实际长度,C语言有一个“字符串结束标志”(0)。例:有一个字符串,其第10个字符为0,则此字符串的有效字符为9个。系统对字符串常量也自动加一个0作为结束符。在定义字符数组时应估计实际字符串长度,使数组长度始终保证大于字符串实际长度。charstr16=h,e,l,l,o;系统对字符串常

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论