第 2 章 C51 程序设计基础

33
第2第 C51 第第第第第第 在在在 C 在在在在在在在在 C51 在在在在在在在在在在在 C 在在在 C51 在在在 . 在在在在在在 C51 在在在在在在在在在在在在在在在在在在在在在 在在在在在在在 在在在在在在在在在 、、 在在在 在在在在在在 .

description

第 2 章 C51 程序设计基础. 在标准 C 语言的基础上学习 C51 程序设计,应重点掌握标准 C 语言和 C51 的区别 . 本章主要介绍 C51 的数据类型和存储类型、基本运算与流程控制语句、构造数据类型、函数以及程序设计中的其他一些问题等内容. 2 . 1 C51 数据类型及存储类型. 2 . 1 . 1 数据类型 - PowerPoint PPT Presentation

Transcript of 第 2 章 C51 程序设计基础

Page 1: 第 2 章   C51 程序设计基础

第 2 章 C51 程序设计基础 在标准 C 语言的基础上学习 C51 程序设计,应重点掌握标准 C 语言和 C51 的区

别 . 本章主要介绍 C51 的数据类型和存储类型、基本运算与流程控制语句、构造数据类型、函数以及程序设计中的其他一些问题等内容 .

Page 2: 第 2 章   C51 程序设计基础

2 . 1 C51 数据类型及存储类型• 2 . 1 . 1 数据类型 C51 编译器支持的数据类型有:位型( bi

t )、无符号字符型( unsigned char )、有符号 字 符 型 ( signed char ) 、 无 符 号 整 型( unsigned int )、有符号整型( signed int )、无符号长整型( unsigned long )、有符号长整型( signed long )、浮点型( float )和指针型等。

Page 3: 第 2 章   C51 程序设计基础

2 . 1 . 2 常量与变量• 1 .常量 C51 语言中的常量是不接受程序修改的固定值,常量可为任意数据类型。 ( 1 )整型常量 ( 2 )实型常量 ( 3 )字符常量 ( 4 )字符串常量 ( 5 )符号常量

Page 4: 第 2 章   C51 程序设计基础

2 .变量• 其值可以改变的量称为变量。 • 所有的 C51 变量必须在使用前定义。定义变量的一般形式为: 数据类型 变量名; ( 1 )整型变量( int ) ( 2 )长整型变量( long int ) ( 3 )实型变量 ( 4 )字符变量 char ( 5 )位变量( bit )

Page 5: 第 2 章   C51 程序设计基础

2 . 1 . 3 数据存储类型• 1 .存储区介绍• ( 1 ) DATA 区• ( 2 ) BDATA• ( 3 ) IDATA 区• ( 4 ) PDATA 和 XDATA 区• ( 5 )程序存储区 CODE

Page 6: 第 2 章   C51 程序设计基础

2 .存储模式• ( 1 ) SMALL 模式• ( 2 ) COMPACT 模式• ( 3 ) LARGE 模式

Page 7: 第 2 章   C51 程序设计基础

2.2 C51 对单片机主要资源的控制• C51 对单片机应用系统主要资源的控制主要包括特殊功能寄存器的定义、片

内 RAM 的使用、片外 RAM 及 I/O 口的使用、位变量的定义。• 片内 RAM 的使用、片外 RAM 及 I/O的使用又称为绝对地址的访问。

Page 8: 第 2 章   C51 程序设计基础

2.2.1 特殊功能寄存器的 C51 定义• 1 .使用关键字定义 sfr 语法如下: sfr 特殊功能寄存器名字 = 特殊功能寄存器地址;• 如: sfr SCON=0x98 ; sfr TMOD=0X89 ;

Page 9: 第 2 章   C51 程序设计基础

2 .通过头文件访问 SFR

• C51 编译器把 MCS-51 单片机的常用的特殊功能寄存器和特殊位进行了定义,放在一个“ reg51.h” 或“ reg52.h” 的头文件中。当用户要使用时,只需要在使用之前用一条预处理命令“ #include <reg51.h>” 把这个头文件包含到程序中,然后就可以使用特殊功能寄存器名和特殊位名称了。用户可以通过文本编辑器对头文件进行增减。

Page 10: 第 2 章   C51 程序设计基础

3 . SFR 中位定义 • 第一种方法: sbit 位名 = 特殊功能寄存器名 ^ 位置;• 第二种方法: sbit 位名 = 字节地址 ^ 位置;• 第三种方法: sbit 位名 = 位地址;

Page 11: 第 2 章   C51 程序设计基础

2 . 2 . 2 绝对地址的访问• 1 .绝对宏 C51 编译器提供了一组宏定义来对 51 系列单片机的 code 、 data 、 pdata 和 xdata 空间进行绝对寻址。在程序中,用“ #include<absacc.h>” 即可使用其中声明的宏来访问绝对地址,包括 CBYTE 、 XBYTE 、

PWORD 、 DBYTE 、 CWORD 、 XWORD 、PBYTE 、 DWORD.

Page 12: 第 2 章   C51 程序设计基础

2 . _at_ 关键字• 一般格式如下:[ 存储器类型 ] 数据类型说明符 变量名 _at_ 地址常数;

Page 13: 第 2 章   C51 程序设计基础

2 . 2 . 3 位变量的 C51 定义• 1 .位变量的 C51 定义 采用关键字“ bit” 进行定义。 • 2 .函数可包含类型为 bit 的参数,也可以将其作为返回值• 3 .对位变量定义的限制• 4 .可位寻址对象

Page 14: 第 2 章   C51 程序设计基础

2.3 C51 的基本运算与流程控制语句主要包括:• 基本运算 • 选择(分支)控制语句 • 循环结构流程控制语句• break 语句、 continue 语句和 goto 语句

