您好,欢迎访问三七文档
当前位置:首页 > 建筑/环境 > 工程监理 > 第4章KeilC51应用程序设计.
KeilC51应用程序设计长江大学徐爱钧KeilC51程序的一般结构与标准C语言相同,KeilC51程序由一个或多个函数构成,其中应至少包含一个main函数。一般结构如下:预处理命令/*用于包含头文件等*/全局变量说明/*全局变量可被本程序的所有函数引用*/功能函数说明/*说明自定义函数,以便调用*/main(){/*主函数*/局部变量说明;/*局部变量只能在所定义函数内部引用*/执行语句;函数调用;}/*其他函数定义*/数据类型KeilC51编译器除了支持常用的char(字符型),int(整型),long(长整型),float(浮点型),*(指针型)等基本数据类型之外,还支持以下扩充数据类型。bit位类型。可定义一个位变量,但不能定义位指针,也不能定义位数组。sfr特殊功能寄存器。可以定义8051单片机的所有内部8位特殊功能寄存器。sfr型数据占用一个内存单元,其取值范围是0~255。sfr1616位特殊功能寄存器。它占用两个内存单元,取值范围是0~65535,可以定义8051单片机内部16位特殊功能寄存器。sbit可寻址位。可以定义8051单片机内部RAM中的可寻址位或特殊功能寄存器中的可寻址位。KeilC51能够识别的数据类型数据类型长度值域unsignedchar单字节0~255signedchar单字节-128~127unsignedint双字节0~65536signedint双字节-32768~32767unsignedlong四字节0~4294967295signedlong四字节-2147483648~2147483647float四字节±1.175494E-38~±3.402823E+38*1~3字节对象的地址bit位0或1sfr单字节0~255sfr16双字节0~65536sbit位0或1变量定义格式KeilC51中对变量进行定义的格式如下:[存储种类]数据类型[存储器类型]变量名表;其中,“存储种类”和“存储器类型”是可选项。变量的存储种类有四种:自动(auto)、外部(extern)、静态(static)和寄存器(register)。定义变量时如果省略存储种类选项,则该变量将为自动(auto)变量。KeilC51编译器还允许说明变量的存储器类型,使之能够在8051单片机内准确地定位。KeilC51能够识别的存储器类型存储器类型说明DATA直接寻址的片内数据存储器(128字节),访问速度最快。BDATA可位寻址的片内数据存储器(16字节),允许位与字节混合访问。IDATA间接访问的片内数据存储器(256字节),允许访问全部片内地址。PDATA分页寻址的片外数据存储器(256字节),用MOVX@Ri指令访问。XDATA片外数据存储器(64K字节),用MOVX@DPTR指令访问。CODE程序存储器(64K字节),用MOVC@A+DPTR指令访问。编译模式KeilC51定义变量时如果省略“存储器类型”选项,则按编译时使用的存储器模式SMALL、COMPACT或LARGE来规定默认存储器类型,确定变量的存储器空间,函数中不能采用寄存器传递的参数变量和过程变量也保存在默认的存储器空间。KeilC51能够识别的编译器模式编译模式存储器类型SMALLDATA,变量被定义在8051片内数据存储器中。COMPACTPDATA,变量被定义在分页寻址的片外数据存储器中,每一页片外数据存储器的长度为256字节。这时对变量的访问是通过寄存器间接寻址(MOVX@Ri)进行。LARGEXDATA,变量被定义在片外数据存储器中(最大可达64K字节),使用数据指针DPTR来间接访问变量(MOVX@DPTR)。一般指针与基于存储器的指针KeilC51支持两种指针类型:一般指针和基于存储器的指针。一般指针可用于存取任何变量而不必考虑变量在8051单片机存储器空间的位置,许多C51库函数采用了一般指针。定义一般指针与ANSIC相同,例如:char*sptr;/*char型指针*/int*numptr/*int型指针*/定义基于存储器的指针时可以指定存储器空间,例如:chardata*xdatastr;/*指向data空间char型数据的指针,指针本身在xdata空间*/intxdata*datanum;/*指向xdata空间char型数据的指针,指针本身在data空间*/longcode*idatapow;/*指向code空间long型数据的指针,指针本身在idata空间*/KeilC51对存储器的访问KeilC51可以采用指针变量来访问存储器地址空间。由于8051单片机存储器结构自身的特点,仅用指针方式访问有时会感觉不太方便,也可以利用库函数中绝对地址访问头文件“ABDACC.H”来访问不同区域的存储器地址空间。绝对地址访问KeilC51在源程序中定义变量时,可以利用扩展关键字“_at_”来对指定变量在存储器空间的绝对地址,一般格式如下:[存储器类型]数据类型标识符_at_地址常数其中,“存储器类型”为idata、data、xdata等C51编译器能够识别的所有类型,如果省略该选项,则按编译模式LARGE、COMPACT或SMALL规定的默认存储器类型确定变量的存储器空间;“数据类型”除了可用int、long、float等基本类型外,还可以采用数组、结构等复杂数据类型;标识符为要定义的变量名;地址常数规定了变量的绝对地址,它必须位于有效存储器空间。也可以用头文件“ABSACC.H”中的预定义宏来指定变量的绝对地址。头文件“ABSACC.H”中的预定义宏宏定义可访问的存储器空间及数据类型CBYTE[地址](访问CODE区char型)CWORD[地址](访问CODE区int型)DBYTE[地址](访问DATA区char型)PBYTE[地址](访问PDATA区或I/O端口char型)XBYTE[地址](访问XDATA区或I/O端口char型)DWORD[地址](访问DATA区int型)PWORD[地址](访问PDATA区或I/O端口int型)XWORD[地址](访问XDATA区或I/O端口int型)中断服务函数与寄存器组定义KeilC51编译器支持在C语言源程序中直接编写8051单片机的中断服务函数程序,一般形式为:函数类型函数名(形式参数表)[interruptn][usingn]关键字intrrupt后面的n是中断号,n的取值范围为0~31。编译器从8n+3处产生中断向量,具体的中断号n和中断向量取决于8051系列单片机芯片型号。关键字using用来选择8051单片机中不同的工作寄存器组。using后面的n是一个0~3的常整数,分别选中4个不同的工作寄存器组。常用中断号与中断向量中断号n中断源中断向量8n+30外部中断00003H1定时器0000BH2外部中断10013H3定时器1001BH4串行口0023H数据调用协议KeilC51编译器规定数据在内存中按高字节地址在前、低字节地址在后的顺序存放。一个值为0x12345678的“long”类型数据,在内存中存储格式如下:地址+0+1+2+3内容0x120x340x560x78数据调用协议“float”类型数据的长度为4个字节(32位),在内存中按IEEE-754标准单精度32位浮点数的格式存储。格式如下:地址+0+1+2+3内容SEEEEEEEEMMMMMMMMMMMMMMMMMMMMMMM其中,S为符号位,“0”正“1”负。E为用原码表示的阶码,占用8位二进制数,存放在两个字节中,E的取值范围是1~254。注意,实际上以2为底的指数要用E的值减去偏移量127,实际幂指数的取值范围为-126~+127。M为尾数的小数部分,用23位二进制数表示,存放在三个字节中。尾数的整数部分永远为1,因此不予保存,但它是隐含存在的。小数点位于隐含的整数位“1”的后面。数据调用协议KeilC51编译器支持“基于存储器”的指针和“一般”指针。基于存储器类型data、idata和pdata的指针具有1个字节的长度,基于存储器类型xdata和code的指针具有2个字节的长度,一般指针具有3个字节的长度。在一般指针的3个字节中,第一个字节表示存储器类型,第二、第三个字节表示指针的地址偏移量。一般指针在内存中的存储格式为:地址+0+1+2内容存储器类型高字节地址偏移量低字节地址偏移量第一个字节中存储器类型的编码如下:存储器类型idata/data/bdataxdatapdatacode编码值0x000x010xFE0xFFKeilC51的库函数本征库函数本征库函数是指编译时直接将固定的代码插入到当前行,而不是用汇编语言中的“ACALL”和“LCALL”指令来实现调用,从而大大提高函数的访问效率。非本征库函数则必须由“ACALL”和“LCALL”指令来实现调用。KeilC51的本征库函数只有9个,数量虽少,但非常有用。本征库函数在头文件INTRINS.H中定义。字符判断转换库函数字符判断转换库函数的原型声明在头文件CTYPE.H中定义。KeilC51的库函数输入输出库函数输入输出库函数的原型声明在头文件STDIO.H中定义,通过8051系列单片机的串行口工作,如果希望支持其它I/O接口,只需要改动_getkey()和putchar()函数,库中所有其它I/O支持函数都依赖于这两个函数模块,在使用8051系列单片机的串行口之前,应先对其进行初始化。例如以2400波特率(12MHz时钟频率)初始化串行口的语句如下:SCON=0x52;/*SCON置初值*/TMOD=0x20;/*TMOD置初值*/TH1=0xf3;/*T1置初值*/TR1=1;/*启动T1*/KeilC51的库函数字符串处理库函数字符串处理库函数的原型声明包含在头文件STRING.H中,字符串函数通常接收指针串作为输入值。一个字符串应包括2个或多个字符,字符串的结尾以空字符表示。在函数memcmp、memcpy、memchr、memccpy、memset和memmove中,字符串的长度由调用者明确规定。类型转换及内存分配库类型转换及内存分配库函数的原型声明包含在头文件STDLIB.H中,利用该库函数可以完成数据类型转换以及存储器分配操作。KeilC51的库函数字符串处理库函数字符串处理库函数的原型声明包含在头文件STRING.H中,字符串函数通常接收指针串作为输入值。一个字符串应包括2个或多个字符,字符串的结尾以空字符表示。在函数memcmp、memcpy、memchr、memccpy、memset和memmove中,字符串的长度由调用者明确规定。类型转换及内存分配库类型转换及内存分配库函数的原型声明包含在头文件STDLIB.H中,利用该库函数可以完成数据类型转换以及存储器分配操作。数学计算库函数数学计算库函数的原型声明包含在头文件MATH.H中。
本文标题:第4章KeilC51应用程序设计.
链接地址:https://www.777doc.com/doc-2156375 .html