C-51程序设计.doc
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《C-51程序设计.doc》由会员分享,可在线阅读,更多相关《C-51程序设计.doc(39页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、西南销售服务中心单片机编程器 我们不仅提供产品,更提供技术与服务! 单片机电子研发室 Franklin C-51语言设计基础11 Franklin C-51数据类型 Franklin C-51编译器支持下列数据类型: 数 据 类 型 长 度 值 域bit1 字节0 或 1signed char1 字节-128+127unsigned char1 字节0255signed int2 字节-32768+32867unsigned int2 字节065535signed long4 字节-2147483648+2147483647unsigned long4 字节04294967295float4
2、字节1.176E-383.40E+38指针13 字节对象地址sbit1 位0 或 1sfr1 字节0255sfr162 字节065535编译的数据类型(如结构)包含上表所列的数据类型。由于8051系列是8位机,因而不存在字节校准问题。这意味着数据结构成员是顺序放置的。数据类型的转换:当计算结果隐含着另外一种数据类型时,数据类型可以自动进行转换,例如,将一个位变量赋给一个整型变量时,位型值自动转换为整型值,有符号变量的符号也能自动进行处理。这些转换也可以用C语言的标准指令进行人工转换。1. 2数据类型的物理结构121 bit “bit”类型只有1位,不允许有位指针和位数组。位对象始终位于8051
3、 CPU的可寻址RAM空间。如果程序控制流允许,L51将位对象交迭。122 signed/unsigned char;data/idata/pdata 指针“char”类型标量和基于存贮器的“data/idata/pdata”指针具有1个字节长度(8 bits)。123 signed/unsigned int/short;xdata/code 指针“int”和“short”类型标量及指向xdata/code区域的指针具有2字节长度(16 bits)。整型值(或偏移)0x1234以下面方式保存在内存中:地址:+0 +1内容: 0x120x34124 signed/unsigned long“lo
4、ng”类型标量长为4个字节(32 bits),值0x12345678以下面方式放置:地址:+0+1+2+3内容: 0x12 0x34 0x56 0x78125 “一般”指针“一般”指针包括3个字节:2字节偏移和1字节存贮器类型:地址:+0 +1 +2内容: 存贮器类型偏移高位 偏移低位第一个字节代表了指针的存贮器类型,存贮器类型编码如下:存贮器类型 IDATA XDATA PDATADATACODE值 12 3 4 5使用其它类型值可能导致不可预测的程序动作。XDATA类型的0x1234地址作为指针表示如下:地址:+0+1 +2内容: 0x02 0x12 0x34当用常数作指针时,必须注意正确
5、定义存贮器类型和偏移。下例将值0x41写入绝对地址为0x8000的外部数据存贮器:#defineXBYTE (char *)0x20000L)XBYTE0x8000=0x41;上例中用其它常数索引或索引变量也起作用。这样,各种存贮器类型的绝对地址可以一种非常有效的方式访问。但有一个例外,即SFR。注意:绝对地址定义为“long”型常量,低16位包含偏移,高8位表明了xdata类型。为了表示这种指针,必须用长整数来定义存贮器类型。C51编译器不检查指针常数,用户必须选择有实际意义的值。126 float“float”类型为4个字节(32位),使用的格式与IEEE-754标准(32位)具有24位精
6、度,尾数的高位始终为“1”,因而不保存,位的分布如下:l 1位符号l 8位指数位l 23位尾数符号位是最高位,尾数为最低的位,内存中按字节存贮如下:地址:+0 +1 +2+3内容:MMMM MMMM MMMM MMMME MMM MMMMS EEE EEEE其中:S:符号位,1=负,0=正E:指数(在两个字节中),偏移为127M:23位尾数,最高位“1”浮点值12.5的十六进制为0xC1480000,它按下面方式存贮:地址:+0+1+2+3内容: 0x00 0x00 0x48 0xc18051不包括捕获浮点错误(例外)的中断向量。用户软件因此必须对错误条件作出适当反应。下面推荐一种方法(也可以
7、用其它可靠办法):“union”用来保存浮点值,这个“union”必须包括一个“float”和一个“unsigned long”,以根据IEEE对错误作出响应。除了通常浮点值外,IEEE标准可能出错的条件以下面二进制值表示,为检查可能出现的计算错误,可在计算后进行检查。因为当执行一个运算时考虑了每个运算符的错误状态并且该状态被送到结果中。 NaN0xFFFFFFF不是一个数+INF0x7F80000正无穷(正溢出)-INF0XFF80000负无穷(负溢出)1.3 C-51 的扩充定义131 特殊功能寄存器的声明 MSC-51 系列包括多种寄存器,其中一些具有特殊功能,如定时器,端口的控制寄存器
8、等,为了能够直接访问这些寄存器,C51编译器提供了一种定义的自主形式,这是必要的,因为这些定义与标准C语言是不兼容的。为了支持这些特殊功能寄存器(SFR)的声明,引入了关键词“sfr”,语法如下:sfr-dcl:sfr sfr_name=int_constant例:sfr p0=0x80;sfr p1=0x90;必须注意的是“sfr”后不是一个地址而是一个名字。因此上例中名字P0和P1(port0和port1)定义为特殊功能寄存器并被赋予相应的绝对地址,名字可按意愿自由选取,源文件中不应有先定义的sfr名字。“=”号后的地址必须是常数,不允许带有运算符的表达式,这个常数表达式必须在特殊功能寄存
9、器的地址范围内,位于0X80到0XFF之间。8051系列寄存器数量和类型是极其不同的,因此建议将所有特别的“sfr”声明放入一个头文件,头文件包括8051一些系列成员中的SFR定义。进一步的定义可由用户用一文件编辑器产生。132 对SFR的16位数据访问 在新的8051系列产品中,SFR在功能上经常组合为16位的,为了有效的访问这类SFR,使用定义“sfr16”,当“SFR”的高端直接位于低端后时,对SFR16位的访问是可能的。例如8052的定时器2就是这种情况,16位声明的语法与“sfr”相同,SFR低地址部分必须作为sfr16的地址:例:sfr16 T2=0xCC /*Timer2:T2L
10、=0CCH,T2H=0CDH */ sfr16 RCAP2=0xCA/*RCAP2L=0CAH,PCAP2H=0CBH */本例中,T2(由T2L和T2H组成)和RCAP2(由RCAP2L和RCAP2H组成)被定义为16位SFR,即使在这种情况下,声明中的名字后仍不是赋值语句,而是一个SFR地址,高字节必须直接位于低字节之后,这种声明适用于所有新的SFR,但不能用于Timer0和Timer1。133 SBIT:特殊功能位声明在典型的8051应用问题中,经常需要单独访问SFR中的位,C51扩充功能使之成为可能,特殊位,象SFR一样,不与标准C语言兼容,使用保留字“sbit”可访问位寻址对象。与S
11、FR声明一样,用保留字“sbit”声明某些特殊位接受符号名,“=”后语句将绝对值地址赋给变量名,这种地址分配有三种方法:方法1:sfr_nameint_constant当字节是特殊功能寄存器的地址可用这个方法。sfr_name必须是已定义的SFR的名字,“”后的语句定义了基地址上的特殊位的位置,该位置必须是一个07的数。例: sfr PSW=0xD0; sfr LE=0xA8; sbit OV=PSW2; sbit CY=PSW7;方法2:int_constantint_constant这种方法以一整常数作基地址,该值必须在0x800xFF之间,并能被8整除,确定位的位置方法同上。例: sbi
12、t OV=0xD02; sbit CV=0xD07; sbit EA=0xA87;方法3: int_constant这种方法是将位的绝对地址赋给变量,地址必须位于0x800xFF之间。例: sbit OV=0xD2; sbit CY=0xD7; sbit EA=0xAF;特殊功能位代表了一个独立的声明类,它不能与其它声明和位域互换。134 BIT:位标量声明除了通常的C数据类型外,C51编译器支持“bit”数据类型,对此有下列扩充与限制:(1) 函数可包含类型为“bit”的参数,也可将其作为返回值。 bit bfunc(bit b0,bit b1)/*/return(b1); 注:使用禁止中断
13、(#pragma disable)或包含明确的寄存器组切换(using n)的函数不能返回位值,在这种情况下,编译器会识别出来并产生一个错误信息。(2) 位标量声明的语法及C声明的语义static bit dirction_bit;extern bit lock_printer_port;bit display_invers;(3) 对于位声明的限制l 位不能声明为一个指针(bit *bit_poiter)l 不存在位数组(bit b_array5)位声明中允许定义存贮器类型,位都被放入一个位段,它总是在8051内部RAM中,因此存贮器类型限制为DATA或IDATA,声明为其它存贮器类型都将导
14、致编译出错。135 可位寻址对象可位寻址对象指可以字节或位寻址的对象,当对象位于MSC-51可寻址RAM中时会有这种情况,C51允许带“bdata”类型的对象放入可位寻址存贮器中。bdata int ibase; /*位寻址指针 int*/bdata char bary4; /*位寻址数组 arrray*/使用“sbit”声明可独立访问可位寻址对象的位:sbit mybit0=ibase0;sbit mybit15=ibase15;sbit ary07=bary07;sbit ary37=bary37;对象“ibase”和“bary”也可位寻址:ary37=0;/*寻址“bary3”中的位7*
15、/ibase=-1;/*寻址字节地址*/mybit15=0;/*寻址“ibase”的位15*/sbit声明要求基址对象的存贮器类型为“bdata”,否则只有绝对的位声明方法是合法的。位位置(操作符号后)的最大值依赖于指定的基类型,这个值于char/uchar而言是07,对于int/uint/short/ushort而言是015,对于long/ulong而言是031。在编译器内存贮器类型bdata与data一样操作,并且只作与可再定位的sbit的运算。注:可位寻址的的段长最大不能超过16字节,可再定位的sbit声明自动转为公共的(PBULIC)以使它们能被其它C模块使用。模块1:sbitary3
16、7=bary37;模块2:externbit ary37;sbit声明也可为结构和函数所用:unionlftfloat mf;long ml; ;bdatastructbad char ml; union lft u; tcp;sbit tcpf31=tcp.u.ml31; /*浮点限制*/sbit tcpml0=tcp.ml0;sbit tcmpl7=tcp.ml.7;注:位位置的指定不能直接被float类型所用,如果需要这样做,浮点标量必须与一个长整型标量一起放入一个联合中并且位位置必须由长整型标题指定(见上例)。14 存贮器类型C51编译器完全支持8051微处理器及其系列的结构,可完全访
17、问MCS-51硬件系统所有部分。每个变量可准确地赋予不同的存贮器类型(data,idata,pdata,xdata,code)。访问内部数据存贮器(idata)要比访问外部数据存贮器(xdata)相对要快一些,因此,可将经常使用的变量置于内部数据存贮器中,而将较大及很少使用的数据单元置于外部数据存贮器中。 存贮器类型 描 述 data直接寻址内部数据存贮器,访问变量速度最快(128bytes) bdata可位寻址内部数据存贮器,允许位与字节混合访问(16 bytes) iIdata间接寻址内部数据存贮器,可访问全部地址空间(256bytes) pPdata分页(256bytes)外部数据存贮器
18、,由操作码MOVX Ri访问 xdata外部数据存贮器(64K),由MOVX DPTR访问 code代码数据存贮器(64K),由MOVC A+DPTR访问变量说明举例:data char charvar;char code msg=”ENTER PARAMETER:”;unsigned long xdata array100;float idata x,y,z;unsigned char xdata vector1044;sfr p0=0x80;sbit RI=0x98;char bdata flags;sbit flago=flags0;如果在变量说明时略去存贮器类型标志符,编译器会自动选择
19、默认的存贮器类型。默认的存贮器类型进一步由控制指令SMALL、COMPACT和LARGE限制。例如:如果声明char charvar,则默认的存贮器模式为SMALL,charvar放在data存贮器;如果使用COMPACT模式,则charvar放入idata存贮区;在使用LARGE模式的情况下,charvar被放入外部存贮区或xdata存贮区。15 存贮器模式存贮器模式决定了自动变量和默认存贮器类型,参数传递区和无明确存贮区类型的说明。在固定的存贮器地址变量参数传递是C51的一个标准特征,在SMALL模式下参数传递是在内部数据存贮区中完成的。LARGRE和COMPACT模式允许参数在外部存贮器
20、中传递。C51同时也支持混合模式,例如在LARGE模式下生成的程序可将一些函数分页放入SMALL模式中从而加快执行速度。 存贮器模式 描 述 SMALL参数及局部变量放入可直接寻址的内部寄存器(最大128bytes,默认存贮器类型是DATA) COMAPCT参数及局部变量放入分页外内部存贮区(最大256bytes,默认存贮器类型是PDATA) LARGE参数及局部变量直接放入外部数据存贮器(最大64K,默认存贮器类型是XDATA)16 指针Franklin C-51支持“基于存贮器的”和“一般指针”。1.6.1 基于存贮器的指针基于存贮器的指针由C源代码中存贮器类型决定并在编译时确定,用这种指
21、针可高效访问对象且只需一个字节(idata*,data*,pdata*)或2个字节(code*,xdata*)。操作较短指针的代码被缩短,一般被“内行”编码;库调用不再必要。声明举例:char xdata *pt在XDATA存贮器中声明一个指向对象类型为“CHAR”的指针。指针默认自身在默认存贮区(决定于编译模式),长度为2字节。(值为00XFFFF)char xdata *data pdx;除了指针明确位于内部数据存贮器(data)中外,与上例相同。它与编译模式无关。data char xdata *pdx;本例与上例完全相同。存贮器类型定义既可放在声明的开头也可直接放在声明的对象之前。这种
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 51 程序设计
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内