第3章C51数据与运算_第1页
第3章C51数据与运算_第2页
第3章C51数据与运算_第3页
第3章C51数据与运算_第4页
第3章C51数据与运算_第5页
已阅读5页,还剩67页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第三章第三章C51数据与运算数据与运算 3.1数据与数据类型数据与数据类型 数据数据具有一定格式的数字或数值叫做数据具有一定格式的数字或数值叫做数据 数据类型数据类型数据的不同格式叫做数据类型数据的不同格式叫做数据类型 数据结构数据结构数据按一定的数据类型进行的排数据按一定的数据类型进行的排 列、组合、架构。列、组合、架构。 C51编译器具体支持的数据类型:编译器具体支持的数据类型:位型,无符号字符,有符号字符,位型,无符号字符,有符号字符,无无 符号整型,有符号整型,无符号长型,符号整型,有符号整型,无符号长型,有符号长型,有符号长型,浮点和指针类型等浮点和指针类型等 C51数据类型与标准数

2、据类型与标准C数据类型的最大不同之处:位型数据类型的最大不同之处:位型 位型(位型(bit) 字符型(字符型(char) 整型(整型(int) 长整型(长整型(long) 浮点型(浮点型(float) 双精度浮点型(双精度浮点型(double) 数组类型(数组类型(array) 结构体类型(结构体类型(struct) 共用体(共用体(union) 枚举(枚举(enum) 基本类型基本类型 构造类型构造类型 指针类型指针类型 空类型空类型 数据类型数据类型 表表3-1 KEIL C51的数据类型的数据类型 数据类型数据类型长度长度(bit)长度长度(byte)值域值域 bit1 1 0,1 un

3、signed char810255 signed char81 128127 unsigned int 162065535 signed int 162 3276832767 unsigned long32404294967295 signed long 324 21474836482147483647 float 324 1.176E383.40E+38(6位数字位数字) double648 1.176E383.40E+38(10位数字位数字) 一般指针一般指针243存储空间存储空间065535 在在C51语言程序中,有可能会出现在运算中数据类型语言程序中,有可能会出现在运算中数据类型 不一

4、致的情况。不一致的情况。C51允许任何标准数据类型的隐式转换,允许任何标准数据类型的隐式转换, 隐式转换的优先级顺序如下:隐式转换的优先级顺序如下: bitcharintlongfloat unsignedsigned 也就是说,当也就是说,当char型与型与int型进行运算时,先自动对型进行运算时,先自动对 char型扩展为型扩展为int型,然后与型,然后与int型进行运算,运算结果为型进行运算,运算结果为 int型。型。C51除了支持隐式类型转换外,还可以通过强制类除了支持隐式类型转换外,还可以通过强制类 型转换符型转换符“()()”对数据类型进行人为的强制转换。对数据类型进行人为的强制转

5、换。 C5l编译器除了能支持以上这些基本数据类型之外,编译器除了能支持以上这些基本数据类型之外, 还能支持一些复杂的组合型数据类型,如数组类型、指还能支持一些复杂的组合型数据类型,如数组类型、指 针类型、结构类型、联合类型等这些复杂的数据类型。针类型、结构类型、联合类型等这些复杂的数据类型。 常量是指在程序执行过程中其值不能改变的量。在常量是指在程序执行过程中其值不能改变的量。在 C51中支持整型常量、浮点型常量、字符型常量和字符串中支持整型常量、浮点型常量、字符型常量和字符串 型常量。型常量。 一、整型常量一、整型常量 整型常量也就是整型常数,根据其值范围在计算机中分整型常量也就是整型常数,

6、根据其值范围在计算机中分 配不同的字节数来存放。在配不同的字节数来存放。在C51C51中它可以表示成以下几种中它可以表示成以下几种 形式:形式: 十进制整数。如十进制整数。如234234、-56-56、0 0等。等。 十六进制整数。以十六进制整数。以0 x0 x开头表示,如开头表示,如0 x120 x12表示十六进制数表示十六进制数 12H12H。 长整数。在长整数。在C51C51中当一个整数的值达到长整型的范围,中当一个整数的值达到长整型的范围, 则该数按长整型存放,在存储器中占四个字节,另外,如则该数按长整型存放,在存储器中占四个字节,另外,如 一个整数后面加一个字母一个整数后面加一个字母

7、L L,这个数在存储器中也按长整,这个数在存储器中也按长整 型存放。如型存放。如123L123L在存储器中占四个字节。在存储器中占四个字节。 3.2常量与变量常量与变量 二浮点型常量二浮点型常量 浮点型常量也就是实型常数。有十进制表示形式浮点型常量也就是实型常数。有十进制表示形式 和指数表示形式。和指数表示形式。 十进制表示形式又称定点表示形式,由数字和小十进制表示形式又称定点表示形式,由数字和小 数点组成。如数点组成。如0.123、34.645等都是十进制数表示形等都是十进制数表示形 式的浮点型常量。式的浮点型常量。 指数表示形式为:指数表示形式为: 数字数字.数字数字e 数字数字 例如:例

8、如:123.456e-3、-3.123e2等都是指数形式的等都是指数形式的 浮点型常量。浮点型常量。 三字符型常量三字符型常量 字符型常量是用单引号引起的字符,如字符型常量是用单引号引起的字符,如a、1、 F等。可以是可显示的等。可以是可显示的ASCII字符,也可以是不可显字符,也可以是不可显 示的控制字符。对不可显示的控制字符须在前面加上示的控制字符。对不可显示的控制字符须在前面加上 反斜杠反斜杠“”组成转义字符。利用它可以完成一些特殊组成转义字符。利用它可以完成一些特殊 功能和输出时的格式控制。常用的转义字符如下表所功能和输出时的格式控制。常用的转义字符如下表所 示。示。 转义字符转义字符

9、 含含 义义ASCII码(十六进制数)码(十六进制数) o 空字符(空字符(null)00H n 换行符(换行符(LF)0AH r 回车符(回车符(CR)0DH t 水平制表符(水平制表符(HT)09H b 退格符(退格符(BS)08H f 换页符(换页符(FF)0CH 单引号单引号27H ” 双引号双引号22H 反斜杠反斜杠5CH 四字符串型常量四字符串型常量 字符串型常量由双引号字符串型常量由双引号“”“”括起的字符组成。括起的字符组成。 如如“D”、“1234”、“ABCD”等。注意字符串常量等。注意字符串常量 与字符常量是不一样,一个字符常量在计算机内只用与字符常量是不一样,一个字符常

10、量在计算机内只用 一个字节存放,而一个字符串常量在内存中存放时不一个字节存放,而一个字符串常量在内存中存放时不 仅双引号内的字符一个占一个字节,而且系统会自动仅双引号内的字符一个占一个字节,而且系统会自动 的在后面加一个转义字符的在后面加一个转义字符“o”作为字符串结束符。作为字符串结束符。 因此不要将字符常量和字符串常量混淆,如字符常量因此不要将字符常量和字符串常量混淆,如字符常量 A和字符串常量和字符串常量“A”是不一样的。是不一样的。 常量常量在程序运行的过程中,其值不能改变的。在程序运行的过程中,其值不能改变的。 变量变量在程序运行中,其值可以改变的。一个变量由两在程序运行中,其值可以

11、改变的。一个变量由两 部分组成:变量名和变量值。部分组成:变量名和变量值。 习惯上,习惯上,符号常量名用大写,变量用小写符号常量名用大写,变量用小写,以示区别。,以示区别。 #defineCONST60 main() intvariable,result; variable=20; result=variable*CONST; printf(result=%dn,result); 只有只有bitbit和和unsigned charunsigned char两种数据类型可以直接支两种数据类型可以直接支 持机器指令,必须慎重变量和数据类型的选择。持机器指令,必须慎重变量和数据类型的选择。 用用C语

12、言编写单片机应用程序与标准的语言编写单片机应用程序与标准的 C语言程序的区别语言程序的区别: C语言编写单片机应用程序时,需根据单片语言编写单片机应用程序时,需根据单片 机存储结构及内部资源定义相应的数据类型和机存储结构及内部资源定义相应的数据类型和 变量,而标准的变量,而标准的C语言程序不需要考虑这些问题语言程序不需要考虑这些问题 C51包含的数据类型、变量存储模式、输入包含的数据类型、变量存储模式、输入 输出处理、函数等方面与标准的输出处理、函数等方面与标准的C语言有一定的语言有一定的 区别。其它的语法规则、程序结构及程序设计区别。其它的语法规则、程序结构及程序设计 方法等与标准的方法等与

13、标准的C语言程序设计相同。语言程序设计相同。 C51的语法规定、程序结构及程序设计方的语法规定、程序结构及程序设计方 法都与标准的法都与标准的C语言程序设计相同,但语言程序设计相同,但C51程程 序与标准的序与标准的C程序在以下程序在以下几个方面不一样几个方面不一样: (1)C51中定义的库函数和标准中定义的库函数和标准C语言定义语言定义 的库函数不同。标准的的库函数不同。标准的C语言定义的库函数是语言定义的库函数是 按通用微型计算机来定义的,而按通用微型计算机来定义的,而C51中的库函中的库函 数是按数是按8051单片机相应情况来定义的;单片机相应情况来定义的; (2)C51中的数据类型与标

14、准中的数据类型与标准C的数据类型的数据类型 也有一定的区别,在也有一定的区别,在C51中还增加了几种针对中还增加了几种针对 8051单片机特有的数据类型;单片机特有的数据类型; (3)C51变量的存储模式与标准变量的存储模式与标准C中变量的存中变量的存 储模式不一样,储模式不一样,C51中变量的存储模式是与中变量的存储模式是与 8051单片机的存储器紧密相关;单片机的存储器紧密相关; (4)C51与标准与标准C的输入输出处理不一样,的输入输出处理不一样, C51中的输入输出是通过中的输入输出是通过8051串行口来完成的,串行口来完成的, 输入输出指令执行前必须要对串行口进行初始输入输出指令执行

15、前必须要对串行口进行初始 化;化; (5)C51与标准与标准C在函数使用方面也有一定的在函数使用方面也有一定的 区别,区别,C51中有专门的中断函数中有专门的中断函数。 变量是在程序运行过程中其值可以改变的量。一变量是在程序运行过程中其值可以改变的量。一 个变量由两部分组成:变量名和变量值。个变量由两部分组成:变量名和变量值。 在在C51中,变量在使用前必须对变量进行定义,中,变量在使用前必须对变量进行定义, 指出变量的数据类型和存储模式。以便编译系统为指出变量的数据类型和存储模式。以便编译系统为 它分配相应的存储单元,定义的格式如下它分配相应的存储单元,定义的格式如下 存储种类存储种类数据类

16、型数据类型存储器类型存储器类型变量名表变量名表 存储种类存储种类 存储种类是指变量在程序执行过程中的作用范围。存储种类是指变量在程序执行过程中的作用范围。 C51变量的存储种类有四种,分别是自动变量的存储种类有四种,分别是自动(auto)、外部、外部 (extern)、静态、静态(static)和寄存器和寄存器(register)。 1auto: 使用使用auto定义的变量称为自动变量,其作用范围定义的变量称为自动变量,其作用范围 在定义它的函数体或复合语句内部,当定义它的函数体在定义它的函数体或复合语句内部,当定义它的函数体 或复合语句执行时,或复合语句执行时,C51才为该变量分配内存空间,

17、结才为该变量分配内存空间,结 束时占用的内存空间释放。自动变量一般分配在内存的束时占用的内存空间释放。自动变量一般分配在内存的 堆栈空间中。定义变量时,如果省略存储种类,则该变堆栈空间中。定义变量时,如果省略存储种类,则该变 量默认为自动量默认为自动(auto)变量。变量。 2extern: 使用使用extern定义的变量称为外部变量。在一个函数体内,定义的变量称为外部变量。在一个函数体内, 要使用一个已在该函数体外或别的程序中定义过的外部变量要使用一个已在该函数体外或别的程序中定义过的外部变量 时,该变量在该函数体内要用时,该变量在该函数体内要用extern说明。外部变量被定义说明。外部变量

18、被定义 后分配固定的内存空间,在程序整个执行时间内都有效,直后分配固定的内存空间,在程序整个执行时间内都有效,直 到程序结束才释放。到程序结束才释放。 3static: 使用使用static定义的变量称为静态变量。它又分为内部静定义的变量称为静态变量。它又分为内部静 态变量和外部静态变量。在函数体内部定义的静态变量为内态变量和外部静态变量。在函数体内部定义的静态变量为内 部静态变量,它在对应的函数体内有效,一直存在,但在函部静态变量,它在对应的函数体内有效,一直存在,但在函 数体外不可见,这样不仅使变量在定义它的函数体外被保护,数体外不可见,这样不仅使变量在定义它的函数体外被保护, 还可以实现

19、当离开函数时值不被改变。外部静态变量上在函还可以实现当离开函数时值不被改变。外部静态变量上在函 数外部定义的静态变量。它在程序中一直存在,但在定义的数外部定义的静态变量。它在程序中一直存在,但在定义的 范围之外是不可见的。如在多文件或多模块处理中,外部静范围之外是不可见的。如在多文件或多模块处理中,外部静 态变量只在文件内部或模块内部有效。态变量只在文件内部或模块内部有效。 4register: 使用使用register定义的变量称为寄存器变量。它定义定义的变量称为寄存器变量。它定义 的变量存放在的变量存放在CPU内部的寄存器中,处理速度快,但内部的寄存器中,处理速度快,但 数目少。数目少。C

20、51编译器编译时能自动识别程序中使用频率编译器编译时能自动识别程序中使用频率 最高的变量,并自动将其作为寄存器变量,用户可以无最高的变量,并自动将其作为寄存器变量,用户可以无 需专门声明。需专门声明。 位变量位变量(bit)(bit):与:与80518051硬件特性操作有关的可以定义成硬件特性操作有关的可以定义成 位变量。位变量必须定位在位变量。位变量必须定位在80518051单片机片内单片机片内RAMRAM的位寻址空的位寻址空 间中。间中。 字符变量字符变量(char)(char):字符变量的长度为:字符变量的长度为1 byte1 byte即即8 8位。这位。这 很合适很合适80518051

21、单片机,因为单片机,因为80518051单片机每次可处理单片机每次可处理8 8位数据。位数据。 对于无符号变量对于无符号变量(unsigned char)(unsigned char)的值域范围是的值域范围是0255。对。对 于有符号字符变量于有符号字符变量(signed char)(signed char),最具有重要意义的位,最具有重要意义的位 是最高位上的符号标志位是最高位上的符号标志位(msb(msb) )。此位为。此位为1 1代表代表“负负”,为,为0 0 代表代表“正正”。有符号字符变量和无符号字符变量在表示。有符号字符变量和无符号字符变量在表示 0127的数值时,其含义是一样的,

22、都是的数值时,其含义是一样的,都是00 x7F。负数一。负数一 般用补码表示。般用补码表示。 整型变量整型变量(int(int): 8051): 8051系列单片机将系列单片机将intint型变量的高位型变量的高位 字节数存放在低地址字节中,低位字节数存放在高地址字字节数存放在低地址字节中,低位字节数存放在高地址字 节中。有符号整型变量节中。有符号整型变量(signed int(signed int) )也使用也使用msbmsb位作符号标位作符号标 志位,并使用二进制补码表示数值。可直接使用几种专用志位,并使用二进制补码表示数值。可直接使用几种专用 的机器指令来完成多字节的加、减、乘、除运算。

23、的机器指令来完成多字节的加、减、乘、除运算。 图图3.2 整型数的存储结构整型数的存储结构 0 x12 0 x34 +0 +1 地址 0 x12 0 x34 0 x56 0 x78 . +0 +1 +2 +3 地址 图图3.3 长整型变量的存储结构长整型变量的存储结构 浮点型变量浮点型变量(float): 浮点型变量为浮点型变量为32位,占位,占4个字节,许多个字节,许多 复杂的数学表达式都采用浮点变量数据类型。应用符号位表复杂的数学表达式都采用浮点变量数据类型。应用符号位表 示数的符号,用阶码和尾数表示数的大小。示数的符号,用阶码和尾数表示数的大小。 用它们进行任何数学运算都需要使用由编译器

24、决定的各用它们进行任何数学运算都需要使用由编译器决定的各 种不同效率等级的库函数。种不同效率等级的库函数。KEIL C51的浮点变量数据类型的的浮点变量数据类型的 使用格式与使用格式与IEEE-754标准有关,具有标准有关,具有24位精度,尾数的高位位精度,尾数的高位 始终为始终为1,因而不保存,位的分布如下:,因而不保存,位的分布如下: 1位符号位。位符号位。 8位指数位。位指数位。 23位尾数。位尾数。 符号位是最高位,尾数为低符号位是最高位,尾数为低23位,内存中按字节存储顺序如下:位,内存中按字节存储顺序如下: 地址地址+0+1+2+3 内容内容SEEEEEEEEMMMMMMMMMMM

25、MMMM 其中,其中,S为符号位,为符号位,1表示负,表示负,0表示正;表示正;E为阶码;为阶码;M为为23 位尾数,最高位为位尾数,最高位为“1”。 一个浮点数的数值范围是(一个浮点数的数值范围是(-1)2E-127(1.M) 浮点变量值浮点变量值 -12.5的十进制为:的十进制为:0 xC1480000,它按图,它按图3.4所所 示方式存于内存中。示方式存于内存中。 MMMMMMMM 0 xC1 0 x48 0 x00 0 x00 +0 +1 +2 +3 地址 使用简化形式定义数据类型。其方法是在源程序开头使用使用简化形式定义数据类型。其方法是在源程序开头使用 #define语句自定义简化

26、的类型标识符。例如:语句自定义简化的类型标识符。例如: #define uchar unsigned char #define uint unsigned int 这样,在编程中,就可以用这样,在编程中,就可以用uchar代替代替unsigned char,用,用 uint代替代替unsigned int来定义变量。来定义变量。 80518051系列机在物理上有四个存储空间系列机在物理上有四个存储空间 1 1)片内程序存储器空间)片内程序存储器空间 2 2)片外程序存储器空间)片外程序存储器空间 3 3)片内数据存储器空间)片内数据存储器空间 4 4)片外数据存储器空间)片外数据存储器空间 3

27、.3 Cx51数据的存储类型与数据的存储类型与8051存储结构存储结构 80518051片内数据存储器可划分为两类:片内数据存储器可划分为两类: 00H00H7FH7FH为片内低为片内低128128字节字节RAMRAM区;区; 80H80H0FFH0FFH为特殊功能寄存器区。为特殊功能寄存器区。 低字节低字节RAMRAM区又可以划分为区又可以划分为3 3个区域:个区域: 1 1)通用寄存器区()通用寄存器区(00H00H1FH1FH) 每个寄存器可以用寄存器名寻址,也可直接用字每个寄存器可以用寄存器名寻址,也可直接用字 节地址寻址。节地址寻址。 2 2)可位寻址区)可位寻址区 可以按字节寻址操

28、作,也可按位地址操作。可以按字节寻址操作,也可按位地址操作。 3 3)用户)用户RAMRAM区区 程序存储器与数据存储器严格分开,特殊功程序存储器与数据存储器严格分开,特殊功 能寄存器与片内数据存储器统一编址。能寄存器与片内数据存储器统一编址。 片内数据存储区是存放临时性传递变量或使用片内数据存储区是存放临时性传递变量或使用 频率较高的变量的。频率较高的变量的。 访问片内数据存储器速度较快,经常使用的访问片内数据存储器速度较快,经常使用的 变量置于片内数据存储器,而将不常用的置于片变量置于片内数据存储器,而将不常用的置于片 外数据存储器中。外数据存储器中。 寻址方式可使用直接和间接寻址。寻址方

29、式可使用直接和间接寻址。 表表 3.2 C51存储器类型与存储器类型与8051存储空间的对应关系存储空间的对应关系 存储器类型存储器类型与存储空间的对应关系与存储空间的对应关系 data 直接寻址片内数据存储区,访问速度快直接寻址片内数据存储区,访问速度快(128字节字节) bdata 可位寻址片内数据存储区,允许位与字节混合访问可位寻址片内数据存储区,允许位与字节混合访问(16字节字节) idata 间接寻址片内数据存储区,可访问片内全部间接寻址片内数据存储区,可访问片内全部RAM地址空间地址空间(256字节字节) pdata 分页寻址片外数据存储区分页寻址片外数据存储区(256字节字节)由

30、由MOV Ri访问访问(i=0,1) xdata 片外数据存储区片外数据存储区(64 KB)由由MOVX DPTR访问访问 code 程序存储器程序存储器64 KB空间,由空间,由MOVC DPTR访问访问 表表3.3 C51存储器类型及其数据长度和值域存储器类型及其数据长度和值域 存储器类型存储器类型长度长度(bit)长度长度(byte)值域范围值域范围 data810255 idata810255 pdata810255 xdata162065 535 code162065 535 带存储类型的变量的定义的一般格式为:带存储类型的变量的定义的一般格式为: 存储种类存储种类数据类型数据类型存

31、储器类型存储器类型变量名变量名 带存储类型的变量定义举例:带存储类型的变量定义举例: char data var1; bit bdata flags; float idata x,y,z; unsigned int pdata var2; unsigned char vector34; 表表 3.4 存储器模式说明存储器模式说明 存储器模式存储器模式 说说 明明 SMALLSMALL SMALLSMALL模式称为小编译模式模式称为小编译模式, ,默认的存储类型是默认的存储类型是datadata,参数及,参数及 局部变量放入可直接寻址片内局部变量放入可直接寻址片内RAMRAM的用户区中的用户区中

32、( (最大最大128128字节字节) )。 另外所有对象另外所有对象( (包括堆栈包括堆栈) ),都必须嵌入片内,都必须嵌入片内RAMRAM。栈长很关键,。栈长很关键, 因为实际栈长依赖于函数嵌套调用层数因为实际栈长依赖于函数嵌套调用层数 COMPACTCOMPACT COMPACTCOMPACT模式称为紧凑编译模式模式称为紧凑编译模式, ,默认的存储类型是默认的存储类型是pdatapdata,参,参 数及局部变量放入分页的外部数据存储区,通过数及局部变量放入分页的外部数据存储区,通过R0或R1 间接访问,栈空间位于片内数据存储区中间接访问,栈空间位于片内数据存储区中 LARGELARGE L

33、ARGELARGE模式称为大编译模式,默认的存储类型是模式称为大编译模式,默认的存储类型是xdataxdata,参数,参数 及局部变量直接放入片外数据存储区,使用数据指针及局部变量直接放入片外数据存储区,使用数据指针DPTRDPTR来来 进行寻址。用此数据指针进行访问效率较低,尤其对两个或进行寻址。用此数据指针进行访问效率较低,尤其对两个或 多个字节的变量,这种数据类型的访问机制直接影响代码的多个字节的变量,这种数据类型的访问机制直接影响代码的 长度长度 3.4 8051特殊功能寄存器特殊功能寄存器(SFR)的的C51定义定义 8051单片机中,除了程序计数器单片机中,除了程序计数器PC和和4

34、组工作寄存器组外,组工作寄存器组外, 其它所有的寄存器均为特殊功能寄存器其它所有的寄存器均为特殊功能寄存器(SFR),分散在片内,分散在片内 RAM区的高区的高128字节中,地址范围为字节中,地址范围为80H0FFH。SFR中有中有11个个 寄存器具有位寻址能力,它们的字节地址都能被寄存器具有位寻址能力,它们的字节地址都能被8整除,即字节整除,即字节 地址是以地址是以8或或0为尾数的。为尾数的。 为了能直接访问这些为了能直接访问这些SFR,Franklin C51提供了一种自主形提供了一种自主形 式的定义方法,这种定义方法与标准式的定义方法,这种定义方法与标准C语言不兼容,只适用于对语言不兼容

35、,只适用于对 8051系列单片机进行系列单片机进行C语言编程。特殊功能寄存器语言编程。特殊功能寄存器C51定义的一定义的一 般语法格式如下:般语法格式如下: sfr sfr_name = int constant; sfr是定义语句的关键字,其后必须跟一个是定义语句的关键字,其后必须跟一个8051单片机单片机 真实存在的特殊功能寄存器名,真实存在的特殊功能寄存器名,=后面必须是一个整型常数,后面必须是一个整型常数, 不允许带有运算符的表达式,是特殊功能寄存器不允许带有运算符的表达式,是特殊功能寄存器sfr-name 的字节地址,这个常数值的范围必须在的字节地址,这个常数值的范围必须在SFR地址

36、范围内,位地址范围内,位 于于0 x800 xFF。 例如:例如: sfr SCON=0 x98; /* 串口控制寄存器地址串口控制寄存器地址98H */ sfr TMOD=0 x89; /* 定时器定时器/计数器方式控制寄存器地址计数器方式控制寄存器地址 89H */ 8051系列单片机的特殊功能寄存器的数量与类型不尽系列单片机的特殊功能寄存器的数量与类型不尽 相同,因此建议将所有特殊的相同,因此建议将所有特殊的sfr定义放入一个头文件中,定义放入一个头文件中, 该文件应包括该文件应包括8051单片机系列机型中的单片机系列机型中的SFR定义。定义。C51编编 译器的译器的reg51.h头文件

37、就是这样一个文件。头文件就是这样一个文件。 在新的在新的8051系列产品中,系列产品中,SFR在功能上经常组合为在功能上经常组合为16 位值,当位值,当SFR的高字节地址直接位于低字节之后时,对的高字节地址直接位于低字节之后时,对16 位位SFR的值可以直接进行访问。例如的值可以直接进行访问。例如52子系列的定时器子系列的定时器/计计 数器数器2就是这种情况。为了有效地访问这类就是这种情况。为了有效地访问这类SFR,可使用,可使用 关键字关键字sfr16来定义,其定义语句的语法格式与来定义,其定义语句的语法格式与8位位SFR 相同,只是相同,只是=后面的地址必须用后面的地址必须用16位位SFR

38、的低字节地址,的低字节地址, 即低字节地址作为即低字节地址作为sfr16的定义地址。的定义地址。 例如:例如: sfr16 T2 = 0 xCC /*定时器定时器/计数器计数器2:T2低低8位位 地址为地址为0CCH,T2高高8位地址为位地址为0CDH*/ 这种定义适用于所有新的这种定义适用于所有新的16位位SFR,但不能用于,但不能用于 定时器定时器/计数器计数器0和和1。 对于位寻址的对于位寻址的SFR中的位,中的位,C51的扩充功能支持的扩充功能支持 特殊位的定义,像特殊位的定义,像SFR一样不与标准一样不与标准C兼容,使用兼容,使用 sbit来定义位寻址单元。来定义位寻址单元。 第一种

39、方法:第一种方法: sbit bit-name = sfr-nameint constant; sbit是定义语句的关键字,后跟一个寻址位符号名是定义语句的关键字,后跟一个寻址位符号名(该位符该位符 号名必须是号名必须是8051单片机中规定的位名称单片机中规定的位名称),=后的后的sfr-name必必 须是已定义过的须是已定义过的SFR的名字,的名字,后的整常数是寻址位在特殊功能后的整常数是寻址位在特殊功能 寄存器寄存器sfr-name中的位号,必须是中的位号,必须是07范围中的数。例如:范围中的数。例如: sfr PSW=0 xD0 ; /* 定义定义PSW寄存器地址为寄存器地址为D0H *

40、/ sbit OV=PSW2 ; /* 定义定义OV位为位为PSW.2,地址为,地址为D2H */ sbit CY=PSW7 ; /* 定义定义CY位为位为PSW.7,地址为,地址为D7H */ 第二种方法:第二种方法:sbit bit-name = int constantint constant; =后的后的int constant为寻址地址位所在的特殊功能寄存器的为寻址地址位所在的特殊功能寄存器的 字节地址,字节地址,符号后的符号后的int constant为寻址位在特殊功能寄存器为寻址位在特殊功能寄存器 中的位号。例如:中的位号。例如: sbit OV=0 xD02 ;/* 定义定义O

41、V位地址是位地址是D0H字节字节 中的第中的第2位位 */ sbit CY=0 xD07 ; /* 定义定义CY位地址是位地址是D0H字节中字节中 的第的第7位位 */ 第三种方法:第三种方法:sbit bit-name = int constant; =后的后的int constant为寻址位的绝对位地址。例如:为寻址位的绝对位地址。例如: sbit OV=0 xD2 ;/* 定义定义OV位地址为位地址为D2H */ sbit CY=0 xD7 ;/* 定义定义CY位地址为位地址为D7H */ 特殊功能位代表了一个独立的定义类,不能与其它位定义特殊功能位代表了一个独立的定义类,不能与其它位定

42、义 和位域互换。和位域互换。 3.5 8051并行接口及其并行接口及其Cx51定义定义 8051系列单片机并行系列单片机并行I/O接口除了芯片上的接口除了芯片上的4个个I/O口口(P0 P3) 外,还可以在片外扩展外,还可以在片外扩展I/O口。口。8051单片机单片机I/O口与数据存储器统口与数据存储器统 一编址,即把一个一编址,即把一个I/O口当作数据存储器中的一个单元来看待。口当作数据存储器中的一个单元来看待。 使用使用C51进行编程时,进行编程时,8051片内的片内的I/O口与片外扩展的口与片外扩展的I/O可可 以统一在一个头文件中定义,也可以在程序中以统一在一个头文件中定义,也可以在程

43、序中(一般在开始的位一般在开始的位 置置)进行定义,其定义方法如下:进行定义,其定义方法如下: 对于对于8051片内片内I/O口按特殊功能寄存器方法定义。例如:口按特殊功能寄存器方法定义。例如: sfr P0=0 x80 ; /* 定义定义P0口,地址为口,地址为80H */ sfr P1=0 x90 ; /* 定义定义P1口,地址为口,地址为90H */ 对于片外扩展对于片外扩展I/O口,则根据硬件译码地址,将其视作为片口,则根据硬件译码地址,将其视作为片 外数据存储器的一个单元,使用外数据存储器的一个单元,使用#define语句进行定义。例如语句进行定义。例如 #include #defi

44、ne PORTA XBYTE 0 xFFC0 absacc.h是是C51中绝对地址访问函数的头文件,将中绝对地址访问函数的头文件,将PORTA定定 义为外部义为外部I/O口,地址为口,地址为 FFC0H,长度为,长度为8位。位。 一旦在头文件或程序中对这些片外一旦在头文件或程序中对这些片外I/O口进行定义后,在程口进行定义后,在程 序中就可以自由使用变量名与其实际地址的联系,以便使程序序中就可以自由使用变量名与其实际地址的联系,以便使程序 员能用软件模拟员能用软件模拟8051的硬件操作。的硬件操作。 #include #defineucharunsignedchar sbitDIPswitch

45、=P14; sbitgreenLED=P15; voidmain(void) ucharinval; inval=0; while(1) if(DIPswitch=1) inval=P1 greenLED=0; else greenLED=1; P3=(P3 (1) 位变量位变量C51定义。使用定义。使用C51编程时,定义了位变量后,就编程时,定义了位变量后,就 可以用定义了的变量来表示可以用定义了的变量来表示8051的位寻址单元。的位寻址单元。 位变量的位变量的C51定义的一般语法格式如下:定义的一般语法格式如下: 位类型标识符位类型标识符(bit) 位变量名;位变量名; 例如:例如: bi

46、t direction_bit ;/* 把把direction_bit定义为位变量定义为位变量 */ bit look_pointer ;/* 把把look_pointer定义为位变量定义为位变量 */ 3.6 位变量的位变量的C51定义定义 (2) 函数可包含类型为函数可包含类型为bit的参数,也可以将其作为返回的参数,也可以将其作为返回 值。例如:值。例如: bit func(bit b0, bit b1) /* 变量变量b0,b1作为函数的参数作为函数的参数 */ return (b1); /* 变量变量b1作为函数的返回值作为函数的返回值 */ 注意,使用注意,使用(#pragma d

47、isable)或包含明确的寄存器组切换或包含明确的寄存器组切换 (using n)的函数不能返回位值,否则编辑器将会给出一个错误的函数不能返回位值,否则编辑器将会给出一个错误 信息。信息。 (3) 对位变量定义的限制。位变量不能定义成一个指对位变量定义的限制。位变量不能定义成一个指 针,如不能定义:针,如不能定义:bit * bit_pointer。不存在位数组,如。不存在位数组,如 不能定义:不能定义:bit b_array 。 在位定义中,允许定义存储类型,位变量都被放入一在位定义中,允许定义存储类型,位变量都被放入一 个位段,此段总位于个位段,此段总位于8051片内的片内的RAM区中。因

48、此,存储区中。因此,存储 类型限制为类型限制为data和和idata,如果将位变量的存储类型定义成,如果将位变量的存储类型定义成 其它存储类型都将编译出错。其它存储类型都将编译出错。 例例1 先定义变量的数据类型和存储类型:先定义变量的数据类型和存储类型: bdata int ibase; /* 定义定义ibase为为bdata整型变量整型变量 */ bdata char bary4; /* bary4定义为定义为bdata字符型数组字符型数组 */ 然后可使用然后可使用sbit定义可独立寻址访问的对象位:定义可独立寻址访问的对象位: sbit mybit0 = ibase0 ;/* mybi

49、t0定义为定义为ibase的第的第0位位 */ sbit mybit15 = ibase15; /* mybit0定义为定义为ibase的第的第15位位 */ sbit Ary07 = bary07 ; /* Ary07定义为定义为abry0的第的第7位位 */ sbit Ary37 = bary37 ; /* Ary37定义为定义为abry3的第的第7位位 */ 3.7.1Cx51算术运算符及其运算符算术运算符及其运算符 赋值运算符赋值运算符 赋值运算符赋值运算符“=”,在,在C51中,它的功能是将一个数中,它的功能是将一个数 据的值赋给一个变量,如据的值赋给一个变量,如x=10。利用赋值运

50、算符将一个。利用赋值运算符将一个 变量与一个表达式连接起来的式子称为赋值表达式,在变量与一个表达式连接起来的式子称为赋值表达式,在 赋值表达式的后面加一个分号赋值表达式的后面加一个分号“;”就构成了赋值语句,就构成了赋值语句, 一个赋值语句的格式如下:一个赋值语句的格式如下: 变量变量=表达式;表达式; 执行时先计算出右边表达式的值,然后赋给左边的执行时先计算出右边表达式的值,然后赋给左边的 变量。例如:变量。例如: x=8+9;/*将将8+9的值赋绐变量的值赋绐变量x*/ x=y=5;/*将常数将常数5同时赋给变量同时赋给变量x和和y*/ 在在C51中,允许在一个语句中同时给多个变量赋值,中

51、,允许在一个语句中同时给多个变量赋值, 赋值顺序自右向左。赋值顺序自右向左。 3.7Cx51运算符、表达式及其规则运算符、表达式及其规则 C51中支持的中支持的算术运算符算术运算符有:有: +加或取正值运算符加或取正值运算符 -减或取负值运算符减或取负值运算符 *乘运算符乘运算符 /除运算符除运算符 %取余运算符取余运算符 加、减、乘运算相对比较简单,而对于除运算,加、减、乘运算相对比较简单,而对于除运算, 如相除的两个数为浮点数,则运算的结果也为浮点数,如相除的两个数为浮点数,则运算的结果也为浮点数, 如相除的两个数为整数,则运算的结果也为整数,即如相除的两个数为整数,则运算的结果也为整数,

52、即 为整除。如为整除。如25.0/20.0结果为结果为1.25,而,而25/20结果为结果为1。 对于取余运算,则要求参加运算的两个数必须为对于取余运算,则要求参加运算的两个数必须为 整数,运算结果为它们的余数。例如:整数,运算结果为它们的余数。例如:x=5%3,结果,结果x 的值为的值为2。 2、算术表达式、优先级与结合性、算术表达式、优先级与结合性 算术表达式:算术表达式:用算术运算符和括号将运算对象连接起来的用算术运算符和括号将运算对象连接起来的 式子,运算对象包括常量、变量、函数、数组和结构等。式子,运算对象包括常量、变量、函数、数组和结构等。 如:如:a*b/c-2.5+d 优先级优

53、先级指当运算对象两侧都有运算符时指当运算对象两侧都有运算符时, ,执行运算的执行运算的 先后次序。先后次序。 结合性结合性指当一个运算对象两侧的运算符的优先级别指当一个运算对象两侧的运算符的优先级别 相同的运算顺序。相同的运算顺序。 算术运算符的算术运算符的优先级规定优先级规定为:先乘除模,后加减,括号为:先乘除模,后加减,括号 最优先。最优先。 运算符执行的先后取决与运算符的优先级,当优先级相运算符执行的先后取决与运算符的优先级,当优先级相 同时,在看看结合性。同时,在看看结合性。 如:如:a-b*c等价于等价于a-(b*c) a*b/c等价于等价于(a*b)/c 图中图中“ ” 表示必定转

54、换。既使是同一种类型也按表示必定转换。既使是同一种类型也按 转转 换。换。即当遇到即当遇到char、short时,系统一律将其转换为时,系统一律将其转换为int参与运算,参与运算, 如如a + b,先转换为先转换为int,结果为结果为 int。而当遇到。而当遇到float时,一时,一 律转换为律转换为double参与运算。参与运算。 转换方法转换方法: double float 高低高低 long unsigned int char, short +数据类型转换数据类型转换 1. 1.自动(缺省)类型转换自动(缺省)类型转换 可根据自己的意愿利用强制类型转换运算符可根据自己的意愿利用强制类型转

55、换运算符 将一个算术表达式转换为所需类型将一个算术表达式转换为所需类型 强制类型转换格式强制类型转换格式: (类型名类型名) (表达式表达式) 例如例如: (double) a 将将a转换为转换为double (int) (x+y) 将将x+y转换为转换为int (float) (5%3) 将将5%3转换为转换为float 2. 2.强制类型转换运算符强制类型转换运算符“()()” 3.7.2、Cx51关系运算符、表达式及优先级关系运算符、表达式及优先级 大于大于 =大于或等于大于或等于 =测试等于测试等于 !=测试不等于测试不等于 前前4种关系运算符(种关系运算符(、=)优先级相同,后)优先级相同,后 两种也相同;前两种也相同;前4种优先级高

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论