数据结构单片机C_第1页
数据结构单片机C_第2页
数据结构单片机C_第3页
数据结构单片机C_第4页
数据结构单片机C_第5页
已阅读5页,还剩52页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第二章 C51数据结构及存储模式(注意:有一些内容在C语言中已学过,为了讲课的完整性,有些内容还要讲,但讲的较快,复习性质)数据结构中包含了一门语言的编程精髓,对于学习编程语言是相当重要的。第一节 数据类型一、数据与数据类型 数据各种字母、数字符号的组合、语音、图形、图像等统称为数据,数据经过加工后就成为信息。不管使用任何语言、何种算法进行程序设计,最终在计算机中运行的只有数据流。 数据类型数据的不同格式叫作数据类型。 数据结构数据按一定的数据类型进行的排列、组合及架构称为数据结构。 c语言的数据结构是以数据类型出现的,数据类型可分为基本数据类型和构造数据类型,构造数据类型由基本数据类型构造而

2、成。c语言中的基本数据类型有char,int,short,1ong,float和double。对于c51编译器来说,short型与Int型相同,double型与float型相同。为了充分利用MCS-51 单片机的资源特点,C51 在ANSI C 的数据类型基础上增设了位型变量,取消了布尔变量,其实两者的使用方法基本类似。Cx51提供的数据结构是以数据类型的形式出现的。 KEIL Cx51编译器支持的数据类型、长度和值域如表所列。主要类型解释如下:1 char字符类型 char类型的长度是一个字节,分无符号字符类型unsigned char和有符号字符类型signed char,由于编译的智能化

3、程度很高,在只定义了char类型,可以自动适应有符号或无符号,如果你用默无符号数,只要0-255之间有效,如果是有符号数,在-128+127有效,否则编译可以通过,但运行结果是错误的,将超出的位舍掉,应特别注意。unsigned char类型用字节中所有的位来表示数值,可以表达的数值范围是0255。signed char类型用字节中最高位字节表示数据的符号,"0"表示正数,"1"表示负数,负数用补码表示。所能表示的数值范围是-128+127。(应用时一定要注意数据范围!) char类型在ANSI C中表示字符,在单片机中常用它表示<256的数,像普

4、通C语言中循环变量用整型,在单片机C语言中,就可以用char类型作循环变量等。常用于处理ASCII字符或用于处理小于或等于255的整型数。(正数的补码与原码相同,负二进制数的补码等于它的绝对值按位取反后加1。 )地址数据00x1210x342 int整型int整型长度为两个字节,在RAM中按顺序存放,数据0x1234,如右图顺序存放。分有符号int整型数signed int和无符号整型数unsigned int,默认值为signed int类型。signed int表示的数值范围是-32768+32767,字节中最高位表示数据的符号,"0"表示正数,"1"

5、;表示负数。unsigned int表示的数值范围是065535。地址数据00x1210x3420x5630x783 long长整型long长整型长度为四个字节,用于存放一个四字节数据。在RAM中按顺序存放,数据0x12345678,如右图顺序存放。分有符号long长整型signed long和无符号长整型unsigned long,默认值为signed long类型。signed int表示的数值范围是-2147483648+2147483647,字节中最高位表示数据的符号,"0"表示正数,"1"表示负数。unsigned long表示的数值范围是04

6、294967295。在单片机c语言中,尽量采用int、long运算,带小数的数值能否用整型来运算,如果要保留几位小数,可以将扩大,因为由传感器进入单片机的量都是数字量,最后显示时再将其缩小。4 float浮点型(注意:在C51中没有double数据类型,定义double数据类型,实际应用的还是float数据类型,共32位,占4个字节。教材中有些提法是不对的,教材中还有许多例子,用普通C语言可以调通,而用Cx51是调不通的,尽管如此,该教材仍然是单片机C学习较好的教材。)float浮点型在十进制中具有7位有效数字,是符合IEEE754标准的单精度浮点型数据,占用四个字节。表示的数值范围是

