《51单片机C语言简介81.ppt》由会员分享,可在线阅读,更多相关《51单片机C语言简介81.ppt(102页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第第7 7章章 51 51单片机单片机C C语言简介语言简介 7.1 C 7.1 C语言的根本知识语言的根本知识 7.2 C51 7.2 C51程序设计的根本语法程序设计的根本语法 7.3 C51 7.3 C51程序设计程序设计 7.4 7.4 函数函数 7.5 7.5 模块化程序设计模块化程序设计 7.6 C51 7.6 C51编程实例编程实例 7.1 C7.1 C语言的根本知识语言的根本知识 7.1.1C语言的特点与程序结构语言的特点与程序结构以以前前计计算算机机的的系系统统软软件件主主要要是是用用汇汇编编语语言言编编写写的的,对对于于单单片片机机应应用用系系统统来来说说更更是是如如此此。
2、由由于于汇汇编编语语言言程程序序的的可可读读性性和和可可移移植植性性都都较较差差,采采用用汇汇编编语语言言编编写写单单片片机机应应用用系系统统程程序序的的周周期期长长,而而且且调调试试和和排排错错也也比比较较困困难难。为为了了提提高高编编制制计计算算机机系系统统和和应应用用程程序序的的效效率率,改改善善程程序序的的可可读读性性和和可可移移植植性性,最最好好采采用用高高级级语语言言编编程程。C语语言言既既具具有有一一般般高高级级语语言言的的特特点点,又又能能直直接接对对计计算算机机的的硬硬件件进进行行操操作作,并并且且采采用用C语语言言编编写写的的程程序序能能够够很很容容易易地地在在不不同同类类
3、型型的的计计算算机机之之间间进进行行移移植植。与与其其它它计计算算机机高高级级语语言相比,言相比,C语言具有它自身的特点:语言具有它自身的特点:1语言简洁,使用方便灵活。语言简洁,使用方便灵活。2可移植性好。可移植性好。3表达能力强。表达能力强。4可进行结构化程序设计。可进行结构化程序设计。5可以直接操作计算机硬件。可以直接操作计算机硬件。6生成的目标代码质量高生成的目标代码质量高。尽管尽管C语言具有很多的优点,但和其它任何一种程序设计语言具有很多的优点,但和其它任何一种程序设计语言一样,也有其自身的缺点,如不能自动检查数组的边界,语言一样,也有其自身的缺点,如不能自动检查数组的边界,各种运算
4、符的优先级别太多,某些运算符具有多种用途等。各种运算符的优先级别太多,某些运算符具有多种用途等。C语言程序是由假设干个函数单元组成的,每个函数都是语言程序是由假设干个函数单元组成的,每个函数都是完成某个特殊任务的子程序段。组成一个程序的假设干个函数完成某个特殊任务的子程序段。组成一个程序的假设干个函数可以保存在一个源程序文件中,也可以保存语言源程序文件的可以保存在一个源程序文件中,也可以保存语言源程序文件的文件名由程序设计人员根据某种俗成规那么自己确定,其扩展文件名由程序设计人员根据某种俗成规那么自己确定,其扩展名统一为名统一为“.C。如。如A11.C、A21.C。C语言程序的开始局部通常是预
5、处理命令,如程序中通常语言程序的开始局部通常是预处理命令,如程序中通常遇到的遇到的include命令。这个预处理命令通知编译器在对程序命令。这个预处理命令通知编译器在对程序进行编译时,将所需要的头文件读入后再一起进行编译。一般进行编译时,将所需要的头文件读入后再一起进行编译。一般在在“头文件中包含有程序在编译时的一些必要的信息,通常头文件中包含有程序在编译时的一些必要的信息,通常C语言编译器都会提供假设干个不同用途的头文件。头文件的语言编译器都会提供假设干个不同用途的头文件。头文件的读入是在对程序进行编译时才完成的。读入是在对程序进行编译时才完成的。C语语言言程程序序是是由由函函数数所所组组成
6、成的的。一一个个完完整整的的C语语言言程程序序应应包包含含一一个个主主函函数数main和和假假设设干干个个其其它它功功能能的的函函数数。函函数数之之间间可可以以相相互互调调用用,但但main函函数数只只能能调调用用其其它它的的功功能能函函数数,而而不不能能被被其其它它函函数数所所调调用用。功功能能函函数数可可以以是是C语语言言编编译译器器提提供供的的库库函函数数,也也可可以以由由用用户户按按实实际际需需要要自自行行编编写写的的函函数数。不不管管main函函数数处处于于程程序序中中的的什什么么位位置置,程程序序总总是是从从main函函数开始执行。一个函数必须预先定义或声明后才能调用。数开始执行。
7、一个函数必须预先定义或声明后才能调用。函函数数定定义义或或声声明明位位于于源源程程序序的的预预处处理理命命令令之之后后的的开开始始位位置置。函函数数定定义义局局部部包包括括有有函函数数的的存存储储类类型型、返返回回值值数数据据类类型型、函函数数名名、形形式式参参数数说说明明等等,函函数数名名后后面面必必须须跟跟一一个个圆圆括括弧弧,形形式式参参数数说说明明在在圆圆括括弧弧内内进进行行。函函数数也也可可以以没没有有形形式式参参数数,如如main()。函函数数的的位位置置比比较较自自由由。可可以以由由程程序序设设计计人人员员安安排排在在函函数数定定义义后后的的任任意意位位置置。函函数数由由函函数数
8、名名和和一一对对花花括括弧弧“组组成成,在在“里里面面的的内内容容就就是是函函数数体体,如如果果一一个个函函数数有有多多个个“,那么最外面的一对,那么最外面的一对“为函数体的范围。为函数体的范围。函函数数体体的的内内容容为为假假设设干干条条语语句句,一一般般有有两两类类语语句句,一一类类为为说说明明语语句句,用用来来对对函函数数中中将将要要用用到到的的变变量量进进行行定定义义;另另一一类类为为执执行行语语句句,用用来来完完成成一一定定的的功功能能或或算算法法处处理理。有有的的函函数数体体仅仅有有一一对对“,其其中中既既没没有有变变量量定定义义语语句句,也也没没有有执执行行语语句句,这这也也是是
9、合合法法的的,称称为为“空函数。空函数。C语语言言源源程程序序可可以以采采用用任任何何一一种种编编辑辑器器来来编编写写,既既可可以以是是windows环环境境下下的的编编辑辑器器,如如记记事事本本NOTEPAD或或写写字字板板WORDPAD,也也可可以以是是DOS环环境境下下的的编编辑辑器器,如如EDIT或或PE等等。C语语言言程程序序的的书书写写格格式式十十分分自自由由。一一条条语语句句可可以以写写成成一一行行,也也可可以以写写成成几几行行;还还可可以以在在一一行行内内写写多多条条语语句句;但但是是需需要要注注意的是,每条语句都必须以分号意的是,每条语句都必须以分号“;作为结束符。;作为结束
10、符。另另外外,C语语言言区区分分大大小小写写字字母母,C语语言言编编译译器器在在对对程程序序进进行行编编译译时时,对对于于程程序序中中同同一一个个字字母母的的大大小小写写作作为为不不同同的的变变量量来来处处理理。虽虽然然C语语言言程程序序不不要要求求具具有有固固定定的的格格式式,但但我我们们在在实实际际编编写写程程序序时时还还是是应应该该遵遵守守一一定定的的规规那那么么,一一般般应应按按程程序序的的功功能能以以“缩缩格格形形式式来来写写程程序序,同同时时还还应应在在适适当当的的地地方方加加上上必必要要的的注注释释。注注释释对对于于比比较较大大的的程程序序来来说说是是十十分分重重要要的的,这这有
11、利于修改与读懂程序。有利于修改与读懂程序。C语语言言本本身身没没有有输输入入输输出出功功能能,C语语言言程程序序的的输输入入和和输输出出是是通通过过函函数数调调用用来来实实现现的的。FranklinC51编编译译器器提提供供的的输输入入输输出出库库函函数数scanf和和printf是是通通过过8051单单片片机机的的串串行行口口实实现现的的,在在程程序序中中使使用用这这种种输输入入输输出出库库函函数数之之前前必必须须先先对对8051单单片片机机的的串串行行口口进进行行初初始始化化。但但是是对对于于单单片片机机应应用用系系统统来来说说,由由于于具具体体要要求求的的不不同同,应应用用系系统统的的输
12、输入入输输出出方方式式多多种种多多样样,不不可可能能一一律律采采用用串串行行口口作作输输入入和和输输出出。因因此此应应该该根根据据实实际际需需要要,由由应应用用系系统统的的研研制制人人员员自自己己来来编编写写满满足足特特定定需需要要的的输输入入输输出出函函数数,这这一一点点对对于于单单片片机机应应用用系系统统的的开开发发研研制制人人员员来来说说是是十十分重要的。分重要的。7.1.2C语言的标识符和关键字语言的标识符和关键字C语语言言的的标标识识符符是是用用来来标标识识源源程程序序中中某某个个对对象象名名字字的的。这这些些对对象象可可以以是是函函数数、变变量量、常常量量、数数组组、数数据据类类型
13、型、存存储储方方式式、语语句句等等。一一个个标标识识符符由由字字符符串串、数数字字和和下下划划线线等等组组成成,第第一一个个字字符符必必须须是是字字母母或或下下划划线线,通通常常以以下下划划线线开开头头的的标标识识符符是是编编译译系系统统专专用用的的,因因此此在在编编写写C语语言言源源程程序序时时一一般般不不要要使使用用以以下下划划线线开开头头的的标标识识符符,而而将将下下划划线线用用作作分分段段符符。C51编编译译器器规规定定标标识识符符最最长长可可达达255个个字字符符,但但只只有有前前面面32个个字字符符在在编编译译时时有有效效,因因此此在在编编写写源源程程序序时时标标识识符符的的长长度
14、度不不要要超超过过32个个字字符符。程程序序中中对对于于标标识识符符的的命命名名应应当当简简洁洁明明了了,含含义义清清晰晰,便便于于阅阅读读理理解解,如如用用标标识识符符“max表表示示最最大大值值,用用“TIMER0表示定时器表示定时器0等。等。关关键键字字是是一一类类具具有有固固定定名名称称和和特特定定含含义义的的特特殊殊标标识识符符,又又称称为为保保存存字字。在在编编写写C语语言言源源程程序序时时一一般般不不允允许许将将关关键键字字另另作作别别用用,换换句句话话说说就就是是对对于于标标识识符符的的命命名名不不要要与与关关键键字字相相同同。在在C语语言言中中,ANSIC标标准准一一共共规规
15、定定了了32个个关关键键字字,表表7.1按用途列出了按用途列出了ANSIC标准的关键字。标准的关键字。表表7.1ANSIC标准的关键字标准的关键字关键字关键字用用途途说说明明autobreakcasecharconstcontinuedefaultdodoubleelseenumexternfloatforgotoifintlongregisterreturnshortsignedsizeofstaticstructswitchtypedefunionunsignedvoidvolatilewhile存储类说明存储类说明程序语句程序语句程序语句程序语句数据类型说明数据类型说明存储类型说明存储类
16、型说明程序语句程序语句程序语句程序语句程序语句程序语句数据类型说明数据类型说明程序语句程序语句数据类型说明数据类型说明存储种类说明存储种类说明数据类型说明数据类型说明程序语句程序语句程序语句程序语句程序语句程序语句数据类型说明数据类型说明数据类型说明数据类型说明存储种类说明存储种类说明程序语句程序语句数据类型说明数据类型说明数据类型说明数据类型说明运算符运算符存储种类说明存储种类说明数据类型说明数据类型说明程序语句程序语句数据类型说明数据类型说明数据类型说明数据类型说明数据类型说明数据类型说明数据类型说明数据类型说明数据类型说明数据类型说明程序语句程序语句用以说明局部变量用以说明局部变量退出最
17、内层循环退出最内层循环switch语句中的选择项语句中的选择项单字节整型数或字符型数据单字节整型数或字符型数据在程序执行过程中不可能修改的变量值在程序执行过程中不可能修改的变量值转向下一个循环转向下一个循环switch语句中的失败选择项语句中的失败选择项构成构成dowhile循环结构循环结构双精度浮点数双精度浮点数构成构成ifelse选择结构选择结构枚举枚举在其它程序模块中说明了的全局变量在其它程序模块中说明了的全局变量单精度浮点数单精度浮点数构成构成for循环结构循环结构构成构成goto转移结构转移结构构成构成ifelse选择结构选择结构基本整型数基本整型数长整型数长整型数使用使用CPU内部
18、寄存器的变量内部寄存器的变量函数返回函数返回短整型数短整型数有符号数,二进制数据的最高位为符号位有符号数,二进制数据的最高位为符号位计算表达式或数据类型的字节数计算表达式或数据类型的字节数静态变量静态变量结构类型数据结构类型数据构成构成switch选择结构选择结构重新进行数据类型定义重新进行数据类型定义联合数据类型联合数据类型无符号数据无符号数据无符号数据无符号数据说明该变量在程序执行中可被隐含地改变说明该变量在程序执行中可被隐含地改变构成构成while和和dowhile循环结构循环结构关键字关键字用用 途途说说 明明bitsbitsfrsfr16databdataidatapdataxdat
19、acodeinterruptUsingreetrant位标量声明位标量声明位标量声明位标量声明特殊功能寄存器声明特殊功能寄存器声明特殊功能寄存器声明特殊功能寄存器声明存储器类型声明存储器类型声明存储器类型声明存储器类型声明存储器类型说明存储器类型说明存储器类型说明存储器类型说明存储器类型说明存储器类型说明存储器类型说明存储器类型说明中断函数说明中断函数说明寄存器组定义寄存器组定义再入函数声明再入函数声明声明一个位标量或位类型的函数声明一个位标量或位类型的函数声明一个可位寻址变量声明一个可位寻址变量声明一个特殊功能寄存器(声明一个特殊功能寄存器(8位)位)声明一个声明一个16位的特殊功能寄存器位
20、的特殊功能寄存器直接寻址直接寻址的的8051内部数据存储器内部数据存储器可位寻址可位寻址的的8051内部数据存储器内部数据存储器间接寻址间接寻址的的8051内部数据存储器内部数据存储器“分分页页”寻寻址址的的8051外外部部数数据据存存储储器器8051外部外部数据存储器数据存储器8051程序存储器程序存储器定义一个中断函数定义一个中断函数定义定义8051工作寄存器组工作寄存器组定义一个再入函数定义一个再入函数C51C51编编译译器器除除了了支支持持ANSI ANSI C C标标准准关关键键字字以以外外,还还扩扩展展了了如如表表7.27.2所示的关键字:所示的关键字:表表7.27.2C51C51
21、编译器的扩展关键字编译器的扩展关键字7.1.3 7.1.3 单片机单片机C51C51程序的编译连接与调试程序的编译连接与调试 FranklinC51交交叉叉编编译译器器是是专专为为8051系系列列单单片片机机设设计计的的C语语言言编编译译器器,它它能能在在IBMPC及及其其兼兼容容机机上上运运行行,使使用用非非常常方方便便。为为了了保保证证编编译译器器能能正正常常工工作作,PC机机应应具具有有512K以以上上的的内内存存、一一个个软软盘盘驱驱动动器器、一一个个硬硬盘盘,采采用用MSDOS3.0以以上上版版本本的的操操作作系系统统。FranklinC51以以软软件件包包的的形形式式提提供供,软软
22、件件包包中中主主要要有有C51交交叉叉编编译译器器、A51交交叉叉汇汇编编器器、L51连连接接定定位位器器、OHS51代代码码转转换换器器和和dScope一一51软软件件仿仿真真调调试试器器以以及及其其它它一一些些实实用用软软件件程程序序。如如果果在在PC机机的的硬硬盘盘C:上上安安装装C51编编译译器器,在在安安装装之之前前应应对对PC机机的的配配置置文文件件CONFIG.SYS和自动批处理文件和自动批处理文件AUTOEXEC.BAT作如下修改:作如下修改:CONFIG.SYS:FIELS20BUFFER20AUTOEXEC.BAT:SETC51LIB=C:C51LIBSETC51INCC:
23、CSIINCSETPATH=C:C51BIN这这样样修修改改之之后后,C51编编译译器器会会当当头头文文件件不不在在当当前前目目录录时时,能能从从C:C51INC子子目目录录中中找找到到头头文文件件;L51连连接接器器会会自自动动为为所所有有的的编编译译模模式式及及算算术术尤尤其其是是浮浮点点运运算算功功能能从从C:C51LIB于目录中找到所需要的库文件。于目录中找到所需要的库文件。C51编编译译器器可可根根据据不不同同的的硬硬件件环环境境由由4个个文文件件做做出出修修改。以下配置文件包括在改。以下配置文件包括在C51软件包中:软件包中:STARTUP.A51:C51编编译译器器的的启启动动程
24、程序序,所所有有的的栈栈指针和存贮器,只要需要,将被初始化。指针和存贮器,只要需要,将被初始化。INT.A51:在在文文件件中中已已明明确确初初始始化化了了的的变变量量作作初初始始化化。如如果果系系统统装装了了“看看门门狗狗,该该文文件件可可包包含含附附加加的的“看看门门狗狗刷新。刷新。PUTCHAR.C:函函数数“printf、“puts等等的的字字符符输输出出核核心心程程序序,该该程程序序可可根根据据用用户户硬硬件件加加以以修修改改如如LCD显示。显示。GETKEY.C:函函数数“getchar、“scanf等等的的字字符符输输入入核核心心程程序序,该该程程序序可可根根据据硬硬件件加加以以
25、修修改改如如矩矩阵阵键键盘盘所有文件都包含在所有文件都包含在C运行库中,因此,不能在连运行库中,因此,不能在连接时指定调用。如果用户改变一个文件,可将其编译接时指定调用。如果用户改变一个文件,可将其编译后与其它目标文件一起连接,因而不必改动运行库。后与其它目标文件一起连接,因而不必改动运行库。库中原文件自动忽略。库中原文件自动忽略。例:例:L51MYMODUL1.OBJ,MYMODUL2.OBJ,STARTUP.OBJ,PUTCHAR.OBJ上例将用户建立的上例将用户建立的STARTUP.OBJ和和PUTCHAR.OBJ连接起来。连接起来。用用C语言编写的程序必须通过编译和连接之后,语言编写的
26、程序必须通过编译和连接之后,才能生成可执行代码。才能生成可执行代码。C51编译器由命令编译器由命令“C51启启动,例如以动,例如以EXI2.C为文件名的程序编译命令如下;为文件名的程序编译命令如下;C51EXI2.CCODEDEBUG回车回车C51是是编编译译器器启启动动命命令令,EXI2.C是是程程序序文文件件名名,CODE和和DEBUG是是编编译译控控制制指指令令。输输入入完完命命令令后后回回车车,即即可可进进人人编编译译过过程程。如如果果编编译译过过程程中中未未发发现现错误,屏幕上会显示出:错误,屏幕上会显示出:C51 COMPILATION COMPILETE,0WARINGS,0ER
27、RORS并并产产生生列列表表文文件件EXI2.LST和和目目标标文文件件EXI2.OBJ。如如果果编编译译中中发发现现任任何何错错误误,那那么么不不产产生生目目标标文文件件,而而将将所所有有的的错错误误信信息息都都在在列列表表文文件件中中表表示示出出来来。编编译译控控制制指指令令CODE使使列列表表文文件件的的后后面面附附加加一一个个汇汇编编语语言言文文件件。编编译译控控制制指指令令DEBUG使使目目标标文文件件中中包包含含有有进进行行源源程程序序调调试试时时需需要要的的各各种种符符号号信信息息。目目标标文文件件中中还还包包含含有有可可再再定定位位的的目目标标码码,以以供供L51连连接接器器作
28、作进进一一步步的的处处理理。C51编编译译器器提提供供了了许许多多不不同同控控制指令可以完成各种编译控制功能。制指令可以完成各种编译控制功能。7.2 C517.2 C51程序设计的根本语法程序设计的根本语法C语言是一种程序设计语言,采用语言是一种程序设计语言,采用C语言进行程序设语言进行程序设计时,需要遵循一定的语法规那么。计时,需要遵循一定的语法规那么。7.2.1C语言的数据类型语言的数据类型C语言的数据结构是以数据类型出现的,数据类型可分语言的数据结构是以数据类型出现的,数据类型可分为根本数据类型和复杂数据类型,复杂数据类型由根本数为根本数据类型和复杂数据类型,复杂数据类型由根本数据类型构
29、造而成。据类型构造而成。C语言中的根本数据类型有语言中的根本数据类型有char,int,short,long,float和和double。对于。对于C51编译器来说,编译器来说,short型与型与int型相同,型相同,double型与型与float型相同。分别说明如下:型相同。分别说明如下:1char字符类型。有字符类型。有signedchar和和unsignedchar之之分,默认值为分,默认值为signedchar。对于。对于signedchar型数据,其字型数据,其字节中的最高位表示该数据的符号,节中的最高位表示该数据的符号,“0表示正数,表示正数,“l表示负数。负数用补码表示。所能表示
30、的数值范围是表示负数。负数用补码表示。所能表示的数值范围是128127;unsignedchar型数据,是无符号字符型数据,其字型数据,是无符号字符型数据,其字节中的所有位均用来表示数据的数值,所表示的数值范围节中的所有位均用来表示数据的数值,所表示的数值范围是是0255。2int整整型型。有有signedint和和unsignednit之之分分,默默认认值值为为signedint。signedint是是有有符符号号整整型型数数,字字节节中中的的最最高高位位表表示示数数据据的的符符号号,“0表表示示正正数数,“1表表示示负负数数。所所能能表表示示的的数数值值范范围围是是32768+32767。
31、unsignedint是是无无符符号号整整型型数数,所所表表示示的的数数值范围是值范围是065535。3long长长整整型型。有有signedlong和和unsignedlong之之分分,默默认认值值为为signedlong。它它们们的的长长度度均均为为四四个个字字节节。singedlong是是有有符符号号的的长长整整型型数数据据,字字节节中中的的最最高高位位表表示示数数据据的的符符号号,“0表表示示正正数数,“1表表示示负负数数。数数值值的的表表示示范范围围是是21474836482147483647;unsignedlong是是无无符符号号长长整整型型数数据据,数值的表示范围是数值的表示范
32、围是04294967295。4float浮点型。它是符合浮点型。它是符合IEEE754标准的标准的单精度浮点型数据,在十进制中具有单精度浮点型数据,在十进制中具有7位有效数字。位有效数字。float型数据占用四个字节型数据占用四个字节2位二进制数。位二进制数。需要需要指出的是,对于浮点型数据除了有正常数值之外,指出的是,对于浮点型数据除了有正常数值之外,还可能出现非正常数值。根据还可能出现非正常数值。根据IEEE标准,当浮点型标准,当浮点型数据取以下数值数据取以下数值16进制数时即为非正常值:进制数时即为非正常值:FFFFFFFFH非数非数NaN;7F800000H正溢出正溢出INF;FF80
33、0000H负溢出负溢出INF;另外,由于另外,由于8051单片机不包括捕获浮点运算错单片机不包括捕获浮点运算错误的中断向量,因此必须由用户自己根据可能出现误的中断向量,因此必须由用户自己根据可能出现的错误条件用软件来进行适当的处理。的错误条件用软件来进行适当的处理。5*指指针针型型。指指针针型型数数据据不不同同于于以以上上四四种种根根本本数数据据类类型型,它它本本身身是是一一个个变变量量,但但在在这这个个变变量量中中存存放放的的不不是是普普通通的的数数据据而而是是指指向向另另一一个个数数据据的的地地址址。指指针针变变量量也也要要占占据据一一定定的的内内存存单单元元,在在C51中中指指针针变变量
34、量的的长长度度一一般般为为3个个字字节节。指指针针变变量量也也具具有有类类型型,其其表表示示方方法法是是在在指指针针符符号号“*的的前前面面冠冠以以数数据据类类型型符符号号。如如char*Pointl;表表示示Pointl是是一一个个字字符符型型的的指指针针变变量量。指指针针变变量量的的类类型型表表示示该该指指针针所所指指向向地地址址中中数数据据的的类类型型。使使用用指指针针型型变变量量可可以以方方便便地地对对8051单单片片机机的的各各局局部部物物理理地地址直接进行操作。址直接进行操作。6bit位位标标量量。这这是是C51编编译译器器的的一一种种扩扩充充数数据据类类型型,利利用用它它可可定定
35、义义一一个个位位标标量量,但但不不能能定定义义位指针,也不能定义位数组。位指针,也不能定义位数组。7 7sfr sfr 特特殊殊功功能能存存放放器器。这这也也是是C C 5151编编译译器器的的一一种种扩扩充充数数据据类类型型,利利用用它它可可以以访访问问80518051单单片片机机的的所所有有内内部部特特殊殊功功能能存存放放器器。sfrsfr型型数数据据占占用用一一个个内内存单元,其取值范围存单元,其取值范围0 0255255。8 8sfr16 sfr16 1616位位特特殊殊功功能能存存放放器器。它它占占用用两两个个内存单元,取值范围是内存单元,取值范围是0 06553565535。9 9
36、sbit sbit 可可寻寻址址位位。这这也也是是C51C51编编译译器器的的一一种种扩扩充充数数据据类类型型,利利用用它它可可以以访访80518051单单片片机机内内部部RAMRAM中中的可寻址位或特殊功能存放器中的可寻址位。的可寻址位或特殊功能存放器中的可寻址位。在在C C语言程序中的表达式或变量赋值运算中,有语言程序中的表达式或变量赋值运算中,有时会出现运算对象的数据不一致的情况,时会出现运算对象的数据不一致的情况,C C语言允许语言允许任何标准数据类型之间的隐式转换。隐式转换按以下任何标准数据类型之间的隐式转换。隐式转换按以下优先级别自动进行:优先级别自动进行:bit char int
37、 long float signed bit char int long float signed unsignedunsigned 转换时由低向高进行,而不是数据转换时的顺序。转换时由低向高进行,而不是数据转换时的顺序。一般来说,如果有几个不同类型的数据同时参加运算,一般来说,如果有几个不同类型的数据同时参加运算,先将低级别类型的数据转换成高级别类型,再作运算先将低级别类型的数据转换成高级别类型,再作运算处理,并且运算结果为高级别类型数据。处理,并且运算结果为高级别类型数据。C51 C51编译器除了能支持以上这些根本数据之外,编译器除了能支持以上这些根本数据之外,还能支持一些复杂的构造型数据
38、,如结构类型、联合还能支持一些复杂的构造型数据,如结构类型、联合类型等。类型等。7.2.2 7.2.2 常量常量 常量是在程序执行过程中其值不能改常量是在程序执行过程中其值不能改变的量。常量的数据类型有整型、浮点型、变的量。常量的数据类型有整型、浮点型、字符型和字符串型等,字符型和字符串型等,C51C51编译器还扩充了编译器还扩充了一种位一种位bitbit标量。分别说明如下:标量。分别说明如下:1 1整型常量整型常量 整型常量就是整型常数,可表示为以整型常量就是整型常数,可表示为以下几种形式:十进制整数;十六进制整数:下几种形式:十进制整数;十六进制整数:以以 0X 0X开头的数是十六进制数,
39、开头的数是十六进制数,ANSI CANSI C标准标准规定十六进制数的数字为规定十六进制数的数字为0 09 9,再加字母,再加字母a af f;长整数:在数字后面加一个字母;长整数:在数字后面加一个字母L L就就构成了长整数。构成了长整数。2 2浮点型常量浮点型常量 浮点型常量有十进制表示形式和指数浮点型常量有十进制表示形式和指数表示形式。表示形式。十进制表示形式又称定点表示形式,十进制表示形式又称定点表示形式,由数字和小数点组成。如由数字和小数点组成。如 0.3141 0.3141、31.4131.41、314.1314.1及及0.00.0都是十进制数表示形式的浮点都是十进制数表示形式的浮点
40、型常量。型常量。在在这这种种表表示示形形式式中中,如如果果整整数数或或小小数数局局部部为为0 0可可以以省略不写,但必须有小数点。省略不写,但必须有小数点。指数表示形式为:指数表示形式为:数字数字数字数字e e 数字数字 其其中中,中中的的内内容容为为可可选选项项,可可有有可可无无,但但其其余余局部必须有。局部必须有。3 3字符型常量字符型常量 字字符符型型常常量量是是单单引引号号内内的的字字符符,如如aa、bb等等。对对于于不不可可显显示示的的控控制制字字符符,可可以以在在该该字字符符前前面面加加一一个个反反斜斜杠杠字字符符“组组成成专专用用转转义义字字符符。利利用用转转义义字字符符可可以以
41、完成一些特殊功能和输出时的格式控制。完成一些特殊功能和输出时的格式控制。4 4字符串型常量字符串型常量 字字符符串串型型常常量量由由双双引引号号“内内的的字字符符组组成成。当当双双引引号号内内的的字字符符个个数数为为0 0时时,称称为为空空串串常常量量。需需要要注注意意的的是是,字字符符串串常常量量首首尾尾的的双双引引号号是是界界限限符符,当当需需要要表表示示双双引引号号字字符符串串时时,可可用用转转义义字字符符来来表表示示为为:“。如如:“I“I saysay:“goodbye“goodbye!字字符符串串为为I I saysay:“goodbye“goodbye!另另外外,C C语语言言将
42、将字字符符串串常常量量作作为为一一个个字字符符类类型型数数组组来来处处理理,在在存存储储字字符符串串常常量量时时,要要在在字字符符串串的的尾尾部部加加一一个个转转义义字字符符0 0作作为为该该字字符符串串常常量量的的结结束束符符。因因此此不不要要将将字字符符常常量量与与字字符符串串常量混淆。常量混淆。5 5位标量位标量 这这是是C51C51编编译译器器的的一一种种扩扩充充数数据据类类型型。位位标标量量用用关关键键字字“bit“bit来来定定义义,它它的的值值是是一一个个二二进进制制位位。一一个个函函数数中中可可以以包包含含“bit“bit类类型型的的参参数数,函函数数的的返返回回值值也也可可为
43、为“bit“bit型型。另另外,不能定义位指针,也不能定义位数组。外,不能定义位指针,也不能定义位数组。7.2.3 7.2.3 变量及其存储模式变量及其存储模式 和和常常量量相相比比,变变量量是是另另一一种种量量,在在程程序序执执行行过过程程中中其其值值能能不不断断变变化化。每每一一个个变变量量都都必必须须有有一一个个标标识识符符作作为为它它的的变变量量名名。在在使使用用一一个个变变量量之之前前,必必须须先先对对该该变变量量进进行行定定义义,指指出出它它的的数数据据类类型型和和存存储储模模式式,以以便便编编译译系系统统为为它它分分配配相相应应的的存存储单元。在储单元。在C51C51中对变量进行
44、定义的格式如下:中对变量进行定义的格式如下:存储种类数据类型存储器类型变量名表;存储种类数据类型存储器类型变量名表;其其中中,“存存储储种种类类和和“存存储储器器类类型型是是可可选选项项。变变量量的的存存储储种种类类有有四四种种:自自动动autoauto、外外部部externextern、静静态态staticstatic和和存存放放器器registerregister。在在定定义义一一个个变变量量时时如如果果省省略略存存储储种种类类选选项项,那那么么该该变变量量将将为为自自动动autoauto变变量。量。定定义义一一个个变变量量时时除除了了需需要要说说明明其其数数据据类类型型之之外外,C51C
45、51编编译译器器还还允允许许说说明明变变量量的的存存储储器器类类型型。Franklin Franklin C51C51对对于于每每个个变变量量可可以以准准确确地地赋赋予予其其存存储储器器类类型型,从从而而可可使使之之能能够够在在单单片机系统内准确地定位。片机系统内准确地定位。定定义义变变量量时时如如果果省省略略“存存储储器器类类型型选选项项,那那么么按按编编译译模模式式SMALLSMALL、COMPACTCOMPACT或或LARGELARGE所所规规定定的的默默认认存存储储器器类类型型确确定定变变量量的的存存储储区区域域,不不能能位位于于存存放放器器中中的的参参数数传传递递变变量量和和过过程程
46、变变量量也也保保存存在在默默认认的的存存储储器器区区域域。C51C51编编译译器器的的三三种种存存储储器模式默认的存储器类型对变量的影响如下:器模式默认的存储器类型对变量的影响如下:1.1.SMALL SMALL 变变量量被被定定义义在在 80518051单单片片机机的的内内部部数数据据存存储储器器中中,因因此此对对这这种种变变量量的的访访问问速速度度最最快快。另另外外,所所有有的的对对象象,包包括括堆堆栈栈,都都必必须须嵌嵌入入内内部部数数据据存存储储器器,而而堆堆栈栈的的长长度度是是很很重要的,实际栈长取决于不同函数的嵌套深度。重要的,实际栈长取决于不同函数的嵌套深度。2.2.COMPAC
47、T COMPACT 变变量量被被定定义义在在分分页页外外部部数数据据存存储储器器中中,外外部部数数据据段段的的长长度度可可达达256256字字节节。这这时时对对变变量量的的访访问问是是通通过过存存放放器器间间接接寻寻址址MOVX MOVX RiRi进进行行的的,堆堆栈栈位位于于80518051单单片片机机内内部部数数据据存存储储器器中中。采采用用这这种种编编译译模模式式时时,变变量量的的高高 8 8位位地地址址由由 P2P2口口确确定定。因因此此,在在采采用用这这种种模模式式的的同同时时,必必须须适适当当改改变变启启动动程程序序 STARTUPSTARTUPA51A51中中的的参参数数:PDA
48、TASTARTPDATASTART和和PDATALENPDATALEN;用用L51L51进进行行连连接接时时还还必必须须采采用用连连接接控控制制命命令令PDATAPDATA来来对对P2P2口口地地址址进进行行定定位位,这这样样才才能能确确保保P2P2口口为为所所需需要要的的高高8 8位地址。位地址。3.3.LARGE LARGE 变变量量被被定定义义在在外外部部数数据据存存储储器器中中最最大大可可达达64K64K字字节节,使使用用数数据据指指针针DPTRDPTR来来间间接接访访问问变变量量。这这种种访访问问数数据据的的方方法法效效率率是是不不高高的的,尤尤其其是是对对于于2 2个个或或多多个个
49、字字节节的的变变量量,用用这这种种数数据据访访问问方方法法相相当当影影响响程程序序的的代代码码长长度度。另另外外一一个不方便之处是这种数据指针不能对称操作。个不方便之处是这种数据指针不能对称操作。需需要要特特别别指指出出的的是是,变变量量的的存存储储种种类类与与存存储储器器类类型型是是完完全无关的。例如:全无关的。例如:static unsigned char data x static unsigned char data x;*在内部数据在内部数据 存存储储器器中中定定义义一一个个静静态态无无符符号字符型变量号字符型变量x *x *int y int y;*定义一个自动整型变量定义一个自动
50、整型变量y y,它的存储器,它的存储器 类型由编译模式确定类型由编译模式确定 *为为了了能能够够直直接接访访问问这这些些特特殊殊功功能能存存放放器器,C51C51编编译译器器扩扩充充了了关关键键字字 sfrsfr和和 sfr16sfr16,利利用用这这种种扩扩充充关关键键字字可可以以在在C C语语言言源源程程序序中中直直接接对对80518051单单片片机机的的特特殊殊功功能能存存放放器器进进行行定定义义。定定义义方法如下:方法如下:sfr sfr 特殊功能存放器名特殊功能存放器名=地址常数;地址常数;例例如如:sfr sfr P0 P0=0 x800 x80;*定定义义 I IO O口口 P0