330 likes | 564 Views
第 2 章 C51 程序设计基础. 在标准 C 语言的基础上学习 C51 程序设计,应重点掌握标准 C 语言和 C51 的区别 . 本章主要介绍 C51 的数据类型和存储类型、基本运算与流程控制语句、构造数据类型、函数以及程序设计中的其他一些问题等内容. 2 . 1 C51 数据类型及存储类型. 2 . 1 . 1 数据类型
E N D
第2章 C51程序设计基础 在标准C语言的基础上学习C51程序设计,应重点掌握标准C语言和C51的区别. 本章主要介绍C51的数据类型和存储类型、基本运算与流程控制语句、构造数据类型、函数以及程序设计中的其他一些问题等内容.
2.1 C51数据类型及存储类型 • 2.1.1 数据类型 C51编译器支持的数据类型有:位型(bit)、无符号字符型(unsigned char)、有符号字符型(signed char)、无符号整型(unsigned int)、有符号整型(signed int)、无符号长整型(unsigned long)、有符号长整型(signed long)、浮点型(float)和指针型等。
2.1.2 常量与变量 • 1.常量 C51语言中的常量是不接受程序修改的固定值,常量可为任意数据类型。 (1)整型常量 (2)实型常量 (3)字符常量 (4)字符串常量 (5)符号常量
2.变量 • 其值可以改变的量称为变量。 • 所有的C51变量必须在使用前定义。定义变量的一般形式为: 数据类型 变量名; (1)整型变量(int) (2)长整型变量(long int) (3)实型变量 (4)字符变量char (5)位变量(bit)
2.1.3 数据存储类型 • 1.存储区介绍 • (1)DATA区 • (2)BDATA • (3)IDATA区 • (4)PDATA和XDATA区 • (5)程序存储区CODE
2.存储模式 • (1)SMALL模式 • (2)COMPACT模式 • (3)LARGE模式
2.2 C51对单片机主要资源的控制 • C51对单片机应用系统主要资源的控制主要包括特殊功能寄存器的定义、片内RAM的使用、片外RAM及I/O口的使用、位变量的定义。 • 片内RAM的使用、片外RAM及I/O的使用又称为绝对地址的访问。
2.2.1 特殊功能寄存器的C51定义 • 1.使用关键字定义sfr 语法如下: sfr 特殊功能寄存器名字 = 特殊功能寄存器地址; • 如: sfr SCON=0x98; sfr TMOD=0X89;
2.通过头文件访问SFR • C51编译器把MCS-51单片机的常用的特殊功能寄存器和特殊位进行了定义,放在一个“reg51.h”或“reg52.h”的头文件中。当用户要使用时,只需要在使用之前用一条预处理命令“#include <reg51.h>”把这个头文件包含到程序中,然后就可以使用特殊功能寄存器名和特殊位名称了。用户可以通过文本编辑器对头文件进行增减。
3.SFR中位定义 • 第一种方法: sbit 位名=特殊功能寄存器名^位置; • 第二种方法: sbit 位名=字节地址^位置; • 第三种方法: sbit 位名=位地址;
2.2.2 绝对地址的访问 • 1.绝对宏 C51编译器提供了一组宏定义来对51系列单片机的code、data、pdata和xdata空间进行绝对寻址。在程序中,用“#include<absacc.h>”即可使用其中声明的宏来访问绝对地址,包括CBYTE、XBYTE、PWORD、DBYTE、CWORD、XWORD、PBYTE、DWORD.
2._at_关键字 • 一般格式如下: [存储器类型] 数据类型说明符 变量名 _at_地址常数;
2.2.3 位变量的C51定义 • 1.位变量的C51定义 采用关键字“bit”进行定义。 • 2.函数可包含类型为bit的参数,也可以将其作为返回值 • 3.对位变量定义的限制 • 4.可位寻址对象
2.3 C51 的基本运算与流程控制语句 主要包括: • 基本运算 • 选择(分支)控制语句 • 循环结构流程控制语句 • break语句、continue语句和goto语句
2.3.1 基本运算 • 1.C51的算术运算 • C51 最基本的算术运算符有以下五种: • + (加法运算符) • - (减法运算符) • × (乘法运算符) • / (除法运算符) • % (模运算或取余运算符)
2.C51的关系运算 关系运算又称为比较运算,C51 提供了以下六种关系运算符: < (小于) <= (小于等于) > (大于) >= (大于等于) == (等于) != (不等于)
3.C51的逻辑运算 逻辑运算是对变量进行逻辑与运算、或运算、及非运算。C51 提供三种逻辑运算符。如下: && (逻辑与) || (逻辑或) ! (逻辑非)
5.C51的位运算 • C51提供以下六种位运算: • & 按位与; • | 按位或; • ^ 按位异或; • ~ 按位取反; • << 位左移; • >> 位右移;
2.3.2 选择(分支)控制语句 • if语句是C51语言的一个基本条件选择语句,它是用来判定所给定的条件是否满足,根据判定结果决定执行给出的两种操作之一。 • 形式一: if(表达式){语句} • 形式二: if(表达式){语句1;} else {语句2;}
形式三: if(表达式1){语句1;} else if(表达式2){语句2;} else if(表达式3){语句3;} ... else if(表达式m){语句m;} else {语句n;}
2.switch 语句 • switch/case语句的一般形式如下: switch(表达式) { case 常量表达式1:{语句1;} break; case 常量表达式2:{语句2;} break; ... case 常量表达式n:{语句n;} break; default :{语句n+1;} }
2.3.3 循环结构流程控制语句 • 1.基于if 和goto 构成的循环 • 2.基于while语句构成的循环 • 3.基于do-while 语句构成的循 • 4.基于 for 语句构成的循环 • 5.“死”循环的实现
2.3.4 break、continue和goto语句 • 1.break语句 • 2.continue语句 • 3.goto语句
2.4 C51的构造数据类型 • C51 的构造数据类型主要有数组、指针和结构等。在单片机系统中,数组的应用比较广泛,指针则次之,结构用的相对较少,这和单片机系统的要求以及用户的程序设计习惯有一定的关系。这里我们只讨论数组和指针。
2.4.1 数组 • 数组是同类型数据的一个有序集合。数组用一个名字来标识,称为数组名。 • 1.一维数组 类型说明符 数组名[元素个数]; • 2.二维数组或多维数组 类型说明符 数组名[行数] [列数]; • 3.字符数组
5.数组与存储空间 • 数组占用的内存空间(即字节数)的计算式为: 字节数=第1维长度×第2维长度×...×第n维长度×该数组数据类型占用的字节数。
2.4.2 指针 • C51支持“基于存储器”的指针和“一般”指针两种指针类型。 • 1.基于存储器的指针 在定义一个指针时,若给出了它所指对象的存储类型,则该指针是基于存储器的指针。 • 2.一般指针 在函数的调用中,函数的指针参数需要用一般指针。一般指针的说明形式如下: 数据类型 *指针变量;
2.5 C51 函数 • 函数是一个自我包含的完成一定相关功能的执行代码段。
2.5.1 函数的基本问题 • 1.函数的分类 • 从C51语言程序的结构上划分,C51语言函数分为主函数main( )和普通函数两种。而对于普通函数,从不同的角度或以不同的形式又可以分为标准库函数和用户自定义函数。
2.函数的定义 • 不同的函数形式,具有不同的定义方式。 • (1)无参函数的定义方法 • 无参函数的定义形式为: • 返回值类型标识符 函数名( ) • { • 函数体; • } • 无参函数一般不带返回值,因此函数返回值类型标识符可以省略
2.5.2 中断函数 • 中断函数的定义格式为: 函数类型 函数名 interrupt n using n 其中: • interrupt和using为关键字; • interrupt后面的n 为中断源的编号,即中断号; • using后面的n所选择的寄存器组,取值范围为0~3。
2.6 C51程序设计的其他问题 • 养成好的编程习惯 • 宏定义、文件包含与条件编译 • 使用移位运算代替乘除和求模运算 • C51的库函数 • 汇编语言和C语言混合编程 • C51程序设计中容易出错的地方
本章小结 • 本章介绍C51 的基本内容和程序设计方法,充分重视C51 与标准C的区别和联系,是学习好C51 的关键,因此读者在学习本章之前,应有一定的C 语言知识。 • C51 和ANSI-C是非常相似的,其不同之处主要体现在三个方面:其一是基于MCS-51 本身的特点,引入适应该单片机的数据类型和数据存储类型,如bits、bit、data、bdata、idata、pdata、xdata、code等。其二是C51 中断函数的定义中使用了关键字interrupt、using、中断号、寄存器组号等。其三是C51 中提供的函数少于ANSI C,C51 只提供了字符函数、一般I/O 函数、串函数、数学函数、绝对地址访问等。