资源预览内容
第1页 / 共34页
第2页 / 共34页
第3页 / 共34页
第4页 / 共34页
第5页 / 共34页
第6页 / 共34页
第7页 / 共34页
第8页 / 共34页
第9页 / 共34页
第10页 / 共34页
亲,该文档总共34页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
C51 语言的基本知识1第 2 章 单片机 C51 语言基础随着单片机开发技术的不断发展,目前已有越来越多的人从普遍使用汇编语言逐渐过渡到使用高级语言开发,其中又以 C 语言为主,市场上几种常见的单片机均有其 C 语言开发环境。应用于 51 系列单片机开发的 C 语言通常简称为 C51 语言。Keil C51是目前最流行的 51 系列单片机的 C 语言程序开发软件。本章重点介绍 C51 语言对标准ANSIC 语言的扩展内容。深入理解并应用这些扩展内容是学习 C51 语言程序设计的关键。掌握 C51 语言的基本知识,特别是新增数据类型 bit、sbit、sfr、sfr16 的使用方法;理解 C51 语言中关于存储区域的划分;掌握 C51 语言中指针及绝对地址的使用方法;进一步熟悉 Keil C51、Proteus ISIS 的使用方法。2.1 C51 语言的基本知识众所周知,C 语言的特点是具有灵活的数据结构和控制结构;表达力强;可移植性好;用 C 语言编写的程序兼有高级语言和低级语言的优点,表达清楚且效率高。C51 语言继承了 C 语言的绝大部分特性,而且基本语法相同。为了适应 51 系列单片机本身资源的特点,在数据类型、存储器类型、存储器模型、指针、函数等方面,C51 语言对C 语言进行了一定的扩展。本节主要介绍 C51 语言的基本知识,包括标识符、常量、基本数据类型、存储区域与存储模式等。2.1.1 标识符用计算机语言编写程序的目的是处理数据,因此,数据是程序的重要组成部分。然而参与计算的数据的值特别是计算结果在编程时是不知道的,人们只能用变量表示。用来标识常量名、变量名、函数名等对象的有效字符序列称为标识符(Identifier)。简单地说,标识符就是一个名字。合法的标识符由字母、数字和下划线组成,并且第一个字符必须为字母或下划线。例如:area、 PI、_ini、a_array 、s123、P101p都是合法的标识符,而456P、cade-y、w.w、a&b都是非法的标识符。在 C51 语言的标识符中,大、小写字母是严格区分的。因此,page 和 Page 是两个不同的标识符。对于标识符的长度(一个标识符允许的字符个数) ,一般取前 8 个字符,多余的字符将不被识别。单片机 C51 语言基础2C51 语言的标识符可以分为 3 类:关键字、预定义标识符和自定义标识符。1. 关键字关键字是 C51 语言规定的一批标识符,在源程序中代表固定的含义,不能另作它用。C51 语言除了支持 ANSI 标准 C 语言中的关键字( 见表 2-1)外,还根据 51 系列单片机的结构特点扩展部分关键字,见表 2-2。2. 预定义标识符预定义标识符是指 C51 语言提供的系统函数的名字( 如 printf、scanf)和预编译处理命令( 如 define、 include)等。C51 语言语法允许用户把这类标识符另作它用,但将使这些标识符失去系统规定的原意。因此,为了避免误解,建议用户不要把预定义标识符另作它用。3. 自定义标识符由用户根据需要定义的标识符,一般用来给变量、函数、数组或文件等命名。程序中使用的自定义标识符除要遵循标识符的命名规则外,还应做到“见名知意” ,即选择具有相关含义的英文单词或汉语拼音,以增加程序的可读性。如果自定义标识符与关键字相同,程序在编译时将给出出错信息;如果自定义标识符与预定义标识符相同,系统并不报错。表 2- 1 标准 C 语言中的常用关键字关 键 字 类 别 用 途 说 明char 定义字符型变量double 定义双精度实型变量enum 定义枚举型变量float 定义单精度实型变量int 定义基本整型变量long定义变量的数据类型定义长整型变量short 定义短整型变量signed 定义有符号变量,二进制数据的最高位为符号位struct 定义结构型变量typedef 定义新的数据类型说明符union 定义联合型变量unsigned 定义无符号变量void 定义无类型变量volatile定义变量的数据类型定义在程序执行中可被隐含地改变的变量auto 定义局部变量,是默认的存储类型const 定义符号常量extern 定义全局变量register 定义寄存器变量static定义变量的存储类型定义静态变量break 退出本层循环或结束 switch 语句C51 语言的基本知识3case switch 语句中的选择项continue 结束本次循环,继续下一次循环default switch 语句中的默认选择项do 构成 dowhile 循环语句else 构成 ifelse 选择语句for for 循环语句goto 转移语句if 选择语句return 函数返回switch 开关语句while控制程序流程while 循环语句sizeof 运算符 用于测试表达式或数据类型所占用的字节数表 2- 2 C51 语言中新增的常用关键字关 键 字 类 别 用 途 说 明bdata 可位寻址的片内数据存储器(20H2FH)code 程序存储器data 可直接寻址的片内数据存储器idata 可间接寻址的片内数据存储器pdata 可分页寻址的片外数据存储器xdata定义数据存储区域片外数据存储器compact 指定使用片外分页寻址的数据存储器large 指定使用片外数据存储器small 定义数据存储模式 指定使用片内数据存储器bit 定义一个位变量sbit 定义一个位变量sfr 定义一个 8 位的 SFRsfr16定义数据类型定义一个 16 位的 SFRinterrupt 定义中断函数 声明一个函数为中断服务函数reentrant 定义再入函数 声明一个函数为再入函数using 定义当前工作寄存器组 指定当前使用的工作寄存器组-at- 地址定位 为变量进行存储器绝对地址空间定位-task- 任务声明 定义实时多任务函数2.1.2 常量在程序运行过程中其值始终不变的量称为常量。在 C51 语言中,可以使用整型常量、实型常量、字符型常量。1. 整型常量整型常量又称为整数。在 C51 语言中,整数可以用十进制、八进制和十六进制形式来表示。但是,C51 中数据的输出形式只有十进制和十六进制两种,并且在 Keil 单片机 C51 语言基础4Vision2 中的 Watches 对话框中可以切换,如图 2-1 所示。图 2- 1 C51 中数据输出形式选择 十进制数:用一串连续的数字来表示,如 12、-1 、0 等。 八进制数:用数字 0 开头,如 010、-056 、011 等。 十六进制数:用数字 0 和字母 x 或 X 开头,如 0x5a、-0x9c 等。例如,下列程序片段的执行结果为 sum=497(或 0x1F1)。int i=123, j=0123, k=0x123, sum;sum = i + j + k;在 C51 语言中,还可以用一个“特别指定”的标识符来代替一个常量,称为符号常量。符号常量通常用#define 命令定义,如#define PI 3.14159 / 定义符号常量 PI=3.14159定义了符号常量 PI,就可以用下例语句计算半径为 r 的圆的面积 S 和周长 L。S = PI*r*r; / 在程序中引用符号常量 PIL = 2*PI*r; / 在程序中引用符号常量 PI2. 实型常量实型常量又称实数。在 C51 语言中,实数有两种表示形式,均采用十进制数,默认格式输出时最多只保留 6 位小数。 小数形式:由数字和小数点组成。例如,0.123、.123、123.、0.0 等都是合法的实型常量。 指数形式:小数形式的实数 E整数。例如,2.3026 可以写成0.23026E1,或 2.3026E0,或 23.026E -1。3. 字符型常量用单引号括起来的一个 ASCII 字符集中的可显示字符称为字符常量。例如, A、a、 9、 #、 %都是合法的字符常量。C51 语言规定,所有字符常量都可作为整型常量来处理。字符常量在内存中占一个字节,存放的是字符的 ASCII 代码值。因此,字符常量 A的值可以是 65,或0x41;字符常量a的值可以是 97 或 0x61。例如,下列程序片段的执行结果为 z=16(或 0x10)。unsigned char x=A, y=a;unsigned z;z=(y-x)/2;C51 语言的基本知识52.1.3 基本数据类型数据类型是指变量的内在存储方式,即存储变量所需的字节数以及变量的取值范围。C51 语言中变量的基本数据类型见表 2-3,其中 bit、sbit、sfr、sfr16 为 C51 语言新增的数据类型,可以更加有效地利用 51 系列单片机的内部资源。所谓变量,是指在程序运行过程中其值可以改变的量。表 2- 3 C51 语言中的基本数据类型数据类型 占用的字节数 取 值 范 围unsigned char 单字节 0255 signed char 单字节 -128+127unsigned int 双字节 065535signed int 双字节 -32768+32767unsigned long 四字节 04294967295signed long 四字节 -2147483648+2147483647float 四字节 1.175 494E-383.402 823E+38* 13 字节 对象的地址bit 位 0 或 1sbit 位 0 或 1sfr 单字节 0255sfr16 双字节 065535变量应该先定义后使用,定义格式如下:数据类型 变量标识符 =初值 变量定义通常放在函数的开头部分,但也可以放在函数的外部或复合语句的开头。以 unsigned int 为例,变量的定义方式主要有以下 3 种。unsigned int k; / 定义变量 k 为无符号整型unsigned int i, j, k; / 定义变量 i, j, k 为无符号整型unsigned int i=6, j; / 定义变量的同时给变量赋初值,变量初始化当在一个表达式中出现不同数据类型的变量时,必须进行数据类型转换。C51 语言中数据类型的转换有两种方式:自动类型转换和强制类型转换。(1) 自动类型转换。不同数据类型的变量在运算时,由编译系统自动将它们转换成同一数据类型,再进行运算。自动转换规则如下:bitcharintlongfloatsignedunsigned自左至右数据长度增加,即参加运算的各个变量都转换为它们之中数据最长的数据类型。当赋值运算符左右两侧类型不一致时,编译系统会按上述规则,自动把右侧表达式的类型转换成左侧变量的类型,再赋值。(2) 强制类型转换。单片机 C51 语言基础6根据程序设计的需要,可以进行强制类型转换。强制类型转换是利用强制类型转换符将一个表达式强制转换成所需要的类型。其格式如下:( 类型 ) 表达式例如,( int ) 5.87=5 。 注意:无论是自动转换还是强制转换,都局限于某次运算,并不改变数据说明时对变量规定的数据类型。【例 2-1】 数据类型转换。#include void main( ) float x=3.5, y, z, l ; unsigned int i=6, j ;j=x+i ; / 结果为整型y=x+i ; / 结果为实型l=i+(int)5.8 ; / 将 5.8 强制转换为整型,结果为实型z=(float)i+5.8 ; / 将 i=6 强制转换为实型,结果为实型在 Keil Vision2 的 Watches 窗口中可以观察程序运行的结果。下面重点介绍 C51 语言中新增的数据类型 bit、sbit 、sfr 和 sfr16。为了方
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号