7、7;1.175494E-38±3.402823E+38。一个浮点数的表示方式是(-1)s×2E-127×(1M)。各字符含义及在内存中的存放格式如下:字节地址0123内 容SEEEEEEEEMMMMMMMMMMMMMMMMMMMMMMM其中:S为符号位,存放在最高字节的最高位。“l”表示负,“0”表示正。E为阶码,占用8位二进制数,存放在高两个字节中。注意,阶码E值是以2为底的指数再加上偏移量127,这样处理的目的是为了避免出现负的阶码值,而指数是可正可负的。阶码E的正常取值范围是1254,从而实际指数的取值范围为126127。M为尾数的小数部分,用23位二进制数

8、表示,存放在低三个字节中。尾数的整数部分永远为1,因此不予保存,但它是隐含存在的。小数点位于隐含的整数位“1”的后面。例如浮点数12.5,s1,12.5的二进制是1100.1,小数点向前移到第一个1的后面,移了3位,E=3+127=130(10000010),小数点前的1去掉,尾数为100100,共23位,十六进制为0Xc1480000,在内存中的存放格式为:字节地址0123内 容110000010100 0000000000000000000 需要指出的是,对于浮点型数据除了有正常数值之外,还可能出现非正常数值。根据IEEE标准,当浮点型数据取以下数值(1 6进制数)时即为非正常值: FFF

9、FFFFFH 非数(NaN) 7F800000H E位255,最大为7E, 正溢出FF800000H E位255,最大为FE,负溢出由于805l单片机不包括捕获浮点运算错误的中断向量,因此必须由用户自己根据可能出现的错误条件用软件来进行适当的处理。和长整型相比,同样是4个字节,编译成汇编语言,字节长度要大的多。将数据都存到片内RAM的条件下,曾用C语言编了一个简单的加法程序实验过,处理long类型的程序代码长度为41个字节,而float类型却要占367个字节。5*指针型指针型本身就是一个变量,在这个变量中存放的是一个数据存放的地址。这个指针变量要占据一定的内存单元,对不同的处理器长度也不尽相同

10、,在C51中它的长度一般为13个字节。指针变量也具有类型,在后面讲。6 bit位型bit位型是C51编译器的一种扩充数据类型,利用它可定义一个位型,但不能定义位指针,也不能定义位数组。它的值是一个二进制位,不是0就是1,类似一些高级语言中的Boolean类型中的True和False。7 sfr特殊功能寄存器sfr也是单片机C扩充数据类型,值域为0255。利用它可以访问51单片机内部的所有特殊功能寄存器。如sfr P1 = 0x90;定义P1为单片机P1端口在片内的寄存器,在后面的语句中我们用P1 = 255(对P1端口的所有引脚置高电平)之类的语句来操作特殊功能寄存器。AT89C51的特殊功能

11、寄存器表(直接打开C51文件看)8sfr16 16位特殊功能寄存器sfr16占用两个内存单元,值域为065535。sfr16和sfr一样用于操作特殊功能寄存器,所不同的是它用于操作占两个字节的寄存器,如定时器T0和T1、数据指针寄存器DPTR。9 sbit可寻址位型sbit同位型一样是C51中的一种扩充数据类型,利用它可以访问芯片内部的RAM中的可寻址位或特殊功能寄存器中的可寻址位。具体应用在后面讲。 两点说明: 1、8051系列是8位机,有位存储空间,凡占一位或一个字节的数据类型直接支持机器指令,运行速度快;其他类型要占多个字节,并顺序存放。 2、由于单片机内存很少,不但关系到运行速度,还涉

12、及程序在所设计的系统中是否可以运行。编程时选择数据类型很重要。二、数据类型的选用1、选用原则: 单片机C语言编程不同于一般的C语言编程的显著的一个特点,就是要和程序存储器资源结合起来,虽然其提供的数据据类型十分丰富,但是只有bit和char等数据类型是是机器语言直接支持的数据类型,用此类数据类型的语句所生成的代码较短;而其它的数据类型如整型、浮点型等数据要有一定的内部程序或内部函数的支持,相对来说用该类数据类型的语句生成的代码要长。有些C语言程序表面上看起来十分的简单,但在在实际编译时,生成的代码却相当长。因此我们要按照实际需要,合理地选用数据,可以大大的减少所生成的代码长度。1)尽量用cha

