资源预览内容
第1页 / 共114页
第2页 / 共114页
第3页 / 共114页
第4页 / 共114页
第5页 / 共114页
第6页 / 共114页
第7页 / 共114页
第8页 / 共114页
第9页 / 共114页
第10页 / 共114页
亲,该文档总共114页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
第8章 C51程序设计语言及程序设计,8.1 C51数据类型与运算 8.2 C51流程控制语句 8.3 C51构造数据类型 8.4 C51函数 8.5 C51应用编程实例,8.1 C51数据类型与运算,8.1.1 C51数据类型 8.1.2 C51数据存储类型 8.1.3 C51定义SFR 8.1.4 C51定义并行口 8.1.5 C51定义位变量 8.1.6 C51运算符、表达式及其规则,8.1.1 C51数据类型,C51具有标准C语言的所有标准数据类型,针对51单片机内部结构增加了以下特殊数据类型: (1)bit 位变量。 (2)sbit 可独立寻址的位变量。 (3)sfr 8位特殊功能寄存器。 (4)sfr16 16位特殊功能寄存器。,8.1.1 C51数据类型,1char字符类型 char类型的数据长度是一个字节,通常用于定义处理字符数据的变量或常量。分无符号字符类型unsigned char 和有符号字符类型signed char,默认值为 signed char 类型。 2int整型 int整型长度为两个字节,用于存放一个双字节数据。分有符号整型数signed int和无符号整型数unsigned int,默认值为signed int类型。,8.1.1 C51数据类型,3long长整型 long长整型长度为四个字节,用于存放一个四字节数据。分有符号长整型signed long 和无符号长整型unsigned long,默认值为signed long 类型。 4float浮点型 float浮点型在十进制中具有7位有效数字,是符合IEEE754标准的单精度浮点型数据,占用四个字节。,8.1.1 C51数据类型,5指针型 指针型本身就是一个变量,在这个变量中存放的数据是指向另一个数据的地址。这个指针变量要占据一定的内存单元,对不一样的处理器长度也不尽相同,在C51中它的长度一般为13个字节。 6bit位变量 bit位变量是C51编译器的一种扩充数据类型,利用它可定义一个位标量,但不能定义位指针,也不能定义位数组。它的值是一个二进制位,不是0就是1,类似一些高级语言中的Boolean 类型中的True和False。,8.1.1 C51数据类型,7sfr特殊功能寄存器 sfr也是一种扩充数据类型,占用一个内存单元,值域为 0255。利用它能访问51单片机内部的所有特殊功能寄存器。 8sfr16 16位特殊功能寄存器 sfr16占用两个内存单元,值域为 065535。sfr16和sfr一样用于操作特殊功能寄存器,不同的是它用于操作占两个字节的寄存器,如定时器T2。,8.1.1 C51数据类型,9sbit 可寻址位 sbit同样是单片机C语言中的一种扩充数据类型,利用它能访问芯片内部的RAM中的可寻址位或特殊功能寄存器中的可寻址位。,8.1.1 C51数据类型,表8.1 Keil uVision2单片机C语言编译器所支持的数据类型,8.1.2 C51数据存储类型,C51编译器可以通过将变量、常量定义为不同的存储类型(data,bdata,idata,pdata,xdata,code)的方法,将它们定义在不同的存储区中。 C51数据存储类型与MCS-51单片机实际存储空间的对应关系如表8.2所示。,表8.2 C51存储类型与MCS-51单片机存储空间的对应关系,当使用存储类型data,bdata定义常量和变量时,C51编译器会将它们定位在片内数据存储区中。片内RAM是存放临时性传递变量或使用频率较高变量的理想场所。访问片内数据存储器(data,bdata,idata)比访问片外数据存储器(xdata,pdata)相对快一些,因此可将经常使用的变量置于片内数据存储器,而将规模较大的,或不常使用的数据置于片外数据存储器中。 C51存储类型及其大小和值域如表8.3所示。,表8.3 C51存储类型及其大小和值域,如果在变量定义时略去存储类型标志符,编译器会自动默认存储类型。默认的存储类型进一步有SMALL、COMPACT和LARGE存储模式指令限制。见表8.4。,表8.4 存储模式及说明,8.1.3 C51定义SFR,在C51中,特殊功能寄存器及其可位寻址的位是通过关键字sfr和sbit来定义的,这种方法与标准C不兼容,只适用于C51。 (1)sfr:定义为8位特殊功能寄存器。例如, sfr PSW=0xD0; /定义程序状态字PSW的地址为D0H sfr TMOD=0x89; /定义定时器/计数器方式控制寄存器 TMOD的地址为89H sfr P1=0x90; /定义P1口的地址为90H “sfr”后面必须跟一个特殊寄存器名;“=”后面的地址必须为常数,常数值的范围必须在特殊功能寄存器地址范围内,即位于地址0x80到0xff之间,不允许带有运算符的表达式。,(2)sfr16:定义的16位特殊功能寄存器。例如, sfr16 T2=0xCC; /定义8052定时器2,低8位地址为T2L=CCH, 高8位T2H=CDH 用sfr16定义16位特殊功能寄存器时,等号后面是它的低位地址。sfr16不能用于定时器0和1的定义。 (3)sbit:定义为可位寻址对象,如访问特殊功能寄存器中的某位。例如,PSW是可位寻址的SFR,其中各位可用sbit定义。 sbit CY=0xD7; /定义进位标志CY的地址为D7H sbit AC=0xD06; /定义辅助进位标志AC的地址为D6H sbit RS0=0xD03; /定义RS0的地址为D3H 注意:sfr和sbit只能在函数外使用,一般放在程序的开头。,8.1.4 C51定义并行口,MCS-51单片机的基本I/O口只有P0、P1、P2、和P3四个,除此之外,还可以在片外扩展I/O口和其他功能芯片,它们与外部数据存储器统一编址,即MCS-51单片机把它们当作外部数据存储单元。 P0、P1、P2和P3的定义在头文件reg51.h和reg52.h中,扩展的外部RAM单元和外部I/O口需要用户自己定义。例如, #include “absacc.h“ #define PA XBYTE0xffec main() PA=0x3A; /将数据3AH写入地址为0xffec的存储单元或I/O端口 以上程序用C中的编译预处理命令#define将PA定义为外部I/O口,地址为0xffec,是单字节量。其中XBYTE是一个指针,指向外部数据存储器的零地址单元,它是在绝对地址访问头文件absacc.h中定义的。,8.1.5 C51定义位变量,1位变量的定义 位变量用关键字“bit”来定义,它的值是一个二进制位。例如, bit lock; /将lock定义为位变量 bit direction; /将direction定义为位变量,8.1.5 C51定义位变量,2函数可以有bit类型的参数,也可以有bit类型的返回值 例如, bit func(bit b0,bit b1) bit a; return a; 使用禁止中断宏命令#progma disable,或指定明确的寄存器切换(using n)的函数不能返回位值。,8.1.5 C51定义位变量,3对位变量定义的限制 不能定义位变量的指针,如:bit *bit_point; 不能定义位数组,如:bit bit_array5; 位变量说明中可以指定存储类型,位变量的存储类型只能是bdata。 在程序设计时,对于可位寻址的对象,既可以字节寻址又可以位寻址的变量,则其存储类型只能是bdata。,8.1.6 C51运算符、表达式及其规则,C51的运算符主要有: 算术运算符 关系运算符 逻辑运算符 赋值及复合赋值运算符等,8.1.6 C51运算符、表达式及其规则,1算术运算符和算术表达式 (1)基本的算术运算符:C51最基本的算术运算符有以下五种: + (加法运算符) (减法运算符) (乘法运算符) (除法运算符) % (模运算或取余运算符) 对于除法运算符:若两个整数相除,结果为整数(即取整)。 对于取余运算符:要求%两侧的操作数均为整型数据,所得结果的符号与左侧操作数的符号相同。,8.1.6 C51运算符、表达式及其规则,(2)自增、自减运算符:+为自增运算符,为自减运算符。例如, +j、j+、i、i +和运算符只能用于变量,不能用于常量和表达式。+j表示先加1,再取值;j+表示先取值,再加1。同理,自减运算也是这个道理。,8.1.6 C51运算符、表达式及其规则,(3)算术表达式和运算符的优先级与结合性:用算术运算符和括号将运算对象连接起来的式子称为算术表达式。其中的运算对象包括常量、变量、函数、数组、结构等。例如:a+b*c/d。 C51规定了算术运算符的优先级和结合性为:先乘除模,后加减,括号最优先。,8.1.6 C51运算符、表达式及其规则,如果一个运算符两侧的数据类型不同,则必须通过数据类型转换将数据转换成同种类型。转换方式有以下两种。 一是自动类型转换:即在程序编译时,由C编译器自动进行数据类型转换。转换规则如右侧所示:,8.1.6 C51运算符、表达式及其规则,一般来说,当运算对象的数据类型不相同时,先将较低的数据类型转换成较高的数据类型,运算结果为较高的数据类型。 二是强制类型转换:使用强制类型转换运算符,其形式为:(类型名)(表达式)。例如, (double) a 将a强制转换成double类型 (int) (x+y) 将x+y强制转换成int类型,8.1.6 C51运算符、表达式及其规则,2关系运算符和关系表达式 (1)关系运算符及其优先级:关系运算即比较运算。C51提供了六种关系运算符如下: (小于) = (小于等于) (大于) = (大于等于) = (等于) != (不等于) 优先级关系是: 、=、=这四个运算符的优先级相同,处于高优先级。 =和!=这两个运算符的优先级相同,处于低优先级。 关系运算符的优先级低于算术运算符的优先级,而高于赋值运算符的优先级。,8.1.6 C51运算符、表达式及其规则,(2)关系表达式:用关系运算符将运算对象连接起来的式子称为关系表达式。如:ab,a+b=c+d,(a=3)=b,若a的值是4,b的值是3,则给定关系满足,关系表达式的值为1,即逻辑真;若a的值是2,则给定关系不成立,系表达式的值为0,即逻辑假。,8.1.6 C51运算符、表达式及其规则,3逻辑运算符和逻辑表达式 (1)逻辑运算符及其优先级:逻辑运算是对逻辑量进行运算。C51提供三种逻辑运算符。如下: & (逻辑与) | (逻辑或) ! (逻辑非) 它们的优先级关系是:!的优先级最高,而且高于算术运算符;|的优先级最低,它低于关系运算符,却高于赋值运算符。,8.1.6 C51运算符、表达式及其规则,(2)逻辑表达式:用逻辑运算符将运算对象连接起来的式子称为逻辑表达式。运算对象可以是表达式或逻辑量,而表达式可以是算术表达式、关系表达式或逻辑表达式。逻辑表达式的值也是逻辑量,即真或假。 对于算术表达式,其值若为0,则认为是逻辑假;若不为0,则认为是逻辑真。 逻辑表达式的执行规则是:逻辑表达式不一定完全被执行,只有当一定要执行下一个逻辑运算符才能确定表达式的值时,才执行该运算符。,8.1.6 C51运算符、表达式及其规则,4位运算符及其表达式 位运算的操作对象只能是整型和字符型数据,不能是实型数据。C51提供以下六种位运算。 & (按位与) 相当于ANL指令 | (按位或) 相当于ORL指令 (按位异或) 相当于XRL指令 (按位取反) 相当于CPL指令 (右移) 相当于RR指令,8.1.6 C51运算符、表达式及其规则,5赋值运算符和赋值表达式 (1)赋值运算符:赋值运算符就是赋值符号“=”,赋值运算符的优先级低,结
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号