单片机学习资料_第1页
单片机学习资料_第2页
单片机学习资料_第3页
单片机学习资料_第4页
单片机学习资料_第5页
已阅读5页,还剩47页未读 继续免费阅读

下载本文档

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

文档简介

1、三 C语言基础知识C语言:C语言是目前最流行的、也是最优秀的一种高级程序设计语言。它于1972年在美国的贝尔实验室问世,后来历经发展和完善。它不仅具有高级语言的易学、易用、可移植性强等优点,而且具有低级语言的执行效率高、可对硬件直接进行操作等优点。31 概述今天,计算机已经渗入到我们日常生活的各个方面,它的无所不能为它蒙上了一层神秘的面纱。很多人叫它“电脑”,难道它真的比我们人脑聪明吗?这显然是不可能的!实际上计算机的一切功能都是人所赋予的。它所能完成的工作以及怎样去完成也是人所指定的,确切地说计算机与电视机、VCD一样,都是供我们使用的一种工具,它完全由我们人所控制。要使计算机完成我们想要它

2、做的工作,摸门必须懂得和计算机进行交流的语言。也许你会说:我不懂得和计算机交流的语言,但我仍然能利用计算机完成许多工作。,但是你知道吗?完成这些工作所使用的软件就是人们利用计算机语言所编写出来的程序。什么叫程序?从广义上来说,程序就是完成某项工作所要经过的步骤和方法。如我们平常在家里炒菜就是按洗菜生火加作料翻炒装盘等步骤一步一步进行的。计算机程序就是人们为了让计算机完成某项工作而事先用特定的程序设计语言所编写的控制指令或语句的集合。这些控制指令或语句,将告诉计算机“做什么”和“怎样做”。程序设计语言经历了从机器语言、汇编语言到高级语言这样一个发展过程。我们将要学习的C语言属于高级语言。但是由于

3、C语言同时具有一些低级语言的特性,所以许多人又把C语言称为中级语言。下面分别简单介绍这3几种程序设计语言。1机器语言在计算机刚诞生的时候,人们还没有发明一种工具可以用来比较方便地指挥计算机工作,计算机程序是直接用计算机能识别的二进制指令来书写的。这种程序设计语言就是机器语言。机器语言是直接对计算机硬件产生作用的,所以不同型号的计算机的“机器语言”不一样,这使得“机器语言”很难被人掌握和推广,一般只有少数计算机专家或专业技术人员使用。2汇编语言汇编语言实际上是一种符号化的机器语言。在汇编语言中,每一条机器指令对应一个符号化的指令。比如,在机器语言中,二进制代表加法运算,那么可以用英文单词ADD来

4、代替。一个有意义的英文单词显然比一长串二进制数要简洁、直观且好记多,因此,汇编语言相对于机器语言来说,容易学习和掌握。不过,用汇编语言编写的程序必须经过专门的编译软件将它要翻译成机器语言后才能被计算机执行。3高级语言由于汇编语言和机器语言都是面向机器的语言,而且在程序的书写形式上很难直观地反映出程序设计者的思路,因此人们发明了与人类的自然语言非常接近的高级程序设计语言。高级语言不仅易学、易用,而且写出的程序更加简练,同一个程序还可以用在不同型号的机器上。比如说,我们要求两个数的和,在高级语言中可以用一个很简单的语句C=A+B;来表示,但在汇编或者机器语言中,这可能就是几条甚至几十条机器指令构成

5、的一个程序段,在不同型号的机器上构成这个程序段的机器指令不同,而且除非程序设计者告诉您这是一个实现加法的程序,常人要读懂它也不是那么容易。同样,用高级语言编写的程序不能直接被计算机理解和执行,而必须先由这种语言的编译程序或者解释程序翻译成机器指令,然后再让计算机执行机器指令。32 计算机中的数据常用的计算机,确切地说是电子数字计算机。为什么叫电子数字计算机呢?这是因为它的内部是一个数字信息世界:空间地址是数字化;语言是数字化;信息流动是数字化;运算及各种逻辑判断是数字化;整体管理和控制是数字化;与外部交换信息也是数字化;下面我们介绍一下常用计数的方法,即数制。一、数制数制就是计数的方法和规则。