13、r类型和位类型。2)有符号类型比无符号的占存储容量和内存都大。3)浮点数编译后,程序代码比长整型的占用空间大的多。4)在选择数据类型时,一定要认真分析数据的性质,尽量选用占存储容量小的数据类型。例1:一位移测量仪,最大行程为10mm,显示精度为0.001mm,编程时要存储该测量值,选用何种数据类型。该数据最大为10000,如果位移全为正,可以用unsigned int,范围为065535;如果计量有正有负,用signed int,范围为3276832767。也可以给采集的数据加20000,单片机处理的数据全为正数。三、C语言的标识符和关键字标识符是用来标识源程序中某个对象的名字的,这些对象可以

14、是语句、数据类型、函数、变量、数组等等。C语言是大小字敏感的一种高级语言,如果我们要定义一个定时器1,可以写做"Timer1",如果程序中有"TIMER1",那么这两个是完全不同定义的标识符。标识符由字母,数字和下划线等组成,注意的是第一个字符必须是字母或下划线,如"1Timer"是错误的,编译时便会有错误提示。有些编译系统专用的标识符是以下划线开头,所以一般不要以下划线开头命名标识符。标识符在命名时应当简单,含义清晰,这样有助于阅读理解程序。在C51编译器中,只支持标识符的前32位为有效标识,一般情况下也足够用了。关键字则是编程语言

15、保留的特殊标识符,它们具有固定名称和含义,在程序编写中不允许标识符与关键字相同。在KEIL uVision2中的关键字除了有ANSI C标准的32个关键字外还根据51单片机的特点扩展了相关的关键字。以下是Cx51扩展的关键字: 关键字用 途说 明bit位标量声明声明一个位标量或位类型的函数sbit位标量声明声明一个特殊功能寄存器可位寻址Sfr特殊功能寄存器声明声明一个特殊功能寄存器Sfr16特殊功能寄存器声明声明一个16位的特殊功能寄存器data存储器类型说明直接寻址的内部数据存储器bdata存储器类型说明可位寻址的内部数据存储器idata存储器类型说明间接寻址的内部数据存储器pdata存储器

16、类型说明分页寻址的外部数据存储器xdata存储器类型说明外部数据存储器code存储器类型说明程序存储器interrupt中断函数说明定义一个中断函数reentrant再入函数说明定义一个再入函数using寄存器组定义定义芯片的工作寄存器第二节 常量C语言中的数据有常量、变量之分。 常量在程序运行的过程中,其值不能改变的量称为常量。常量的数据类型有整型、浮点型、字符型和字符串型等,c51编译器还扩充了一种位标量。分别说明如下: 1、整型常量 整型常量就是整型常数,可表示为以下几种形式: 十进制整数。如1234、一5678、0等。十六进制整数。以0x开头的数是十六进制数,如0x123表示十六进制数

17、123H,相当于十进制数29l。0xla表示十六进制数1aH,相当于十进制数26。常量在单片机C编程中的应用:入口地址,常数等,如片外扩展I/O口,根据硬件的地址,可以如下定义: define PORTA XBYTE0XFFC0 /字符名前不能为数字在程序中要访问该I/O口时,就可以用PORTA.如; PORTA=PORT&0Xbf;,给该端口输出:PORTA=0X5F;(可以运行“常量练习”) 长整数。在数字后面加一个字母L就构成了长整数,如2048L、0123L、Oxff00L等。 2浮点型常量 浮点型常量有十进制表示形式和指数表示形式。 十进制表示形式又称定点表示形式,由数字和小

