第3章 单片机C51语言程序设计基础.ppt
第3章 单片机C51语言程序设计基础单片机C51语言既具有汇编语言对操作硬件的功能,又兼有高级编程语言的许多优点。在现代的单片机程序设计中,单片机C51语言得到了广泛的采用。本章主要介绍了包括C51程序的基本结构,以及C51程序设计的基础知识,包括标识符、关键字、数据类型、表达式和运算符等。熟练掌握这些知识,将为下面进一步学习打好基础。3.1 C51程序的基本结构单片机C51语言继承了C语言的特点,其程序结构与一般C语言的程序结构没有差别。C51源程序文件的扩展名为“.c”,如Test.c、Function.c等。每个C51源程序中包含一个名为“main()”的主函数,C51程序的执行总是从main()函数开始的。当主函数中所有语句执行完毕,则程序执行结束。Keil Vision3项目结构示意图 3.2 C51编程规范及注意事项在学习任何一种编程语言的时候,按照一定的规范培养良好的编程习惯很重要。良好的编程规范可以帮助开发人员理清思路、方便整理代码,同时也便于他人阅读理解以促进代码的交流。在进行C51语言程序设计时,应该注意一下几方面的编程规范。3.2.1 注释任何编程语言都支持注释语句。注释语句只对代码起到功能描述的作用,在实际的编译链接过程中不起作用。C51语言中可以通过两种方式来表示注释内容:用“/”符号开头来注释一行,如“/变量声明”。用“/*”符号开头,并以“*/”符号结束来对C51源程序中的任何部分进行注释,如“/*声明整型变量ch*/”。3.2.2 命名在进行程序设计时,经常需要自定义一些函数或者变量。一般来说,只要符合C51命名规范即可通过编译。但是,为了便于源程序的理解和交流,在进行命名时应注意如下几点:自定义函数或者变量的名称最好能反映该函数或变量的功能用途。因此,需要采用有意义的单词或者字母组合来表示。例如,MAX表示最大值、MIN表示最小值等。变量名通常加上表示数据类型的前缀,如“ucSendData”的前缀“uc”表示unsigned char。在命名时不要和系统保留的标识符以及关键字产生冲突或者歧义。3.2.3 格式为了程序阅读的方便,在进行C51程序设计时,在程序结构以及语句书写格式方面应注意以下几点:虽然C51语言对main()函数放置的位置没有限定,但为了程序阅读的方便,最好将其放置在所有自定义函数的最前面,即依次是头文件声明、自定义函数以及全局变量声明、main()函数、自定义函数。C51语句可以写在一行上也可以写在多行上。为了程序理解的方便,最好将每个语句单独写在一行,并加以注释。有时某几个相连的语句相近或者共同执行某个功能则可以放置在一行。对于源程序文件不同结构部分之间要留有空行。例如,头文件声明、自定义函数声明、main()函数以及自定义函数之间均要空一行来明显区分不同结构。对于if、while等块结构语句中的“”和“”要配对对齐,以便于程序阅读时能够理解该结构的起始和结束。源代码安排时可以通过适当的空格以及Tab键来实现代码对齐。3.3 C51的标识符与关键字标识符和关键字是一种编程语言最基本的组成部分,C51语言同样支持自定义的标识符以及系统保留的关键字。在进行C51程序设计时,需要了解标识符和关键字的使用规则。3.3.1 标识符标识符常用来声明某个对象的名称,如变量和常量的声明、数组和结构的声明、自定义函数的声明以及数据类型的声明等。示例如下。int count;void Function1();在上面的例子中,count为整型变量的标识符,Function1为自定义函数的标识符。在C51语言中,标识符可以由字母、数字(09)和下划线“_”组成,最多可支持32个字符。并且,C51标识符第一个字符必须是字母或者下划线“_”。例如“ut1”、“ch_1”等,都是正确的。而“5count”则是错误的标识符。另外,C51的标识符区分大小写,例如“count1”和“COUNT1”代表两个不同的标识符。3.3.2 关键字关键字是C51语言重要的组成部分,是C51编译器已定义保留的专用特殊标识符,有时也称为保留字。这些关键字通常有固定的名称和功能,如int、float、if、for、do、while、case等。3.4 C51的变量类型数据类型是C51语言最基本的组成部分。在C51中,每个变量在使用之前必须定义其数据类型。C51语言中的数据类型分为基本数据类型和聚合数据类型,这里首先介绍基本数据类型。3.4.1 C51的数据类型C51的基本数据类型有整型(int)、浮点型(float)、字符型(char)、无值型(void)。在基本数据类型中,除void类型外,其前面均可以有各种修饰符。修饰符用来改变基本类型的意义,以便更准确地适应各种情况的需求。常用的修饰符有signed(有符号)、unsigned(无符号)、long(长型符)、short(短型符)。在C51语言中的所有数据类型的字长和取值范围,如表所示。表3.2C51语言的数据类型3.4.2 整型变量整型变量是整数类型的数据。整型变量是最常用的数据类型。整型变量的定义格式是“类型说明符 变量标识符,变量标识符”。示例如下:inta,b;/定义a、b为短整型变量longc,d;/定义c、d为长整型变量其中,类型说明符与变量标识符之间至少有一个空格。最后一个变量标识符必须以“;”结尾。整型变量的前面可以加上不同的修饰符,整型变量的类型如表所示。表整型变量的类型类型简写形式字长(bit)取值范围unsignedshortint(无符号短整型)unsignedint8065535signedshortint(有符号短整型)short或int8-3276832767signedlongint(有符号长整型)unsignedlong32-21474836482147483649unsignedlongint(无符号长整型)long32042949672963.4.3 浮点型变量浮点型变量是用于表示包含小数点的数据类型。浮点型变量的一般定义格式是“类型说明符 变量标识符,变量标识符”。示例如下:float a,b;/定义a、b为单精度浮点型变量double c,d;/定义c、d为双精度浮点型变量同整型变量一样,浮点型变量也可以同时定义多个。C51支持三种浮点型变量类型,即float类型、double类型和long double类型。但是在C51中不具体区分这三种类型,它们都被当作float类型对待。因此,这三种浮点类型的精度和取值范围相同。浮点类型变量的字长为4个字节,共32位二进制数,取值范围为3.4x10-383.4x10+38。浮点型变量的示例程序如下:#include/头文件void main()/主函数floata;/定义a为单精度浮点型变量double b;/定义b为双精度浮点型变量a=8976.1538;/赋值b=6950.2692;printf(a=%fnb=%fn,a,b);/打印输出结果3.4.4 字符型变量在信息的表示和传递中,经常用到字符以及文字的表示。字符型变量就是用来存放单个字符的变量类型。字符型变量的定义格式是“类型说明符 变量标识符,变量标识符”。示例如下:char a:/定义a为有符号字符变量unsigned char b;/定义b为无符号字符变量在C51中,可以定义两种类型的字符型变量:有符号字符变量char和无符号字符变量unsigned char。在C51中,字符型变量在操作时将按整型变量处理。字符是以ASCII码方式表示的,其字长为1个字节,所以有符号字符型变量的取值范围为-128127,无符号字符型变量的取值范围是0255。如果某个变量被定义成char,则表明该变量是有符号的,即它将转换成有符号的整型变量。3.4.5 指针型变量指针型变量是指向变量所存放地址的数据类型。在C51中,指针型变量的定义格式是“类型说明符 变量标识符,变量标识符”。示例如下:int*i;/定义整型指针变量float*f;/定义浮点型指针变量char*c;/定义字符型指针变量struct*stu;/定义结构型指针变量union*uni;/定义联合指针变量3.4.6 无值型变量无值型变量是一个特殊的类型,其字节长度为0。无值型变量的定义格式是“类型说明符 变量标识符,变量标识符”。示例如下:void*buf;/buf被定义为无值型指针在C51中,无值型变量主要用于以下两个方面:定义一个同一类型的指针,该指针可根据需要动态分配内存。在自定义函数时,明确地表示这个函数不返回任何值。程序示例如下:#include/头文件void Fun1(int a)/定义一个无返回值的函数printf(the number is%d,a);/输出void main()/主函数int i;/定义变量i=12;/赋值Fun1(i);/调用函数 3.5 C51的常量类型常量也C51中常用的数据形式。与变量的表示相比,常量的表示要相对简单,但是同样要注意表示的规范,否则会导致程序出错。C51中的常量有整型常量、浮点型常量、字符型常量和转义字符四种类型。下面分别对其进行介绍。3.5.1 整型常量整型数据包括整型变量和整型常量两种,整型变量的定义前面已经详细介绍。整型常量及整型常数可以表示十进制、八进制、十六进制的整数值。根据表示的数的进制不同进行区分,整型常量的表示如表所示。整型常量的表示整型常量类型表示形式示例十进制数以非0开始的数来表示220,-560,45900八进制数以0开始的数来表示06,0106,0578十六进制数以0X或0 x开始的数来表示0X0D,0XFF,0 x4e3.5.2 浮点型常量浮点型常量也称为实型常量,只可以以十进制来表示。一般来说,浮点型常量的值由整数部分、尾数部分和指数部分组成。在不加说明的情况下,浮点型常量通常为正值。如果需要表示负值,则在常量前使用负号,如18.47,-45.63,-4.2e-16,8.165。在C51中,所有浮点常量都被默认为float型。对于绝对值小于1的浮点型常量,其小数点前面的零可以省略。例如,0.68可写为.68,-0.0314E-4可写为-.0314E-4。在编译环境中,默认的输出格式为浮点数时,最多只保留小数点后六位,不够的后面补零。在浮点型常量中不得出现任何空白符号。字母E或e之前必须有数字,其表示形式为“数字e数字”,且浮点型常量中E或e后面的指数必须是整数,例如“e2.3”、“e-2.5”等都是不合法的指数形式。3.5.3 字符型常量字符型常量用来表示单个字符,其用一对单引号括起来。其中单引号只起定界作用,并不表示字符本身,例如F,5,?。在C51中,字符常量的单引号中的字符不能是单引号()或反斜杠()。如果需要使用这两个字符,则需要采用转义字符来表示,这将在后面介绍。在C51中,字符是按其所对应的ASCII码值来存储的,一个字符占一个字节。因此也可用该字符的ASCII码值来表示该字符,例如,十进制数65表示大写字母A,十六进制数0 x5d表示符号,八进制数0110表示大写字母B等。另外,格式控制符是无法在程序中显式地表示的。因此,这些格式控制字符不能用符号表示,但其可以用ASCII码值来表示。例如,十进制数13表示回车符,八进制数033表示Esc,十六进制数0 x0A表示换行符等。3.5.4 转义字符转义字符用于表示ASCII码字符集中的格式控制字符和特定功能字符,这些字符都是不可打印的。例如,用于表示字符常量的单引号(),用于表示字符串常量的双引号()和反斜杠()等。转义字符是C51语言中一种特殊的字符表示形式,其用反斜杠“”后面加一个字符或一个八进制或十六进制数表示,转义字符的表示如表所示。转义字符转义字符含义ASCII码值(十进制)a响铃(BEL)007b退格(BS)008f换页(FF)012n换行(LF)010r回车(CR)013t水平制表(HT)009v垂直制表(VT)011反斜杠092?问号字符063单引号字符039双引号字符0340空字符(NULL)000ddd任意字符三位八进制xhh任意字符二位十六进制3.6 变量作用域变量作用域是程序中变量起作用的范围。由于C51中可以包含多个函数和程序文件,因此使用变量时,除要首先定义该变量外,还要注意变量的有效作用范围,即该变量的作用域。变量作用域即变量的作用范围,可以是作用于一个函数,或一个程序文件,甚至整个工程里的所有文件都可用。一般而言,按照变量的存储类型,变量分为自动变量、全局变量、静态变量和寄存器变量四种类型。下面将分别介绍其作用域范围。3.6.1 变量作用域的基本规则在C51语言中,任何以花括号括起来的一段程序称为一个块结构,通常称为复合语句。最典型的块结构是函数或者for、if、do和while等语句。C51中规定,在块结构中进行定义的变量,其有效使用范围只在该块结构内部,示例如下:#include/头文件void main()/主函数int i;/在main函数中定义整型变量i=15;/变量赋值/块结构int t;/在块结构中定义整型变量t=2;/变量赋值printf(i=%d,i);/输出变量i,正确printf(t=%d,t);/输出变量t,错误 3.6.2 自动变量自动变量一般在是函数的内部或者程序块中时使用,其是以关键字auto标识的变量类型。其定义格式为“auto 类型说明符 变量标识符,变量标识符”。自动型变量的作用域范围是函数或者程序块的内部。在编译C51程序时,自动型变量根据变量类型动态分配存储空间。在程序执行到该函数时,根据变量类型为其自动分配存储空间,当该函数执行完毕后,立即取消该变量的存储空间,即该自动型变量失效。这样在该函数内部定义的变量,就不能在该函数外引用。3.6.3 全局变量全局变量一般定义在所有函数的外部,即整个程序文件的最前面,也称为外部变量。全局变量的作用域是整个程序文件,即全局变量可以被该程序文件中的任何函数使用。在编译C51程序时,全局变量根据变量类型被静态地分配适当的存储空间。在整个程序运行过程中,该变量一旦分配空间,便不会消失。这样全局变量对整个程序文件都有效。因为全局变量是永久性的,因此全局变量可以作为不同函数间的参数进行传递和共享。3.6.4 静态变量静态变量即在编译C51程序时,根据数据类型静态地分配合适的存储空间,并在程序运行过程中始终占有该存储空间的变量。以关键字static定义,其定义格式为“static 类型说明符 变量标识符,变量标识符”。示例如下:static int i;static char c;在C51语言中,根据变量声明位置的不同,静态变量可以分为如下两种:内部静态变量,即在函数内部定义,其作用域只是定义该变量的函数内部,和自动变量类似。外部静态变量,即在函数外部定义,其始终占有内存空间,和全局变量类似。3.6.5 寄存器变量寄存器变量被存储在CPU的寄存器中。寄存器变量以关键字register声明,声明格式为“register 类型说明符 变量标识符,变量标识符”。示例如下:register char ch;register double db;由于寄存器变量被存储在CPU的寄存器中,因此其读写速度比较高。寄存器变量常用于某一变量名频繁使用的情况,这样做可以提高系统的运算速度。在使用寄存器变量使需要注意如下几点:由于单片机内部寄存器数量有限,不能定义多个寄存器变量。在实际程序设计中应将最重要的变量设置为寄存器变量,以提高系统执行速度。在C51中,只允许同时定义两个寄存器变量,如果多于两个,程序在编译时会自动地将两个以外的寄存器变量作为非寄存器变量来处理。3.7 分隔符与const修饰符分隔符和修饰符是计算机语言中很重要的组成部分,下面分别介绍C51的分隔符和const修饰符。3.7.1 C51分隔符分隔符在C51程序语言中起辅助标识和分界的作用,如+、-、*、/、!、|、=、.、,、:、;、#等。这些都是简单分隔符。简单分隔符是由除字母、数字、下划线以外的单个ASCII字符组成的符号。除此以外,C51中还有复合分隔符,例如=、(、)等。复合分隔符是特定字符的某种组合。C51的分隔符常用于数组、结构、指针以及语句等情况,下面举出常用的分隔符示例。“;”分隔符:主要用于语句的末尾,起到隔离语句的作用,例如例如int r;。“”分隔符:主要用于对数组说明,例如char ch=Hello Everyone!。“()”分隔符:主要用于进行隔离,例如s=area(r)。“,”分隔符:主要用于进行隔离,例如char ch1,ch2。“”分隔符:主要用于进行复合语句的隔离,例如for i=0;i10;i+。“*”分隔符:主要用于做指针,例如char*p1。“#”分隔符:主要用于做预处理伪指令,例如#define PI 3.14159。“”分隔符:主要用于标识特殊寄存器的位,例如sbit P10=P10。3.7.2 const修饰符在C51语言中,用关键字const修饰的是一类特殊的常量,一般称为符号常量或const变量。const修饰符主要用来定义常量或变量。其定义格式为“const =;”。示例如下:const double PI=3.14159;/定义浮点型的const变量基本数据类型的变量一旦加上const修饰符,程序在编译时,将其视为一个常量,而不再为其分配内存。当在程序中遇到该const变量时,将用其定义时的初值来代替,不能在程序中修改const修饰的变量的值。所以在声明const变量时,必须对其进行初始化赋值,除非该变量是用extern修饰的全局变量。3.8 C51的运算符运算符是表示特定的算术或逻辑操作的符号,也称为操作符。例如,“*”号表示了一个乘法运算符;“&”号表示了一个逻辑与的运算符。在C51语言中,需要进行运算的各个量(常量或变量)通过运算符连接起来便构成一个表达式。本节首先介绍运算符,表达式将在下一节进行介绍。C51语言中有算术运算符、关系运算符、逻辑运算符、位运算符这几类运算符。还有些用于辅助完成复杂功能的特殊运算符,如“,”运算符、“?”运算符、地址操作运算符、联合操作运算符、“sizeof”运算符、类型转换运算符。使用特殊运算符可以起到简化程序的作用。下面对各种运算符的含义和用法分别进行介绍。3.8.1 算术运算符算术运算符是用来进行算术运算的操作符。C51语言中的算术运算符继承了其它高级计算机语言的特点,用法也基本一致。C51语言中的算术运算符有如下所示的几种。“-”运算符:进行减法或取负的运算。“+”运算符:进行加法运算。“*”运算符:进行乘法运算。“/”运算符:进行除法运算。“%”运算符:进行模运算。“-”运算符:进行自减(减1)运算。“+”运算符:进行自增(增1)运算。1普通算术运算符2自增和自减运算3.8.2 逻辑运算符逻辑运算符是进行逻辑运算的操作符。C51语言中的逻辑运算符如下所示。“!”运算符:进行逻辑非运算。“|”运算符:进行逻辑或运算。“&”运算符:进行逻辑与运算。逻辑运算符的操作对象可以是整型数据、浮点型数据,以及字符型数据。如果逻辑运算符的操作结果是真,则运算结果为1;如果为假,则运算结果为0。逻辑运算符的逻辑真值如表所示。逻辑运算符的真值表ABA&BA|B!A000010101110010111103.8.3 关系运算符关系运算符主要用于比较操作数的大小关系,其和一般的C语言相类似。常用的关系运算符如下所示。“”运算符:判断是否大于。“=”运算符:判断是否大于等于。“”运算符:判断是否小于。“”运算符:进行右移运算。“”运算符:进行左移运算。位运算符的操作对象整型和字符型数据的字节或字,位操作不能用于float、double、long double、void或其他聚合类型。支持全部的位运算符,表明C51可以进行汇编语言所具有的位运算,因此C51语言既具有高级语言的特点,也具有低级语言的功能。3.8.5 “,”运算符“,”运算符是把几个表达式串在一起,并用括号括起来,按照顺序从左向右计算的运算符。“,”运算符左侧表达式的值不作为返回值,只有最右侧表达式的值作为整个表达式的返回值。程序示例如下:#include/头文件void main()/主函数int a,b,c;/定义变量a=37;/赋值b=179;c=(a+,+b,b+a);/执行“,”运算符,为c赋值printf(c=%dn,c);/输出结果3.8.6 “?”运算符“?”运算符首先计算表达式1的值,然后根据表达式1的真假接着计算其余表达式的值并输出结果。“?”运算符是三目操作符,其一般形式如下:EXP1?EXE2:EXP3;其中,EXP1、EXP2和EXP3是表达式。“?”运算符作用是在计算表达式EXP1的值后,如果其值为真,则计算表达式EXP2的值,并将其结果作为整个表达式的结果;如果表达式EXP1的值为假,则计算表达式EXP3的值,并将结果其作为整个表达式的结果。?”运算符的程序示例如下:3.8.7 “sizeof”运算符“sizeof”运算符返回变量所占的字节或类型长度字节。“sizeof”运算符是单目操作符。在C51语言中,“sizeof”运算符类似于C语言中length函数。使用“sizeof”运算符的程序示例如下:#include/头文件void main()/主函数 char ch=hello everyone!;/定义字符串数组 int i,j;/定义整型变量 i=sizeof(ch);/获取字符串数组的长度 j=sizeof(float);/获取float类型数据的长度 printf(i=%dnj=%dn,i,j);/输出结果3.8.8 地址操作运算符地址操作运算符用来对变量的地址来进行操作。C51语言中,地址操作运算符主要有两种:“*”和“&”。其中,“*”运算符是单目操作符,其返回位于某个地址内存储的变量值;“&”运算符也是一个单目操作符,其返回操作数的地址。“*”运算符和“&”运算符是相对应的。程序示例如下:#include/头文件main()/主函数char ch1,ch2;/定义字符型变量char*p;/定义指针型变量ch1=A;/为字符型变量ch1赋值p=&ch1;/将变量ch1的地址赋给pch2=*p;/地址p所指的单元值赋给ch2printf(ch2=%cn,ch2);/输出ch2 3.8.9 联合操作运算符联合操作运算符主要用来简化一些特殊的赋值语句,这类赋值语句的一般形式为:=利用联合操作运算符可以简化为:=联合操作运算符适合于所有的双目操作符。C51语言中常用的联合操作运算符示例如下:a+=b,相当于a=a+b;a*=b,相当于a=a*b;a&=b,相当于a=a&b;a|=b,相当于a=a|b;a/=x+y-z,相当于a=a/(x+y-z)。3.8.10 类型转换运算符类型转换运算符用于强制使某一表达式的结果变为特定数据类型。类型转换运算符的一般形式为:(类型)表达式其中,“(类型)”中的类型必须是C51中的一种数据类型。类型转换运算符的使用示例如下:(float)x/2/将x/2的结果转换为浮点型在C51语言中,“/”运算的结果将取其整数,为确保表达式x/2具有准确的结果,所以使用类型转换运算符强制运算结果转换为浮点型数据。类型转换运算符的程序示例如下:#include/头文件void main()/主函数 int i;/定义整型循环变量 for(i=0;i7;i+)/for循环语句 printf(%d/3=%fn,i,(float)i/3);/循环输出i/3的数值 3.8.11 运算符优先级和结合性在C51语言中,当一个表达式中有多个运算符参与运算时,要按照运算符的优先级别进行运算。在复杂的表达式中,除了要判断运算优先级,还要考虑结合性(或者关联性)。1算术运算符的优先级2关系运算符和逻辑运算符的优先级3运算符的结合性4程序示例3.9 C51的表达式表达式是需要进行运算的各个量由运算符连接起来而构成的一个整体。表达式是由操作数和运算符组成的,其中操作数一般包括常量和变量,甚至也可以包括函数和表达式等。表达式也是C51语言中的基本组成部分。C51中主要有算术表达式、赋值表达式、逗号表达式、关系表达式和逻辑表达式几种表达式。下面分别对这些表达式的使用进行介绍。3.9.1 算术表达式算术表达式是指用算术运算符将操作数连接起来的式子,其中也可以使用括号,例如,(a-(b+c)*3)/2-12。算术表达式虽然比较简单,但是在使用时要注意算术运算符的计算优先级和结合性,否则很容易使程序出现错误。算术表达式的程序示例如下:#include/头文件void main()/主函数 int i,j,x,y;/声明变量i=105;/赋值j=2;x=i+j*2;/算术运算y=(i-j*2)%3;/算术运算 printf(x=%dny=%dn,x,y);/输出结果3.9.2 赋值表达式赋值表达式是指,由赋值运算符“=”将一个变量和一个常量或者表达式连接起来的式子。赋值表达式的一般形式为:例如,“a=27”就是一个简单的赋值表达式,表示将常量27赋值给变量a。赋值表达式在执行时,首先求解赋值运算符右边的表达式的值,然后将该值赋给左边的变量。赋值表达式的程序示例如下:#include/头文件void main()/主函数 int i,j;/声明变量char a,b;float f;i=12;/赋值j=i-5;a=A;/变量赋值 b=a+1;f=17.5/2;printf(i=%dnj=%dn,i,j);/输出结果 printf(a=%cnb=%cn,a,b);/输出结果 printf(f=%fn,f);/输出结果 3.9.3 逗号表达式逗号表达式是用逗号运算符“,”以及括号将两个或多个表达式连接在一起的式子。其一般形式为:表达式1,表达式2,表达式3,表达式n逗号表达式的应用示例如下:#include/头文件void main()/主函数 int a,b;/声明变量 b=(a=4*10,a*5,a/10);/逗号表达式 printf(a=%dnb=%dn,a,b);/输出结果3.9.4 关系表达式关系表达式是指两个表达式用关系运算符连接起来的式子。关系运算又称为“比较运算”。示例如下:x(19+y)x!=y(x=7关系表达式的计算结果是逻辑“真”(True)或者逻辑“假”(False)。当结果为真时,表达式的值为1;当结果为假时,表达式的值为0。关系表达式的程序示例如下:#include/头文件void main()/主函数 int a,b,c,d;/声明变量 a=27;/赋值 b=237;c=a(b-200);/计算关系表达式 d=(a!=(b-100);printf(c=%dnd=%dn,c,d);/输出结果 3.9.5 逻辑表达式逻辑表达式是指两个表达式用逻辑运算符连接起来的式子。逻辑表达式中的操作对象可以是任何类型的数据,如整型、浮点型、字符型或指针型等。逻辑表达式的值是逻辑值,即“真”和“假”。当结果为真时,表达式的值为1,反之为0。逻辑表达式的程序示例如下:#include/头文件void main()/主函数 int a,b,c,d,e;/声明变量float f1,f2;a=7;/变量赋值 b=9;c=!a;/计算逻辑表达式 d=a|b;f1=2.3;f2=5.7;e=(f1!=f2);printf(c=%dnd=%dne=%dn,c,d,e);/输出结果 3.10 小结C51语言是单片机设计所广泛采用的程序语言。本章首先介绍了C51语言的基本结构和编程规范,然后分别介绍了C51语言的基本知识,包括标识符、关键字、变量与常量、运算符和表达式等。本章在每个基本知识点进行介绍时,都给出了完整详细的实例,可以方便读者学习掌握。本章是单片机C51语言的基础,因此应该熟练掌握本章所有内容。