6、常用的计数的方法用十进制、和二进制及十六进制三种。1十进制十进制就是利用0、1、29这十个数码,而且逢十进一的计数方法。在日常生活中,我们常用十进制进行计数。2二进制即利用0和1两个数码,逢二进一的计数方法。二进制是最简单的计数法,而且对应于具有两个稳态电子器件的两种状态,因此计算机中常用二进制进行计数。3十六进制就是利用0、1、2、9和A、B、C、D、E、F这十六个数码,逢十六进一的计数方法。由于二进制位数太多,不便于书写和记忆,因此,在编写程序时我们通常使用十六进制。为了区分上述三种计数方法,我们通常用带下标D(Decimal)的数表示二进制数、用带下标B(Binary)的数表示十进制数和

7、带下标H(Hexadecimal)表示十六进制,如:1111B、13D、2AF。二、二进制、十进制和十六进制的对应关系015数码的二进制、十进制和十六进制的对应关系见表31。表31 二进制、十进制和十六进制的对应关系二进制(B)十进制十六进权值8(23)4(22)2(21)1(20)000000000111001022001133010044010155011066011177100088100199101010A101111B110012C110113D111014E111115F由表31可知:4位二进制数可以表达十进制数015,共十六个数。当十进制数超过15时,其二进制数向前进一位,变成0

8、000B。进上去的1为溢出位。三、数的转换同一个数采用不同的计数方法,其表示形式不同。例如:十进制的10,用二进制表示为1010,而用十六进制表示为A。这种在不同数制之间表达形式的转换,称为数的转换。用理论方法进行数的转换,我们不多讲,有兴趣的同学可以参考有关这方面的书籍。这里我们以将十进制的180转换为相应的二进制和十六进制为例子,介绍一种简单又直观的转换方法科学计算器转换法。其操作步骤如下:第一步:如图31所示,点击桌面左下角的按钮,在弹出的开始菜单中依次选中程序/附件/计算器,打开电脑自带的计算器,如图32。图31图32第二步:如图33所示,单击主菜单,在弹出的下拉菜单中单击选中菜单项,

9、弹出科学型计算器窗口,如图34:图33图34 第三步:将光标移动到前的小圆圈中,单击选中十进制项,这是计算器窗口变为图35所示:图35 第四步:将十进制数180键入到科学计算器中,如图36:图36 第五步:将光标移动到前的小圆圈中点击选中二进制项,这时计算器所显示的数就是我们转换所得到的二进制数(),如图37:图37用相同的方法,我们可以求得它用十六进制表示的数(B4),如图38。图38熟记015数码在十进制、二进制和十六进制之间的转换,可以提高在编写程序时进行数的转换的效率。记忆上述数码的数的转换有一定的技巧,那就是抓住其二进制相应位的权值。下面我们以0110B和7D为例,说明这个技巧的应用

10、。0110B的转换:7D的转换:四、有关位、字节、字和字长的概念1位(Bit)表示一个二进制数码0或1,是计算机存储处理信息的最基本的单位。通常把1024个为称为1K。2字节(Byte)相临的8个二进制位称为1个字节。字节表示计算机一个完整的处理单位是8位二进制数。在微型计算机中,通常用多少字节来表示存储器的存储容量。3字(Word)表示计算机进行数据存储和数据处理的运算单位。换句话来说就是计算机对数据进行处理或存储是以字为单位进行的。4字长表示一个字所包含二进制位数的多少。计算机处理数据的速率,和它一次能处理字的字长以及进行运算的快慢有关。一般地,大型计算机的字长为3264位,小型计算机的字

11、长为1232位,而微型计算机字长为4一16位。字长是衡量计算机性能的一个重要因素。33 结构化设计一、算法和流程图在学习结构化设计之前,我们先来了解算法和流程图概念。1什么是算法所谓算法,就是为了解决一个特定问题而采取的确定的有限的步骤。我们编写程序主要就是编制计算机各种操作步骤,这一过程叫做算法设计。2流程图流程图是描述算法的工具。下面介绍这种常用的流程图符号。用流程图表示算法的优点是:用图形来表示流程,形象直观,各种操作一目了然,而且不会产生“歧义性”。因此,流程图成为描述算法的标准工具。二、结构化程序设计最早的程序设计是没有什么方法可言的,人们编写程序基本上是想到什么就写什么。这种程序曾

12、导致60年代美国登月计划的失败和IBM公司投资上千万美元的软件开发计划的流产等严重事件。因此,寻找一种科学的程序设计方法就十分必要了。经过广大计算机科学家和软件专家多年的研究和尝试,在60年代末,一种被称为“结构化程序设计方法”诞生了。结构化程序设计的要求如下:所编写的程序思路清晰、可读性强;程序设计者必须按一定规范编写程序,而不能随心所欲地设计程序;程序设计应当采取“自上而下,逐步细化和模块化”的方法进行。也就是在程序设计过程中首先将一个大任务分成若干个子任务,。如果子任务还是太复杂,就再将它分解成若干个更简单的子任务,如此逐层分解,逐步细化。每个子任务就是一个模块。结构化程序设计方法规定了