18、数点组成。如03141、 .3141、3141、3141.及0.0都是十进制数表示形式的浮点型常量。在这种表示形式中,如果整数或小数部分为O可省略不写,但必须有小数点。 指数表示形式为: ±数字.数字e±数字其中,中的内容为可选项,其中的内容根据具体情况可有可无,但其余部分必须有。如123e4、5e6、7Oe8等都是合法的指数形式的浮点型常量;而e9、5e4.3和e则都是不合法的表示形式。 3.字符型常量 字符型常量是用单引号引起的字符,如a、1、F等。可以是可显示的ASCII字符,也可以是不可显示的控制字符。对不可显示的控制字符须在前面加上反斜杠“”组成转义字符。利用它可

19、以完成一些特殊功能和输出时的格式控制。常用的转义字符如下表所示。 转义字符含 义ASCII码(十六进制数) o空字符(null)00H n换行符(LF)0AH r回车符(CR)0DH t水平制表符(HT)09H b退格符(BS)08H f换页符(FF)0CH 单引号27H ”双引号22H 反斜杠5CH 4.字符串型常量 字符串型常量由双引号“”括起的字符组成。如“D”、“1234”、“ABCD”等。注意字符串常量与字符常量是不一样,一个字符常量在计算机内只用一个字节存放,而一个字符串常量在内存中存放时不仅双引号内的字符一个占一个字节,而且系统会自动的在后面加一个转义字符“o”作为字符串结束符。

20、因此不要将字符常量和字符串常量混淆,如字符常量A和字符串常量“A”是不一样的。注意:单片机用串行口输出。第三节 变量及其存储模式 一、变量的定义及格式1、定义:变量是在程序执行过程中其值能不断变化的量。2、格式c语言程序中的每个变量都必须有一个标识符作为它的变量名。在使用一个变量之前,必须先对该变量进行定义,指出它的数据类型和存储模式,以便编译系统为它分配相应的存储单元。在c51中对变量进行定义的格式如下: 存储类型 数据类型 存储器类型 变量名表;在定义格式中除了数据类型和变量名表是必要的,其它都是可选项。存储种类型有四种:自动(auto),外部(extern),静态(static)和寄存器

21、(register),缺省类型为自动(auto)。数据类型:是前面已经学习的各种数据类型。存储器类型:存储器类型的说明就是指定该变量在C51硬件系统中所使用的存储区域,并在编译时准确的定位。普通C中无存储器类型。变量名表:与普通C语言相同,由标识符和初值组成,其中初值是可选的,可以一次定义多个数据类型和存储类器型相同的变量。二、存储类型存储类型是普通C语言变量定义中有的,主要讲一下不同点。1、auto(自动存储类型)将说明的对象存放在内存的堆栈中,一般从RAM的08H开始,需要时自动修改堆栈指针。注意:一旦说明存储器类型,则该存储类无用,一般不用。2、register(寄存器存储类型)在单片机

22、中,工作寄存器主要用于存储中间过程的变量,在Cx51中,变量的存储器类型确定以后,就确定了变量的存储类型,故该定义不起作用。该存储种类不要用。(以上两个与C语言有区别)3、extern(外部存储类型)在普通c语言中,一般把在函数外部定义的变量叫外部变量,也叫全局变量。定义在函数内部的为局部变量,在此也适用。但对一个大的程序,有好几个文件,如有A、B、C三个文件,要同时在几个文件的程序中用同一个变量,就需要说明成外部变量extern,引用说明时不分配内存,不能初始化。如果一个程序只有一个文件则不需要说明。外部变量被定义后分配固定的内存空间,在程序整个执行时间内都有效,直到程序结束才释放。4、st

23、atic(静态存储类型)内部静态变量在函数内部说明,分配固定的地址,退出该函数后其值不变。但其他函数不能应用。该存储类有时需要使用。外部静态变量定义在函数的外部,在定义该变量的文件中始终可用,但在多文件系统中,其他文件不可用。(注意局部变量与全局变量,很重要)(可以运行“外部函数变量”)三、存储器类型(该内容很重要,考试必考内容)1、存储空间这是单片机C语言的特色部分,因为单片机的RAM很小,要求要合理利用,所以要指定将变量存储到RAM的那个空间。下面复习一下AT89Cxx单片机的RAM空间。在片内RAM中,又分为三个不同的空间:分别为工作寄存器区间、位寻址区间和数据缓冲区。2、C51定义的存

