




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第三章第三章C51数据与运算数据与运算 3.1数据与数据类型数据与数据类型数据数据具有一定格式的数字或数值叫做数据具有一定格式的数字或数值叫做数据数据类型数据类型数据的不同格式叫做数据类型数据的不同格式叫做数据类型数据结构数据结构数据按一定的数据类型进行的排数据按一定的数据类型进行的排列、组合、架构。列、组合、架构。C51编译器具体支持的数据类型:编译器具体支持的数据类型:位型,无符号字符,有符号字符,位型,无符号字符,有符号字符,无无符号整型,有符号整型,无符号长型,符号整型,有符号整型,无符号长型,有符号长型,有符号长型,浮点和指针类型等浮点和指针类型等C51数据类型与标准数据类型与标准C
2、数据类型的最大不同之处:位型数据类型的最大不同之处:位型位型(位型(bit)字符型(字符型(char)整型(整型(int)长整型(长整型(long)浮点型(浮点型(float)双精度浮点型(双精度浮点型(double)数组类型(数组类型(array)结构体类型(结构体类型(struct)共用体(共用体(union)枚举(枚举(enum)基本类型基本类型构造类型构造类型指针类型指针类型空类型空类型数据类型数据类型表表3-1 KEIL C51的数据类型的数据类型数据类型数据类型长度长度(bit)长度长度(byte)值域值域bit110,1unsigned char810255signed char
3、81128127unsigned int 162065535signed int 1623276832767unsigned long32404294967295signed long 32421474836482147483647float 3241.176E383.40E+38(6位数字位数字)double6481.176E383.40E+38(10位数字位数字)一般指针一般指针243存储空间存储空间065535 在在C51语言程序中,有可能会出现在运算中数据类型语言程序中,有可能会出现在运算中数据类型不一致的情况。不一致的情况。C51允许任何标准数据类型的隐式转换,允许任何标准数据类型的
4、隐式转换,隐式转换的优先级顺序如下:隐式转换的优先级顺序如下: bitcharintlongfloat unsignedsigned 也就是说,当也就是说,当char型与型与int型进行运算时,先自动对型进行运算时,先自动对char型扩展为型扩展为int型,然后与型,然后与int型进行运算,运算结果为型进行运算,运算结果为int型。型。C51除了支持隐式类型转换外,还可以通过强制类除了支持隐式类型转换外,还可以通过强制类型转换符型转换符“()()”对数据类型进行人为的强制转换。对数据类型进行人为的强制转换。C5l编译器除了能支持以上这些基本数据类型之外,编译器除了能支持以上这些基本数据类型之外
5、,还能支持一些复杂的组合型数据类型,如数组类型、指还能支持一些复杂的组合型数据类型,如数组类型、指针类型、结构类型、联合类型等这些复杂的数据类型。针类型、结构类型、联合类型等这些复杂的数据类型。常量是指在程序执行过程中其值不能改变的量。在常量是指在程序执行过程中其值不能改变的量。在C51中支持整型常量、浮点型常量、字符型常量和字符串中支持整型常量、浮点型常量、字符型常量和字符串型常量。型常量。一、整型常量一、整型常量 整型常量也就是整型常数,根据其值范围在计算机中分整型常量也就是整型常数,根据其值范围在计算机中分配不同的字节数来存放。在配不同的字节数来存放。在C51C51中它可以表示成以下几种
6、中它可以表示成以下几种形式:形式: 十进制整数。如十进制整数。如234234、-56-56、0 0等。等。 十六进制整数。以十六进制整数。以0 x0 x开头表示,如开头表示,如0 x120 x12表示十六进制数表示十六进制数12H12H。 长整数。在长整数。在C51C51中当一个整数的值达到长整型的范围,中当一个整数的值达到长整型的范围,则该数按长整型存放,在存储器中占四个字节,另外,如则该数按长整型存放,在存储器中占四个字节,另外,如一个整数后面加一个字母一个整数后面加一个字母L L,这个数在存储器中也按长整,这个数在存储器中也按长整型存放。如型存放。如123L123L在存储器中占四个字节。
7、在存储器中占四个字节。3.2常量与变量常量与变量二浮点型常量二浮点型常量浮点型常量也就是实型常数。有十进制表示形式浮点型常量也就是实型常数。有十进制表示形式和指数表示形式。和指数表示形式。十进制表示形式又称定点表示形式,由数字和小十进制表示形式又称定点表示形式,由数字和小数点组成。如数点组成。如0.123、34.645等都是十进制数表示形等都是十进制数表示形式的浮点型常量。式的浮点型常量。指数表示形式为:指数表示形式为: 数字数字.数字数字e 数字数字例如:例如:123.456e-3、-3.123e2等都是指数形式的等都是指数形式的浮点型常量。浮点型常量。三字符型常量三字符型常量字符型常量是用
8、单引号引起的字符,如字符型常量是用单引号引起的字符,如a、1、F等。可以是可显示的等。可以是可显示的ASCII字符,也可以是不可显字符,也可以是不可显示的控制字符。对不可显示的控制字符须在前面加上示的控制字符。对不可显示的控制字符须在前面加上反斜杠反斜杠“”组成转义字符。利用它可以完成一些特殊组成转义字符。利用它可以完成一些特殊功能和输出时的格式控制。常用的转义字符如下表所功能和输出时的格式控制。常用的转义字符如下表所示。示。 转义字符转义字符 含含 义义ASCII码(十六进制数)码(十六进制数) o空字符(空字符(null)00H n换行符(换行符(LF)0AH r回车符(回车符(CR)0D
9、H t水平制表符(水平制表符(HT)09H b退格符(退格符(BS)08H f换页符(换页符(FF)0CH 单引号单引号27H ”双引号双引号22H 反斜杠反斜杠5CH四字符串型常量四字符串型常量字符串型常量由双引号字符串型常量由双引号“”“”括起的字符组成。括起的字符组成。如如“D”、“1234”、“ABCD”等。注意字符串常量等。注意字符串常量与字符常量是不一样,一个字符常量在计算机内只用与字符常量是不一样,一个字符常量在计算机内只用一个字节存放,而一个字符串常量在内存中存放时不一个字节存放,而一个字符串常量在内存中存放时不仅双引号内的字符一个占一个字节,而且系统会自动仅双引号内的字符一个
10、占一个字节,而且系统会自动的在后面加一个转义字符的在后面加一个转义字符“o”作为字符串结束符。作为字符串结束符。因此不要将字符常量和字符串常量混淆,如字符常量因此不要将字符常量和字符串常量混淆,如字符常量A和字符串常量和字符串常量“A”是不一样的。是不一样的。常量常量在程序运行的过程中,其值不能改变的。在程序运行的过程中,其值不能改变的。变量变量在程序运行中,其值可以改变的。一个变量由两在程序运行中,其值可以改变的。一个变量由两部分组成:变量名和变量值。部分组成:变量名和变量值。 习惯上,习惯上,符号常量名用大写,变量用小写符号常量名用大写,变量用小写,以示区别。,以示区别。#defineCO
11、NST60main()intvariable,result;variable=20;result=variable*CONST;printf(result=%dn,result); 只有只有bitbit和和unsigned charunsigned char两种数据类型可以直接支两种数据类型可以直接支持机器指令,必须慎重变量和数据类型的选择。持机器指令,必须慎重变量和数据类型的选择。 用用C语言编写单片机应用程序与标准的语言编写单片机应用程序与标准的C语言程序的区别语言程序的区别:C语言编写单片机应用程序时,需根据单片语言编写单片机应用程序时,需根据单片机存储结构及内部资源定义相应的数据类型和
12、机存储结构及内部资源定义相应的数据类型和变量,而标准的变量,而标准的C语言程序不需要考虑这些问题语言程序不需要考虑这些问题C51包含的数据类型、变量存储模式、输入包含的数据类型、变量存储模式、输入输出处理、函数等方面与标准的输出处理、函数等方面与标准的C语言有一定的语言有一定的区别。其它的语法规则、程序结构及程序设计区别。其它的语法规则、程序结构及程序设计方法等与标准的方法等与标准的C语言程序设计相同。语言程序设计相同。C51的语法规定、程序结构及程序设计方的语法规定、程序结构及程序设计方法都与标准的法都与标准的C语言程序设计相同,但语言程序设计相同,但C51程程序与标准的序与标准的C程序在以
13、下程序在以下几个方面不一样几个方面不一样:(1)C51中定义的库函数和标准中定义的库函数和标准C语言定义语言定义的库函数不同。标准的的库函数不同。标准的C语言定义的库函数是语言定义的库函数是按通用微型计算机来定义的,而按通用微型计算机来定义的,而C51中的库函中的库函数是按数是按8051单片机相应情况来定义的;单片机相应情况来定义的;(2)C51中的数据类型与标准中的数据类型与标准C的数据类型的数据类型也有一定的区别,在也有一定的区别,在C51中还增加了几种针对中还增加了几种针对8051单片机特有的数据类型;单片机特有的数据类型;(3)C51变量的存储模式与标准变量的存储模式与标准C中变量的存
14、中变量的存储模式不一样,储模式不一样,C51中变量的存储模式是与中变量的存储模式是与8051单片机的存储器紧密相关;单片机的存储器紧密相关;(4)C51与标准与标准C的输入输出处理不一样,的输入输出处理不一样,C51中的输入输出是通过中的输入输出是通过8051串行口来完成的,串行口来完成的,输入输出指令执行前必须要对串行口进行初始输入输出指令执行前必须要对串行口进行初始化;化;(5)C51与标准与标准C在函数使用方面也有一定的在函数使用方面也有一定的区别,区别,C51中有专门的中断函数中有专门的中断函数。变量是在程序运行过程中其值可以改变的量。一变量是在程序运行过程中其值可以改变的量。一个变量
15、由两部分组成:变量名和变量值。个变量由两部分组成:变量名和变量值。在在C51中,变量在使用前必须对变量进行定义,中,变量在使用前必须对变量进行定义,指出变量的数据类型和存储模式。以便编译系统为指出变量的数据类型和存储模式。以便编译系统为它分配相应的存储单元,定义的格式如下它分配相应的存储单元,定义的格式如下存储种类存储种类数据类型数据类型存储器类型存储器类型变量名表变量名表存储种类存储种类存储种类是指变量在程序执行过程中的作用范围。存储种类是指变量在程序执行过程中的作用范围。C51变量的存储种类有四种,分别是自动变量的存储种类有四种,分别是自动(auto)、外部、外部(extern)、静态、静
16、态(static)和寄存器和寄存器(register)。1auto:使用使用auto定义的变量称为自动变量,其作用范围定义的变量称为自动变量,其作用范围在定义它的函数体或复合语句内部,当定义它的函数体在定义它的函数体或复合语句内部,当定义它的函数体或复合语句执行时,或复合语句执行时,C51才为该变量分配内存空间,结才为该变量分配内存空间,结束时占用的内存空间释放。自动变量一般分配在内存的束时占用的内存空间释放。自动变量一般分配在内存的堆栈空间中。定义变量时,如果省略存储种类,则该变堆栈空间中。定义变量时,如果省略存储种类,则该变量默认为自动量默认为自动(auto)变量。变量。2extern:使
17、用使用extern定义的变量称为外部变量。在一个函数体内,定义的变量称为外部变量。在一个函数体内,要使用一个已在该函数体外或别的程序中定义过的外部变量要使用一个已在该函数体外或别的程序中定义过的外部变量时,该变量在该函数体内要用时,该变量在该函数体内要用extern说明。外部变量被定义说明。外部变量被定义后分配固定的内存空间,在程序整个执行时间内都有效,直后分配固定的内存空间,在程序整个执行时间内都有效,直到程序结束才释放。到程序结束才释放。3static:使用使用static定义的变量称为静态变量。它又分为内部静定义的变量称为静态变量。它又分为内部静态变量和外部静态变量。在函数体内部定义的静
18、态变量为内态变量和外部静态变量。在函数体内部定义的静态变量为内部静态变量,它在对应的函数体内有效,一直存在,但在函部静态变量,它在对应的函数体内有效,一直存在,但在函数体外不可见,这样不仅使变量在定义它的函数体外被保护,数体外不可见,这样不仅使变量在定义它的函数体外被保护,还可以实现当离开函数时值不被改变。外部静态变量上在函还可以实现当离开函数时值不被改变。外部静态变量上在函数外部定义的静态变量。它在程序中一直存在,但在定义的数外部定义的静态变量。它在程序中一直存在,但在定义的范围之外是不可见的。如在多文件或多模块处理中,外部静范围之外是不可见的。如在多文件或多模块处理中,外部静态变量只在文件
19、内部或模块内部有效。态变量只在文件内部或模块内部有效。4register:使用使用register定义的变量称为寄存器变量。它定义定义的变量称为寄存器变量。它定义的变量存放在的变量存放在CPU内部的寄存器中,处理速度快,但内部的寄存器中,处理速度快,但数目少。数目少。C51编译器编译时能自动识别程序中使用频率编译器编译时能自动识别程序中使用频率最高的变量,并自动将其作为寄存器变量,用户可以无最高的变量,并自动将其作为寄存器变量,用户可以无需专门声明。需专门声明。 位变量位变量(bit)(bit):与:与80518051硬件特性操作有关的可以定义成硬件特性操作有关的可以定义成位变量。位变量必须定
20、位在位变量。位变量必须定位在80518051单片机片内单片机片内RAMRAM的位寻址空的位寻址空间中。间中。 字符变量字符变量(char)(char):字符变量的长度为:字符变量的长度为1 byte1 byte即即8 8位。这位。这很合适很合适80518051单片机,因为单片机,因为80518051单片机每次可处理单片机每次可处理8 8位数据。位数据。对于无符号变量对于无符号变量(unsigned char)(unsigned char)的值域范围是的值域范围是0255。对。对于有符号字符变量于有符号字符变量(signed char)(signed char),最具有重要意义的位,最具有重要意
21、义的位是最高位上的符号标志位是最高位上的符号标志位(msb)(msb)。此位为。此位为1 1代表代表“负负”,为,为0 0代表代表“正正”。有符号字符变量和无符号字符变量在表示。有符号字符变量和无符号字符变量在表示0127的数值时,其含义是一样的,都是的数值时,其含义是一样的,都是00 x7F。负数一。负数一般用补码表示。般用补码表示。 整型变量整型变量(int): 8051(int): 8051系列单片机将系列单片机将intint型变量的高位型变量的高位字节数存放在低地址字节中,低位字节数存放在高地址字字节数存放在低地址字节中,低位字节数存放在高地址字节中。有符号整型变量节中。有符号整型变量
22、(signed int)(signed int)也使用也使用msbmsb位作符号标位作符号标志位,并使用二进制补码表示数值。可直接使用几种专用志位,并使用二进制补码表示数值。可直接使用几种专用的机器指令来完成多字节的加、减、乘、除运算。的机器指令来完成多字节的加、减、乘、除运算。图图3.2 整型数的存储结构整型数的存储结构 0 x120 x34+0+1地址 0 x120 x340 x560 x78.+0+1+2+3地址 图图3.3 长整型变量的存储结构长整型变量的存储结构 浮点型变量浮点型变量(float): 浮点型变量为浮点型变量为32位,占位,占4个字节,许多个字节,许多复杂的数学表达式都
23、采用浮点变量数据类型。应用符号位表复杂的数学表达式都采用浮点变量数据类型。应用符号位表示数的符号,用阶码和尾数表示数的大小。示数的符号,用阶码和尾数表示数的大小。 用它们进行任何数学运算都需要使用由编译器决定的各用它们进行任何数学运算都需要使用由编译器决定的各种不同效率等级的库函数。种不同效率等级的库函数。KEIL C51的浮点变量数据类型的的浮点变量数据类型的使用格式与使用格式与IEEE-754标准有关,具有标准有关,具有24位精度,尾数的高位位精度,尾数的高位始终为始终为1,因而不保存,位的分布如下:,因而不保存,位的分布如下: 1位符号位。位符号位。 8位指数位。位指数位。 23位尾数。
24、位尾数。 符号位是最高位,尾数为低符号位是最高位,尾数为低23位,内存中按字节存储顺序如下:位,内存中按字节存储顺序如下:地址地址+0+1+2+3内容内容SEEEEEEEEMMMMMMMMMMMMMMM 其中,其中,S为符号位,为符号位,1表示负,表示负,0表示正;表示正;E为阶码;为阶码;M为为23位尾数,最高位为位尾数,最高位为“1”。 一个浮点数的数值范围是(一个浮点数的数值范围是(-1)2E-127(1.M) 浮点变量值浮点变量值 -12.5的十进制为:的十进制为:0 xC1480000,它按图,它按图3.4所所示方式存于内存中。示方式存于内存中。MMMMMMMM0 xC10 x480
25、 x000 x00+0+1+2+3地址 使用简化形式定义数据类型。其方法是在源程序开头使用使用简化形式定义数据类型。其方法是在源程序开头使用#define语句自定义简化的类型标识符。例如:语句自定义简化的类型标识符。例如:#define uchar unsigned char #define uint unsigned int 这样,在编程中,就可以用这样,在编程中,就可以用uchar代替代替unsigned char,用,用uint代替代替unsigned int来定义变量。来定义变量。 8051 8051系列机在物理上有四个存储空间系列机在物理上有四个存储空间 1 1)片内程序存储器空间)
26、片内程序存储器空间 2 2)片外程序存储器空间)片外程序存储器空间 3 3)片内数据存储器空间)片内数据存储器空间 4 4)片外数据存储器空间)片外数据存储器空间3.3 Cx51数据的存储类型与数据的存储类型与8051存储结构存储结构 80518051片内数据存储器可划分为两类:片内数据存储器可划分为两类:00H00H7FH7FH为片内低为片内低128128字节字节RAMRAM区;区; 80H80H0FFH0FFH为特殊功能寄存器区。为特殊功能寄存器区。 低字节低字节RAMRAM区又可以划分为区又可以划分为3 3个区域:个区域: 1 1)通用寄存器区()通用寄存器区(00H00H1FH1FH)
27、 每个寄存器可以用寄存器名寻址,也可直接用字每个寄存器可以用寄存器名寻址,也可直接用字节地址寻址。节地址寻址。 2 2)可位寻址区)可位寻址区 可以按字节寻址操作,也可按位地址操作。可以按字节寻址操作,也可按位地址操作。 3 3)用户)用户RAMRAM区区程序存储器与数据存储器严格分开,特殊功程序存储器与数据存储器严格分开,特殊功能寄存器与片内数据存储器统一编址。能寄存器与片内数据存储器统一编址。 片内数据存储区是存放临时性传递变量或使用片内数据存储区是存放临时性传递变量或使用频率较高的变量的。频率较高的变量的。 访问片内数据存储器速度较快,经常使用的访问片内数据存储器速度较快,经常使用的变量
28、置于片内数据存储器,而将不常用的置于片变量置于片内数据存储器,而将不常用的置于片外数据存储器中。外数据存储器中。寻址方式可使用直接和间接寻址。寻址方式可使用直接和间接寻址。表表 3.2 C51存储器类型与存储器类型与8051存储空间的对应关系存储空间的对应关系存储器类型存储器类型与存储空间的对应关系与存储空间的对应关系 data 直接寻址片内数据存储区,访问速度快直接寻址片内数据存储区,访问速度快(128字节字节) bdata 可位寻址片内数据存储区,允许位与字节混合访问可位寻址片内数据存储区,允许位与字节混合访问(16字节字节) idata 间接寻址片内数据存储区,可访问片内全部间接寻址片内
29、数据存储区,可访问片内全部RAM地址空间地址空间(256字节字节) pdata 分页寻址片外数据存储区分页寻址片外数据存储区(256字节字节)由由MOV Ri访问访问(i=0,1) xdata 片外数据存储区片外数据存储区(64 KB)由由MOVX DPTR访问访问 code 程序存储器程序存储器64 KB空间,由空间,由MOVC DPTR访问访问表表3.3 C51存储器类型及其数据长度和值域存储器类型及其数据长度和值域存储器类型存储器类型长度长度(bit)长度长度(byte)值域范围值域范围data810255idata810255pdata810255xdata162065 535code
30、162065 535带存储类型的变量的定义的一般格式为:带存储类型的变量的定义的一般格式为: 存储种类存储种类数据类型数据类型存储器类型存储器类型变量名变量名带存储类型的变量定义举例:带存储类型的变量定义举例:char data var1;bit bdata flags;float idata x,y,z;unsigned int pdata var2;unsigned char vector34;表表 3.4 存储器模式说明存储器模式说明存储器模式存储器模式说说 明明SMALLSMALLSMALLSMALL模式称为小编译模式模式称为小编译模式, ,默认的存储类型是默认的存储类型是datada
31、ta,参数及,参数及局部变量放入可直接寻址片内局部变量放入可直接寻址片内RAMRAM的用户区中的用户区中( (最大最大128128字节字节) )。另外所有对象另外所有对象( (包括堆栈包括堆栈) ),都必须嵌入片内,都必须嵌入片内RAMRAM。栈长很关键,。栈长很关键,因为实际栈长依赖于函数嵌套调用层数因为实际栈长依赖于函数嵌套调用层数COMPACTCOMPACTCOMPACTCOMPACT模式称为紧凑编译模式模式称为紧凑编译模式, ,默认的存储类型是默认的存储类型是pdatapdata,参,参数及局部变量放入分页的外部数据存储区,通过数及局部变量放入分页的外部数据存储区,通过R0或R1间接访
32、问,栈空间位于片内数据存储区中间接访问,栈空间位于片内数据存储区中LARGELARGELARGELARGE模式称为大编译模式,默认的存储类型是模式称为大编译模式,默认的存储类型是xdataxdata,参数,参数及局部变量直接放入片外数据存储区,使用数据指针及局部变量直接放入片外数据存储区,使用数据指针DPTRDPTR来来进行寻址。用此数据指针进行访问效率较低,尤其对两个或进行寻址。用此数据指针进行访问效率较低,尤其对两个或多个字节的变量,这种数据类型的访问机制直接影响代码的多个字节的变量,这种数据类型的访问机制直接影响代码的长度长度3.4 8051特殊功能寄存器特殊功能寄存器(SFR)的的C5
33、1定义定义 8051单片机中,除了程序计数器单片机中,除了程序计数器PC和和4组工作寄存器组外,组工作寄存器组外,其它所有的寄存器均为特殊功能寄存器其它所有的寄存器均为特殊功能寄存器(SFR),分散在片内,分散在片内RAM区的高区的高128字节中,地址范围为字节中,地址范围为80H0FFH。SFR中有中有11个个寄存器具有位寻址能力,它们的字节地址都能被寄存器具有位寻址能力,它们的字节地址都能被8整除,即字节整除,即字节地址是以地址是以8或或0为尾数的。为尾数的。 为了能直接访问这些为了能直接访问这些SFR,Franklin C51提供了一种自主形提供了一种自主形式的定义方法,这种定义方法与标
34、准式的定义方法,这种定义方法与标准C语言不兼容,只适用于对语言不兼容,只适用于对8051系列单片机进行系列单片机进行C语言编程。特殊功能寄存器语言编程。特殊功能寄存器C51定义的一定义的一般语法格式如下:般语法格式如下:sfr sfr_name = int constant; sfr是定义语句的关键字,其后必须跟一个是定义语句的关键字,其后必须跟一个8051单片机单片机真实存在的特殊功能寄存器名,真实存在的特殊功能寄存器名,=后面必须是一个整型常数,后面必须是一个整型常数,不允许带有运算符的表达式,是特殊功能寄存器不允许带有运算符的表达式,是特殊功能寄存器sfr-name的字节地址,这个常数值
35、的范围必须在的字节地址,这个常数值的范围必须在SFR地址范围内,位地址范围内,位于于0 x800 xFF。例如:例如:sfr SCON=0 x98; /* 串口控制寄存器地址串口控制寄存器地址98H */sfr TMOD=0 x89; /* 定时器定时器/计数器方式控制寄存器地址计数器方式控制寄存器地址89H */ 8051系列单片机的特殊功能寄存器的数量与类型不尽系列单片机的特殊功能寄存器的数量与类型不尽相同,因此建议将所有特殊的相同,因此建议将所有特殊的sfr定义放入一个头文件中,定义放入一个头文件中,该文件应包括该文件应包括8051单片机系列机型中的单片机系列机型中的SFR定义。定义。C
36、51编编译器的译器的reg51.h头文件就是这样一个文件。头文件就是这样一个文件。 在新的在新的8051系列产品中,系列产品中,SFR在功能上经常组合为在功能上经常组合为16位值,当位值,当SFR的高字节地址直接位于低字节之后时,对的高字节地址直接位于低字节之后时,对16位位SFR的值可以直接进行访问。例如的值可以直接进行访问。例如52子系列的定时器子系列的定时器/计计数器数器2就是这种情况。为了有效地访问这类就是这种情况。为了有效地访问这类SFR,可使用,可使用关键字关键字sfr16来定义,其定义语句的语法格式与来定义,其定义语句的语法格式与8位位SFR相同,只是相同,只是=后面的地址必须用
37、后面的地址必须用16位位SFR的低字节地址,的低字节地址,即低字节地址作为即低字节地址作为sfr16的定义地址。的定义地址。例如:例如: sfr16 T2 = 0 xCC /*定时器定时器/计数器计数器2:T2低低8位位地址为地址为0CCH,T2高高8位地址为位地址为0CDH*/ 这种定义适用于所有新的这种定义适用于所有新的16位位SFR,但不能用于,但不能用于定时器定时器/计数器计数器0和和1。 对于位寻址的对于位寻址的SFR中的位,中的位,C51的扩充功能支持的扩充功能支持特殊位的定义,像特殊位的定义,像SFR一样不与标准一样不与标准C兼容,使用兼容,使用sbit来定义位寻址单元。来定义位
38、寻址单元。 第一种方法:第一种方法: sbit bit-name = sfr-nameint constant; sbit是定义语句的关键字,后跟一个寻址位符号名是定义语句的关键字,后跟一个寻址位符号名(该位符该位符号名必须是号名必须是8051单片机中规定的位名称单片机中规定的位名称),=后的后的sfr-name必必须是已定义过的须是已定义过的SFR的名字,的名字,后的整常数是寻址位在特殊功能后的整常数是寻址位在特殊功能寄存器寄存器sfr-name中的位号,必须是中的位号,必须是07范围中的数。例如:范围中的数。例如: sfr PSW=0 xD0 ; /* 定义定义PSW寄存器地址为寄存器地址
39、为D0H */ 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 ;/* 定
40、义定义OV位地址是位地址是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 */ 特殊功能位代表了一个独立的定义类,不能与其它位定义特殊功能位代表了一个独立的定义类,不能与其它
41、位定义和位域互换。和位域互换。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可可以统一在一个头文件中定义,也可以在程序中以统一在一个头文件中定义,也可以在程序中(
42、一般在开始的位一般在开始的位置置)进行定义,其定义方法如下:进行定义,其定义方法如下: 对于对于8051片内片内I/O口按特殊功能寄存器方法定义。例如:口按特殊功能寄存器方法定义。例如:sfr P0=0 x80 ; /* 定义定义P0口,地址为口,地址为80H */sfr P1=0 x90 ; /* 定义定义P1口,地址为口,地址为90H */ 对于片外扩展对于片外扩展I/O口,则根据硬件译码地址,将其视作为片口,则根据硬件译码地址,将其视作为片外数据存储器的一个单元,使用外数据存储器的一个单元,使用#define语句进行定义。例如语句进行定义。例如#include #define PORTA
43、 XBYTE 0 xFFC0 absacc.h是是C51中绝对地址访问函数的头文件,将中绝对地址访问函数的头文件,将PORTA定定义为外部义为外部I/O口,地址为口,地址为 FFC0H,长度为,长度为8位。位。 一旦在头文件或程序中对这些片外一旦在头文件或程序中对这些片外I/O口进行定义后,在程口进行定义后,在程序中就可以自由使用变量名与其实际地址的联系,以便使程序序中就可以自由使用变量名与其实际地址的联系,以便使程序员能用软件模拟员能用软件模拟8051的硬件操作。的硬件操作。#include#defineucharunsignedcharsbitDIPswitch=P14;sbitgreen
44、LED=P15;voidmain(void)ucharinval;inval=0;while(1)if(DIPswitch=1)inval=P1&0 x0f;greenLED=0;elsegreenLED=1;P3=(P3&0 xf0)|inval; (1) 位变量位变量C51定义。使用定义。使用C51编程时,定义了位变量后,就编程时,定义了位变量后,就可以用定义了的变量来表示可以用定义了的变量来表示8051的位寻址单元。的位寻址单元。 位变量的位变量的C51定义的一般语法格式如下:定义的一般语法格式如下: 位类型标识符位类型标识符(bit) 位变量名;位变量名; 例如:例如:
45、bit 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 di
46、sable)或包含明确的寄存器组切换或包含明确的寄存器组切换(using n)的函数不能返回位值,否则编辑器将会给出一个错误的函数不能返回位值,否则编辑器将会给出一个错误信息。信息。 (3) 对位变量定义的限制。位变量不能定义成一个指对位变量定义的限制。位变量不能定义成一个指针,如不能定义:针,如不能定义:bit * bit_pointer。不存在位数组,如。不存在位数组,如不能定义:不能定义:bit b_array 。 在位定义中,允许定义存储类型,位变量都被放入一在位定义中,允许定义存储类型,位变量都被放入一个位段,此段总位于个位段,此段总位于8051片内的片内的RAM区中。因此,存储区中
47、。因此,存储类型限制为类型限制为data和和idata,如果将位变量的存储类型定义成,如果将位变量的存储类型定义成其它存储类型都将编译出错。其它存储类型都将编译出错。例例1 先定义变量的数据类型和存储类型:先定义变量的数据类型和存储类型: bdata int ibase; /* 定义定义ibase为为bdata整型变量整型变量 */bdata char bary4; /* bary4定义为定义为bdata字符型数组字符型数组 */然后可使用然后可使用sbit定义可独立寻址访问的对象位:定义可独立寻址访问的对象位:sbit mybit0 = ibase0 ;/* mybit0定义为定义为ibas
48、e的第的第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。利用赋值运算符将一个。利用赋值运算符将一个变量与
49、一个表达式连接起来的式子称为赋值表达式,在变量与一个表达式连接起来的式子称为赋值表达式,在赋值表达式的后面加一个分号赋值表达式的后面加一个分号“;”就构成了赋值语句,就构成了赋值语句,一个赋值语句的格式如下:一个赋值语句的格式如下:变量变量=表达式;表达式;执行时先计算出右边表达式的值,然后赋给左边的执行时先计算出右边表达式的值,然后赋给左边的变量。例如:变量。例如:x=8+9;/*将将8+9的值赋绐变量的值赋绐变量x*/x=y=5;/*将常数将常数5同时赋给变量同时赋给变量x和和y*/在在C51中,允许在一个语句中同时给多个变量赋值,中,允许在一个语句中同时给多个变量赋值,赋值顺序自右向左。
50、赋值顺序自右向左。3.7Cx51运算符、表达式及其规则运算符、表达式及其规则C51中支持的中支持的算术运算符算术运算符有:有:+加或取正值运算符加或取正值运算符-减或取负值运算符减或取负值运算符*乘运算符乘运算符/除运算符除运算符%取余运算符取余运算符加、减、乘运算相对比较简单,而对于除运算,加、减、乘运算相对比较简单,而对于除运算,如相除的两个数为浮点数,则运算的结果也为浮点数,如相除的两个数为浮点数,则运算的结果也为浮点数,如相除的两个数为整数,则运算的结果也为整数,即如相除的两个数为整数,则运算的结果也为整数,即为整除。如为整除。如25.0/20.0结果为结果为1.25,而,而25/20
51、结果为结果为1。对于取余运算,则要求参加运算的两个数必须为对于取余运算,则要求参加运算的两个数必须为整数,运算结果为它们的余数。例如:整数,运算结果为它们的余数。例如:x=5%3,结果,结果x的值为的值为2。2、算术表达式、优先级与结合性、算术表达式、优先级与结合性算术表达式:算术表达式:用算术运算符和括号将运算对象连接起来的用算术运算符和括号将运算对象连接起来的式子,运算对象包括常量、变量、函数、数组和结构等。式子,运算对象包括常量、变量、函数、数组和结构等。如:如:a*b/c-2.5+d优先级优先级指当运算对象两侧都有运算符时指当运算对象两侧都有运算符时, ,执行运算的执行运算的先后次序。
52、先后次序。 结合性结合性指当一个运算对象两侧的运算符的优先级别指当一个运算对象两侧的运算符的优先级别相同的运算顺序。相同的运算顺序。 算术运算符的算术运算符的优先级规定优先级规定为:先乘除模,后加减,括号为:先乘除模,后加减,括号最优先。最优先。 运算符执行的先后取决与运算符的优先级,当优先级相运算符执行的先后取决与运算符的优先级,当优先级相同时,在看看结合性。同时,在看看结合性。如:如:a-b*c等价于等价于a-(b*c)a*b/c等价于等价于(a*b)/c 图中图中“ ” 表示必定转换。既使是同一种类型也按表示必定转换。既使是同一种类型也按 转转换。即当遇到换。即当遇到char、short
53、时,系统一律将其转换为时,系统一律将其转换为int参与运算,参与运算,如如a + b,先转换为先转换为int,结果为,结果为 int。而当遇到。而当遇到float时,一时,一律转换为律转换为double参与运算。参与运算。转换方法转换方法:double float高低高低 longunsignedint char, short+数据类型转换数据类型转换1. 1.自动(缺省)类型转换自动(缺省)类型转换 可根据自己的意愿利用强制类型转换运算符可根据自己的意愿利用强制类型转换运算符将一个算术表达式转换为所需类型将一个算术表达式转换为所需类型强制类型转换格式强制类型转换格式: (类型名类型名) (表
54、达式表达式)例如例如: (double) a 将将a转换为转换为double(int) (x+y) 将将x+y转换为转换为int(float) (5%3) 将将5%3转换为转换为float2. 2.强制类型转换运算符强制类型转换运算符“()()”3.7.2、Cx51关系运算符、表达式及优先级关系运算符、表达式及优先级大于大于=大于或等于大于或等于=测试等于测试等于!=测试不等于测试不等于前前4种关系运算符(种关系运算符(、=)优先级相同,后)优先级相同,后两种也相同;前两种也相同;前4种优先级高于后两种种优先级高于后两种2.关系运算符的优先级关系运算符的优先级关系运算符优先级如右图关系运算符优
55、先级如右图:算术运算符算术运算符赋值运算符赋值运算符关系运算符关系运算符高高低低举例举例: ca+b c(a+b)ab!=c (ab)!=ca= =bc a= =(bc a=(bc)关系运算符的结合性为左结合关系运算符的结合性为左结合关系表达式:用关系运算符连接起来的表达式关系表达式:用关系运算符连接起来的表达式格式:格式:说明:说明: 关系表达式的结果只有两种即关系表达式的结果只有两种即“真真”和和“假假”,其,其中中“真真”用用“”表示、表示、“假假”用用“”表示。表示。 判断一个量是否为真时,等于判断一个量是否为真时,等于0表示假,非表示假,非0都是真。都是真。3.7.3、Cx51逻辑运
56、算符、表达式及优先级逻辑运算符、表达式及优先级&逻辑逻辑“与与”(AND)|逻辑逻辑“或或”(OR)!逻辑逻辑“非非”(NOR)“&”和和“|”是双目运算符,要求有两个运算对象;而是双目运算符,要求有两个运算对象;而“!”是单目运算符,只要求有一个运算对象。是单目运算符,只要求有一个运算对象。逻辑表达式的结合性为自左向右逻辑表达式的结合性为自左向右逻辑表达式:用逻辑运算符关系运算符或逻辑表达式:用逻辑运算符关系运算符或逻辑量连接起来的式子称为逻辑表达式。逻辑量连接起来的式子称为逻辑表达式。逻辑表达式的值应该是一个逻辑量真或假逻辑表达式的值应该是一个逻辑量真或假逻辑表达式的值与关
57、系表达式的值相同,逻辑表达式的值与关系表达式的值相同,以以0代表假,以代表假,以1代表真。代表真。例如:若例如:若a=8,b=3,c=0,则!,则!a为假,为假,a&b为真,为真,b&c为假为假3.7.4、Cx51位操作及其表达式位操作及其表达式&按位与按位与|按位或按位或按位异或按位异或按位取反按位取反位右移位右移除了按位取反运算符除了按位取反运算符“”以外,以上位操作运算以外,以上位操作运算符都是两目运算符,即要求运算符两侧各有一个运符都是两目运算符,即要求运算符两侧各有一个运算对象。算对象。位运算位运算只能是只能是整型或字符型数,不能为实型数据整型或字符型数,不能为实型数据“&”:参加运算的两个运算对象,若两者相应的位都为:参加运算的两个运算对象,若两者相应的位都为1,则该位结果值为则该位结果值为1,否则为,否则为0。“|”:参加运算的两个对象,若两者相应的位中有一个为:参加运算的两个对象,若两者相应的位中有一个为1,则该位结果为,则该位结果为1“”:参加
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年土地使用权补办出让合同范本
- 2025家用电器买卖合同范文
- 2025变电站建设施工的合同协议书
- 2025如何才能规避签订购房合同的常见风险
- 2025存量房买卖合同范本及司法解释
- 2025年云南事业单位a类真题及答案
- 2025年事业单位c类真题及答案
- 2025包装材料供应合同模板
- 2025超市租赁合同范本模板
- 2025挖掘机租赁合同样本挖掘机租赁合同模板
- 2025届广东省佛山市高三下学期教学质量检测(二)物理试题及答案
- 2025年初中数学联考试题及答案
- 河北省邯郸市2025年高考物理二模试卷(含解析)
- 《综合保税区发展战略》课件
- 2025第十三届贵州人才博览会遵义市事业单位人才引进47人笔试备考试题及答案解析
- 2025合肥市辅警考试试卷真题
- 《出师表》与《杜正献公》对比阅读训练
- 《我国中小企业薪酬激励机制研究-以郑州宇通客车公司为例》9700字
- 幕墙铝板合同协议
- 抽样计划考试试题及答案
- 2025年上半年四川成都农业科技职业学院招聘工作人员16人重点基础提升(共500题)附带答案详解
评论
0/150
提交评论