1、培训内容第一部分:C语言基础 1、C51特点 2、C51开发环境安装与简介 3、C语言基本语法 4、编程风格第二部分:常用接口模块编程 1、键盘接口 2、数码管显示 3、温度传感器18B20使用 4、LCD1602使用 5、时钟芯片1302使用与编程 C51知识C语言是一种编译型程序设计语言,它兼顾了多种高级语言的特点,并具备汇编语言的功能。目前,使用C语言进行程序设计已经成为软件开发的一个主流。用C语言开发系统可以大大缩短开发周期,明显增强程序的可读性,便于改进、扩充和移植。而针对8051的C语言日趋成熟,成为了专业化的实用高级语言。C C语言作为一种非常方便的语言而得到广泛语言作为一种非常
2、方便的语言而得到广泛的支持,很多硬件开发都用的支持,很多硬件开发都用C C语言编程,如:语言编程,如:各种单片机、各种单片机、DSPDSP、ARMARM等等.C C语言程序本身不依赖于机器硬件系统,基语言程序本身不依赖于机器硬件系统,基本上不作修改就可将程序从不同的单片机中本上不作修改就可将程序从不同的单片机中移植过来。移植过来。C C提供了很多数学函数并支持浮点运算,开提供了很多数学函数并支持浮点运算,开发效率高,故可缩短开发时间,增加程序可发效率高,故可缩短开发时间,增加程序可读性和可维护性。读性和可维护性。C-51C-51的特点的特点C-51C-51与与ASM-51ASM-51相比,有如
3、下优点:相比,有如下优点:1.1.对单片机的指令系统不要求了解,仅对单片机的指令系统不要求了解,仅要求对要求对8051 8051 的存贮器结构有初步了解;的存贮器结构有初步了解;2.2.寄存器分配、不同存贮器的寻址及数寄存器分配、不同存贮器的寻址及数据类型等细节可由编译器管理;据类型等细节可由编译器管理;3.3.程序有规范的结构,可分成不同的函程序有规范的结构,可分成不同的函数,这种方式可使程序结构化;数,这种方式可使程序结构化;4.4.提供的库包含许多标准子程序,具有提供的库包含许多标准子程序,具有较强的数据处理能力;较强的数据处理能力;5.5.由于具有方便的模块化编程技术,使由于具有方便的
4、模块化编程技术,使已编好程序可容易地移植;已编好程序可容易地移植;v汇编语言与C语言对比举例 (1)1 1、在一个、在一个C C语序中必须有一个语序中必须有一个void main()void main()函数,函数,此函数是整个程序的入口,函数体由括起。此函数是整个程序的入口,函数体由括起。2 2、C C语言中的大小写是敏感的。语言中的大小写是敏感的。3 3、C C程序是由语句构成,一个语句必须由程序是由语句构成,一个语句必须由“;”;”号号结束。结束。4 4、#include#include命令的功能是把指定的文件插入该命命令的功能是把指定的文件插入该命令行位置取代该命令行,从而把指定的文件
5、和当前令行位置取代该命令行,从而把指定的文件和当前的源程序文件连成一个源文件。的源程序文件连成一个源文件。:系统路径查找:系统路径查找 “”“”:源文件路径查找:源文件路径查找通常有通常有:reg51.h reg52.h math.h stdio.h:reg51.h reg52.h math.h stdio.h 常常用有用有:reg51.h reg52.h:reg51.h reg52.h(定义特殊功能寄存器和位(定义特殊功能寄存器和位寄存器)寄存器)基本基本C C程序结构程序结构C C语言基础知识语言基础知识下面我们开始学习下面我们开始学习C C语言基本知识语言基本知识一、常量一、常量常量是在
6、程序运行过程中不能改变值的量常量是在程序运行过程中不能改变值的量常量表示:常量表示:1 1 整型常量十进制表示如整型常量十进制表示如123,0123,0,8989等。等。十六进制表示则以十六进制表示则以0 x0 x开头如开头如0 x34,-0 x3B0 x34,-0 x3B等。等。2 2 浮点型常量。十进制由数字和小数点组成,浮点型常量。十进制由数字和小数点组成,如如0.888,3345.345,0.00.888,3345.345,0.0等,等,3 3 字符型常量是单引号内的字符,如字符型常量是单引号内的字符,如a,da,d等,等,4 4 字符串型常量由双引号内的字符组成,如字符串型常量由双引
7、号内的字符组成,如test,OKtest,OK 等。等。二、变量二、变量程序执行过程中其值能不断变化的量,放在程序执行过程中其值能不断变化的量,放在RAMRAM中。中。例如你要对例如你要对P1.1P1.1口输入的脉冲进行计数,就需要一口输入的脉冲进行计数,就需要一个地方存这个数。个地方存这个数。1 1、定义一个、定义一个普通变量普通变量的格式如下:的格式如下:数据类型变量名表数据类型变量名表例如:例如:unsigned int a,b,cunsigned int a,b,c;变量名,只能以字母或下划线开头,由字符组成,变量名,只能以字母或下划线开头,由字符组成,不能与关键字重名。不能与关键字重
8、名。常见的数据类型:常见的数据类型:C C语言基础知识语言基础知识类型类型符号符号关键字关键字数的表示范围数的表示范围所占位数所占位数整型整型字符型字符型实型实型有有无无(signed)int16-3276832767(signed)short16-3276832767(signed)long32-2147483648214748364716unsigned int0655353204294967295unsigned long intunsigned short int16065535有有float323.4e-383.4e38有有double641.7e-3081.7e308有有char8
9、-128127无无unsigned char80255举例说明举例说明 2 2C关键字(保留)2 2、定义一个特殊功能寄存器变量的格式如下:、定义一个特殊功能寄存器变量的格式如下:sfrsfr 特殊功能寄存器名特殊功能寄存器名=特殊功能寄存器地址常数特殊功能寄存器地址常数;例如:例如:sfrsfr P0 =0 x80;P0 =0 x80;3 3、定义一个可位寻址对象变量的格式如下:、定义一个可位寻址对象变量的格式如下:sbitsbit 位变量名位地址位变量名位地址例如:例如:sbitsbit P0.0 =0 x80;P0.0 =0 x80;sbit sbit P0.0 =P00;P0.0 =P
10、00;举例说明作用举例说明作用4 4、位变量定义、位变量定义 bit bit 位变量名位变量名三、运算符三、运算符1 1、赋值运算符、赋值运算符 赋值运算符就是赋值符号赋值运算符就是赋值符号“=”=”2 2、算术运算符、算术运算符 加法运算符加法运算符 减法运算符减法运算符乘法运算符乘法运算符除法运算符除法运算符 模运算或取余运算符模运算或取余运算符为自增运算符为自增运算符为自减运算符。为自减运算符。3 3、复合赋值运算符、复合赋值运算符 ,例如:例如:a+=b a+=b 等价于等价于a=(a+ba=(a+b)x x*=a+b=a+b 等价于等价于x=(xx=(x*(a+b(a+b)4 4、位
11、运算符、位运算符&按位与按位与相当于相当于ANLANL指令指令|按位或按位或 相当于相当于ORLORL指令指令按位异或按位异或 相当于相当于XRLXRL指令指令 按位取反按位取反相当于相当于CPLCPL指令指令 右移右移相当于相当于RRRR指令指令按位与(&)v运算规则0&0=0;0&1=0;1&0=0;1&1=1;v用途按位清零保留某些指定位按位与举例v运算举例 1010,1101(0 xAD)&0110,1001(0 x69)0010,1001(0 x29)v按位清零、其他位不变xxxx,xxxx_&0110,0010(0 x62)0 xx0,00 x0_按位或(|)v运算规则0|0=0;
12、0|1=1;1|0=1;1|1=1;v用法按位置一按位或举例v运算举例 1010,1101(0 xAD)|0110,1001(0 x69)1110,1101(0 xED)v按位置一xxxx,xxxx_|0110,0010(0 x62)x11x,xx1x_按位异或()v运算规则0 0=0;0 1=1;1 0=1;1 1=0;v说明相“异”则为1,相“同”则为0相当于按位且无进位的加法按位异或用法举例v特定位翻转 1010,1101(0 xAD)0110,1001(0 x69)1100,0100(0 xC4)v与0相异或,保持原值不变。v与1相异或,翻转其值。(翻转特定位)v与自身相异或,则全部位
13、清零v交换两个整数值a=ab;b=ba;a=ab;按位取反()v运算规则 0=1;1=0;v用法所有位翻转按位取反举例v运算举例 1010,1101(0 xAD)0101,0010(0 x52)所有位翻转左移()v运算规则i n把i各位全部向左移动n位最左端的n位被移出丢弃最右端的n位用0补齐v用法若没有溢出,则左移n位相当于乘上2n运算速度比真正的乘法和幂运算快得多左移举例v运算举例 1010,1101 3(101)0110,1000_v溢出举例若左移后的数据超出表示范围,则发生溢出int i,j;i=0 x2431;j=i2;/*j=-0 x6F3C,溢出*/j=i)v运算规则i n把i各
14、位全部向右移动n位最右端的n位被移出丢弃最左端的n位用0补齐(逻辑右移)或最左端的n位用符号位补齐(算术右移)v用法右移n位相当于除以2n,并舍去小数部分运算速度比真正的除法和幂运算快得多右移举例v运算举例0101,1101 30000,1011(101)5 5、关系运算符、关系运算符 小于小于 小于等于小于等于 大于大于 大于等于大于等于 等于等于!不等于不等于实例分析实例分析6 6、逻辑运算符、逻辑运算符&逻辑与逻辑与|逻辑或逻辑或!逻辑非逻辑非实例分析实例分析四、程序流程控制四、程序流程控制1 1、顺序结构、顺序结构 依次执行的语句。依次执行的语句。2 2、选择语句、选择语句 (1)(1
15、)、ifif语句语句以下三种形式:以下三种形式:ifif(表达式)(表达式)语句;语句;ifif(表达式)(表达式)语句语句1 1;else else 语句语句2 2;嵌套使用:嵌套使用:ifif(表达式(表达式1 1)语句语句1 1;else ifelse if(表达式(表达式2 2)语句语句2 2;else ifelse if(表达式(表达式3 3)语句语句3 3;else if else if(表达式(表达式m m)语句语句m m;elseelse 语句语句 n n;三种形式的简明示意图例例1 1:if(p1!=0)if(p1!=0)c=20;c=20;例例2 2:if(p1!=0)if
16、(p1!=0)c=20;c=20;elseelse c=0;c=0;例例3 3:if(a=1)c=10;if(a=1)c=10;else if(a=2)c=20;else if(a=2)c=20;else if(a=3)c=30;else if(a=3)c=30;else if(a=4)c=40;else if(a=4)c=40;else c=0;else c=0;if语句中注意的问题ifif关键字之后的表达式通常是逻辑表达式或关系表关键字之后的表达式通常是逻辑表达式或关系表达式,但也可以是其它表达式,如赋值表达式等,达式,但也可以是其它表达式,如赋值表达式等,甚至可以是一个变量。甚至可以是一
17、个变量。例如:例如:ifif(a=5a=5););ifif(b b)语句;都是允许的。)语句;都是允许的。只要表达式的值为非只要表达式的值为非0 0,即为,即为“真真”,那么其后的,那么其后的语句就要执行。在语句就要执行。在ifif语句中,条件判断表达式必须语句中,条件判断表达式必须用括号括起来,在语句之后必须加分号。用括号括起来,在语句之后必须加分号。在在ifif语句的语句的3 3种形式中,所有的语句应为单个语句,种形式中,所有的语句应为单个语句,如果要想在满足条件时执行一组(多个)语句,则如果要想在满足条件时执行一组(多个)语句,则必须把这一组语句用必须把这一组语句用括起来组成一个复合语句
18、。括起来组成一个复合语句。但要注意的是在但要注意的是在“”之后不能再加分号。之后不能再加分号。上机练习:上机练习:根据按键亮灯,当按下一个铵键后,灯亮,松开后,根据按键亮灯,当按下一个铵键后,灯亮,松开后,灯灭。灯灭。(2)(2)、switch/switch/casecase语句语句switch/caseswitch/case语句的一般形式如下:语句的一般形式如下:switchswitch(表达式)(表达式)case case 常量表达式常量表达式1 1:语句:语句1 1;breakbreak;case case 常量表达式常量表达式2 2:语句:语句2 2;breakbreak;case c
19、ase 常量表达式常量表达式n n:语句:语句n n;breakbreak;default default:语句:语句n+1n+1;breakbreak语句又称间断语句,它的功能是终止当前语语句又称间断语句,它的功能是终止当前语句的执行,使程序跳出句的执行,使程序跳出switchswitch语句。语句。switch语句说明(1 1)switchswitch括号后面的表达式,允许为任何类型。括号后面的表达式,允许为任何类型。(2 2)当)当“表达式表达式”的值与某个的值与某个casecase后面的常量表后面的常量表达式的值相等时,就执行此达式的值相等时,就执行此casecase后面的语句。如果后
20、面的语句。如果表达式的值与所有常量表达式都不匹配,就执行表达式的值与所有常量表达式都不匹配,就执行defaultdefault后面的语句后面的语句(如果没有如果没有defaultdefault就执行跳出就执行跳出switch,switch,执行执行switchswitch语句后面的语句语句后面的语句)。(3 3)各个常量表达式的值必须互不相同,否则出)各个常量表达式的值必须互不相同,否则出现矛盾。现矛盾。(4 4)各个)各个casecase,defaultdefault出现的顺序不影响执行结出现的顺序不影响执行结果。果。(5 5)执行完一个)执行完一个casecase后面的语句后,流程控制转后
21、面的语句后,流程控制转移到下一个移到下一个casecase中的语句继续执行。此时,中的语句继续执行。此时,“case case 常量表达式常量表达式”只是起到语句标号的作用,并不在此只是起到语句标号的作用,并不在此处进行条件判断。在执行一个分支后,可以使用处进行条件判断。在执行一个分支后,可以使用breakbreak语句使流程跳出语句使流程跳出switchswitch结构,即终止结构,即终止switchswitch语句的执行(最后一个分支可以不用语句的执行(最后一个分支可以不用breakbreak语句)。语句)。(6 6)casecase后面如果有多条语句,不必用后面如果有多条语句,不必用括起
22、来。括起来。(7 7)多个)多个casecase可以共用一组执行语句。(注意可以共用一组执行语句。(注意breakbreak使用的位置)使用的位置)switch语句说明switch 语句应用举例#includestdio.h#include#include#includeextern serial_initialextern serial_initial();();void main()void main()int a,b int a,b;serial_initial serial_initial();();printf(“please printf(“please input b=”);in
23、put b=”);scanf(“%d”,&b scanf(“%d”,&b););switch(b)switch(b)case 0:a=1;case 0:a=1;case 1:a=3;case 1:a=3;case 2:a=5;case 2:a=5;default:a=7;default:a=7;printf(“n a=%d,b=%d”,a,b printf(“n a=%d,b=%d”,a,b););while(1);while(1);3 3、循环语句、循环语句 许多问题的求解归结为重复执行的操作,比如许多问题的求解归结为重复执行的操作,比如数值计算中的方程迭代求根,非数值计算中的对象数值计算中
24、的方程迭代求根,非数值计算中的对象遍历。重复执行就是循环。重复工作是计算机特别遍历。重复执行就是循环。重复工作是计算机特别擅长工作之一。擅长工作之一。重复的动作是受控制的,比如满足一定条件继重复的动作是受控制的,比如满足一定条件继续做,一直做直到某个条件满足,做多少次结束。续做,一直做直到某个条件满足,做多少次结束。也就是说重复工作需要进行控制也就是说重复工作需要进行控制-循环控制。循环控制。(一)while语句(当型循环)注意事项(1)while语句的特点是先计算表达式的值,然后根据表达式的值决定是否执行循环体中的语句。因此,如果表达式的值一开始就为“假”,那么循环体一次也不执行。(2)当循
25、环体为多个语句组成,必须用括起来,形成复合语句。(3)在循环体中应有使循环趋于结束的语句,以避免“死循环”的发生。while语句应用举例例:利用while语句,编写程序计算1+2+3+100。流程图 (二)do-while语句(直到型循环)执行流程说明(1)do-while循环,总是先执行一次循环体,然后再求表达式的值,因此,无论表达式是否为“真”,循环体至少执行一次。(2)do-while循环与while循环十分相似,它们的主要区别是:while循环先判断循环条件再执行循环体,循环体可能一次也不执行。do-while循环先执行循环体,再判断循环条件,循环体至少执行一次。(三)for语句(当型
26、循环)for循环执行过程for循环的执行流程注意(1)for循环中语句可以为语句体,但要用“”和“”将参加循环的语句括起来。(2)for循环中的“初始化表达式”(表达式1)、“循环条件表达式”(表达式2)和“增量表达式”(表达式3)都是选择项,即可以缺省,但“;”不能缺省。省略了初始化表达式,表示不对循环控制变量赋初值。省略了条件表达式,则不做其它处理时便成为死循环。省略了增量,则不对循环控制变量进行操作,这时可在语句体中加入修改循环控制变量的语句。(3)for语句可以有多层嵌套。几种循环的比较1、循环变量初始化:while和do-while循环,循环变量初始化应该在while和do-whil
27、e语句之前完成;而for循环,循环变量的初始化可以在表达式1中完成。2、循环条件:while和do-while循环只在while后面指定循环条件;而for循环可以在表达式2中指定。几种循环的比较3、循环变量修改使循环趋向结束:while和do-while循环要在循环体内包含使循环趋于结束的操作;for循环可以在表达式3中完成。4、while和for循环先测试表达式,后执行循环体,而do-while是先执行循环体,再判断表达式。(所以while,for循环是典型的当型循环,而do-while循环可以看作是直到型循环)。几种循环的比较5、三种基本循环结构一般可以相互替代,不能说哪种更加优越。具体使
28、用哪一种结构依赖于程序的可读性和程序设计者个人程序设计的风格(偏好)。我们应当尽量选择恰当的循环结构,使程序更加容易理解上机练习:上机练习:1 1、编写程序计算、编写程序计算1+2+3+1+2+3+100+100。2 2、用、用C C语言完成流水灯实验。语言完成流水灯实验。(四)break 语句和continue语句1、break语句 break语句的一般形式为:break;break语句的执行过程是:终止对switch语句或循环语句的执行(跳出这两种语句),而转移到其后的语句处执行。2、continue语句 一般形式是:continue;功能:结束本次循环。即跳过本层循环体中余下尚未执行的语
29、句,接着再一次进行循环条件的判定。注意:执行continue语句并没有使整个循环终止。注意与break语句进行比较。break,continue主要区别 continue语句只终止本次循环,而不是终止整个循环结构的执行;break语句是终止循环,不再进行条件判断。void main()while().continue;.break;五、函数五、函数 C C语言程序的架构是由函数所组成,其中函数语言程序的架构是由函数所组成,其中函数main()main()最为重要。理论上我们可以把所有程序叙述最为重要。理论上我们可以把所有程序叙述全部放在全部放在main()main()函数中,但是这样会使程序看
30、起来函数中,但是这样会使程序看起来很没条理,而且有许多程序叙述会重复,所以当我很没条理,而且有许多程序叙述会重复,所以当我们的程序越写越大时,我们必须试着将负责处理各们的程序越写越大时,我们必须试着将负责处理各种机能的程序叙述分别写成一个个不同的函数中,种机能的程序叙述分别写成一个个不同的函数中,这样一来不但程序代码变的清楚明了,而且许多重这样一来不但程序代码变的清楚明了,而且许多重复的地方,都可以调用相同的函数完成。复的地方,都可以调用相同的函数完成。C C语言程序的结构如图所示。在每个程序中,主函语言程序的结构如图所示。在每个程序中,主函数数mainmain是必须的,它是所有程序的执行起点
31、,是必须的,它是所有程序的执行起点,mainmain函数只调用其它函数,不能为其它函数调用。其它函数只调用其它函数,不能为其它函数调用。其它函数没有主从关系,可以相互调用。所有函数都可函数没有主从关系,可以相互调用。所有函数都可以调用库函数。程序的总体功能通过函数的调用来以调用库函数。程序的总体功能通过函数的调用来实现。实现。f11()f11()f31()f1()f11();f2()f11();f22();main()f1();f2();使用函数的意义:使用函数的意义:使用函数可以控制任务的规模使用函数可以控制任务的规模 使用函数可以控制变量的作用范围使用函数可以控制变量的作用范围使用函数,程
32、序的开发可以由多人分工协作使用函数,程序的开发可以由多人分工协作 使用函数,可以重新利用已有的、调式好的、成使用函数,可以重新利用已有的、调式好的、成熟的程序模块熟的程序模块 函数定义的一般格式如下:函数定义的一般格式如下:函数类型函数类型 函数名(形式参数表)函数名(形式参数表)形式参数说明形式参数说明 局部变量定义局部变量定义函数体函数体return(return(返回值返回值););格式说明:格式说明:1 1函数类型函数类型函数类型说明了函数返回值的类型。(有返回类型函数类型说明了函数返回值的类型。(有返回类型 的函数可以放到的右边)的函数可以放到的右边)2 2函数名函数名函数名是用户为
33、自定义函数取的名字以便调用函数函数名是用户为自定义函数取的名字以便调用函数时使用。时使用。3 3形式参数表形式参数表形式参数表用于列录在主调函数与被调用函数之间形式参数表用于列录在主调函数与被调用函数之间进行数据传递的形式参数。进行数据传递的形式参数。4 4、无返回类型的为、无返回类型的为voidvoid型。函数中形式参数表可型。函数中形式参数表可为空。为空。例:定义一个返回两个整数中最大值的函数例:定义一个返回两个整数中最大值的函数max()max()。int max(int x,intint max(int x,int y)y)intint z;z;ifif(xyxy)z=x;z=x;el
34、seelsez=y;z=y;returnreturn(z z);也可以用成这样:也可以用成这样:int max(x,yint max(x,y)int x,yint x,y;intint z;z;ifif(xyxy)z=x;z=x;elseelsez=y;z=y;returnreturn(z z);在在keilkeil中举例验证中举例验证例:通过函数的参数可将前面的延时程序修改成可以例:通过函数的参数可将前面的延时程序修改成可以调节延时量的函数。调节延时量的函数。void Delay1ms(unsigned intvoid Delay1ms(unsigned int count)count)un
35、signed int i,junsigned int i,j;for(i=0;icount;ifor(i=0;icount;i+)+)for(jfor(j=0;j120;j+);=0;j120;j+);void main()void main()P0_0=0;P0_0=0;Delay1ms(500);/500msDelay1ms(500);/500msP0_0=1;P0_0=1;P0_1=0;P0_1=0;Delay1ms(1000);/1SDelay1ms(1000);/1SP0_1=1;/P0_1=1;/这样可以根据需要设置延时量,比较灵活这样可以根据需要设置延时量,比较灵活局部变量:局部
36、变量:在一个函数内部说明的变量是内部变量,它只在在一个函数内部说明的变量是内部变量,它只在该函数范围内有效。即只有在包含变量说明的函数内该函数范围内有效。即只有在包含变量说明的函数内部,才能使用被说明的变量,在该函数之外就不能使部,才能使用被说明的变量,在该函数之外就不能使用这些变量了。所以内部变量也称用这些变量了。所以内部变量也称“局部变量局部变量”。例如:例如:intf1(inta)/*函数函数f1*/intb,c;/*a,b,c作用域:仅限于函数作用域:仅限于函数f1()中中*/intf2(intx)/*函数函数f2*/inty,z;/*x,y,z作用域:仅限于函数作用域:仅限于函数f2
37、()中中*/main()intm,n;/*m,n作用域:仅限于函数作用域:仅限于函数main()中中*/说明:说明:主函数主函数main()中定义的内部变量,也只能在主函数中定义的内部变量,也只能在主函数中使用,其它函数不能使用。同时,主函数中也不能中使用,其它函数不能使用。同时,主函数中也不能使用其它函数中定义的内部变量。使用其它函数中定义的内部变量。形参变量也是内部变量,属于被调用函数;实参变形参变量也是内部变量,属于被调用函数;实参变量,则是调用函数的内部变量。量,则是调用函数的内部变量。允许在不同的函数中使用相同的变量名,它们代表允许在不同的函数中使用相同的变量名,它们代表不同的对象,
38、分配不同的单元,互不干扰,也不会发不同的对象,分配不同的单元,互不干扰,也不会发生混淆。生混淆。在复合语句中也可定义变量,其作用域只在复合语在复合语句中也可定义变量,其作用域只在复合语句范围内。句范围内。全局变量全局变量在函数之外定义的变量。(所有函数前,各个函在函数之外定义的变量。(所有函数前,各个函数之间,所有函数后)数之间,所有函数后)全局变量作用域:从定义全局变量的位置起到本源程全局变量作用域:从定义全局变量的位置起到本源程序结束为止。序结束为止。说明:说明:1、全局变量一旦定义后,任何函数都可以存取全局变、全局变量一旦定义后,任何函数都可以存取全局变量的值,即多个函数共享同一个变量,
39、即值的共享性。量的值,即多个函数共享同一个变量,即值的共享性。2、外部变量可加强函数模块之间的数据联系,但又使、外部变量可加强函数模块之间的数据联系,但又使这些函数依赖这些外部变量,因而使得这些函数的独这些函数依赖这些外部变量,因而使得这些函数的独立性降低。立性降低。从模块化程序设计的观点来看这是不利的,因此不是从模块化程序设计的观点来看这是不利的,因此不是非用不可时,不要使用外部变量非用不可时,不要使用外部变量。3、在同一源文件中,允许外部变量和内部变量同名。、在同一源文件中,允许外部变量和内部变量同名。在内部变量的作用域内,外部变量将被屏蔽而不起作在内部变量的作用域内,外部变量将被屏蔽而不
40、起作用。用。上机练习:上机练习:1、写一个函数,该函数返回三个数中最小的数,编程、写一个函数,该函数返回三个数中最小的数,编程验证。验证。2、用函数的思想完成流水灯。、用函数的思想完成流水灯。六、数组六、数组数组是同一类型变量的有序集合,在内存中数组是同一类型变量的有序集合,在内存中是连续存放的。是连续存放的。一维数组的定义一维数组的定义 类型说明符类型说明符 数组名数组名 元素个数元素个数;如:如:intint a50 a50;各部分说明如下:各部分说明如下:(1 1)“类型说明符类型说明符”说明了数组中各个元素存储说明了数组中各个元素存储的数据的类型。的数据的类型。(2 2)“数组名数组名
41、”是整个数组的标识符,它的取名是整个数组的标识符,它的取名方法与变量的取名方法相同。方法与变量的取名方法相同。(3 3)“元素个数元素个数”,取值要为整型常量,必须用,取值要为整型常量,必须用方括号方括号“”括起来。用于说明该数组的长度,即括起来。用于说明该数组的长度,即该数组元素的个数。该数组元素的个数。(4 4)C C语言中数组的下标是从语言中数组的下标是从0 0开始的。开始的。(5 5)C C规定在引用数组时,只能逐个引用数组中的规定在引用数组时,只能逐个引用数组中的各个元素,而不能一次引用整个数组。但如果是字各个元素,而不能一次引用整个数组。但如果是字符数组则可以一次引用整个数组。符数
42、组则可以一次引用整个数组。一维数组的初始化一维数组的初始化 intint a5=1 a5=1,2 2,3 3,4 4,55;/*给全部元素给全部元素赋值赋值*/intint b6=1 b6=1,2 2,66;/*给部分元素赋值给部分元素赋值*/intint d10 d10;d0=4d0=4;d1=d1=6 6;/*定定义完后再赋值义完后再赋值*/上例中数组上例中数组a a有有5 5个元素分别为:个元素分别为:a0,a1,a2,a3,a4a0,a1,a2,a3,a4每个元素都可以作为一个每个元素都可以作为一个intint变量使用。变量使用。字符数组字符数组 用来存放字符数据的数组称为字符数组,它
43、是用来存放字符数据的数组称为字符数组,它是C C语言中常用的一种数组。字符数组中的每一个元语言中常用的一种数组。字符数组中的每一个元素都用来存放一个字符,也可用字符数组来存放字素都用来存放一个字符,也可用字符数组来存放字符串。字符数组的定义下一般数组相同,只是在定符串。字符数组的定义下一般数组相同,只是在定义时把数据类型定义为义时把数据类型定义为charchar型。型。例:用字符数组存放字符串例:用字符数组存放字符串char str20=“Hello”;char str20=“Hello”;字符串以字符串以“0”0”作为结束符作为结束符,因此:因此:str0=H,str1=e,str2=l,s
44、trstr0=H,str1=e,str2=l,str3=l,3=l,str4=o,str5=0str4=o,str5=0上机练习:上机练习:定义一个有定义一个有1010个元素的数组,随机设置初始值,编个元素的数组,随机设置初始值,编写程序,将写程序,将1010个元素进行降序排序。个元素进行降序排序。编程规范编程规范现在单片机的程序设计,现在单片机的程序设计,C51已经得到广泛的推广和应用,已经得到广泛的推广和应用,算是单片机的主流设计程序,甚至可以说作为单片机开发算是单片机的主流设计程序,甚至可以说作为单片机开发人员必须要掌握的一门语言了。人员必须要掌握的一门语言了。作为一门工具,最终的目的就
45、是实现功能。在满足这个前作为一门工具,最终的目的就是实现功能。在满足这个前提条件下,我们希望我们的程序能很容易地被别人读懂,提条件下,我们希望我们的程序能很容易地被别人读懂,或者能够很容易地读懂别人的程序,在团体合作开发中就或者能够很容易地读懂别人的程序,在团体合作开发中就能起到事半功倍之效。在网上请求帮助时,如能以规范的能起到事半功倍之效。在网上请求帮助时,如能以规范的写法贴出程序,网友会比较容易地明白你的问题,则会比写法贴出程序,网友会比较容易地明白你的问题,则会比较快的得到网友的帮助,否则让人看上半天也不明所以然,较快的得到网友的帮助,否则让人看上半天也不明所以然,这样就达不到预期的效果
46、了。因此,为了便于源程序的交这样就达不到预期的效果了。因此,为了便于源程序的交流,减少合作开发中的障碍,说一下编程规范。流,减少合作开发中的障碍,说一下编程规范。一、注释一、注释1、采用中文;、采用中文;2、开始的注释:、开始的注释:文件文件(模块模块)注释内容:注释内容:公司名称、版权、作者名称、修改时间、模块功能、背景介绍等公司名称、版权、作者名称、修改时间、模块功能、背景介绍等,复杂的算法需复杂的算法需要加上流程说明要加上流程说明;例如:例如:/*/*公司名称公司名称:*/*模模块块名:名:LCD模块模块LCD型号:型号:HD44780*/*创创建建人:人:XXX日期:日期:2001-0
47、6-08*/*修修改改人:人:日期:日期:2007-06-08*/*功能描述:功能描述:*/*其他说明:其他说明:*/*版版本:本:/*/函数开头的注释内容:函数开头的注释内容:函数名称、功能、说明函数名称、功能、说明输入、返回、函数描述、流程处理、全局变量、调用样例等输入、返回、函数描述、流程处理、全局变量、调用样例等,复杂的函数需要加上变量用途说明复杂的函数需要加上变量用途说明;/*函函数数名名:v_LcdInit*功能描述功能描述:LCD初始化初始化*函数说明函数说明:初始化命令:初始化命令:0 x3c,0 x08,0 x01,0 x06,0 x10,0 x0c*调用函数调用函数:v_D
48、elaymsec(),v_LcdCmd()*全局变量全局变量:*输输入入:无无*返返回回:无无*设设计计者:者:XXX日期:日期:2007-12-09*修修改改者:者:XXX日期:日期:2007-12-09*版版本:本:*/3、程序中的注释内容:、程序中的注释内容:修改时间和作者、方便理解的注释等。注释内容应简炼、清楚、明了,修改时间和作者、方便理解的注释等。注释内容应简炼、清楚、明了,一目了然的语句不加注释。一目了然的语句不加注释。二、命名:二、命名:命名必须具有一定的实际意义。命名必须具有一定的实际意义。1、常量的命名:全部用大写。、常量的命名:全部用大写。2、变量的命名:、变量的命名:变
49、量名加前缀,前缀反映变量的数据类型,用小写,反映变量意义的第一个变量名加前缀,前缀反映变量的数据类型,用小写,反映变量意义的第一个字母大写,其他小写。字母大写,其他小写。其中变量数据类型:其中变量数据类型:unsignedchar前缀前缀ucsignedchar前缀前缀scunsignedint前缀前缀uisignedint前缀前缀siunsignedlong前缀前缀ulsignedlong前缀前缀slbit前缀前缀b指针指针前缀前缀p例:例:ucReceivData接收数据接收数据3、函数的命名:、函数的命名:函数名首字大写,若包含有两个单词的每个单词首字母大写。函数名首字大写,若包含有两个
50、单词的每个单词首字母大写。三、编辑风格三、编辑风格1、缩进:缩进以、缩进:缩进以Tab为单位,一个为单位,一个Tab为四个空格大小。预处理为四个空格大小。预处理语句、全局数据、函数原型、标题、附加说明、函数说明、标号等语句、全局数据、函数原型、标题、附加说明、函数说明、标号等均顶格书写。语句块的均顶格书写。语句块的“”“”配对对齐,并与其前一行对齐;配对对齐,并与其前一行对齐;2、空格:数据和函数在其类型,修饰名称之间适当空格并据情况对、空格:数据和函数在其类型,修饰名称之间适当空格并据情况对齐。关键字原则上空一格,齐。关键字原则上空一格,3、对齐:原则上关系密切的行应对齐,对齐包括类型、修饰