24、储类型C51 允许将变量或常量定义成不同的存储类型,C51 编译器允许的存储类型主要包括data,bdata、idata、pdata、xdata 和code 等,它们和单片机的不同存储区相对应。c5l编译器完全支持805l系列单片机的硬件结构,可以访问其硬件系统的所有部分对于每个变量可以准确地赋予其存储器类型,从而可使之能够在单片机系统内准确地定位。下表列出了Cx51编译器所能识别的存储器类型。存储类型长度(bit)长度(Byte)寻址范围与存储空间的对应关系data81012751的直接寻址片内低128字节片内数据RAMbdata810128b51的按位寻址片内RAM 的20H2FH地址空间

25、idata810255间接寻址片内数据RAM的00HFFH地址空间pdata810255分页寻址256字节片外RAM,对应MOVX Rixdata162065535寻址64K字节片外RAM,对应MOVX DPTRcode162065535寻址64K 程序ROM,对应MOVC DPTR在定义变量时如果省略“存储器类型”选项,则按编译时指定的存储模式SMALL、COMPAT或LARGE所规定的默认存储器类型确定变量的存储区域 !存储模式说明:SMALL(小模式)参数及局部变量放入可直接寻址的片内存储器(最大128 字节,默认存储类型是data),因此访问十分方便。另外所有对象,包括栈,都必须嵌入片

26、内RAM。栈长很关键,因为实际栈长依赖于不同函数的嵌套层数COMPACT(紧凑模式)参数及局部变量放入分页片外存储区(最大256 字节,默认的存储类型是pdata),通过寄存器R0和R1 间接寻址,栈空间位于内部数据存储区中。LARGE(大模式)参数及局部变量直接放入片外数据存储区(最大64KB,默认存储类型为xdata),使用数据指针DPTR来进行寻址。用此数据指针访问的效率较低,尤其是对二个或多个字节的变量,这种数据类型的访问机制直接影响代码的长度。注意:1) 存储器类型与存储类的概念不能混淆,是两个不同的概念。 2) 存储器类型可以隐含编译模式与显式说明同时应用,如编译模式为small,

27、将大量的数据可以说明成xdata存储器类型。 3)在用xdata模式时,对未指明的变量,运算的中间变量一般都在片内RAM中,只把最后结果存入片外RAM,也可以指明存储地址。 (演示“存储类型”)3、存储示例下面是一些变量定义的例子:1)char data var1 ; /*在data区定义字符型变量var1*/2) int idata var2 ; /在idata区定义整型变量var23)unsigned int xdata y,x;/在片外存储的两个整型变量注意:在程序中为了书写方便,可以定义缩写形式,定义方式如下: define uchar unsigned char/在程序中,可以用uc

28、har定义无符号字符型。 define uint unsigned int/在程序中,可以用uint定义无符号整型。define ulong unsigned long/在程序中,可以用ulong定义无符号长整型。 在程序前面定义了以上两句后,上面一句可以写作: uint xdata y,x;4) int a=5 ; *定义变量a,同时赋以初值5,变量a位于由编译模式确定的默认存储K*5) uchar code table18=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40

29、,0x00;/共阴极显/示代码表,在程序中。6)uchar xdata vccter102;/在片外存储的无符号2维数组7)static ulong xdata array100; /*在xdata 区定义静态无符号长整型数组变量array100*/ 8)char idata *px。/在idata区定义一个指向对象类型为char的指针9) extern bit data pet_port; /*在data区定义一个外部位标量pet_port*/10) char bdata flags;*在bdata 区定义字符型变量flags,定位在片内RAM 中的位寻址区*11) float idata