13、顺序结构、选择结构和循环结构等几种具有良好特性的“基本结构”,用它们作为构成程序的基本单元。这些基本结构具有只有一个入口和一个出口、没有永远执行不到的语句和没有死循环的特点。三、顺序结构顺序结构是我们最常用的一种程序结构,它的特点是:程序按语句排列顺序从上到下依次执行,每条语句必须执行且只能执行一次,没有执行不到或执行多次的语句。例如:如图31,已知一个圆柱体的半径R为6,高H为7,求圆柱体的体积V。 图39解决该问题的流程图为:由上述流程图所编写的程序如下:#include#define PI 3.14159void main() int R,H; float S,V; R=6; V=7;

14、S=PI*R*R; V=S*H; Printf(“圆柱体的体积为:%f”,V);四、选择结构通过学习顺序结构程序设计。你也许已经意识到了:顺序结构的程序能解决的问题是相当少的。举个简单的例子:美国IBM公司的“深蓝”计算机击败了国际象棋世界冠军卡斯帕罗夫。我们知道棋局上的情况是千变万化的,如果“深蓝”只能理解顺序结构的程序,而不能针对棋局上不同的情况作出不同反应,那么它是不可能取胜的。“世事如棋局”,我们所遇到的实际问题也是千差万别的。那么如何让计算机程序来解决这些复杂的问题呢?这就要用到我们马上要学习的选择结构。选择结构的特点是:程序的流程是由多条支路构成的,在程序的一次执行过程中,根据不同

15、的情况,只有一条支路被选中执行,而其它支路上的语句被直接跳过。在C语言中,提供了if和switch两种语句来实现选择结构。(一)最基本的if语句1最基本的if语句的流程图:如图310图310在程序执行过程中首先判断表达式的值,如果表达式的值为真,则执行下面的语句或语句组;如果表达式的值为假,则直接跳过语句或语句组,接着执行后面的其它语句。2最基本的if语句的书写格式 最基本的if语句的书写格式为:if(表达式) 语句;或if(表达式) 语句; 语句; 3复合语句的概念复合语句是由一对花括号包围起来的一条或多条语句。复合语句的书写格式: 语句1; 语句2; 语句3; 虽然复合语句是由花括号内的多

16、条语句构成,但在逻辑上我们把复合语句看成是一条语句。对于复合语句我们要注意:包围复合语句的两个花括号不能缺省的。例:求实数x的绝对值#includevoid main() float x,y; printf(“请输入x的值:”); scanf(“%f”,&x); if(x=0) y=x; if(x0) y=-x; printf(“x的绝对值为:%f”,y);(二)if else语句对于这样一句话“如果x0,则y=x;如果x0,则y=x”可以写出:if(x0) y=x;if(x0) y=x;在这里使用了两条最基本的if语句,对条件“x0和x0”分别进行测试。实际上,当程序测试出“x0”为真后,就

17、意味着“x0”为假;或者测试出“x0”为假后,就意味着“x0”为真,因此没有必要对两个条件都进行测试。这两条语句联系起来实现了一功能,即求数的绝对值,正数或零的绝对值是它本身,负数的绝对值是它的相反数。能不能把这两条语句合成一条?可以的,这就是我们接着要讲的if else语句。1if else语句的流程图:如图311图311在程序执行过程中首先判断表达式的值,如果表达式的值为真,则执行的语句1;如果表达式的值为假,则执行的语句2。2if else语句的书写格式 if else语句的书写格式为:if(表达式) 语句1;else 语句2;注意:如果使用了复合语句,一定要用花括号把它们括起来。例:用

18、if else编写“求实数x的绝对值”程序#includevoid main() float x,y; printf(“请输入x的值:”); scanf(“%f”,&x); if(x=0) y=x; else y=-x; printf(“x的绝对值为:%f”,y);由上面的例程进一步说明了:简单的if语句只能表达“如果那么”的含义;而if else语句却能表达“如果那么否则”的含义。(三)ifelse if语句实际工作中,我们常常面临多种选择的问题。如何解决这种多种选择的问题呢?我们只要把if else语句结构扩展一下,增加else if就行了。下面我们学习有关ifelse if语句的知识。1

