1、 单片机单片机C语言及程序设计语言及程序设计1.1 C51概述概述1.2 C51数据类型及存储数据类型及存储1.3 C51变量的定义及数变量的定义及数据存储区域据存储区域1.4 C51位变量的定义位变量的定义1.5 C51特殊功能寄存器特殊功能寄存器的定义的定义1.6 C51指令的定义指令的定义1.7 C51的输入的输入/输出输出1.8 C51函数的定义函数的定义1.9 C51与汇编语言与汇编语言混合编程混合编程1.10 C51集成开发集成开发软件软件Keil C目目 录录本章主要讨论本章主要讨论C51变量的定义和函数的定变量的定义和函数的定义,以及义,以及Keil C软件的使用等。软件的使用
2、等。本章内容的安排,认为读者已经学习过本章内容的安排,认为读者已经学习过C语言,具有语言,具有C语言的基本知识,因此,本章语言的基本知识,因此,本章内容完全是结合单片机来讲解,也就是补充内容完全是结合单片机来讲解,也就是补充C语言在单片机方面的概念、数据定义和函语言在单片机方面的概念、数据定义和函数定义等。数定义等。通过本章学习,使读者能够比较顺利地通过本章学习,使读者能够比较顺利地编写编写C51程序。程序。1.1 C51概述概述主要内容主要内容1.1.1 C语言编程的优势语言编程的优势1.1.2 C51与与ANSI C的区别的区别1.1.3 C51扩展的关键字扩展的关键字1.1 C51概述概
3、述学习单片机学习单片机C语言的必要性语言的必要性随着单片机性能的不断提高,随着单片机性能的不断提高,C语言编译语言编译调试工具的不断完善,以及现在对单片机产调试工具的不断完善,以及现在对单片机产品辅助功能的要求、对开发周期不断缩短的品辅助功能的要求、对开发周期不断缩短的要求,使得要求,使得越来越多的单片机编程人员转向越来越多的单片机编程人员转向使用使用C语言语言,因此有必要在单片机课程中讲,因此有必要在单片机课程中讲授授“单片机单片机C语言语言”。“C51”概念:概念:为了与为了与ANSI C区别,区别,把把“单片机单片机C语言语言”称为称为“C51”,也称为,也称为“Keil C”。1.1.
4、1 C语言编程的优势语言编程的优势在编程方面,使用在编程方面,使用C51较汇编语言有诸多较汇编语言有诸多优势:优势:1)编程容易)编程容易 2)容易实现复杂的数值计算)容易实现复杂的数值计算3)容易阅读与交流)容易阅读与交流4)容易调试与维护程序)容易调试与维护程序5)容易实现模块化开发)容易实现模块化开发 6)程序可移植性好)程序可移植性好 1.1.2 C语言与语言与ANSI 的区别的区别用汇编语言编写单片机程序时,必须要用汇编语言编写单片机程序时,必须要考虑其存储器的结构考虑其存储器的结构,尤其要考虑其片内数,尤其要考虑其片内数据存储器、特殊功能寄存器是否正确合理的据存储器、特殊功能寄存器
5、是否正确合理的使用,以及按照实际地址端口数据的处理。使用,以及按照实际地址端口数据的处理。用用C51编写程序,虽然不像汇编语言那样编写程序,虽然不像汇编语言那样需要具体地组织、分配存储器资源,但是需要具体地组织、分配存储器资源,但是C51对数据类型和变量的定义,必须要与单对数据类型和变量的定义,必须要与单片机的存储结构相关联片机的存储结构相关联,否则编译器不能正,否则编译器不能正确地映射定位。确地映射定位。用用C51编写单片机程序,与用编写单片机程序,与用ANSI C编编写程序的写程序的不同之处是不同之处是,需要根据单片机存储需要根据单片机存储器结构及内部资源,定义相应的数据类型和器结构及内部
6、资源,定义相应的数据类型和变量变量。其它的语法规定、程序结构及程序设计其它的语法规定、程序结构及程序设计方法,都与方法,都与ANSI C相同。所以相同。所以本章主要介本章主要介绍绍C51各种变量的定义、指针定义、函数定各种变量的定义、指针定义、函数定义和混合编程义和混合编程。1.1.3 C51扩展的关键字扩展的关键字由于单片机在结构及编程上的特殊要求,由于单片机在结构及编程上的特殊要求,C51有自己的特殊关键字,称之为有自己的特殊关键字,称之为C51扩展扩展的关键字的关键字,下面给出常用的,下面给出常用的C51扩展的关键扩展的关键字。字。_at_bdatabit codedataidata i
7、nterruptpdatareentrant sbitsfrsfr16usingvolatilexdata这些关键字在后面会陆续接触到,此处这些关键字在后面会陆续接触到,此处先不给出它们的含义。先不给出它们的含义。1.2 C51数据类型及存储数据类型及存储主要内容主要内容1.2.1 C51的数据类型的数据类型1.2.2 C51数据的存储数据的存储表表4-1 C51数据类型、长度和数值范围数据类型、长度和数值范围数据类型数据类型表示方法表示方法长长 度度数数 值值 范范 围围无符号字符型无符号字符型 unsigned char 1字节字节 0255有符号字符型有符号字符型 signed char
8、1字节字节-128127无符号整型无符号整型unsigned int2字节字节 065535有符号整型有符号整型signed int2字节字节-3276832767无符号长整型无符号长整型 unsigned long 4字节字节 04294967295有符号长整型有符号长整型 signed long4字节字节-21474836482147483647浮点型浮点型float4字节字节 1.1755E-383.40E+38特殊功能寄特殊功能寄存器型存器型sfrsfr161字节字节2字节字节0255065535位类型位类型bit、sbit1位位0或或1数据类型转换数据类型转换1)自动转换)自动转换转
9、换规则是向高精度数据类型转换、向转换规则是向高精度数据类型转换、向有符号数据类型转换有符号数据类型转换。如字符型变量与整型。如字符型变量与整型变量相加时,则位变量先转换字符型或整型变量相加时,则位变量先转换字符型或整型数据,然后相加。数据,然后相加。2)强制转换)强制转换像像ANSI C一样,一样,通过强制类型转换的方通过强制类型转换的方式进行转换式进行转换。如:。如:unsignedintb;floatc;b=(int)c;1.2.2 C51数据的存储数据的存储MCS-51单片机只有单片机只有bit和和unsigned char两两种数据类型支持机器指令种数据类型支持机器指令,而其它类型的数
10、,而其它类型的数据都需要转换成据都需要转换成bit或或unsigned char型进行存型进行存储。储。为了减少单片机的存储空间和提高运行为了减少单片机的存储空间和提高运行速度,要尽可能地使用速度,要尽可能地使用unsigned char型数据。型数据。一、位变量的存储一、位变量的存储bit和和sbit型位变量,直接存于型位变量,直接存于RAM的位的位寻址空间,包括低寻址空间,包括低128位和特殊功能寄存器位和特殊功能寄存器位。位。二、字符变量的存储二、字符变量的存储字符变量字符变量(char):无论是无论是unsigned char数据还是数据还是signed char数据,均为数据,均为1
11、个字个字节,能够被直接存储在节,能够被直接存储在RAM中,可以存储中,可以存储在在00 x7f区域,也可以存储在区域,也可以存储在0 x800 xff区区域,与变量的定义有关。域,与变量的定义有关。unsigned char数:数:可直接被可直接被MSC-51接受接受signed char数据:数据:用补码表示。用补码表示。需要额需要额外的操作外的操作来测试、处理符号位,使用的是两来测试、处理符号位,使用的是两种库函数,代码量大,运算速度降低。种库函数,代码量大,运算速度降低。三、整型变量的存储三、整型变量的存储整型变量整型变量(int):不管是不管是unsigned int数据还是数据还是s
12、igned int数据,均为数据,均为2个字节,其个字节,其存存储方法是高位字节保存在低地储方法是高位字节保存在低地址址(在前面),(在前面),低位字节保存低位字节保存在高地址在高地址(在后面)(在后面)。例如,例如,整型变量的值为整型变量的值为0 x1234,在内存,在内存中的存放如右图所示。中的存放如右图所示。signed int数据用补码表示。数据用补码表示。地址地址低低高高:1234:四、长四、长整型变量的存储整型变量的存储长整型变量(长整型变量(long)为)为4个个字节,其存储方法与整型数据字节,其存储方法与整型数据一样,是一样,是最高位字节保存的地最高位字节保存的地址最低址最低(
13、在最前面),(在最前面),最低位最低位字节保存的地址最高字节保存的地址最高(在最后(在最后面)。面)。如长整型变量的值为如长整型变量的值为0 x12345678,在内,在内存中的存放方法如右图所示。不管是存中的存放方法如右图所示。不管是unsigned long数据还是数据还是signed long数据。数据。地址地址低低高高:12345678:五、浮点五、浮点型变量的存储型变量的存储浮点型变量浮点型变量(fload)占)占4个字节,个字节,用指数用指数方式表示方式表示,其具体格式与编译器有关。,其具体格式与编译器有关。对于对于Keil C,采用的是,采用的是IEEE-754标准标准,具有具有
14、24位精度,尾数的最高位始终为位精度,尾数的最高位始终为1,因,因而不保存。而不保存。具体分布为:具体分布为:1位符号位,位符号位,8位阶位阶码位,码位,23位尾数,如下图所示。位尾数,如下图所示。字节地址字节地址0123浮点数浮点数内容内容SEEEEEEEEMMMMMMMMMMMMMMMMMMMMMMM符号和阶码符号和阶码 尾数高位尾数高位尾数低位尾数低位符号位符号位S:1表示负数,表示负数,0表示正数。表示正数。阶码:阶码:用移码表示。如,实际阶码用移码表示。如,实际阶码-126用用1表示,实际阶码表示,实际阶码0用用127表示,表示,即实际阶即实际阶码数加上码数加上127得到阶码的表达数
15、得到阶码的表达数。阶码数值范围:阶码数值范围:-126+128。例如浮点数例如浮点数-12.5符号位为符号位为1,12.5的二进制数为的二进制数为1100.1=1.1001E+0011,阶码数值为阶码数值为3+127=130=10000010B,尾数为尾数为1001。因此,其十六进制数为因此,其十六进制数为0 xC1480000,则存储结构,则存储结构如右图所示。如右图所示。地址地址低低高高:C1480000:说明:说明:教材中存储结构是错的。教材中存储结构是错的。1.3 C51变量的定义及数据存储区域变量的定义及数据存储区域主要内容主要内容1.3.1 C51变量的定义变量的定义1.3.2 C
16、51变量的存储类型变量的存储类型1.3.3 C51变量的存储区域变量的存储区域1.3.4 C51变量定义举例变量定义举例1.3.5 C51变量的存储模式变量的存储模式1.3.6 C51变量的绝对定位变量的绝对定位1.3.1 C51变量的定义变量的定义C51变量定义的一般格式为:变量定义的一般格式为:存储类型存储类型数据类型数据类型 存储区存储区变量名变量名1=初值初值,变量名变量名2=初值初值,或或存储类型存储类型存储区存储区 数据类型数据类型 变量名变量名1=初值初值,变量名变量名2=初值初值,可见变量可见变量(非位变量)(非位变量)的定义由的定义由4部分组部分组成成,即在变量定义时,指定变
17、量,即在变量定义时,指定变量4种属性。种属性。数据类型:数据类型:在前面的在前面的4.2中已经叙述过,中已经叙述过,对于变量名也无须多说,对于变量名也无须多说,下面主要解释下面主要解释“存存储类型储类型”和和“存储区存储区”等概念等概念。1.3.2 C51变量的存储类型变量的存储类型存储类型这个属性我们仍沿用存储类型这个属性我们仍沿用ANSI C的的说法说法,尽量不改变原来的含义。,尽量不改变原来的含义。按照按照ANSI C,C语言的变量有语言的变量有4种存储类种存储类型型:动态存储(动态存储(auto)静态存储(静态存储(static)全局存储(全局存储(extern)寄存器存储(寄存器存储
18、(register)一、动态存储一、动态存储动态(存储)变量:动态(存储)变量:用用auto定义的为动态定义的为动态变量,也叫自动变量变量,也叫自动变量。作用范围:作用范围:在定义它的函数内或复合语在定义它的函数内或复合语句内部。句内部。当定义它的函数或复合语当定义它的函数或复合语句执行时,句执行时,C51才为变量分配存储空间,结才为变量分配存储空间,结束时所占用的存储空间释放。束时所占用的存储空间释放。定义变量时,定义变量时,auto可以省略可以省略,或者说如果,或者说如果省略了存储类型项,则认为是动态变量。省略了存储类型项,则认为是动态变量。动动态变量一般分配使用寄存器或堆栈态变量一般分配
19、使用寄存器或堆栈。二、静态存储二、静态存储静态(存储)变量:静态(存储)变量:用用static定义的为静定义的为静态变量态变量。分为内部静态和外部静态变量。分为内部静态和外部静态变量。内部静态变量:内部静态变量:在函数体内定义的为内在函数体内定义的为内部静态变量部静态变量。在函数内可以任意使用和在函数内可以任意使用和修改,函数运行结束后会一直存在,但在函修改,函数运行结束后会一直存在,但在函数外不可见,即在函数体外得到保护。数外不可见,即在函数体外得到保护。外部静态变量:外部静态变量:在函数体外部定义的为在函数体外部定义的为外部静态变量外部静态变量。在定义的文件内可以任意使。在定义的文件内可以
20、任意使用和修改,外部静态变量会一直存在,但在用和修改,外部静态变量会一直存在,但在文件外不可见,即在文件外得到保护。文件外不可见,即在文件外得到保护。三、外部存储三、外部存储外部(存储)变量:外部(存储)变量:用用extern声明声明的变量的变量为外部变量为外部变量,是在其它文件定义过的全局变,是在其它文件定义过的全局变量。量。用用extern声明后,便可以在所声明声明后,便可以在所声明的文件中使用。的文件中使用。需要注意的是:需要注意的是:在定义变量时,即便是在定义变量时,即便是全局变量,也不能使用全局变量,也不能使用extern定义定义。四、寄存器存储四、寄存器存储寄存器(存储)变量:寄存
21、器(存储)变量:用用register定义的定义的变量为寄存器变量变量为寄存器变量。寄存器变量存放在寄存器变量存放在CPU的寄存器中的寄存器中,这,这种变量处理速度快,但数目少。种变量处理速度快,但数目少。C51中的寄存器变量:中的寄存器变量:C51的编译器在编的编译器在编译时,能够自动识别程序中使用译时,能够自动识别程序中使用频率高的变频率高的变量量,并将其,并将其安排为寄存器变量安排为寄存器变量,用户不用专,用户不用专门声明。门声明。1.3.3 C51变量的存储区域变量的存储区域变量的存储区属性是单片机扩展的概念变量的存储区属性是单片机扩展的概念,非常重要,非常重要,它涉及到它涉及到7个新的
22、关键字个新的关键字。MCS-51单片机有四个存储空间单片机有四个存储空间,分成三,分成三类,它们是片内数据存储空间、片外数据存类,它们是片内数据存储空间、片外数据存储空间和程序存储空间。储空间和程序存储空间。MCS-51单片机有更多的存储区域:单片机有更多的存储区域:由于由于片内数据存储器和片外数据存储器又分成不片内数据存储器和片外数据存储器又分成不同的区域,所以同的区域,所以单片机的变量有更多的存储单片机的变量有更多的存储区域区域。在定义变量时,必须明确指出在定义变量时,必须明确指出是存放在哪个区域是存放在哪个区域。表表1-2 C51存储区与存储空间的对应关系存储区与存储空间的对应关系关键字
23、关键字对应的存储空间及范围对应的存储空间及范围codeROM空间,空间,64KB全空间全空间data片内片内RAM,直接寻址,低,直接寻址,低128字节字节bdata片内片内RAM,位寻址区,位寻址区0 x200 x2f,可字节访问,可字节访问idata 片内片内RAM,间接寻址,间接寻址,256字节,与字节,与 Ri 对应对应pdata片外片外RAM,分页寻址的,分页寻址的256字节字节(P2不变不变),P2改变可寻址改变可寻址64KB全空间,与全空间,与MOVX Ri 对应对应xdata片外片外RAM,64KB全空间全空间bit片内片内RAM位寻找区位寻找区,位地址位地址0 x000 x7
24、f,128位位1.3.4 C51变量定义举例变量定义举例1)定义存储在)定义存储在data区域区域的的动态动态unsigned char变量:变量:unsigned char data sec=0,min=0,hou=0;2)定义存储在)定义存储在data区域区域的的静态静态unsigned char变量:变量:static unsigned char data scan_code=0 xfe;3)定义存储在)定义存储在data区域区域的的静态静态unsigned int变量:变量:static unsigned int data dd;4)定义存储在)定义存储在bdata区域区域的的动态动态
25、unsigned char变量:变量:unsigned char bdata operate,operate1;/定义指示操作的可位寻址的变量定义指示操作的可位寻址的变量5)定义存储在)定义存储在idata区域区域的的动态动态unsigned char数组:数组:unsigned char idata temp20;6)定义在)定义在pdata区域区域的的动态动态有符号有符号int数数组:组:int pdata send_data30;/定义存放发送数据的数组定义存放发送数据的数组 7)定义存储在)定义存储在xdata区域区域的的动态动态unsigned int数组:数组:unsigned i
26、nt xdata receiv_buf50;/定义存放接受数据的数组定义存放接受数据的数组8)定义存储在)定义存储在code区域区域的的unsigned char数组:数组:unsigned char code dis_code10=0 x3f,0 x06,0 x5b,0 x4f,0 x66,0 x6d,0 x7d,0 x07,0 x7f,0 x6f;/定义共阴极数码管段码数组定义共阴极数码管段码数组1.3.5 C51变量的存储模式变量的存储模式存储模式:存储模式:如果在定义变量时缺省了存如果在定义变量时缺省了存储区属性,则编译器会自动选择默认的存储储区属性,则编译器会自动选择默认的存储区域,
27、区域,也就是存储模式也就是存储模式。变量的存储模式也就是程序(或函数)变量的存储模式也就是程序(或函数)的编译模式的编译模式。编译模式分为三种:编译模式分为三种:小模式(小模式(small)、)、紧凑模式(紧凑模式(compact)和大模式()和大模式(large)。)。编译模式由编译控制命令决定。编译模式由编译控制命令决定。存储模式(编译模式)决定了变量的默存储模式(编译模式)决定了变量的默认存储区域和参数的传递方法认存储区域和参数的传递方法。一、一、small模式模式在在small模式下,变量的默认存储区域是模式下,变量的默认存储区域是“data”、“idata”,即未指出存储区域的变,即
28、未指出存储区域的变量保存到片内数据存储器中,并且量保存到片内数据存储器中,并且堆栈也安堆栈也安排在该区域中排在该区域中。small模式的特点:模式的特点:存储容量小,但速度存储容量小,但速度快。快。在在small模式下参数的传递:模式下参数的传递:通过寄存器、通过寄存器、堆栈或片内数据存储区完成的。堆栈或片内数据存储区完成的。二、二、compact模式模式在在compact模式下,变量的默认存储区域模式下,变量的默认存储区域是是“pdata”,即未指出存储区域的变量保存,即未指出存储区域的变量保存到片外数据存储器的一页中,最大变量数为到片外数据存储器的一页中,最大变量数为256字节,并且字节,
29、并且堆栈也安排在该区域中堆栈也安排在该区域中。compact模式的其特点:模式的其特点:是存储容量较是存储容量较small模式大,速度较模式大,速度较small模式稍慢,但比模式稍慢,但比large模式要快。模式要快。在在compact模式下参数的传递:模式下参数的传递:通过片外通过片外数据区的一个固定页完成的。数据区的一个固定页完成的。三、三、large模式模式在在large模式下,变量的默认存储区域是模式下,变量的默认存储区域是“xdata”,即未指出存储区域的变量保存到,即未指出存储区域的变量保存到片外数据存储器,最大变量数可达片外数据存储器,最大变量数可达64KB,并且并且堆栈也安排在
30、该区域中堆栈也安排在该区域中。large模式的特点:模式的特点:存储容量大,速度慢存储容量大,速度慢large模式下参数的传递方式:模式下参数的传递方式:参数的传参数的传递也是通过片外数据存储器完成的。递也是通过片外数据存储器完成的。C51支持混合模式:支持混合模式:即可以对函数设置编即可以对函数设置编译模式,所以在译模式,所以在large模式下,可以对某些函模式下,可以对某些函数设置为数设置为compact模式或模式或small模式,从而提模式,从而提高运行速度。高运行速度。默认编译模式:默认编译模式:如果文件或函数未指明如果文件或函数未指明编译模式,则编译器按编译模式,则编译器按small
31、模式处理模式处理。编译模式控制命令:编译模式控制命令:“#pragma small(或或compact、large)”应放在文件的开始。应放在文件的开始。1.3.6 C51变量的绝对定位变量的绝对定位C51有三种方式可以对变量有三种方式可以对变量(I/O端口)端口)绝对定位:绝对定位:绝对定位关键字绝对定位关键字_at_、指针、库、指针、库函数的绝对定位宏。函数的绝对定位宏。对于后两种方式,在对于后两种方式,在后面指针一节介绍。后面指针一节介绍。C51扩展的关键字扩展的关键字_at_专门用于对变量作专门用于对变量作绝对定位绝对定位,_at_使用在变量的定义中,其格使用在变量的定义中,其格式为:
32、式为:存储类型存储类型 数据类型数据类型 存储区存储区 变量名变量名1 _at_ 地址常数地址常数,变量名,变量名2 举例说明举例说明_at_的使用方法的使用方法1)对)对data区域区域中的中的 unsigned char变量变量aa作绝对定位:作绝对定位:unsigned char data aa _at_ 0 x30;2)对)对pdata区域区域中的中的 unsigned int数组数组cc作绝对定位:作绝对定位:unsigned int pdata cc10 _at_ 0 x34;3)对)对xdata区域区域中的中的 unsigned char变量变量printer_port作绝对定位
33、:作绝对定位:unsigned char xdata printer_port _at_ 0 x7fff;对变量绝对定位的几点说明:对变量绝对定位的几点说明:1)绝对地址变量)绝对地址变量在定义时不能初始化在定义时不能初始化,因此不能对因此不能对code型变量绝对定位;型变量绝对定位;2)绝对地址变量)绝对地址变量只能够是全局变量只能够是全局变量,不,不能在函数中对变量绝对定位;能在函数中对变量绝对定位;3)绝对地址变量)绝对地址变量多用于多用于I/O端口端口,一般情,一般情况下不对变量作绝对定位;况下不对变量作绝对定位;3)位变量不能使用)位变量不能使用_at_绝对定位。绝对定位。1.4 C
34、51位变量的定义位变量的定义主要内容主要内容1.4.1 bit型位变量的定义型位变量的定义1.4.2 sbit型位变量的定义型位变量的定义1.4.1 bit型位变量的定义型位变量的定义常说的位变量指的就是常说的位变量指的就是bit型位变量型位变量。C51的的bit型位变量定义的一般格式为:型位变量定义的一般格式为:存储类型存储类型 bit 位变量名位变量名1=初值初值,位变量名,位变量名2=初值初值,bit位变量被保存在位变量被保存在RAM中的位寻址区中的位寻址区域域(字节地址为(字节地址为0 x200 x2f,16字节)。字节)。例如:例如:bitflag_run,receiv_bit=0;
35、static bit send_bit;两点说明:两点说明:1)bit型位变量与其它变量一样,型位变量与其它变量一样,可以可以作为函数的形参作为函数的形参,也可以作为,也可以作为函数的返回函数的返回值值,即函数的类型可以是位型的;,即函数的类型可以是位型的;2)位变量)位变量不能定义指针不能定义指针,不能定义数不能定义数组组。1.4.2 sbit型位变量的定义型位变量的定义对于能够按位寻址的特殊功能寄存器、对于能够按位寻址的特殊功能寄存器、定义在位寻址区域的变量(字节型、整型、定义在位寻址区域的变量(字节型、整型、长整型),可以对其各位用长整型),可以对其各位用sbit定义位变量。定义位变量。
36、为了方便起见,分开讨论为了方便起见,分开讨论按位寻址的特按位寻址的特殊功能寄存器中位变量的定义、按位寻址殊功能寄存器中位变量的定义、按位寻址的变量中位变量的定义。的变量中位变量的定义。一、特殊功能寄存器中位变量定义一、特殊功能寄存器中位变量定义能够按位寻址的能够按位寻址的特殊功能寄存器中位变特殊功能寄存器中位变量定义的一般格式为:量定义的一般格式为:sbit 位变量名位变量名 位地址表达式位地址表达式这里的位地址表达式有三种形式:这里的位地址表达式有三种形式:直接位地址直接位地址特殊功能寄存器名带位号特殊功能寄存器名带位号字节地址带位号字节地址带位号1、用直接位地址定义位变量、用直接位地址定义
37、位变量这种情况下位变量的定义格式为:这种情况下位变量的定义格式为:sbit 位变量名位变量名 位地址常数位地址常数这里的位地址常数范围为这里的位地址常数范围为0 x800 xff,实际是定义特殊功能寄存器的位实际是定义特殊功能寄存器的位。例如:。例如:sbitP0_0=0 x80;sbitP1_1=0 x91;sbitRS0=0 xd3;/定义定义PSW的第的第3位位sbitET0=0 xa9;/定义定义IE的第的第1位位 2、特殊功能寄存器名带位号定义、特殊功能寄存器名带位号定义这时位变量的定义格式为:这时位变量的定义格式为:sbit 位变量名位变量名 特殊功能寄存器名特殊功能寄存器名 位号
38、常数位号常数这里的位号常数为这里的位号常数为07。例如:。例如:sbitP0_3=P0 3;sbitP1_4=P1 4;sbitOV=PSW 2;/定义定义PSW的第的第2位位sbitES=IE 4;/定义定义IE的第的第4位位 3、寄存器地址带位号定义位变量、寄存器地址带位号定义位变量在这种情况下位变量的定义格式为:在这种情况下位变量的定义格式为:sbit 位变量名位变量名 特殊功能寄存器地址特殊功能寄存器地址 位号常数位号常数这里的位号常数同上,为这里的位号常数同上,为07。例如:。例如:sbitP0_6=0 x80 6;sbitP1_7=0 x90 7;sbitAC=0 xd0 6;/定
39、义定义PSW的第的第6位位sbitEA=0 xa8 7;/定义定义IE的第的第7位位 4、几点说明、几点说明1)用)用sbit定义的位变量,必须能够按位操作,定义的位变量,必须能够按位操作,而不能够对无位操作功能的位定义位变量。而不能够对无位操作功能的位定义位变量。2)用)用sbit定义位变量,必须放在函数外面作为定义位变量,必须放在函数外面作为全局位变量,而不能在函数内部定义。全局位变量,而不能在函数内部定义。3)用)用sbit每次只能定义一个位变量。每次只能定义一个位变量。4)对其它模块定义的位变量()对其它模块定义的位变量(bit型或型或 sbit型)型)的引用声明,都使用的引用声明,都
40、使用bit。5)用)用sbit定义的是一种绝对定位的位变量(因定义的是一种绝对定位的位变量(因为名字是与确定位地址对应的),具有特定的意为名字是与确定位地址对应的),具有特定的意义,在应用时不能像义,在应用时不能像bit型位变量那样随便使用。型位变量那样随便使用。二、二、位寻址区变量的位寻址区变量的位定义位定义对对bdata型变量(字节型、整型、长整型变量(字节型、整型、长整型)型),被保存在,被保存在RAM中的位寻址区,因此中的位寻址区,因此可以对可以对bdata型变量各位作位变量定义型变量各位作位变量定义。这样,既可以对这样,既可以对bdata型变量作字节型变量作字节(或整型、长整型)操作
41、,也可以作位操(或整型、长整型)操作,也可以作位操作。作。bdata型变量的位定义格式:型变量的位定义格式:sbit 位变量名位变量名 bdata型变量名型变量名 位号常数位号常数 bdata型变量为在此之前应该是定义过的型变量为在此之前应该是定义过的,位号常数可以是位号常数可以是07(8位字节变量),或位字节变量),或015(16位整型变量),或位整型变量),或031(32位字位字长整型变量)。例如:长整型变量)。例如:unsigned char bdataoperate;对对operate的低的低4位作位变量定义:位作位变量定义:sbit flag_key=operate 0;/键盘标志位
42、键盘标志位sbit flag_dis=operate 1;/显示标志位显示标志位sbit flag_mus=operate 2;/音乐标志位音乐标志位sbit flag_run=operate 3;/运行标志位运行标志位 1.5 C51特殊功能寄存器的定义特殊功能寄存器的定义主要内容主要内容1.5.1 8位特殊功能寄存器的定义位特殊功能寄存器的定义1.5.2 16位特殊功能寄存器的定义位特殊功能寄存器的定义1.5.1 8位特殊功能寄存器的定义位特殊功能寄存器的定义定义的一般格式为:定义的一般格式为:sfr特殊功能寄存器名特殊功能寄存器名 地址常数地址常数地址常数范围:地址常数范围:0 x800
43、 xff。特殊功能寄存器定义例子(见特殊功能寄存器定义例子(见reg51.h、reg52.h等文件):等文件):sfrP0=0 x80;/定义定义P0寄存器寄存器sfrP1=0 x90;/定义定义P1口寄存器口寄存器sfrPSW=0 xd0;/定义定义PSWsfrIE=0 xa8;/定义定义IE 1.5.2 16位特殊功能寄存器的定义位特殊功能寄存器的定义定义的一般格式为:定义的一般格式为:sfr16 特殊功能寄存器名特殊功能寄存器名 地址常数地址常数地址常数范围:地址常数范围:0 x800 xff。例如(见例如(见reg51.h、reg52.h等文件):等文件):sfr16 DPTR=0 x
44、82;sfr16 T2=0 xcc;/含含TL2和和TH2sfr16 RCAP2=0 xca;/含含RCAP2L/和和RCAP2H,0 xca为为RCAP2L的地址的地址几点说明:几点说明:1)定义特殊功能寄存器中的地址必须)定义特殊功能寄存器中的地址必须在在0 x800 xff范围内。范围内。2)定义特殊功能寄存器,必须放在函)定义特殊功能寄存器,必须放在函数外面作为全局变量。数外面作为全局变量。3)用)用sfr或或sfr16每次只能定义一个特殊每次只能定义一个特殊功能寄存器。功能寄存器。4)像)像sbit一样,用一样,用sfr或或sfr16定义的是绝定义的是绝对定位的变量(因为名字是与确定
45、地址对对定位的变量(因为名字是与确定地址对应的),具有特定的意义,在应用时不能应的),具有特定的意义,在应用时不能像一般变量那样随便使用。像一般变量那样随便使用。1.6 C51指针的定义指针的定义主要内容主要内容1.6.1 通用指针通用指针1.6.2 存储器专用指针存储器专用指针1.6.3 指针变换指针变换1.6.4 C51指针应用指针应用1.6 C51指针的定义指针的定义由于由于MCS-51单片机有三种不同类型的存单片机有三种不同类型的存储空间,并且还有不同的存储区域,储空间,并且还有不同的存储区域,因此因此C51指针的内容更丰富。指针的内容更丰富。指针除了具有像变量的四种属性(存储指针除了
46、具有像变量的四种属性(存储类型、数据类型、存储区、变量名)外,类型、数据类型、存储区、变量名)外,按按存储区,将指针分为通用指针和不同存储区存储区,将指针分为通用指针和不同存储区域的专用指针。域的专用指针。1.6.1 通用指针通用指针所谓通用指针,就是通过该类指针可以所谓通用指针,就是通过该类指针可以访问所有的存储空间访问所有的存储空间。在在C51库函数中通常使用这种指针来访库函数中通常使用这种指针来访问。问。通用指针用通用指针用3个字节来表示:个字节来表示:第一个字节:表示指针第一个字节:表示指针所指向的存储空间所指向的存储空间第二个字节:为指针第二个字节:为指针地址的高字节地址的高字节第三
47、个字节:为指针第三个字节:为指针地址的低字节地址的低字节通用指针的定义与一般通用指针的定义与一般C语言指针的定语言指针的定义相同,其格式为:义相同,其格式为:存储类型存储类型 数据类型数据类型 *指针名指针名1,*指针名指针名2,例如:例如:unsigned char *cpt;int *dpt;long *lpt;static char *ccpt;通用指针的特点:通用指针的特点:定义简单定义简单访问所有空间访问所有空间访问速度慢访问速度慢 1.6.2 存储器专用指针存储器专用指针所谓存储器专用指针,就是通过该类指所谓存储器专用指针,就是通过该类指针,只能够访问规定的存储空间区域针,只能够访
48、问规定的存储空间区域。指针本身占用指针本身占用1个字节(个字节(data*,idata*,bdata*,pdata*)或)或2个字节(个字节(xdata*,code*)。)。存储器专用指针的一般定义格式为:存储器专用指针的一般定义格式为:存储类型存储类型 数据类型数据类型 指向存储区指向存储区 *指针存储区指针存储区 指针名指针名1,*指针存储区指针存储区 指针名指针名2,指向存储区:指向存储区:是指针变量所指向的数据存储空间区域。是指针变量所指向的数据存储空间区域。不能够缺省不能够缺省。指针存储区:指针存储区:是指针变量本身所存储的空间区域。是指针变量本身所存储的空间区域。缺省时认为指针存储
49、区在默认的存储区缺省时认为指针存储区在默认的存储区域,其默认存储区域决定于所设定的编译域,其默认存储区域决定于所设定的编译模式。模式。指向和指针存储区,指向和指针存储区,两者可以是同一个两者可以是同一个区域,但多数情况下不会是同一个区域。区域,但多数情况下不会是同一个区域。存储器专用指针例子:存储器专用指针例子:unsigned char data *cpt1,*cpt2;signed int idata *dpt1,*dpt2;unsigned char pdata *ppt;signed long xdata *lpt1,*lpt2;unsigned char code *ccpt;上面所
50、定义的指针虽然所指向的空间上面所定义的指针虽然所指向的空间不同,但不同,但指针变量本身都存储在默认的存指针变量本身都存储在默认的存储区域储区域。又如又如:1)unsigned char data *idata cpt1,*idata cpt2;2)signed int idata *data dpt1,*data dpt2;3)unsigned char pdata *xdata ppt;4)signed long xdata *lpt1,*xdata lpt2;5)unsigned char code *data ccpt;绿色关键字绿色关键字为指针所指向的存储区为指针所指向的存储区蓝色关键