30、x,y,z;/浮点型变量x、y 和z 被定义为idata 存储类型,定位在片内RAM中,并只能用间接寻址 方式进行访问。12) unsigned int pdata dimension;/无符号整型变量dimension 被定义为/pdata 型,定位在片外数据存储区,相当于用MOVX Ri 访问。13) bit bdata lock; /将lock 定义为位变量14) bit bdata direction;/将direction 定义为位变量如果在变量定义时略去存储类型标志符,编译器会自动默认存储类型。默认的存储类型进一步由SMALL、COMPACT 和LARGE 存储模式指令限制。例如,

31、若表明char var1 在SMALL存储模式下,var1 被定位在data 存储区;在COMPACT 模式下,var1 被定位在idata 存储区,在LARGE 模式下,var1 被定位在xdata 存储区中。 4、用typedef重新定义数据类型在C语言程序中除了可以采用上面所介绍的数据类型之外,用户还可以根据自己的需要对数据类型重新定义。重新定义时需用到关键字typedef,定义方法如下: typedef 已有的数据类型 新的数据类型名; 其中“已有的数据类型”是指上面所介绍的c语言中所有的数据类型,包括结构,指针和数组等,“新的数据类型名”可按用户自己的习惯或根据任务需要决定。关键字t

32、ypedef的作用只是将c语言中已有的数据类型作了置换,因此可用置换后的新数据类型名来进行变量的定义。例如: Typedef unsigned int word;/定义word为新的无符号整型数据类型名 word i,j; /*将i,j定义为无符号整型变量*/该方法也叫起别名,根据个人编程习惯不同,使用频率不一样,有些人特别喜欢用。 5、数据类型和存储器类型对性能的影响 与面向数学运算的计算机相比,8051系列单片机对数据类型的选择更具有关键性的意义。对于C这样的高级语言,不管使用何种数据类型,虽然某一行程序从字面上看,其操作十分简单,但实际上系统的C编译器需要用一系列机器指令对其进行复杂的变

33、量类型、数据类型的处理。特别是当使用浮点变量时,将明显地增加运算时间和程序的长度。当程序必须保证运算精度时,C编译器将调用相应的子程序库,把它们加到程序中去。然而许多不熟练的程序员,在编写C程序时往往会使用大量的、不必要的变量类型。这将导致c编译器相应地增加所调用的库函数的数量,以处理大量增加的变量类型。这最终会使程序变得过于庞大,运行速度减慢,甚至会因此在链接(1ink)时出现因程序过大而装不进代码区的情况。所以必须特别慎重地进行变量和数据类型的选择。 不同的存储器类型,对程序代码的长度和运行速度有一定的影响,下面将会用例子介绍。 决定存储器类型的原则是:1、 由于单片机访问片内RAM 比访

34、问片外RAM 相对快一些,常用的变量,使用频率高的变量,尽量安排在片内存储器中;2、 要用AT89C52单片机,因为有高128个字节的RAM只能用间接寻址访问,一定要定义idata存储类型,否则该区域无法访问,将数据都放到了片外扩展的存储器空间,影响速度。3、 对于数据量较大,只能放到片外存储器空间。4、 要查的表格,常量只能采用code 存储类型。5、 位变量只能用bdata存储器类型。下面以一段很简单的实际程序,体会一下数据类型、存储器空间对代码长度的影响。(可在课堂上演示)存储类型数据类型汇编长度dataint9datasigned int10datalong41datafloat367

35、xdataint19xdatalong118#include<AT89X51.H>#include<math.h>Main() data unsigned char h1=12,h2=2,h3; h3=h1+h2;这是一段很简单的加法程序,其中数据类型和存储器类型很容易更换,更换以后,用keil进行编译,可以看到程序代码的大小。用上述数据类型和存储器类型,编译后的汇编程序如下: MOV A,#02H ADD A,#12H MOV 08H,A/注意存放的位置 RET共占了6个字节。改变存储类型以后的程序代码长度如下:要多加练习,掌握数据类型与存储器类型选择的规律。 第四节