19、ifelse if语句的流程图:如图312图312如果表示式1为真,那么就执行语句1,否则,如果表达式2为真,那么就执行语句2。表达式3和语句3也是这样。如果以上三个条件都不符合,则执行语句4。2ifelse if语句的书写格式 ifelse if语句的书写格式为:if(表达式1) 语句1;else if(表达式2) 语句2;else if(表达式3) 语句3;else 语句4;(四)else与if的匹配问题由前面的学习我们知道:在if语句中往往有多个if和多个else,这些else与if之间有什么样的匹配关系呢?一般来说,每一个if可能与一个else相匹配,也可能不与else相匹配;但每一个

20、else都必须与一个if相匹配。else与if的匹配规则是:else总是与它上面最近的if配对,除非用花括号表示出它的选择。下面我们详细讲述这个问题。if(n6) if(n6) if(n12)printf(“n大于6且小于12n);else printf(“n大于等于12n”);(五)switch语句当程序面临多从选择时,ifelse if语句能够满足需要,但在大多数情况下使用switch语句更方便,而且在程序书写结构上更容易让人理解。1switch语句的流程图:如图313图313它的工作过程是:首先计算switch语句括号中的表达式,然后往下搜索case标号,当表达式的值与某case标号后的

21、常量表达式i的值相等时,程序从该case语句后的语句序列i开始往下顺序执行。一般情况下,程序将一直执行到语句序列n和语句序列n+1。当程序在这个执行过程中遇到了break语句,则程序将在此处跳出switch结构。如果表达式的值与所有case标号的值都不相等,这时有两种情况:一、若switch结构中有defaut标号,则程序跳到defaut标号后的执行语句序列n+1;二;如果switch结构中没有defaut标号,则程序直接跳出switch结构。2switch语句的书写格式 switch语句的书写格式为:switch(表达式)case常量表达式1:语句序列1break;case常量表达式2:语句

22、序列2break;case常量表达式3:语句序列3break;default; 语句序列4五、循环结构在C语言中,循环结构是由while语句、dowhile语句或for语句来实现的。为了更方便地控制程序流程,C语言还提供了两个循环辅助语句:break和continue语句。(一)while语句1while语句的流程图:如图314图314它的工作过程是:首先计算括号中的表达式,如果表达式的值为真,则执行下面的循环体。当循环体中的语句执行完毕后,返回while处,重新计算表达式。如果表达式的值仍然为真,则继续执行循环体;否则,退出由表达式和循环体构成的循环结构,执行下面其它语句。2while语句的

23、书写格式 while语句的书写格式为:while(表达式)语句;例:求1+2+3+100的和3循环结构的基本术语:循环条件:是循环结构中的测试表达式。如源程序中的while(i=100)。循环体:是在每个循环周期均要执行一次的语句序列。如源程序中while语句下面用花括号括起来的复合语句。循环控制变量:是在循环条件中控制条件是真是假的变量。如源程序中的变量i。要写出一个正确的循环结构,对控制变量要做以下三方面的工作:一是控制变量赋初值;二是把控制变量写入正确的循环条件;三是控制变量的更新、调整。(二)do while语句while语句表达的是“当满足条件时,一直做某事”;而do while语句

24、表达的是“一直做某事,直到不满足条件为止”。1do while语句的流程图:如图315图315do while语句的工作过程是:首先执行do下面的语句,开始了第一个循环周期。如果表达式为真,则返回do语句处,继续执行循环体。如果表达式为假,则退出do和while构成的循环圈,执行while语句下面的语句。另外从流程图可以看出:不管开始的时候测试条件是真是假,do while循环体都要执行一次,因为循环体是先于测试条件执行的。这是do while循环与while循环的主要区别。因此,do while循环常用在需要至少执行一次循环体的地方。2do while语句的书写格式do while语句的书写

25、格式为:do 语句;while(表达式);(三)for语句前面已经提到,要正确表达循环结构应注意三方面的问题:控制变量的初始化、循环的条件和控制变量的值的更新。for语句在书写形式上正好体现了这种紧密的逻辑关系。1for语句的流程图:如图316图316for语句的工作过程是:首先计算表达式1,然后计算表达式2,如果表达式2的值为真,则执行循环体,否则,退出for循环,执行for循环下面的语句。如果执行了循环体,则执行完毕后,将计算表达式3,然后重新计算表达式2。依此循环,直至表达式2的值为假,退出循环。2for语句的书写格式for语句的书写格式为:for(表达式1;表达式2;表达式3)语句;(

26、四)while、do while、for语句的选用同一个问题,我们可以用while语句来解决,也可以用do while语句或者for语句来解决。但在实际应用中,要根据具体情况来选用不同的循环语句。选用的一般原则如下:如果循环次数在执行循环体之前就已经确定,一般用for语句;如果循环次数是根据循环体的执行情况确定的,一般用while语句或者do while语句。当循环体至少要执行一次时,用do while语句;反之,如果循环体可能一次也不执行,用while语句。六、缩排缩排是在编写程序时使一条语句相对于上一条语句退后若干个字符位置的一种书写格式。缩排就象写文章,每一段落开始处都要空两格。缩排的目