Page 15: 第 2 章   C51 程序设计基础

2 . 3 . 1 基本运算• 1 . C51 的算术运算 • C51 最基本的算术运算符有以下五种:• + (加法运算符)• - (减法运算符)• × (乘法运算符)• / (除法运算符)• % (模运算或取余运算符)

Page 16: 第 2 章   C51 程序设计基础

2 . C51 的关系运算 关系运算又称为比较运算, C51 提供了以下六种关系运算符:< (小于)<= (小于等于)> (大于)>= (大于等于)== (等于)!= (不等于)

Page 17: 第 2 章   C51 程序设计基础

3 . C51 的逻辑运算

逻辑运算是对变量进行逻辑与运算、或运算、及非运算。 C51 提供三种逻辑运算符。如下:&& (逻辑与)|| (逻辑或)! (逻辑非)

Page 18: 第 2 章   C51 程序设计基础

5 . C51 的位运算• C51 提供以下六种位运算:• & 按位与;• | 按位或;• ^ 按位异或;• ~ 按位取反;• << 位左移;• >> 位右移;

Page 19: 第 2 章   C51 程序设计基础

2 . 3 . 2 选择(分支)控制语句• if 语句是 C51 语言的一个基本条件选择语句,它是用来判定所给定的条件是否满足,根据判定结果决定执行给出的两种操作之一。• 形式一: if (表达式) { 语句 }• 形式二: if (表达式) { 语句 1 ; } else { 语句

2 ; }

Page 20: 第 2 章   C51 程序设计基础

• 形式三: if (表达式 1 ) { 语句 1 ; } else if (表达式 2 ) { 语句 2 ; } else if (表达式 3 ) { 语句 3 ; } ... else if (表达式 m ) { 语句 m ; } else { 语句 n ; }

Page 21: 第 2 章   C51 程序设计基础

2 . switch 语句 • switch/case 语句的一般形式如下: switch (表达式) {

case 常量表达式 1 : { 语句 1 ; } break ;case 常量表达式 2 : { 语句 2 ; } break ;...case 常量表达式 n : { 语句 n ; } break ;default : { 语句 n+1 ; }

}

Page 22: 第 2 章   C51 程序设计基础

2.3.3 循环结构流程控制语句• 1 .基于 if 和 goto 构成的循环 • 2 .基于 while 语句构成的循环 • 3 .基于 do-while 语句构成的循• 4 .基于 for 语句构成的循环 • 5 .“死”循环的实现

Page 23: 第 2 章   C51 程序设计基础

2.3.4 break 、 continue 和 goto 语句• 1 . break 语句• 2 . continue 语句• 3 . goto 语句

Page 24: 第 2 章   C51 程序设计基础

2 . 4 C51 的构造数据类型 • C51 的构造数据类型主要有数组、指针和结构等。在单片机系统中,数组的应用比较广泛,指针则次之,结构用的相对较少,这和单片机系统的要求以及用户的程序设计习惯有一定的关系。这里我们只讨论数组和指针。

Page 25: 第 2 章   C51 程序设计基础

2 . 4 . 1 数组• 数组是同类型数据的一个有序集合。数组用一个名字来标识,称为数组名。 • 1 .一维数组 类型说明符 数组名 [ 元素个数 ] ; • 2 .二维数组或多维数组 类型说明符 数组名 [ 行数 ] [ 列数 ] ; • 3 .字符数组

Page 26: 第 2 章   C51 程序设计基础

5 .数组与存储空间• 数组占用的内存空间(即字节数)的计算式为: 字节数 = 第 1维长度 × 第 2维长度 ×...×

第 n维长度 ×该数组数据类型占用的字节数。

Page 27: 第 2 章   C51 程序设计基础

2 . 4 . 2 指针• C51 支持“基于存储器”的指针和“一般”指针两种指针类型。 • 1 .基于存储器的指针 在定义一个指针时,若给出了它所指对象的存储类型,则该指针是基于存储器的指针。 • 2 .一般指针 在函数的调用中,函数的指针参数需要用一般指针。一般指针的说明形式如下: 数据类型 * 指针变量;

Page 28: 第 2 章   C51 程序设计基础

2 . 5 C51 函数• 函数是一个自我包含的完成一定相关功能的执行代码段。

Page 29: 第 2 章   C51 程序设计基础

2 . 5 . 1 函数的基本问题• 1 .函数的分类 • 从 C51 语言程序的结构上划分, C51 语言函数分为主函数 main( ) 和普通函数两种。而对于普通函数,从不同的角度或以不同的形式又可以分为标准库函数和用户自定义函数。

Page 30: 第 2 章   C51 程序设计基础

• 2 .函数的定义• 不同的函数形式,具有不同的定义方式。• ( 1 )无参函数的定义方法• 无参函数的定义形式为:• 返回值类型标识符 函数名( )• {• 函数体;• }• 无参函数一般不带返回值,因此函数返回值类型标识符可以省略

Page 31: 第 2 章   C51 程序设计基础

2 . 5 . 2 中断函数• 中断函数的定义格式为: 函数类型 函数名 interrupt n using n其中:• interrupt 和 using 为关键字;• interrupt 后面的 n 为中断源的编号,即中断号;• using 后面的 n 所选择的寄存器组,取值范围为 0 ~ 3 。

Page 32: 第 2 章   C51 程序设计基础

2 . 6 C51 程序设计的其他问题• 养成好的编程习惯• 宏定义、文件包含与条件编译• 使用移位运算代替乘除和求模运算• C51 的库函数• 汇编语言和 C 语言混合编程• C51 程序设计中容易出错的地方

Page 33: 第 2 章   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 函数、串函数、数学函数、绝对地址访问等。