1、1237.1.1标识符和关键字7.1.2C51 数据类型7.1.3常量与变量4C语言编程的基本概念和知识1函数。C语言程序由一个主函数和若干个其他函数构成,程序中由主函数调用其他函数,其他函数之间也可以相互调用。指针与指针变量。若定义变量x,&x即为x的指针,指针变量是指针的指针,若xp=&x,利用*xp即可访问变量x。23#include(包含处理命令)。一个源文件将另一个源文件的全部内容包含进来,或者说把一个外部文件包含到本文件之中。4#define(宏定义)。在C程序中,可以指定一标志符去定义一个常量或字符串。5主函数名必须为main()。C程序通过函数调用去执行指定的工作。6一个函数由
2、说明部分和函数体两部分组成。函数说明部分是对函数名、函数类型、形参名和形参类型等所做的说明。C程序的执行是从main()函数开始,而对该函数的位置无特殊的规定。78源程序文件需要包含其他源程序文件时,应在本程序头部用包含命令#include处理。9C程序中的一个函数需要调用另一个子函数时,另一个函数应写在前面,否则应声明。10C程序书写格式自由,一行可写一个语句或几个语句。每个语句结尾用“;”结束。51标识符标识符是用来表示源程序中自定义对象名称的符号。其中的自定义对象可以是常量、变量、数组、结构、语句标号以及函数等。在C51语言中,标识符可以由字母(az,AZ)、数字(09)和下划线“_”组
3、成,最多可支持32个字符。C51标识符的定义不是随意的,应遵循“简洁”和“见名知意”的原则,并需要符合一定的规则:标识符的第一个字符必须是字母或者下划线,不能为数字。由于有些编译系统专用的标识符以下划线开头,所以用户在定义标识符时一般不要以下划线开头。C51的标识符区分大小写,例如“ch1”和“Ch1”表示两个不同的标识符。用户自定义的标识符不能与系统保留的关键字重复。62关键字关键字是C51编译器保留的一些特殊标识符,具有特定的含义和用法。单片机C51程序语言继承了ANSI C标准定义的32个关键字,如表7-1所示。表7-1 C51的关键字auto存储种类说明用以说明局部变量,缺省值为此br
4、eak程序语句退出最内层循环case程序语句Switch 语句中的选择项char数据类型说明单字节整型数或字符型数据const存储类型说明在程序执行过程中不可更改的常量值continue程序语句转向下一次循环default程序语句Switch语句中的失败选择项do程序语句构成dowhile循环结构关键字用 途说 明double数据类型说明双精度浮点数else程序语句构成ifelse选择结构enum数据类型说明枚举extern存储种类说明在其他程序模块中说明了的全局变量float数据类型说明单精度浮点数for程序语句构成for循环结构goto程序语句构成goto转移结构if程序语句构成if el
5、se选择结构int数据类型说明基本整型数long数据类型说明长整型数register存储种类说明使用CPU内部寄存的变量return程序语句函数返回short数据类型说明短整型数signed数据类型说明有符号数,二进制数据的最高位为符号位sizeof运算符计算表达式或数据类型的字节数static存储种类说明静态变量struct数据类型说明结构类型数据switch程序语句构成switch选择结构typedef数据类型说明重新进行数据类型定义union数据类型说明联合类型数据unsigned数据类型说明无符号数据void数据类型说明无类型数据volatile数据类型说明该变量在程序执行中可被隐含地
6、改变while程序语句构成while和do while循环语句同时C51又结合单片机硬件的特点扩展了19个关键字:_at_ idata sfr16 alien interrupt small bdata large _task_ code bit pdata using reentrant xdata compact sbit data sfr7表7-2列出了Keil uVision2 C51编译器所支持的数据类型。数据类型长 度值 域unsigned char单字节0255signed char单字节-128+127unsigned int双字节065535signed int双字节-327
7、68+32767unsigned long四字节04294967295signed long四字节-2147483648+2147483647表7-2 C51编译器所支持的数据类型float四字节1.175494E-383.402823E+38*13 字节对象的地址bit位0 或1sfr单字节0255sfr16双字节065535sbit位0 或181char字符类型char类型的长度是一个字节,通常用于定义处理字符数据的变量或常量。char字符类型分为无符号字符类型(unsigned char)和有符号字符类型(signed char),默认值为signed char类型。unsigned c
8、har类型用字节中所有的位来表示数值,可以表达的数值范围是0255;signed char类型中字节最高位表示数据的符号,“0”表示正数,“1”表示负数(负数用补码表示),所能表示的数值范围是-128+127。 unsigned char常用于处理ASCII字符或小于等于255的整型数。正数的补码与原码相同,负二进制数的补码等于它的绝对值按位取反后加1。说 明92int整型int整型长度为两个字节,用于存放一个双字节数据。分为有符号整型数signed int和无符号整型数unsigned int,默认值为signed int类型。signed int表示的数值范围是-32768+32767,字
9、节中最高位表示数据的符号,“0”表示正数,“1”表示负数;unsigned int表示的数值范围是065535。3long长整型long长整型长度为四个字节,用于存放一个四字节数据。分有符号长整型signed long和无符号长整型unsigned long,默认值为signed long类型。signed int表示的数值范围是-2147483648+2147483647,字节中最高位表示数据的符号,“0”表示正数,“1”表示负数;unsigned long表示的数值范围是04294967295。105*指针型指针型数据本身是一个变量,在这个变量中存放着指向另一个数据的地址。根据处理器的不同
10、,指针型数据所占的内存单元也不尽相同,在C51中它的长度一般为13个字节。4float浮点型float浮点型在十进制中具有7位有效数字,是符合IEEE754标准的单精度浮点型数据,占用四个字节。浮点数的结构较复杂,单片机使用较少。6bit位标量bit 位标量是C51编译器的一种扩充数据类型,利用它可定义一个位标量,但不能定义位指针,也不能定义位数组。它的值是一个二进制位,非0即1。定义格式:bit 变量名=变量值。7sfr特殊功能寄存器sfr是一种扩充数据类型,占用一个内存单元,地址范围为0 x800 xFF。定义格式为:sfr 变量名=变量地址。利用它可以访问51单片机内部的所有特殊功能寄存
11、器。例如,用“sfr P1=0 x90”这一句定P1为P1端口在片内的寄存器。119sbit可位寻址位sbit是C51中的一种扩充数据类型,利用它可以访问芯片内部的RAM中的可寻址位或特殊功能寄存器中的可寻址位。定义格式:sbit 变量名=位地址;sbit 变量名=SFR地址位序号;sbit 变量名=sfr16变量位序号。因P1端口的寄存器是可位寻址的,所以我们可以定义P1_1为P1中的P1.1引脚,同样我们可以用P1.1的地址去写,这样在以后的程序语句中就可以用P1_1来对P1.1引脚进行读写操作了。例如:sbit P1_1=P11;sbit P1_1=0 x91;8sfr16 16位特殊功
12、能寄存器sfr16是一种扩充数据类型,占用两个内存单元,sfr16和sfr一样用于操作特殊功能寄存器,所不同的是,此类型的变量可访问16为特殊功能寄存器。定义格式:sfr16 变量名=变量地址。此处的变量地址为16位中的低8位地址,其地址范围为0 x800 xFF。通过sfr16变量读16位特殊功能寄存器时,先读低字节,后读高字节;写特殊功能寄存器时先写高字节,后写低字节。12(2)浮点型常量浮点型常量可分为十进制和指数表示形式。十进制浮点型常量由数字和小数点组成,整数或小数部分为0,可以省略但必须有小数点,如0.888,3345.345,0.0等。指数浮点型常量表示形式为:数字.数字e数字
13、中的内容为可选项,如125e3,7e9,-3.0e-3等。1常量常量是在程序运行过程中不能改变的量,如固定的数据表、字符等。常量的数据类型只有整型、浮点型、字符型、字符串型和位标量。(1)整型常量不同数据类型的整型常量表示方法不同,十进制如123,0,-89等;十六进制则以0 x开头如0 x34,-0 x3B等;长整型就在数字后面加字母L,如104L,034L,0 xF340等。131常量常量是在程序运行过程中不能改变的量,如固定的数据表、字符等。常量的数据类型只有整型、浮点型、字符型、字符串型和位标量。(3)字符型常量字符型常量是单引号内的字符,如a,d等。表示不显示的控制字符,可以在该字符
14、前面加一个反斜杠“”组成专用转义字符,常用转义字符如表7-3所示。o空字符(NULL)00H/0n换行符(LF)0AH/10r回车符(CR)0DH/13转义字符含 义ASCII 码(16/10 进制)表7-3 常用转义字符表t水平制表符(HT)09H/9b退格符(BS)08H/8f换页符(FF)0CH/12单引号27H/39双引号22H/34反斜杠5CH/92141常量常量是在程序运行过程中不能改变的量,如固定的数据表、字符等。常量的数据类型只有整型、浮点型、字符型、字符串型和位标量。(4)字符串型常量字符串型常量由双引号内的字符组成,如“test”,“OK”等。当引号内没有字符时,为空字符串
15、。在C中字符串常量是做为字符类型数组来处理的,在存储字符串时系统会在字符串尾部加上“0”转义字符以作为该字符串的结束符。字符串常量“A”和字符常量A是不同的,前者在存储时多占用一个字节的空间。15(5)位标量位标量是C51编译器的一种扩充数据类型,它的值是一个二进制位,不是0就是1。下面我们来看一些常量定义的例子:#define False 0 x0;/用预定义语句可以定义常量,这里定义False为0,True 为1#define True 0 x1; /在程序中用到False编译时自动用0替换,同理True替换为1unsigned int code a=100; /这一句用code把a定义在
16、程序存储器中并赋值const unsigned int c=100; /用const定义c为无符号int常量并赋值以上两句它们的值都保存在程序存储器中,而程序存储器在运行中是不允许被修改的,所以如果在这两句后面用了类似a=110,a+这样的赋值语句,编译时将会出错。1常量常量是在程序运行过程中不能改变的量,如固定的数据表、字符等。常量的数据类型只有整型、浮点型、字符型、字符串型和位标量。162变量变量是可以在程序运行过程中不断变化的量,变量的定义可以使用所有C51编译器支持的数据类型。要在程序中使用变量必须先用标识符作为变量名,并指出所用的数据类型和存储模式,这样编译系统才能为变量分配相应的存
17、储空间。17(1)变量的定义和作用范围定义一个变量的格式如下:存储类型 数据类型 存储器类型 变量名表在定义格式中除了数据类型和变量名表是必要的,其他都是可选项。存储类型不同存储类型的变量以及不同位置定义的变量具有不同的代码有效范围,也就是变量的作用域。在单片机程序中,按照变量的存储类型,可以分为:自动变量、全局变量、静态变量和寄存器变量。2变量18存储类型自动变量是以关键字auto标识的变量类型,其一般是在函数的内部或者复合语句中使用。自动型变量的作用域范围是函数或者复合语句的内部。在C51中,函数或复合语句内部定义自动变量时,关键字auto可以省略,即默认为自动型变量。在程序执行过程中,自
18、动变量是动态分配存储空间的。当程序执行到该变量声明语句时,根据变量类型自动为其分配存储空间。当该函数或者复合语句执行完毕后,该变量的存储空间将立刻自动取消,此时,该自动变量失效,在函数或者复合语句外部将不能够使用该变量。 自动变量全局变量是以关键字extern标识的变量类型,如果一个变量定义在所有函数的外部,即整个程序文件的最前面,那么这个变量便是全局变量。全局变量有时也称为外部变量。在编译程序时,全局变量将被静态地分配适当的存储空间。该变量一旦分配空间,在整个程序运行过程中便不会消失。因此,全局变量对整个程序文件都有效,即全局变量可以被该程序文件中的任何函数使用。 全局变量静态变量以关键字s
19、tatic定义,从变量作用域来看,静态变量和自动变量类似,作用域只是定义该变量的函数内部。如果静态变量定义在函数外部,将具有全局的作用域。而从内存占用的角度,静态变量和全局变量类似,其始终占有内存空间。单片机的CPU寄存器中也可以保存少量的变量,这种变量称为寄存器变量。寄存器变量以关键字register声明。由于单片机对CPU寄存器的读写十分快,因此寄存器变量的操作速度要原高于其他类型的变量。寄存器变量常用于某一变量名频繁使用的情况,这样做可以提高系统的运算速度。由于单片机资源有限,程序中只允许同时定义两个寄存器变量。如果多于两个,在编译时会自动地将其他的寄存器变量当做非寄存器变量来处理。 寄
20、存器变量 静态变量19存储器类型存储器类型的说明就是指定该变量在C51硬件系统中所使用的存储区域,并在编译时准确的定位。表7-4中是KEIL uVision2所能认别的存储器类型。表7-4 存储器类型存储器类型说 明data直接访问内部数据存储器(128 字节),访问速度最快bdata可位寻址内部数据存储器(16 字节),允许位与字节混合访问idata间接访问内部数据存储器(256 字节),允许访问全部内部地址pdata分页访问外部数据存储器(256 字节),用MOVXRi指令访问xdata外部数据存储器(64KB),用MOVXDPTR指令访问code程序存储器(64KB),用MOVCA+DP
21、TR指令访问 在AT89C51芯片中RAM只有低128位,位于80H到FFH的高128位则在52芯片中才有用,并和特殊寄存器地址重叠。说 明20如果省略存储器类型,系统则会按编译模式small,compact或large所规定的默认存储器类型去指定变量的存储区域。 small存储模式small存储模式将函数参数和局部变量放在片内RAM(默认变量类型为DATA,最大128字节)。另外所有对象包括栈都优先放置在片内RAM,当片内RAM用满,再向片外RAM放置。 compact存储模式compact存储模式中将参数和局部变量放在片外RAM(默认存储类型是PDATA,最大256字节);通过R0、R1间
22、接寻址。 large存储模式large存储模式将参数和局部变量直接放入片外RAM(默认的存储类型 是 X D A T A , 最 大64KB);使用数据指针DPTR间接寻址,因此访问效率较低。21对变量进行绝对定位C51扩展的关键字_at_专门用于对变量作绝对定位,_at_使用在变量的定义中,其格式为:存储类型 数据类型 存储区 变量名1 _at_ 地址常数,变量名2例如: 对data区域中的 unsigned char变量aa作绝对定位:unsigned chardata aa _at_ 0 x30; 对pdata区域中的 unsigned int数组cc作绝对定位:unsigned int
23、 pdata cc10 _at_ 0 x34; 对xdata区域中的 unsigned char变量printer_port作绝对定位:unsigned charxdata printer_port _at_ 0 x7fff;22对变量进行绝对定位绝对地址变量在定义时不能初始化,因此不能对code型常量绝对定位对变量绝对定位的几点说明:绝对地址变量只能够是全局变量,不能在函数中对变量绝对定位绝对地址变量多用于I/O端口,一般情况下不对变量作绝对定位位变量不能使用_at_绝对定位23(2)变量的初始化和赋值 变量的初始化变量的初始化是指变量在被说明的同时赋给一个初值。外部变量和静态全程变量在程序
24、开始处被初始化,局部变量包括静态局部变量是在进入定义它们的函数或复合语句时才作初始化。所有全程变量在没有明确的初始化时将被自动清零,而局部变量和寄存器变量在未赋值前其值是不确定的。对于外部变量和静态变量,初值必须是常数表达式,而自动变量和寄存器变量可以是任意的表达式,这个表达式可以包括常数和前面说明过的变量和函数。24例如:float f0,f1=0.2; /定义全程变量,在初始化时f0被清零,f1被赋0.2main()static int i=10,j; /定义静态局部变量,初始化时i被赋10,j不确定int k=i*5; /定义局部变量,初始化时k 被赋10*5=50char c=y; /
25、定义字符型指什变量并初始化 变量的初始化25 变量的赋值变量赋值是给已说明的变量赋给一个特定值。单个变量的赋值: 整型变量和浮点变量。赋值格式如下:变量名=表达式;例如:main()int a,m; /定义局部整型变量a,mfloat n; /定义局部浮点变量na=100,m=20; /给变量赋值n=a*m*0.1; C语言中允许给多个变量赋同一值时可用连等的方式。说 明main()int a,b,c;a=b=c=0;/同时给a,b,c赋值26 变量的赋值 字符型变量。字符型变量可以用三种方法赋值。例如:main()char a0,a1,a2; /定义局部字符型变量a0,a1,a2a0=b;
26、/将字母b赋给a0a1=50; /将十进制数字2的ASCII值50赋给a1a2=x0d; /将回车符赋给a227287.2.1算术运算符7.2.2关系运算符7.2.3逻辑运算符7.2.4布尔“位”运算符7.2.5赋值运算符7.2.6递增/递减运算符7.2.7运算符的优先级29单片机C程序的运算符和表达式如下: 关系运算符6个= 大于xy若x变量的值大于y变量的值,其结果为1,否则为0。 小于x=大于等于x=y若x变量的值大于或等于y变量的值,则结果为1,否则为0。=小于等于xy)|(yz)若x变量的值大于y变量的值,或y变量的值也大于z变量的值,其结果为真(值为1),否则为假(值为0)!非运算
27、!(xy)若x变量的值大于y变量的值,其结果为真(值为1),否则为假(值为0)33布尔“位”运算符与逻辑运算符比较相似,不同之处在于逻辑运算的最终结果为真或假,而布尔“位”运算符的结果是一个具体数据。布尔“位”运算符如表7-8所示。表7-8 布尔“位”运算符符号作用举例解释&与运算A=x&y变量A的结果为将x与y变量的每个位进行AND运算|或运算B=x|y变量B的结果为将x与y变量的每个位进行OR运算异或运算C=xy变量C的结果为将x与y变量的每个位进行XOR运算取反运算D=x变量D的结果为将x与y变量的每个位进行取反运算 左移运算E=x 右移运算F=xn变量F的结果为将变量x值右移n位。34
28、赋值运算符包括“=”运算符,还有算术运算符,逻辑运算符等,如表7-9所示。表7-9 赋值运算符=赋值A=x将x变量的值赋给变量A中+=赋值加B+=x将B变量的值与x变量的值相加,和存存到变量B当中,功能相当于B=B+x- =赋值减C-=x将C变量的值与x变量的值相减,差存存到变量C当中,功能相当于C=C+x* =赋值乘D*=x将D变量的值与x变量的值相乘,积存入D变量当中,功能相当于D=D*x/ =赋值除E/=x将E变量的值除于变量x,商存入到变量E当中,功能相当于E=E/x% =赋值取余F%=x将F变量的值除于x变量,余数存入F变量中,功能相当于F=F%x符号作用举例解释& =赋值与G&=x
29、将G变量的值与变量x的值进行AND运算,其结果存入G变量中,功能相当于G=G&x| =赋值或H|=x将H变量的值与x变量的值进行OR运算,结果存入H变量中,功能相当于H=H&x =赋值异或I=x将I变量的值与x变量的值进行XOR运算,结果存入I变量中,功能相当于I=Ix =左移赋值J=n将J变量的值左移n位,其功能与J=J =右移赋值K=n将K变量的值右移n位,其功能与K=Kn相当35递增/递减运算符也是一种比较有效的运算符,包括自增与自减运算符,如表7-10所示。表7-10 递增/递减运算符符号作用举例解释+ +自加1x+将x变量的值自加1 - -自减1x- -将x变量的值自减136运算符的
30、优先级如表7-11所示。表7-11 运算符的优先级1(、)小括号2、!取补码、反相运算符3+ +、- -自加1,自减14*、/、%乘、除、取余数5+、-加、减6左移、右移7、=、=、!=关系运算符优先级运算符或提示符解释8&布尔“位”AND运算符9布尔“位”XOR运算符10|布尔“位”OR运算符11&逻辑运算符AND12|逻辑运算符OR13=、*=、/=、%=、+=、-=、=、&=、=、|=赋值运算符37387.3.1循环指令7.3.2选择指令39循环指令就是将程序流控制在指定的循环里,直到符合指定条件才结束循环,继续往下执行。Keil C所提供的循环指令有for语句、while语句、do-w
31、hile语句。1计数循环for语句是一个很实用的计数循环,其格式如下:for(表达式1;表达式2;表达式3) 指令; break; 例如:for(int i=0;i0;x-) for(;);2前条件循环while语句将判断条件放在语句之前,称为前条件循环,其格式如下:while(表达式) 指令; break; 3后条件循环do-while语句提供先执行再判断的功能,称为后条件循环,其格式如下:do 指令; break; while(表达式);40选择指令的功能是根据条件决定程序的流程,Keil C所提供的选择指令有if-else语句及switch-case语句。if-else语句提供条件判断的
32、语句,称为条件选择语句,其格式(如下)与流程图(如图7-1):if(表达式) 指令区域1; else 指令区域2; 图7-1 if-else条件选择流程图if的多重条件判断语句如下,其流程图如图7-2所示。if(表达式1) 指令区域1; else if(表达式2) 指令区域2; else if(表达式3) 指令区域3; else 指令区域4; 图7-2 if-else 条件判断多重选择流程图1条件选择412多分支选择switch-case语句提供多重选择,就像是波段开关一样,称为多分支选择语句。这种选择方式不会有优先等级的问题,其格式如下,switch-case语句的流程图如图7-3所示。sw
33、itch(表达式) case(常数1); 指令区域1; break; case(常数2): 指令区域2; break; default: 指令区域n; break; 图7-3 switch-case多重选择流程图4243数组也是一种变量,将一堆相同数据形态的变量,以一个相同的变量名称来表示。既然是一种变量,使用之前就得声明,其声明格式如下:数据类型 数组名数组大小例如声明一个含有5个字符的数组:char LPC5;这个数组包括LPC0LPC4等5个字符,是字符的数组,相当于常说的“字符串”。但是Keil C没有“字符串”数据类型,所以用字符数组来代替字符串变量。声 明 数 组 的 同 时 也
34、可 以 赋 初 值 , 如 c h a r LPC5=ABCD经过上述声明后,LPC0=A, LPC1=B, LPC2=C, LPC3=D, LPC4= 0。数组(array)是一种将同类型数据集合管理的数据结构,而指针(Pointer)是存放存储器地址的变量,因此,数组与指针可谓是数据管理的好帮手。若不知道数组的大小可不填数组大小,而由程序来处理,例如:char string1= welcome to hua dong jiao da li gong xue yuan如果声明整数(int)或浮点数(float)数组,也要指定其初始值,可利用大括号实现,语句如下:int Num6= 30,22
35、,33,44,55,66;若要定义多维数组,可以按如下形式:数据类型 数组名数组大小1数组大小2数组大小n;如:int Num32=10,11,12,13,14,15;1数组442指针指针是用来存放存储器地址的变量,既然是变量,使用前均需要先定义才能使用。数据类型 *变量名称;通常指针都采用整数数据类型,例如要声明一个名为ptr的指针,语句如下:int *ptr;也可以将同类型的变量与指针放在一起声明,语句如下:int *ptr1, *ptr2, a, b, c;与指针息息相关的运算符是“&”,该运算符的功能是取变量的地址,运算符可以将指定的变量的地址放入指针变量,以便后续操作,语句如下:pt
36、r1=&a;执行以上语句后,a变量的地址就被放入ptr1指针变量。当然,这些操作主要是针对数组,通常会先取得数组的第一个元素的地址,如ptr1=&Num00;执行以上语句后,Num数组的首地址将被放入ptr1指针变量。若要将Num00内容输出到P2口,可执行P2=Num00;或以指针变量的方式实现以上操作,语句如下:P2=*ptr1;同理,若要将Num11的内容赋值给P2,语句如下:P2=Num11;或以指针变量的方式实现以上操作,语句如下:P2=*(ptr1+3);4546函数(Function)和中断子程序都属于子程序。也可以称函数为子程序,称中断子程序为中断函数。1函数函数的结构与主程序
37、的结构类似,不过函数还能传入自变量,其结构如下:void Sub_name(int x) int i, j ; unsigned char LED; LED=0 xff;/*关闭LED*/ 其中,void为传出自变量,Sub_name为函数名,x为传入自变量,“int i,j;和unsigned char LED;”为变量声明区,“LED=0 xff; /*关闭LED*/”为程序区。47中断子程序的结构与函数的结构类似,不过中断子程序不能传入自变量,也不返回值。而且使用中断子程序之前不需要声明,但需要在主程序中进行中断的相关设置。从中断子程序的第一行就可以看出它与一般函数的不同,如下所示:vo
38、id 中断子程序名称 (void) interrupt 中断编号 using 寄存器组2中断子程序 中断子程序不能被主程序调用,中断子程序的命名只要符合规定的字符串即可。说 明interrupt右边标示中断编号,Keil C提供031等32个中断编号,不过8051只使用04,8052则使用05,例如要声明为INT0外部中断,则标识为“interrupt 0”;若要声明为T0定时计数器中断,则标识为“interrupt 1”。using右边标示中断子程序里所要采用的寄存器组。8051内部有4组寄存器组,即RB0RB3。通常主程序使用RB0,根据需要在子程序里使用其他寄存器组,以避免数据的冲突。若
39、不指定寄存器组,则可省略本项目。4849所谓“预处理命令”,是指先经过预处理器处理后,才进行编译的命令。通常,除条件编译命令外,预处理命令放置于整个程序的开头。1定义命令#define命令用来指定常数、字符串或宏函数的代名词,与汇编语言的“equ”、“reg”命令一样,#define命令的格式如下:#define 代名词 常数 (字符串或宏函数)比如要从P0口输出,则可以将outputs定义为P2,语句如下。#define outputs P2经过上述定义后,如果在程序中要输出到P2的指令,就可以用output代替,语句如下:outputs=0 xff;/* 输出 1111 1111 */进行
40、编译时,预处理器会将整个程序里的所有“outputs”替换为P2,所以将这个指令改为:P2=0 xff;/* 输出 1111 1111 */50#include命令的功能是将指定的定义或声明等文件放入程序之中。常用于引入标准库函数文件,下面介绍一些常用的C51头文件:absacc.h包含允许直接访问8051不同存储区的宏定义;assert.h文件定义assert 宏,可以用来建立程序的测试条件;ctype字符转换和分类程序;intrins.h文件包含指示编译器产生嵌入式固有代码的程序的原型;math.h数学程序;reg51.h51的特殊寄存器;reg52.h52的特殊寄存器;setjmp.h定
41、义jmp_buf类型和setjmp和longjmp程序的原型;stdarg.h可变长度参数列表程序;stdlib.h存储区分配程序;stdio.h标准输入和输出程序;string.h字符串操作程序、缓冲区操作程序。对于常用的MCS-51单片机,必须包含reg51.h的头文件,因为该文件对51单片机的相关寄存器及位进行了定义,这样在程序中才可以使用这些资源。2包含命令51C语言是一种可移植性很高的程序语言,源程序可在不同版本的C语言编译器下进行编译。当然,不同的C语言编译器提供不同的资源与指令语法。这时候,就可应用条件式编译命令来区分不同的编译器。在8051的程序设计里也可以应用条件式编译命令以适应不同的外围与控制方式。条件编译格式如下:#if 表达式 程序1#else 程序2#endif若表达式成立,则编译程序1,否则编译程序2。3条件式编译命令谢谢观看