27、的就是为了使源程序的层次清晰,从而增加源程序的可读性。注意:良好的源程序书写风格,无论是对程序的作者还是读者,都是十分有好处的。34 基本符号、标识符和保留字一、基本符号由图317所示汉语语言首先由字构成词,再由词构成句。汉字是汉语语言最基本的组成单位。同样,C语言程序也是由最基本组成单位基本字符组合而成的图317C语言的基本符号126个英文字母(C语言中字母的大、小写是有区别的);210个阿拉伯数字(09);3其它特殊符号,以运算符为主(+、*、/、=、!等)。注意:汉字不是C语言的基本符号。二、标识符在大千世界中,有各种各样的人,如果都没有名字,肯定会带来许多不便,有了名字就可以对他们进行

28、区分。同样,在C语言中有大量的变量、数组、函数,为了能区分它们,是不是应该为它们取上名字呢?当然得取名字。在C语言中各种变量名,数组名、函数名和其它由用户自定义的数据类型名,统称为标识符。我们知道了什么是标识符,那么标识符该怎么写呢?是不是可以随意给变量或数组命名呢?我们必须严格按照以下三条规则书写标识符。1标识符只能由英文字母、数字和下划线构成。其它符号,如+、汉字不能用在标识符,如:Zhang+san。2标识符必须以字母或下划线开头。也就是说用数字打头的标识符都是错误的,如:9Apple.。3标识符不能与保留字相同,如:int。三、保留字保留字又称为关键字,是具有固定名称和含义的特殊标识符

29、。表32列出了ANSI C的32个保留字表32 ANSI C的32个保留字关键字用 途说 明auto存储种类声明用来声明局部变量(默认值为此值)break程序语句退出最内层循环体case程序语句Switch语句中的选择项char数据类型声明字符型数据或单字节整数型const存储类型声明在程序执行过程中不可修改的变量值continue程序语句退出本次循环,转向下一次循环defaut程序语句Switch语句中的失败选择项do程序语句构成dowhile循环结构double数据类型说明双精度浮点数else程序语句构成ifelse选择结构enum数据类型说明枚举型extern存储类型声明在其他程序模块中

30、声明了的全局变量float数据类型说明单精度浮点数for程序语句构成for循环goto程序语句构成goto循环if程序语句构成ifelse选择结构int数据类型说明基本整型数long数据类型说明长整型数register存储类型声明使用CPU内部的寄存器的变量return程序语句函数返回short数据类型说明短整型数signed数据类型说明有符号数sizeof运算符计算表达式或数据类型的字节数static存储类型声明静态变量struct数据类型说明结构类型数据switch程序语句构成switch选择结构typedef数据类型说明重新进行数据类型定义union数据类型说明联合类型数据unsigne

31、d数据类型说明无符号类型数据void数据类型说明无类型数据volatile数据类型说明声明该变量在程序执行过程中可被隐含while程序语句构成whil或dowhile循环语句ICCAVR编译器除支持ANSI C标准的有关规定外,还根据AVR单片机的自身特点扩展了表33的保留字及汇编伪指令。表33 AVR扩展的保留字及汇编伪指令关键字用 途说 明pragma编译附注声明编译附注/注释const存储类型声明对ANSI C中的const的功能进行扩充task函数类型说明Pragma task合用,说明生成的函数不必保存和恢复寄存器itterupt函数类型说明Pragmainterrupt handl

32、er合用,说明函数为中断函数vector中断向量说明在汇编语句中说明中断向量eeprom存储类型声明AVR单片机中的EEPROMdata存储类型声明AVR单片机中的SRAMtext存储类型声明AVR单片机中的FLASHglobl数据类型说明定义一个全局符号asm程序类型说明汇编程序类型abs代码定位方式声明汇编中绝对定位区域(伪指令)rel代码定位方式声明汇编中重定位区域(伪指令)con代码定位方式声明汇编中连接定位区域(伪指令)ovr代码定位方式声明汇编中覆盖定位区域(伪指令)byte定义常数汇编中表示字节常数(伪指令)word定义常数汇编中表示字常数(伪指令)long定义常数汇编中表示双字

