版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第八章C语言程序设计何宾2023.08主要内容存储器区域数据类型类型限定符存储类别绝对位置变量指针函数属性预处理器内嵌汇编程序定制文件设计实例:按键识别与显示存储器区域STC32G系列单片机兼容MCS-251ISA,因此支持用于程序和数据的多个物理分离的存储区域或存储器空间每个存储区域都有一定的优点和缺点这些存储空间可能是读取但不写入、读取或写入、比其他存储空间更快地读取或写入STC32G系列单片机上可用的各种存储空间与大多数大型计算机、小型寄存器和微型计算机架构有很大的不同在这些架构中,程序、数据和常数都加载到计算机内的同一物理存储空间存储器区域
--程序存储器程序(CODE)存储器为只读。在STC32G系列单片机中,程序存储器位于单片机的内部该单片机支持高达64KB的程序存储器。然而,可以使用代码库来扩展程序空间
一些单片机提供了更大的代码空间
程序代码,包含所有函数和库例程,保存在程序存储器中
常数变量也可以保存在程序存储器中STC32G系列仅执行保存在程序存储器中的程序
通过使用存储器类型标识符code,C语言程序可以访问程序存储器
声明code对象的用法如下:unsignedcharcodecode_constant;存储器区域
--程序存储器声明code对象的用法如下:unsignedcharcodecode_constant;注:存储器类型code是为了与C51编译器兼容而实现的。应该使用constnear或constnear代替代码。这通常会生成更好的代码,应该在新的STC32G系列单片机中使用,而不是存储器类型code存储器区域
--内部数据存储器内部数据存储器位于STC32G系列单片机的内部,并且是读/写的data和idata存储区域位于STC32G系列单片机内,并且可以写入和读取data存储器是片上存储器的前128字节。idata存储器是片上存储器的前256个字节。还有一个从20h开始的16字节区域,可用短8051兼容指令进行位寻址声明idata变量的方法如下:unsignedcharidatavariable;对内部数据存储器的访问非常快,因为它可以使用8位地址访问。然而,内部数据存储器限制为最大256字节存储器区域
--内部数据存储器内部数据存储器可以分为三种不同的数据类型,包括databdataebdata存储器区域
--内部数据存储器存储器说明符data是指内部数据存储器的前128个字节此处保存的变量使用直接寻址进行访问声明data变量,如下所示:unsignedchardatafast_variable;存储器区域
--内部数据存储器存储器说明符bdata指定的内部数据区(20h~2Fh)中的16字节可位寻址的存储器该存储器类型说明符允许程序开发人员声明也可以在位级别访问的数据类型声明bdata变量,如下所示:unsignedcharbdatabdata_var;存储器区域
--内部数据存储器存储器说明符ebdata是指内部数据区(20h~7Fh)中的扩展251位可寻址存储器该存储器类型说明符允许程序开发人员声明也可以在位级别访问的数据类型然而,与bdata存储区域相比,对ebdata存储器的位访问需要更长的操作码编码声明edata变量,如下所示:unsignedintebdataeb_var;存储器区域
--内部数据存储器【例8-1】存储器说明符ebdata的用法structs{//定义结构体sunsignedintb0:3;//整型变量b0,分配3个二进制位unsignedintb1:2;//整型变量b1,分配2个二进制位unsignedintb2:1;//整型变量b2,分配1个二进制位unsignedintb3:1;//整型变量b3,分配1个二进制位unsignedintb4:1;//整型变量b4,分配1个二进制位unsignedintb5:1;//整型变量b5,分配1个二进制位unsignedintb6:1;//整型变量b6,分配1个二进制位unsignedintb7:4;//整型变量b7,分配4个二进制位};存储器区域
--内部数据存储器structsebdatav;//声明结构体变量v,且保存在ebdata区域
voidmain(void){//声明主程序main v.b0=4;//结构变量v的元素b0赋值为4 v.b1=3;//结构变量v的元素b1赋值为3 v.b7=15;//结构变量v的元素b7赋值为15if(v.b1){//如果结构变量v的元素b1的值不为0v.b0=7;//结构变量v的元素b0赋值为7}}存储器区域
--内部数据存储器对于上面的设计代码,变量的位分配位号0x20.70x20.60x20.50x20.40x20.30x20.20x20.10x20.0变量——v.b7v.b6v.b5位号0x21.70x21.60x21.50x21.40x21.30x21.20x21.10x21.0变量v.b4v.b3v.b2v.b1v.b0存储器区域
--内部数据存储器0xFF0000020030LJMPC:0x003014:voidmain(void){15:v.b0=4;0xFF00037E3520MOVWR6,v(0x20)0xFF00065E70F8ANLR7,#0xF80xFF00094E7004ORLR7,#0x04//R7[3:0]=0x040xFF000C7A3520MOVv(0x20),WR6//{R6,R7}=WR616:v.b1=3;0xFF000F4E7018ORLR7,#0x18//
0x18逻辑“或”R7,R7.4,R7.3置10xFF00127A3520MOVv(0x20),WR6//17:v.b7=15;0xFF00154E603CORLR6,#0x3C0xFF00187A3520MOVv(0x20),WR6
存储器区域
--内部数据存储器18:if(v.b1){0xFF001B7D23MOVWR4,WR60xFF001D1E24SRLWR40xFF001F1E24SRLWR40xFF00211E24SRLWR40xFF00235E240003ANLWR4,#0x00030xFF00276806JEC:0x002F19:v.b0=7;0xFF00294E7007ORLR7,#0x070xFF002C7A3520MOVv(0x20),WR620:}存储器区域
--外部数据存储器片内/片外的外部数据存储器是读/写的由于外部数据存储器是通过数据指针寄存器(必须加载地址)间接访问的,因此它比访问内部数据存储器慢STC32G系列单片机提供了片上XRAM空间,该空间使用与传统外部数据空间相同的指令进行访问。该XRAM空间通常通过配置SFR寄存器启用,并于外部存储器空间重叠可能有多达64KB的外部数据存储器。然而,该地址空间不一定必须用作存储器。硬件设计可能会将外设映射到存储器空间中。如果是这种情况,开发的程序将访问外部数据存储器来编程和控制外设。这种技术称为存储器映射的I/Osfr80H~FF,PWM,USB,….声明xdata变量的方法如下:unsignedcharxdatavariable;存储器区域
--近存储器近存储器(nearmemory)区域的地址范围为00:0000~00:FFFF,这是STC32G系列单片机存储器的前64KB部分寄存器位于STC32G系列单片机的内部,并且可以使用16位寻址进行快速的访问近存储器区域在汇编语言级别由存储器类EDATA或ECONST表示,使用直接寻址访问保存在近存储器中的变量声明near对象的方法如下:unsignedcharnearnear_variable;unsignedcharconstnearnear_const_variable;存储器区域
--远存储器远存储器(farmemory)区域表示STC32G系列单片机的完整地址范围远存储器区域在汇编语言级别中使用存储器类HDATA或HCONST表示使用间接寻址来访问存储器类型far定义的变量地址计算仅为16位,因此将远对象的数据大小限制为64KB然而,远变量可以驻留在存储器中的任何位置,这允许总大小多达16MB存储器区域
--远存储器声明far对象的方法如下:unsignedcharfarfar_variable[0x10000];unsignedcharconstfarfar_const_variable[0x4000]={1,2,3,...};unsignedinti;unsignedcharfar_func(void){return(far_variable[i]);}存储器区域
--大存储器与far相反,huge使用32位运算进行地址计算,因此允许无限的对象大小程序开发人员可以有一个数MB大小的单个数组或结构在大存储器(hugememory)中,声明的变量的大小可以达到16MB-1存储器区域
--大存储器声明huge对象的方法如下:unsignedcharhugehuge_variable[0x50000];unsignedcharconsthugehuge_const_variable[0x20000]={1,2,3,...};unsignedlongl;unsignedintfunction(void){return(huge_variable[l]);}存储器区域
--SFR存储器STC32G系列单片机为SFR提供128字节的存储器SFR是位、字节或字大小的寄存器,用于控制定时器、计数器、串行I/O和外设注:可以使用MOV指令直接访问SFR存储器,不能使用间接寻址模式数据类型C251编译器提供了几种可以在C程序中使用的基本数据类型编译器支持标准C数据类型以及MCS-251ISA特有的几种数据类型数据类型位数字节数值的范围bit1—“0”或“1”signedchar81-128~+127unsignedchar810~+255enum162-32768~+32767signedshortint162-32768~+32767unsignedshortint1620~+65535数据类型数据类型位数字节数值的范围signedint162-32768~+32767unsignedint1620~+65535signedlongint324-2147483648~+2147483647unsignedlongint3240~+4294967295float324±1.17549435E-38~±3.4028235E+38double648±2.2250738585072014E-308~±1.7976931348623158E+308idata,data,pdata(指针)810~0Xffnear,xdata,code(指针)1620~0xFFFF数据类型far,huge(指针)3240~0Xffffffsbit1—“0”或“1”sfr810~+255sfr161620~+65535数据类型位数字节数值的范围数据类型
--标准C语言所支持的类型本节只介绍标准C语言所支持数据类型中的基本类型,包括voidcharintenumfloatdouble标准C语言所支持的类型
--void数据类型void定义了没有返回值的函数,没有参数列表的函数以及指向未定义类型对象的指针其用法如下:voidfunction-name(argument-list);return-typefunction-name(void);void*name;其中function-name为函数的名字argument-list为传给函数的参数return-type为函数的返回类型name为指向void对象的指针标准C语言所支持的类型
--char数据类型char定义了1个字节的二进制整数其格式为:<[>{signed|unsigned}<]>charname<[>=value<]>;其中name为变量的名字value为分配给变量的值signed或unsigned显式声明数据类型是有符号或无符号标准C语言所支持的类型
--int数据类型int定义了1个二进制整数其格式为:
<[>{signed|unsigned}<]><[>{long|short}<]>intname<[>=value<]>;其中name为变量的名字value为分配给变量的值signed或unsigned显式声明数据类型是有符号的还是无符号的long或short声明整数是32位或16位的整数标准C语言所支持的类型
--enum关键字enum(枚举)定义了一组int类型的常数其格式如下:enum[tag]{name[=value],...};其中tag为enum集的名字name为枚举常数的名字value为分配给常数的值。如果缺少值,则假定它是集合+1中的前一个常量的值。列表中第一个常数的默认值为0标准C语言所支持的类型
--float数据类型float定义了IEEE-754浮点数其格式如下:floatname<[>=value<]>;其中name为变量的名字value为分配给变量的值标准C语言所支持的类型
--float在兼容MCS-251ISA的STC32G系列单片机中,浮点数按下面格式保存表中s表示符号位,取值为“1”表示负数,“0”表示正数E是指数M是24位尾数(保存23位)。最高位24位总是为“1”,因此无需保存地址地址+0地址+1地址+2地址+3内容SEEEEEEEEMMMMMMMMMMMMMMMMMMMMMMM标准C语言所支持的类型
--float浮点数-12.5,其保存在STC32G系列单片机中保存为十六进制数0xC1480000该十六进制数在存储器中的保存格式表中:符号位为“1”,表示该浮点数为负数指数为“10000010”,等效于十进制数130尾数为“10010000000000000000000”,等效于十进制小数0.5625地址地址+0地址+1地址+2地址+3内容(十六进制)0xC10x480x000x00内容(二进制数)11000001010010000000000000000000标准C语言所支持的类型
--float
因此,真正的十进制浮点数表示为:注:STC32G系列单片机中不包含捕获浮点错误的中断向量。因此,软件必须对这些错误条件进行适当的响应
标准C语言所支持的类型
--floatC251库函数_chkfloat_允许程序开发人员快速的检查浮点状态作为替代方案,可以使用下面的联合体来保存浮点值unionf{floatf;//浮点数的值unsignedlongul;//无符号长整型数};该联合体包含一个浮点数和一个无符号长整型数,用于执行浮点运算以及响应IEEE的错误状态标准C语言所支持的类型
--float检查浮点运算状态的C语言代码#include<intrins.h>//包含头文件intrins.h#include<stdio.h>//包含头文件stdio.h#include<reg251s.h>//包含头文件reg251s.h
voidmain(void)//主函数main{ floatf2=1.0,f3=0.0;//声明浮点数f2和f3floatf1;//声明浮点数f1SCON=0x52;//初始化串口寄存器SCONTMOD=0x20;//初始化串口寄存器TMODTCON=0x69;//初始化串口寄存器TCONTH1=0xF3;//初始化串口寄存器TH1 f1=f2/f3;//浮点数f2和f3相除,除数f3为0标准C语言所支持的类型
--floatswitch(_chkfloat_(f1))//调用chkfloat,判断浮点运算结果 {case0://取值为0,表示浮点运算结果正常printf("resultisanumber\n");break;//在KeilUART窗口打印信息case1://取值为1,表示浮点除数为零printf("resultiszero\n");break;//在KeilUART窗口打印信息case2://取值为2,表示浮点运算上溢printf("resultis+INF\n");break;//在KeilUART窗口打印信息case3://取值为3,表示浮点运算下溢printf("resultis-INF\n");break;//在KeilUART窗口打印信息case4://取值为4,表示不是一个数printf("resultisNaN\n");break;//在KeilUART窗口打印信息}}标准C语言所支持的类型
--double数据类型double定义了IEEE-754浮点数其格式如下:doublename<[>=value<]>;其中name为变量的名字value为分配给变量的值注:只要没有使用FLOAT64编译器命令,数据类型double和数据类型float就是相同的。在这种情况下,类型double的变量使用与类型float相同的4字节存储类型标准C语言所支持的类型
--double数据类型
--位寻址对象位可寻址对象是可以作为字或者位寻址的对象只有占据STC32G系列单片机内部存储器的位可寻址区域的数据对象属于这一类别C251编译器将用bdata或ebdata存储器类型声明的变量放到位可寻址区域存储器类型bdata是指8051兼容位空间;ebdata指定扩展的STC32G系列单片机的位空间bdata和ebdata存储器类型都像数据存储器类型一样处理,除了变量驻留在片上数据存储器的位可寻址部分中注:对于bdata,该存储器区域的总大小不能超过16字节;对于ebdata,则不能超过96字节数据类型
--位寻址对象程序开发人员可以声明全局bdata/ebdata变量,如下所示:intbdataibase;//位可寻址的int型charbdatabary[4];//位可寻址的数组intebdataibase;//ebdata可位寻址的int型charebdatabary[4];//ebdata可位寻址的char型上面的例子中,变量ibase和bary是可位寻址的。因此,可以直接访问和修改这些变量的各个位。使用sbit关键字声明访问bdata变量位的新变量sbitmybit0=ibase^0;//ibase的位0sbitmybit15=ibase^15;//ibase的位15数据类型
--位寻址对象sbitAry07=bary[0]^7;//bary[0]的位7sbitAry37=bary[3]^7;//bary[3]的位7
sbitebBit0=ebase^0;//ebase的位0sbitebBit15=ebase^15;//ebase的位15
sbitebAry07=eary[0]^7;//eary[0]的位7sbitebAry37=eary[3]^7;//eary[3]的位7数据类型
--位寻址对象上面的例子表示声明,而不是对ibase/ebase和bary/eary变量的位的赋值例子中的符号“^”后面的表达式指定使用该声明访问的位的位置。该表达式必须是常数值范围取决于声明中包含的基变量的类型。范围是:0~7用于char和unsignedchar;0~15用于int、unsignedint、short和unsignedshort;0~31用于long和unsignedlong;注:C251编译器假设使用sbit声明访问的对象以小端字节顺序保存。这是sfr16类型的情况。然而,像int和long这样的标准C类型以大端保存数据类型
--位寻址对象此外,可以为sbit类型提供外部变量声明,以访问其他模块中的这些类型。例如:externbitmybit0;//ibase的位0externbitmybit15;//ibase的位15
externbitAry07;//bary[0]的位7externbitAry37;//bary[3]的位7
externbitebdataeBit15;//外部基于ebdata的位externbitebdataebAry37;//外部基于ebdata的位数据类型
--位寻址对象涉及sbit类型的声明要求使用存储器类型bdata或ebdata声明基对象注:基于ebdata的外部位的声明需要存储器类型ebdata。如果没有显式存储器,则假定默认空间bdata唯一例外的是特殊功能位的“变种”。如果要声明基于SFR的位,则必须省略存储器空间下面的例子说明了基于上述声明更改ibase和bary位的方法Ary37=0;//清除bary[3]的位7bary[3]='a';//字节寻址ibase=-1;//字寻址mybit15=1;//设置ibase的位15数据类型
--位寻址对象除了用bdata声明的变量位于内部数据存储器的可位寻址部分之外,bdata存储器类型的处理方式于数据存储器类似注:该存储器区域的总大小不能超过16字节数据类型
--位寻址对象除了位标量类型声明sbit变量之外,还可以为结构和联合声明sbit。比如:unionlft//声明联合类型lft{floatmf;longml;};sbittcpf31=tcp.u.ml^31;//浮点位31sbittcpm10=tcp.m1^0;//字符位0sbittcpm17=tcp.m1^7;//字符位7数据类型
--位寻址对象bdatastructbad//声明结构类型bad,设置在bdata区域
{charm1;unionlftu;}tcp;数据类型
--位寻址对象bit类型定义单个位变量。其用途如下:bitname<[>=value<]>其中:name为位变量的名字value为分配给位变量的值bit类型可用于变量声明、参数列表和函数返回值数据类型
--位寻址对象位变量和其他C数据类型一样声明。例如:staticbitdone_flag=0;//声明并初始化位变量done_flag
//函数testfunc返回类型为bit,参数类型为bitbittestfunc(bitflag1,bitflag2){…return(0);//函数返回类型为bit}数据类型
--位寻址对象所有的位变量都保存在STC32G系列单片机的8051兼容内部存储器区域中的位段中因为该区域只有16个字节长度,所以在任何一个范围内最多可以声明128位变量注:对STC32G系列单片机的扩展位的访问比对标准8051兼容位区域的访问产生更多的代码。因此,程序开发人员应尽可能使用标准的8051兼容位区域,以最大化性能数据类型
--位寻址对象STC32G系列单片机支持位于数据存储器地址范围0x20~0x7F中扩展位可寻址区域。该区域最多支持768位变量要在扩展位区域中定位位,需要指定ebdata。如下所示:bitebdatastate1;//在扩展位空间声明位变量state1bitfunction(bitflag)//在8051位空间的位参数flag{bitebdatalocal_bit;//在扩展位空间声明本地位变量local_bitlocal_bit=flag;return(local_bit);//函数返回扩展位空间位变量local_bit}数据类型
--位寻址对象下面的限制适用于位变量和位声明:不能将位声明成指针。例如:bit*ptr;//非法的位类型的数组无效。例如:bitware[5];//非法的
禁止中断的函数(#pragmadisable)和使用显式寄存器声明的函数(usingn)不能返回类型为bit的值C251编译器为尝试返回位类型的此类函数生成错误消息数据类型
--特殊功能寄存器STC32G系列单片机位访问SFR提供了独特的存储区域在程序中,SFR用于控制定时器、计数器、串行I/O、端口I/O和外设SFR位于地址0x80~0xFF之间,可以作为位、字节和字访问特殊功能寄存器
--sfrsfr类型定义了一个SFR其格式如下:sfrname=address;其中name为SFR的名字address为SFR的地址SFR的声明方式与其他C变量相同。唯一的区别是指定的类型是sfr而不是char或int特殊功能寄存器
--sfr例如:sfrP0=0x80;//端口0的地址为80hsfrP1=0x90;//端口1的地址为90hsfrP2=0xA0;//端口2的地址为0A0hsfrP3=0xB0;//端口3的地址为0B0hP0、P1、P2和P3是SFR名字声明sfr变量的名字与其他C变量声明一样定义sfr声明中可以使用任何符号名字等号(“=”)后面的地址规范必须是数字常数。不允许使用带有运算符的表达式。此常数表达式必须位于SFR地址范围(0x80~0xFF)内。
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年理财规划师之二级理财规划师真题含完整答案详解(各地真题)
- 2026年质量员继续教育题库试题【巩固】附答案详解
- 心身疾病的心理护理质量控制
- 2026年一级注册建筑师《建筑经济、施工与设计业务管理》考试彩蛋押题及参考答案详解(满分必刷)
- 2026年医师考核笔考前冲刺模拟带答案详解(培优B卷)
- 休克急救护理中的伦理问题与应对
- 统编人教版六年级语文下册古诗词诵读《江上渔者》示范公开课教学课件
- 生物质与工业废弃物协同改性生物基材料的制备工艺与性能优化研究
- 2026浙江中外运有限公司温州分公司招聘2人备考题库及答案详解(有一套)
- 2026辽宁丹东国有资本投资运营集团有限公司招聘备考题库含答案详解(满分必刷)
- 房屋建筑统一编码与基本属性数据标准JGJ-T496-2022
- 2026年七年级语文下册期中真题汇编 专题08 名著《骆驼祥子》
- 山东省济南市2026届高三下学期二模试题 数学 含答案
- 2026中盐甘肃省盐业(集团)有限责任公司管理人员招聘3人建设笔试模拟试题及答案解析
- 依法合规进行业务的承诺书范文4篇
- 工厂采购部绩效考核制度
- 【新教材】人教版八年级生物下册实验01 鸟卵适于在陆地上发育的结构特征(教学课件)
- 2026年中职计算机专业教师岗位实操考核试题及答案
- 深圳大疆在线测评行测题库
- 《高中生科技创新活动与综合素质评价研究》教学研究课题报告
- 组织部采购工作内控制度
评论
0/150
提交评论