资源预览内容
第1页 / 共16页
第2页 / 共16页
第3页 / 共16页
第4页 / 共16页
第5页 / 共16页
第6页 / 共16页
第7页 / 共16页
第8页 / 共16页
第9页 / 共16页
第10页 / 共16页
亲,该文档总共16页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
单片机 C 语言及程序设计4.1 C51 概述“C51”概念:为了与 ANSI C 区别,把“单片机 C 语言”称为“C51”,也称为 “Keil C”。 用汇编语言编写单片机程序时,必须要考虑其存储器的结构,尤其要考虑其片内数据存储器、特殊功能寄存器是否正确合理的使用,以及按照实际地址端口数据的处理。 4.1.2 C 语言与 ANSI 的区别用 C51 编写程序,虽然不像汇编语言那样需要具体地组织、分配存储器资源,但是 C51 对数据类型和变量的定义,必须要与单片机的存储结构相关联,否则编译器不能正确地映射定位。 用 C51 编写单片机程序,与用 ANSI C 编写程序的不同之处是,需要根据单片机存储器结构及内部资源,定义相应的数据类型和变量。其它的语法规定、程序结构及程序设计方法,都与 ANSI C 相同。所以本章主要介绍 C51 各种变量的定义、指针定义、函数定义和混合编程。 4.1.3 C51 扩展的关键字由于单片机在结构及编程上的特殊要求,C51 有自己的特殊关键字,称之为 C51 扩展的关键字,下面给出常用的 C51 扩展的关键字。_at_ bdata bit codedata idata interrupt pdatareentrant sbit sfrsfr16 using volatile xdata 4.2 C51 数据类型及存储表 4-1 C51 数据类型、长度和数值范围数据类型 表示方法 长 度 数 值 范 围无符号字符型 unsigned char 1 字节 0255有符号字符型 signed char 1 字节 -128127无符号整型 unsigned int 2 字节 065535有符号整型 signed int 2 字节 -3276832767无符号长整型 unsigned long 4 字节 04294967295有符号长整型 signed long 4 字节 -21474836482147483647浮点型 float 4 字节 1.1755E-38 3.40E+38特殊功能寄存器型 Sfrsfr161 字节2 字节0255065535位类型 bit、sbit 1 位 0 或 1数据类型转换1)自动转换转换规则是向高精度数据类型转换、向有符号数据类型转换。如字符型变量与整型变量相加时,则位变量先转换字符型或整型数据,然后相加。2)强制转换像 ANSI C 一样,通过强制类型转换的方式进行转换。如:unsigned int b;float c; b=(int)c; 4.2.2 C51 数据的存储MCS-51 单片机只有 bit 和 unsigned char 两种数据类型支持机器指令,而其它类型的数据都需要转换成 bit 或 unsigned char 型进行存储。为了减少单片机的存储空间和提高运行速度,要尽可能地使用 unsigned char 型数据。一、位变量的存储bit 和 sbit 型位变量,直接存于 RAM 的位寻址空间,包括低 128 位和特殊功能寄存器位。 二、字符变量的存储字符变量(char):无论是 unsigned char 数据还是 signed char 数据,均为 1 个字节,能够被直接存储在 RAM 中,可以存储在00x7f 区域,也可以存储在 0x800xff 区域,与变量的定义有关。unsigned char 数:可直接被 MSC-51 接受signed char 数据:用补码表示。需要额外的操作来测试、处理符号位,使用的是两种库函数,代码量大,运算速度降低。三、整型变量的存储整型变量(int):不管是 unsigned int 数据还是 signed int 数据,均为 2 个字节,其存储方法是高位字节保存在低地址(在前面) ,低位字节保存在高地址(在后面) 。例如,整型变量的值为 0x1234,在内存中的存放如右图所示。signed int 数据用补码表示。四、长整型变量的存储长整型变量(long)为 4 个字节,其存储方法与整型数据一样,是最高位字节保存的地址最低(在最前面) ,最低位字节保存的地址最高(在最后面) 。 如长整型变量的值为 0x12345678,在内存中的存放方法如右图所示。不管是 unsigned long 数据还是 signed long 数据。五、浮点型变量的存储浮点型变量(fload )占 4 个字节,用指数方式表示,其具体格式与编译器有关。对于 Keil C,采用的是 IEEE-754 标准,具有 24 位精度,尾数的最高位始终为 1,因而不保存。具体分布为:1 位符号位,8 位阶码位,23 位尾数,如下图所示。 字节地址 0 1 2 3浮点数内容SEEEEEEEEMMMMMMMMMMMMMMMMMMMMMMM符号和阶码 尾数高位 尾数低位符号位 S:1 表示负数, 0 表示正数。阶码:用移码表示。如,实际阶码-126 用 1 表示,实际阶码 0 用 127 表示,即实际阶码数加上 127 得到阶码的表达数。阶码数值范围:-126+128。例如浮点数-12.5符号位为 1,12.5 的二进制数为 1100.1=1.1001E+0011,阶码数值为 3+127=130=10000010B,尾数为 1001。因此,其十六进制数为 0xC1480000,则存储结构如右图所示。 4.3 C51 变量的定义及数据存储区域 4.3.1 C51 变量的定义C51 变量定义的一般格式为:存储类型 数据类型 存储区变量名 1=初值 ,变量名 2=初值 ,或 存储类型 存储区 数据类型 变量名 1=初值 ,变量名 2=初值 ,可见变量(非位变量)的定义由 4 部分组成,即在变量定义时,指定变量 4 种属性。数据类型:在前面的 4.2 中已经叙述过,对于变量名也无须多说,下面主要解释“存储类型”和“存储区” 等概念。 4.3.2 C51 变量的存储类型存储类型这个属性我们仍沿用 ANSI C 的说法,尽量不改变原来的含义。按照 ANSI C,C 语言的变量有 4 种存储类型:动态存储(auto)静态存储(static)全局存储(extern)地址低高:3412:地址低高:78563412:地址低高:000048C1:寄存器存储(register) 一、动态存储动态(存储)变量:用 auto 定义的为动态变量,也叫自动变量。作用范围:在定义它的函数内或复合语句内部。 当定义它的函数或复合语句执行时,C51 才为变量分配存储空间,结束时所占用的存储空间释放。定义变量时,auto 可以省略,或者说如果省略了存储类型项,则认为是动态变量。动态变量一般分配使用寄存器或堆栈。 二、静态存储静态(存储)变量:用 static 定义的为静态变量。分为内部静态和外部静态变量。内部静态变量:在函数体内定义的为内部静态变量。 在函数内可以任意使用和修改,函数运行结束后会一直存在,但在函数外不可见,即在函数体外得到保护。外部静态变量:在函数体外部定义的为外部静态变量。在定义的文件内可以任意使用和修改,外部静态变量会一直存在,但在文件外不可见,即在文件外得到保护。 三、外部存储外部(存储)变量:用 extern 声明的变量为外部变量,是在其它文件定义过的全局变量。 用 extern 声明后,便可以在所声明的文件中使用。需要注意的是:在定义变量时,即便是全局变量,也不能使用 extern 定义。 四、寄存器存储寄存器(存储)变量:用 register 定义的变量为寄存器变量。寄存器变量存放在 CPU 的寄存器中,这种变量处理速度快,但数目少。C51 中的寄存器变量: C51 的编译器在编译时,能够自动识别程序中使用频率高的变量,并将其安排为寄存器变量,用户不用专门声明。 4.3.3 C51 变量的存储区域变量的存储区属性是单片机扩展的概念,非常重要,它涉及到 7 个新的关键字。MCS-51 单片机有四个存储空间,分成三类,它们是片内数据存储空间、片外数据存储空间和程序存储空间。MCS-51 单片机有更多的存储区域:由于片内数据存储器和片外数据存储器又分成不同的区域,所以单片机的变量有更多的存储区域。 在定义变量时,必须明确指出是存放在哪个区域。表 4-2 C51 存储区与存储空间的对应关系关键字 对应的存储空间及范围code ROM 空间, 64KB 全空间data 片内 RAM,直接寻址,低 128 字节bdata 片内 RAM,位寻址区 0x200x2f,可字节访问idata 片内 RAM,间接寻址, 256 字节,与 Ri 对应pdata 片外 RAM,分页寻址的 256 字节(P2 不变), P2改变可寻址 64KB 全空间,与 MOVX Ri 对应xdata 片外 RAM,64KB 全空间bit 片内 RAM 位寻找区,位地址 0x000x7f,128 位 4.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=0xfe;3)定义存储在 data 区域的静态 unsigned int 变量:static unsigned int data dd;4)定义存储在 bdata 区域的动态 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 int xdata receiv_buf50; /定义存放接受数据的数组8)定义存储在 code 区域的 unsigned char 数组:unsigned char code dis_code10=0x3f, 0x06, 0x5b, 0x4f, 0x66,0x6d,0x7d,0x07,0x7f,0x6f; /定义共阴极数码管段码数组 4.3.5 C51 变量的存储模式存储模式:如果在定义变量时缺省了存储区属性,则编译器会自动选择默认的存储区域,也就是存储模式。变量的存储模式也就是程序(或函数)的编译模式。编译模式分为三种:小模式(small) 、紧凑模式(compact)和大模式(large) 。编译模式由编译控制命令决定。存储模式(编译模式)决定了变量的默认存储区域和参数的传递方法。 一、small 模式在 small 模式下,变量的默认存储区域是“data”、 “idata”,即未指出存储区域的变量保存到片内数据存储器中,并且堆栈也安排在该区域中。small 模式的特点:存储容量小,但速度快。在 small 模式下参数的传递:通过寄存器、堆栈或片内数据存储区完成的。 二、compact 模式在 compact 模式下,变量的默认存储区域是“pdata”,即未指出存储区域的变量保存到片外数据存储器的一页中,最大变量数为256 字节,并且堆栈也安排在该区域中。compact 模式的其特点:是存储容量较 small 模式大,速度较 small 模式稍慢,但比 large 模式要快。在 compact 模式下参数的传递:通过片外数据区的一个固定页完成的。 三、large 模式在 large
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号