您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 第05章_Keil_C51程序设计基础
1第五讲KeilC51程序设计基础2KeilC51程序设计基础单片机程序既可以用汇编语言也可以用C语言进行编写,两者都可以在C51的环境下进行开发,这两者之间既有区别也有联系。C51是一种特殊的C编译器,它扬弃了C语言的一些不适合MCS-51单片机的特性,针对MCS-51单片机的特性做了适应性保留,使其更适合对单片机底层硬件进行直接控制。汇编语言则是一种用文字助记符来表示机器指令的符号语言,是最接近机器码的一种语言。其主要优点是占用资源少、程序执行效率高。但是,不同的CPU其汇编语言可能有所差异,所以不易相互之间进行移植。3用这两种语言进行单片机系统开发,存在各自的优缺点,主要体现在以下几点。(1)、汇编语言可以更好地针对硬件进行控制汇编语言的一条指令就对应一个机器码,每一步执行什么动作都很清楚,并且程序大小和堆栈调用情况都容易控制,调试起来也比较方便。而用C语言进行编写,一条C语言指令编译后,会变成很多条机器码,很容易出现ROM空间不够、堆栈溢出等问题。4(2)、C语言可以提供良好的人机开发接口C语言是一种编译型程序设计语言,它兼顾了多种高级语言的特点,并具备汇编语言的功能,可以实现结构更为复杂的单片机系统功能。C语言有功能丰富的库函数,运算速度快、编译效率高、有良好的可移植性,而且可以直接实现对系统硬件的控制。C语言是一种结构化程序设计语言,它支持当前程序设计中广泛采用的由顶向下结构化程序设计技术。此外,C语言程序还具有完善的模块程序结构,从而为软件开发中采用模块化程序设计方法提供了有力的保障。因此,使用C语言进行程序设计已成为软件开发的一个主流。用C语言来编写目标系统软件,会大大缩短开发周期,并且明显地增加软件的可读性,便于对已编制好的程序进行改进和扩充,从而研制出规模更大、性能更完备的系统。5针对汇编语言可以更好的针对硬件进行控制的特点,很多单片机设计和生产公司开发了MCS-51单片机的增强型衍生产品,这些产品在内部的主要功能部件上未作出任何变化,只是增加了程序存储器Flash和数据存储器RAM的容量,使其更适合运用C语言开发代码更长的复杂程序。如,表4-1给出的STC单片机RC/RD+(+5V)系列选型一览表中,就是根据这两个因素进行型号区分的。因此,用C语言进行单片机程序设计是单片机开发与应用的必然趋势。所以,作为一个致力于单片机系统开发的开发人员来说,最好能够掌握基本的C语言编程。基于以上原因,本书的所有项目都是采用KeilC51下的C语言进行开发的,本章就对C51的一些基本知识进行简要介绍,读者可以结合后面的具体项目,加深对这部分知识的理解和掌握。关于MCS-51单片机利用汇编进行编程方面的知识,有兴趣的读者也可以查阅相关的资料自行学习。65.1标识符和关键字C语言中的标识符是设计人员在程序中自己定义的一种字符序列,用来命名程序中需要辨认的对象,包括符号常量、变量、数组及函数等对象。标识符具有以下一些特征:(1)、由字母、数字、下划线构成。(2)、开头必须是字母或下划线。(3)、长度不得大于32个字符,而通常是前8个字符有效。(4)、区分大、小写字母。例如,以下标识符是合法的:A,x,x_3,BOOK1,sum5以下标识符是非法的:3s(以数字开头),s*T(出现非法字符*),-3x(以减号开头),bowy-1(出现非法字符-(减号))7在使用标识符时还必须注意以下几点:(1)、标准C语言不限制标识符的长度,但它受各种版本的C语言编译系统的限制,同时也受到具体机器的限制。例如,在某版本C语言中规定标识符前八位有效,当两个标识符前八位相同时,则被认为是同一个标识符。(2)、在标识符中,大小写是有区别的。例如,SEA和sea是两个不同的标识符。(3)、标识符虽然可由程序员随意定义,但标识符是用于标识某个量的符号。因此,命名应尽量有相应的意义,以便于理解。(4)、不应该使用C语言中的保留标识符来做自定义的变量或者函数等的标识符。使用保留标识符来做自定义变量或者函数等的标识符不是语法错误,可以通过编译,因为保留标识符是合法的标识符,符合标识符命名法则。但是,因为这些标识符已经被C语言使用或者保留了,所以使用保留标识符来做自定义变量或者函数等的标识符可能会引起意想不到的问题。8例如,C语言语句intdouble;是错误的,因为double是关键字,不能做变量名。下面列出了C语言的所有关键字,读者在使用中应慎用这些关键字,不要将其作为标识符来使用。Auto、enum、restrict、unsigned、break、extern、return、void、case、float、shortvolatile、char、for、signed、while、const、goto、sizeof、Bool、continue、if、static、default、inline、struct、_Imaginary、do、int、switch、double、long、typedef、else、register和union等。95.2C51的数据类型在C语言中,每个变量在使用之前必须先定义其数据类型。C语言中有以下几种数据类型:整型(int)、浮点型(float)、字符型(char)、指针型(*)、无值型(void)以及结构(struct)和联合(union)。为了充分利用MCS-51单片机的资源特点,C51在C语言的数据类型基础上增设了位型变量sbit,取消了布尔变量,其实两者的使用方法基本类似。表5-1列出了C51的基本数据类型。10表5-1C51的基本数据类型类型说明符位数字节数数的范围signedint162-32768~32767即-215~(215-1)unsignedint1620~65535即0~(216-1)signedlong324-2147483648~2147483647即-231~(231-1)unsignedlong3240~4294967295即0~(232-1)float32410-37~1038double64810-307~10308longdouble1281610-4931~104932signedchar81-128~+127unsignedchar8110~255bit或sbit--0,1115.2.1整型(int)5.2.1.1整型常量整型常量就是整常数。在C51中,使用的整常数有八进制、十六进制和十进制三种。1、十进制整常数:十进制整常数没有前缀。其数码为0~9。2、八进制整常数:八进制整常数必须以0开头,即以0作为八进制数的前缀。数码取值为0~7。八进制数通常是无符号数。如以下各数是八进制数:015(十进制为13)、0101(十进制为65)、0177777(十进制为65535);3、十六进制整常数:十六进制整常数的前缀为0X或0x。其数码取值为0~9,A~F或a~f。如以下各数是十六进制整常数:0X2A(十进制为42)、0XA0(十进制为160)、0XFFFF(十进制为65535)。125.2.1.2整型变量根据表5-1,加上不同的修饰符,整型数有以下几种类型:signedint(有符号短整型数)、signedlong(有符号长整型数说明)、unsignedint(无符号短整型数)和unsignedlong(无符号长整型数),字长和数的取值范围已在表5-1中列出。整型数在内存中是以补码方式存放的,应遵循以下原则:·正数的补码和原码相同。·负数的补码应将该数的绝对值的二进制形式按位取反再加1。例如,101的原码为1100101B,反码为1111111110011010B,补码为1111111110011011B,由反码加1求得。135.2.2实型数据5.2.2.1实型常量实型也称为浮点型。实型常量也称为实数或者浮点数,所有浮点数都被默认为double。在C51中,实数只采用十进制。它有二种形式:十进制小数形式和指数形式。(1)、十进制数形式:由数码0~9和小数点组成。例如,0.0、23.0、9.739、0.113、23.0、3330.、-267.8230等均为实数,它们共同的特点是都有小数点。(2)、指数形式:由十进制数,加阶码标志“e”或“E”以及阶码(只能为整数,可以带符号)组成。其一般形式为:aEn(a为十进制数,n为十进制整数),其值为a*10n。如,3.45E5其值为3.45*105。145.2.2.2实型变量实型变量分为单精度(float型)和双精度(double型)两种类型。表5-1给出了这两类变量的字长和取值范围。以下示例给出了变量定义的格式和书写规则。例如,floatx,y;(x,y为单精度实型变量),doublea,b,c;(a,b,c为双精度实型变量)。实型变量在单片机内存中是按指数形式存储,具体的存放形式请参照相关C语言程序设计书籍。155.2.3字符型数据(char)5.2.3.1字符常量字符常量是用单引号括起来的一个字符。例如,'a'、'b'、'='、'+'、'?'等都是合法的字符常量。在C51中,规定字符常量有以下特点:·字符常量只能用单引号括起来,不能用双引号或其他括号。·字符常量只能是单个字符,不能是字符串。16·字符可以是字符集中任意字符。但数字被定义为字符型之后就不能参与数值运算。如,'9'和9是不同的,'9'是字符常量,不能参与运算。·字符可以用ASCII码值表示。例如,十进制数85表示大写字母'U';十六进制数0x5d表示']';八进制数0102表示大写字母'B'。·一些不能用符号表示的控制符,只能用ASCII码值来表示。如,十进制数10表示'\n'换行;十六进制数0x0d表示回车'\r';十六进制数0x0c表示换页'\f'等。·对于字符串常量,一般用双引号括起来表示。如,HelloC51。175.2.3.2字符变量字符变量用来存储字符常量,为单个字符。加上不同的修饰符,可以定义有符号和无符号两种类型的字符型变量。例如;chara://a被定义为有符号字符变量unsignedcharb;//b被定义为无符号字符变量字符在计算机中以其ASCII码方式表示的,是以ASCII码的形式存放在变量的内存单元之中的,其长度为1个字节。有符号字符型数取值范围为-128~+127,无符号字符型数到值范围是0~255。字符变量类型定义的格式和书写规则都与整型变量相同。如,x的十进制ASCII码是120,y的十进制ASCII码是121。所以也可以把它们看成是整型量。C51允许对整型变量赋以字符值,也允许对字符变量赋以整型值。在输出时,允许把字符变量按整型量输出,也允许把整型量按字符量输出。185.2.4指针型(*)指针是一种特殊的数据类型,在其它语言中一般没有。指针是指向变量的地址,实质上指针就是存储单元的地址。根据所指的变量类型不同,可以是整型指针(int*)、浮点型指针(float*)、字符型指针(char*)、结构指针(struct*)和联合指针(union*)。195.2.5bit位标量bit是C51编译器的一种扩充数据类型,利用它可定义一个位标量,但不能定义位指针,也不能定义位数组。它的值是一个二进制位,不是0就是1,类似一些高级语言中的布尔类型True和False。例如,bitlock;//将lock定义为位变量bitdirention;//将direction定义为位变量函数也可以有bit类型的参数,也可以有bit类型的返回值。205.2.6各类数值型数据之间的混合运算变量的数据类型相互之间是可以转换的,转换的方法有两种,一种是自动转换,一种是强制转换。自动转换发生在不同数据类型的量混合运算时,由编译系统自动完成。自动转换遵循以下规则:(1)、若参与运算量的类型不同,则先转换成同一类型,然后进行运算。(2)、转换按数据长度增加的方向进行,以保证精度不降低。如,int型和long型运算时,先把int量转成long型后再进行运算。(3)、所有的浮点运算都是以双精度进行的,即使仅含float单精度量运算的表达式,也要先转换成double型,再作运算。(4)
本文标题:第05章_Keil_C51程序设计基础
链接地址:https://www.777doc.com/doc-4012846 .html