1、第十章 单片机 高级语言C51程序设计,教学目的和要求,本章主要介绍单片机高级语言C51的语法、数据结构、语句函数的分类以及简单的C51程序设计。重点要求掌握C51的语法、数据结构、语句函数等,以达到设计简单的应用程序的目的。,C51语言的特点及其程序结构,C语言是一种通用的计算机程序设计语言,在国际上十分流行,它既可用来编写计算机的系统程序,也可用来编写一般的应用程序。以前计算机的系统软件主要是用汇编语言编写的,对于单片机应用系统来说更是如此。由于汇编语言程序的可读性和可移植性都较差,采用汇编语言编写单片机应用系统程序的周期长,而且调试和排错也比较困难。为了提高编制计算机系统和应用程序的效率
2、,改善程序的可读性和可移植性,最好采用高级语言编程。语言既具有一般高级语言的特点,又能直接对计算机的硬件进行操作,并且采用语言编写的程序能够很容易地在不同类型的计算机之间进行移植,因此语言的应用范围越来越广泛。,C51语言的特点及其程序结构,语言具有以下一些特点:1、语言简洁,使用方便灵活。 2、可移植性好。 3、表达能力强。4、表达方式灵活。、可进行结构化程序设计。、可以直接操作计算机硬件。、生成的目标代码质量高。尽管语言具有很多的优点,但和其它任何一种程序设计语言一样也有其自身的缺点,如不能自动检查数组的边界、各种运算符的优先级别太多、某些运算符具有多种用途等。,C51语言的特点及其程序结
3、构,语言程序是由若干个函数单元组成的,每个函数都是完成某个特殊任务的子程序段。组成一个程序的若干个函数可以保存在一个源程序文件中,也可以保存在几个源程序文件中,最后再将它们连接在一起。语言源程序文件的扩展名为“.C”,如EX1_1.C,EX1_2.C等。一个语言程序必须有而且只能有一个名为main()的函数,它是一个特殊的函数,也称为该程序的主函数,程序的执行都是从main()函数开始的。下面我们先来看一个简单的程序例子。,C51语言的特点及其程序结构,例10-1: 已知x=10,y=20,计算z=x+y的结果。main( ) /*主函数名*/ /*主函数体开始*/int x,y,z; /*主
4、函数内部变量类型说明*/x=10;y=20; /*变量赋值*/z=x+y; /*计算z=x+y的值*/ /*程序结束*/ 本例的程序是很简单的,它只有一个主函数main()。一般情况下,一个语言程序除了必须有一个主函数之外,还可能有若干个其它的功能函数。下面我们再来看一个例子。,C51语言的特点及其程序结构,例10-2: 求最大值。include /* 预处理命令*/ include main() /*主函数名*/ /*主函数体开始*/ int a,A,c; /*主函数的内部变量类型说明*/ int max(int x,int y); /*功能函数max及其形式参数说明*/ SCON=0x52
5、; /*8051单片机串行口初始化*/ TMOD=0x20; TCON=0x69; TH1=0x0f3; TL1=0x0f3;,C51语言的特点及其程序结构,scanf(“%d%d”, *将计算得到的最大值返回到调用处* *max函数结束*,C51语言的特点及其程序结构,从以上两个例子可以看到,一般语言程序具有如下的结构:预处理命令 include函数说明 long fun1();float fun2();功能函数 fun1()函数体 主函数 main()主函数体 功能函数 fun2()函数体 ,C51语言的标志符和关键字,语言的标识符是用来标识源程序中某个对象名字的。这些对象可以是函数、变量
6、、常量、数组、数据类型、存储方式和语句等。一个标识符由字符串、数字和下划线等组成,第一个字符必须是字母或下划线 。关键字是一类具有固定名称和特定含义的特殊标识符,有时又称为保留字。在编写语言源程序时一般不允许将关键字另作别用,换句话说,就是对于标识符的命名不要与关键字相同。与其它计算机语言相比,语言的关键字是比较少的,ANSIC标准一共规定了32个关键字,表10-1按用途列出了ANSIC标准的关键字。,C51语言的标志符和关键字,表10-1 ANSIC标准的关键字,C51语言的标志符和关键字,C51语言的标志符和关键字,C51编译器除了支持ANSIC标准的关键字以外,还扩展了如表10-2所示的
7、关键字:,表10-2 C51编译器的扩展关键字,C51语言的数据类型及运算符,C51语言的数据类型 任何程序设计都离不开对数据的处理。数据在计算机内存中的存放情况由数据结构决定。语言的数据结构是以数据类型出现的,数据类型可分为基本数据类型和复杂数据类型,复杂数据类型由基本数据类型构造而成。1、基本数据类型 语言中的基本数据类型有char,int,short,long,float等。C51数据类型以及数据长度和其值域见表10-3,C51语言的数据类型及运算符,表10-3 基本数据类型的长度,C51语言的数据类型及运算符,2、复杂数据类型(1)数组类型 数组是一组有序数据的集合,数组中的每一个数据
8、元素都属于同一个数据类型。数组中的各个元素可以用数组名和下标来唯一确定。一维数组只有一个下标,多维数组有两个以上的下标。在C语言中,数组必须先定义,然后才能使用。一维数组的定义形式如下:数据类型 数组名常量表达式;其中,“数据类型”说明了数组中各个元素的类型。“数组名”是整个数组的标识符,它的命名方法与变量的命名方法一样。“常量表达式”说明了该数组的长度,即该数组中的元素个数。常数表达式必须用方括号“”括起来,而且其中不能含有变量。下面是几个定义一维数组的例子。 char xx15; /定义字符型数组xx,它有15个元素int yy20; / 定义整型数组yy,它有20个元素float zz1
9、5; / 定义浮点型数组zz,它有15个元素,C51语言的数据类型及运算符,定义多维数组时,只要在数组名后面增加相应于维数的常量表达式即可。对于二维数组的定义形式为:数据类型 数组名常量表达式 常量表达式;需要指出的是,C语言中数组的下标是从0开始的。在引用数值数组时,只能逐个引用数组中的各个元素,而不能一次引用整个数组;但如果是字符数组则可以一次引用整个数组。,C51语言的数据类型及运算符,例10-3: 利用指针将一个字符数组中的字符串复制到另一个字符数组中去。#includeextern serial_initial();main()char *s1;char xdata *s2;char
10、 code str=“How are you?”;s1=str;s2=0x1000;serial_initial();,C51语言的数据类型及运算符,while(*s2=*s1)!=0)s2+;s1+;s1=str;s2=0x1000;printf(“%sn%sn”,s1,s2);while(1);执行程序结果:How are you?How are you?,C51语言的数据类型及运算符,(2)指针类型 指针类型数据在C语言程序中的使用十分普遍。正确地使用指针类型数据,可以有效地表示复杂的数据结构,直接访问内存地址,而且可以更为有效地使用数组。 指针和地址 指针变量的定义 指针变量定义的一般
11、格式:数据类型 存储器类型 *标识符;其中,“标识符”是所定义的指针变量名。 指针变量的引用 指针变量是含有一个数据对象地址的特殊变量,指针变量中只能存放地址。有关的运算符有两个,它们是地址运算符“&”和间接访问运算符“*”。例如:&a为变量a地址,*p为指针变量p所指向的变量。,C51语言的数据类型及运算符,例10-4: 输入两个整数x和y,经比较后按大小顺序输出。#include extern serial_initial(); main() int x,y; int *p,*p1,*p2; serial_initial(); printf(“Input x and y :n”); sca
12、nf(“%d %d”,C51语言的数据类型及运算符,printf(“max=%d,min=%dn”,*p1,*p2); while(1); 程序执行结果: Input x and y: 4 8(回车)max=8,min=4,C51语言的数据类型及运算符,(2)结构类型 结构是一种构造类型的数据,它是将若干不同类型的数据变量有序地组合在一起而形成的一种数据的集合体。组成该集合的各个数据变量称为结构成员,整个集合体使用一个单独的结构变量名。 结构变量的定义 有三种定义结构变量的方法,分述如下。 先定义结构类型再定义结构变量名定义结构类型的一般格式为:struct 结构名结构元素表;定义好一个结构类
13、型之后,就可以用它来定义结构变 量。 一般格式为: struct 结构名 结构变量名1,结构变量名2,结构变量名3,. 结构变量名n;,C51语言的数据类型及运算符,在定义结构类型的同时定义结构变量名 一般格式为: struct 结构名 结构元素表 结构变量名1,结构变量名2,结构变量名3,结构变量名n; 直接定义结构变量 一般格式为: struct 结构元素表 结构变量名1,结构变量名2,结构变量名3,结构变量名n;,C51语言的数据类型及运算符,结构变量的引用 在定义了一个结构变量之后,就可以对它进行引用,即可以进行赋值、存取和运算。一般情况下,结构变量的引用是通过对其结构元素的引用来实现
14、的。引用结构元素的一般格式为:结构变量名.结构元素其中“.”是存取结构元素的成员运算符。,C51语言的数据类型及运算符,例10-5: 给外部结构变量赋初值。 #include extern serial_initial(); struct mepoint unsigned char name11; unsigned char pressure; unsigned char temperature; po1=“firstpoint”,0x99,0x64; void main(void) serial_initial();printf(“name:%sn pressure:%bxn tempera
15、ture:%bxn”,po1.name,po1.pressure,po1.temperature); while(1); 程序执行结果: name:firstpoint pressure:99 temperature:64,C51语言的数据类型及运算符,(4)联合类型联合也是C语言中一种构造类型的数据结构。在一个联合中可以包含多个不同类型的数据元素,例如可以将一个float型变量、一个int型变量和一个char型变量放在同一个地址开始的内存单元中,如图10-1所示。以上三个变量在内存中的字节数不同,但却都从同一个地址开始存放,即采用了所谓“覆盖技术“。这种技术可使不同的变量分时使用同一个内存空
16、间,提高内存的利用效率。,图10-1 联合中变量的存储方法,C51语言的数据类型及运算符,联合的定义 联合类型变量的一般定义方法为:union 联合类型名成员表列 变量表列;例如:定义一个data联合。union datafloat i;int j;char k;a,b,c; 联合变量的引用 与结构变量类似,对联合变量的引用也是通过对其联合元素的引用来实现的。引用元素的一般格式为:联合变量名.联合元素 或 联合变量名-联合元素注意:引用联合元素时,要注意联合变量用法的一致性。,C51语言的数据类型及运算符,例10-6: 利用联合将整型数转变成两个字节输出。 #include extern se
17、rial_initial(); union int i; struct unsigned char high,unsigned char lowbytes; word; main() int k; k=0x67ab; serial_initial(); word.i=k; printf(“The high is :n”,word.bytes.high); printf(“The low is :n”,word.bytes.low); 程序执行结果: The high is 0x67 The low is 0xab,C51语言的数据类型及运算符,(5)枚举类型在C语言中,用作标志的变量通常只能被
18、赋予下述两个值的一个:True或False。但由于疏忽,我们有时会将一个在程序中作为标志使用的变量,赋予了除True或False以外的值。另外,这些变量通常被定义成int数据类型,从而使他们在程序中的作用模糊不清。如果我们可以定义标志类型的数据变量,然后指定这种被说明的数据变量只能赋值True或False,不能赋予其它值,就可以避免上述情况的发生。枚举数据类型正是因这种需要而产生的。,C51语言的数据类型及运算符,枚举的定义 枚举数据类型是一个有名字的某些整数型常数的集合。这些整数型常数是该类型变量可取的所有合法值。枚举定义应当列出该类型变量的可取值。枚举定义说明语句的一般格式:enum 枚举
19、名 枚举值列表 变量列表;枚举的定义和说明也可以分成两句完成:enum 枚举名 枚举值列表;enum 枚举名 变量列表; 枚举变量的取值 枚举列表中,每一项符号代表一个整数值。在默认情况下,第一项符号取值为0,第二项符号取值为1,第三项符号取值为2,依次类推。此外,也可以通过初始化,指定某些项的符号值。某项符号初始化后,该项后续各项符号值随之依次递增。,C51语言的数据类型及运算符,例10-7: 将颜色为红、绿、蓝的三个球作全排列,共有几种排法?打印出每种组合的三种颜色。 #include #include extern serial_initial(); main() enum colorr
20、ed,green,blue;/定义枚举类型 enum color i,j,k,st;/定义枚举类型变量 int n=0,lp; serial_initial(); for(i=red;i=blue;i+)for(j=red;j=blue;j+)for(k=red;k=blue;k+)n=n+1;printf(“%-4d”,n);for(lp=1;lp3;lp+),C51语言的数据类型及运算符,switch(lp)case 1:st=i;break;case 2:st=j;break;case 3:st=k;break;default:break;switch(st)case red: prin
21、tf(“%-10s”, “red”);break;case green: printf(“%-10s”, “green”);break;case blue: printf(“%-10s”, “blue”);break;default:break;,C51语言的数据类型及运算符,printf(“n”); while(1); 根据排列组合的知识,上述程序共有27种排法。,C51语言的数据类型及运算符,C51语言的运算符语言对数据有很强的表达能力,具有十分丰富的运算符,利用这些运算符可以组成各种各样的表达式及语句。运算符就是完成某种特定运算的符号。表达式则是由运算符及运算对象所组成的具有特定含义的一
22、个式子。由运算符或表达式可以组成语言程序的各种语句。语言是一种表达式语言,在任意一个表达式的后面加一个分号“;”就构成了一个表达式语句。运算符按其在表达式中所起的作用,可分为赋值运算符、算术运算符、增量与减量运算符、关系运算符、逻辑运算符、位运算符、复合赋值运算符、逗号运算符、条件运算符、指针和地址运算符、强制类型转换运算符和sizeof运算符等。运算符按其在表达式中与运算对象的关系又可分为单目运算符、双目运算符和三目运算符等。单目运算符只需要有一个运算对象,双目运算符要求有两个运算对象,三目运算符要求有三个运算对象。掌握各个运算符的意义和使用规则,对于编写正确的语言程序是十分重要的。C语言运算符见表10-4。,