33、常数(伪指令)blkw定义常数汇编中表示保留字节空间而不赋值(伪指令)blkl定义常数汇编中表示保留双字空间而不赋值(伪指令)35 C语言的源程序结构C语言的源程序由一个或多个函数组成,每个函数完成一种指定的功能,所以有人又把C语言称为函数语言。下面我们通过对三个C语言源程序的学习,进一步总结出C语言源程序的结构特点。实例一main() printf(”hello world!n”);C程序由一系列函数组成,这些函数中有且只能有一个以main为名的函数,这个函数称为主函数,整个程序从主函数开始执行。在此例程中,只有一个主函数main()而无其它函数。程序第一行中的main是主函数的函数名,ma

34、in后面的一对小括号是函数的标志,不能省略。第三行的printf是C语言的格式输出函数,它在屏幕上显示出括号内双引号之间的字符串,其中“n”代表换行符。注意第三行末尾的分号,它是一个语句结束的标志。第二行和第四行是一对花括号,分别表示函数体的开始和结束。实例二main() int a,b,sum; /*定义三个变量*/ a=1;b=2; /*把1赋值给变量a,把2赋值给变量b */ sum=a+b; /*求a与b的和,并把结果放入变量sum中*/ printf(”sum=%dn”,sum); /*输出变量sum的值*/这个程序由一个主函数组成。第三行中的int表示定义变量类型为整形,该行定义了

35、三个整形变量,即a、b和sum。第四行是两个赋值语句,其中“=”是赋值运算符。第六行中的“%d”是输入输出函数中的“格式字符串”,在这里表示以“十进制整数”的形式输出变量sum的值。程序的运行结果,“%d”的位置被sum的值取代。程序中出现的/*和*/是注释符,注释内容写在/*和*/之间。注释是写给人看的而不是写给计算机看的,也就是说,/*/部分对程序的编译和运行不起任何作用。但在程序的关键地方写上注释是一个非常好的习惯,因为注释能帮助读者读懂源程序。应该养成在适当之处加注释的习惯,这使得程序易于理解,而对程序的理解是进一步修改和调试程序的基础。实例三main() int num,p; /*定

36、义两个整形变量*/ scanf(“%d”,&num); /*输入一个整形变量到num中 */ p=f2(num); /*调用f2函数,并把函数返回值存入变量p中*/ printf(“ %d”,p); /*输出变量p的值*/int f2(n) /*定义f2函数,n为形式参数*/int n; /*定义形式参数的类型*/ int t; t=n*n; /*求n的平方,并把计算结果放入变量到t中 */return(t); /*返回变量t的值*/本程序的作用是求一个数的平方,运行时输入一个整数,屏幕上即显示出该数的平方值。前面两个例程中都只含有一个主函数,而这个程序由两个函数组成,即主函数main()和被

37、调用的函数f2()。第四行的scanf是格式输入函数,其作用是输入一个十进制整数到变量num中。第五行调用f2(n)函数时,把变量num的值传递给形式参数n。f2()函数返回num的平方,返回值赋予值给变量p。从第八行开始定义函数f2(),该函数的功能是求n的平方,并返回求得的平方值。注意:f2()函数的定义是独立于主函数main()之外的。通过对上面三个例程的归纳总结,得出C语言源程序的结构有以下这些特点C程序由函数构成,函数是C程序的基本组成单位。一个C程序中有且只有一个主函数main(),除主函数main()外,可以有若干其它的函数。每个函数实现某一特定的功能,这样做的好处是让一个复杂的

38、问题由若干个函数共同分担解决,使得“大事化小”。每个函数的结构如下:函数名() 语句;花括号内的函数体由若干个语句组成,每个语句必须以分号结束(而且是英文输入状态下的分号,不能是中文输入状态的分号)。C语言的书写格式很自由,一行内可以写多个语句,一个语句很长时也可以分写在多行上。各个函数的定义是相互独立的。主函数可以写在其它函数的定义之前,也可以写在其它函数的定义之后,但程序的执行总是从主函数开始。36 C语言的数据类型大千世界中的物品是多种多样的,但我们依然可以把它们分出类来。同样,C程序中的数据也是千差万别的,我们也可以对它分类,有了分类就可以对它们进行分类处理。一、C语言的数据类型分类严