36、 C51 对单片机主要资源的定义MCS-51 通过其特殊功能寄存器(SFR)实现对其主要资源的控制。MCS-51 单片机有21个SFR,有的单片机还有更多的SFR,它们分布在片内RAM 的高128 字节中,其地址能够被8 整除的SFR 一般可以进行位寻址。对SFR 只能用直接寻址方式访问。为了能够直接访问特殊功能寄存器,keil Cx51允许通过使用关键字sfr、sfr16或直接引用编译器提供的头文件来实现对SFR 的访问,但对于片外RAM 或扩展I/O 的直接访问只能由用户实现。一、 使用关键字sfr、sfr16定义特殊功能寄存器。 sfr和sfr16可以直接对51单片机的特殊寄存器进行定义

37、,定义方法如下: sfr 特殊功能寄存器名= 特殊功能寄存器地址常数;sfr16 特殊功能寄存器名= 特殊功能寄存器地址常数;我们可以这样定义AT89C51的P1口 sfr P1 = 0x90; /定义P1 I/O口,其地址90H sfr应用实例:sfr PSW=0xD0; /定义程序状态字PSW 的地址为D0Hsfr TMOD=0x89; /定义定时器/计数器方式控制寄存器TMOD 的地址为89Hsfr P1=0x90; /定义P1 口的地址为90H注意:大部分在头文件中已经定义。如果自己要用用sfr定义SFR 必须位于函数外,一般放在程序的开头。二、用sbit定义特殊功能寄存器的特殊位sb

38、it可定义可位寻址对象。如访问特殊功能寄存器中的某位。其实这样应用是经常要用的,如要访问P1口中的第2个引脚P1.1。我们可以照以下的方法去定义:1、sbit 位变量名位地址 sbit P1_1 = 0x91; 这样是把位的绝对地址赋给位变量。2、sbit 位变量名特殊功能寄存器名位位置 sfr P1 = 0x90;sbit P1_1 = P1 1; /先定义一个特殊功能寄存器名再指定位变量名所在的位置当可寻址位位于特殊功能寄存器中时可采用这种方法3、sbit 位变量名字节地址位位置sbit P1_1 = 0x90 1;/注意头文件注意:定义时用大写,引用时必须用大写,如P0、P1、P2三、

39、通过头文件访问SFR编译器给出的头文件已经给出了常用MCS-51 单片机中的SFR 及其可位寻址位的定义。比如Keil C 将这些头文件按单片机的不同生产公司、不同型号分别存在Keil C 的INC 子目录下,在程序中只需直接引用这些头文件即可实现对SFR 的访问和控制。头文件引用实例:#include <AT89X51.h> /使用的单片机为atmel 公司的AT89C51main()TL0=0xb0; /访问定时器0,设置时间常数TH0=0x3c;TR0=1; /启动定时器0四、 扩展I/O 端口或片外RAM 的直接访问扩展的片外RAM 或I/O 端口需要用户自己先定义后才能在

40、语句或函数中使用,其方法如下:#include <absacc.h>/其中定义了XBYTE 宏#define PA8155 XBYTE0xffec /将PA 定义为外部I/O 口,地址为oxffecmain()PA8155=0x3A; /将数据3AH 写入地址为0xffec 的存储单元或I/O 端口五、sbit的其他用途在程序设计时,对于可位寻址的对象,即可以字节寻址又可以位寻址的变量。用存储器类型bdata说明char和int数据类型,就可以用sbit对其中各位进行定义。例如:int bdata a; /整型变量a 定位在片内数据存储区中的可位寻址区sbit a0=a0; /定义

41、a0 为a 的第0 位sbit a12=a12; /定义a12 为a 的第12 位说明:1)sbit 定义要求基址对象的存储类型为bdata,使用sbit 类型位变量时,基址变量和其对应的位变量的说明必须在函数外部进行。2)用sbit定义时只能逐个定义,不能在一行定义两个以上。例:读取P1口的值,存入1个变量中,对该位可以按位进行控制。 #include<at89x51.h> #define uchar unsigned char bdata uchar a; sbit a0=a0; sbit a1=a1; sbit a2=a2; sbit a3=a3; sbit a4=a4; sbit a5=a5; sbit a6=a6; sbit a

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论