39、格地说,C语言的数据可以分为如图318所示这几种类型。图318 C语言的数据类型在这节里,我们先学习它的基本类型,其它类型留在以后章节才阐述。二、常量和变量为了更好地理解C语言的数据类型,我们先学习常量和变量的概念。(一)常量1什么是常量。常量就是在程序运行过程中,其值保持不变的量。常量相当于数学中的常数。例程int sum;sum=10+15;中的10,15就是两个常量。2常量的数据类型 常量分为整型常量、实型常量、字符型常量和字符串型常量四种。整型常量:既为整数。在ICCAVR中整型常量又有下列四种形式:十进制整型常量:如0、520、-123;八进制整型常量:以0开头的数是八进制数,如01

40、23;十六进制整型常量:以0x开头的数是十六进制数,如0x5f;二进制整型常量:以0b开头的数是二进制数,如0b。实型常量:即带小数点的十进制实数,又称浮点型。实型常量有下面两种类型:十进制实型常量:由数字和小数点组成,如0.123、.123。指数形式实型常量:如1.23e123。字符型常量:是用单引号括起来的单个字符,如a 、? 、1。注意:1中1代表的是一个字符,而不是整数。字符串型常量:是用双引号括起来的一个或多个字符,如:”a” 、”abc” 、”1” 。注意: “1”,代表的是一个字符串型常量,而不是字符型号常量,它与字符型常量1是有区别的。另外,在C语言中,对于每个字符串型常量系统

41、都会自动在它的结尾处加上一个“字符串结束标志”,它是一个空字符,ASCII值为0,用转义字符0表示。因此,字符串型常量的存储形式如图所示:二、变量1什么是变量变量指的是在程序运行过程中,其值会发生改变的量。变量如同图319中的杯子。虽然是同一个杯子,但由于所装载的物质的不同,也就导致整个杯子的值发生了变化。图319用杯子装载不同的物质,它有三个内在的特点:杯子名称、杯子中物质的种类和杯子中物质的性质种类。同样一个变量也有三个特征,即:变量名、变量值和变量类型。从图320中我们很容易看出这种类比关系。图3202变量的定义变量的定义格式如下:注意:定义变量时可一次定义一个变量,也可一次定义多个变量

42、。但一次定义多个变量时,只能定义同种类型的变量,而且变量名之间用逗号隔开。例如:int i,j;在定义变量的同时也可对变量赋初值,但不能以连等的形式同时对多个变量赋初值。例如:int i=1; (定义正确)int i=j=k=3;(定义错误)3变量在程序运行过程中,其值的变化情况。 我们以下列的程序为例子,观察一下变量的值在程序运行过程中是如何变化的?Main() int num1,num2,sum; num1=10; num2=15; sum=num1+num2; printf(“sum=%dn”,sum); num1=5; num2=num1+3; sum=num1+num2; print

43、f(“sum=%dn”,sum);程序中num1,num2和sum都是变量。它们的值在程序运行过程中都会发生了变化。变量定义之后,各变量的初值都是不确定的。num1的第一个确切值是10,当再次给num1赋值时,num1的值又变成5,如图321。其它两个变量值的变化情况类似。图3214变量的类型 变量分为整型变量、实型变量和字符型变量等几种类型。不同类型的变量在内存中所占据的存储单元是不同,ICCACR中为各种变量分配的存储空间如表34。表34 ICCAVR变量类型变量类型符号存储空间基本整型int2字节有符号整型signed int2字节无符号整型unsigned int2字节基本字符型cha

44、r1字节无符号字符型unsigned char1字节有符号字符型signed char1字节无符号短整型unsigned short2字节有符号短整型signed short2字节无符号长整型unsigned long4字节有符号长整型signed long4字节单精度浮点型float4字节双精度浮点型double4字节37 运算符与表达式分类计算机与运算是密不可分的,这一节我们就来学习如何通过C语言编程,在计算机上实现一些简单的运算。一、运算量和运算符1运算量 运算量指的是参与运算的各种常量或变量,如:2运算符号 就是实现各种运算特定的符号,如上图中的“+”。3表达式由运算符号、运算量组合而

45、成的式子称为表达式。下列是C语言中 合法的表达式:1+23*521.25+sin(90)+b二、C语言中的基本运算(一)算术运算1算术运算就是将多个运算量进行加(+)、减()、乘(*)、除(/)和求余(%)运算。2算术运算符号:见表35表35 基本算术运算符号运算符含义实例+加法运算,或正值运算3+5、+3减法运算,或负值运算53、3*乘法运算3*5/除法运算5/3=1%求余运算5%3=2需要说明:两个整数相除的结果为整数,如5/3的结果为1,舍去小数部分;但如果两个数中有一个是实数,则结果为double型,如5/2.0的结果为2.5。求余运算符%两侧的数据只能是整数。3自增、自减运算:使变量

46、的值增1或减少1。其运算符见表36。表36 自增、自减运算符号运算符含义+i在使用i之前,先使i的值加1i在使用i之前,先使i的值减1i+在使用i之后,使i的值加1i在使用i之后,使i的值减1粗略地看,+i和i+都相当于i=i+1,但+i和i+是不完全相同的,其不同之处在于:+i是先执行i=i+1,再使用i的值;而i+是先使用i的值,再执行i=i+1,例如:i=3;printf(“d%”,+i);输出为4。如果改为:printf(“d%”, i+);则输出3。(二)关系运算1关系运算关系运算实际上是比较运算,即将两个值进行比较,判断比较的结果是否符合给定的条件,如a3。2关系运算符:见表37表

47、37 关系运算符运算符含义小于=小于或等于大于=大于或等于等于!不等于(三)赋值运算1赋值运算就是将一个数据或表达式的值赋予给一个变量,如“a3”,就是把常量3赋给变量a。2赋值运算在C语言中,赋值运算符为“=”,它不再是数学中的等号。38 逻辑运算常用的逻辑运算有4种,分别是与(AND)、或(OR)、非(NOT)和异或(EOR)运算。逻辑数据只有1和0两个值,其中1表示“真”,0表示“假”。下面我们分别介绍这四种常用的逻辑运算。1“与”运算“与”运算可以用两个开关、灯泡和电源的串联电路来说明,如图322所示。图322“与”逻辑运算示意图由图322可知:只有开关A、B同时闭合时,灯泡P才亮,可

48、用逻辑表达式 AB=P或A&B=P来表示。“与”逻辑运算的门符号如图323。图323 “与”运算门符号 “与”逻辑运算的真值表如表38。表38 “与”运算真值表输入A输入B输出P0011010100012“或”运算“或”运算可以用两个开关并联后,在与灯泡和电源的串联来说明,如图324所示。图324 “与”逻辑运算示意图由图324可知:只要开关A、B有一个闭合时,灯泡P就亮,可用逻辑表达式 A+B=P或A|B=P来表示。“或”逻辑运算的门符号如图325。图325 “或”运算门符号 “或”逻辑运算的真值表如表39。表39 “或”运算真值表输入A输入B输出P0011010101113“非”运算“非”

49、运算可以用一个开关和一个灯泡并联后,再与电源串联来说明,如图326所示。图326 “非”逻辑运算示意图由图326可知:开关A断开时,灯泡P亮;开关A闭合时,灯泡P灭,此关系可用逻辑表达式!A=P来表示。“非”逻辑运算的门符号如图327。图327 “非”运算门符号 “非”逻辑运算的真值表如表310。表310 “非”运算真值表 输入A输出P01104“异或”运算可以用两个双联开关串联后,再与灯泡、电源并联来说明,如图328所示。图328 “异或”逻辑运算示意图由图328可知:当两开关的同面闭合时,灯泡P不亮;当两开关的异面闭合时,灯泡P亮,此关系可用逻辑表达式AB=P来表示。“异或”逻辑运算的门符

50、号如图329。图329 “异或”运算门符号 “异或”逻辑运算的真值表如表311。表311 “异或”运算真值表 输入A输入B输出P00110101011039 位运算C语言是为描述系统而设计的,因此它具有比较好的位操作功能。下面我们介绍它的各种位运算。1位运算所谓位运算是指进行二进制位的运算,如将某个存储单元中的各二进制位左移或右移一位、将两个数按位相加等运算。2位运算符:见表312表312 位运算符位运算符含义实例&按位与a&b|按位或a|b按位异或ab按位取反a左移a右移a13“按位与”运算(&)参加运算的两个数据,按二进位进行“与”运算,即只有当两个相应的二进位都为1时,该位的结果值为1,否则为0。例如:2&6,不是等于8,应该按位与。因此,2&6的值是2。按位与在单片机I/O端口操作中的用途:清零某一端口,其它端口的状态保持不变。只要找一个二进制数,其中各位符合以下条件:要清零端口所在位为0,其它端口所在位为1,然后使二者进行按位与(&)运算,就可以达到目的。如假设PORTB原来

温馨提示

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

评论

0/150

提交评论