1、3 单片机的单片机的C语言程序设计语言程序设计北京航空航天大学出版社北京航空航天大学出版社3 单片机的单片机的C语言程序设计语言程序设计2教学目的教学目的q熟悉熟悉C51的程序结构的程序结构q掌握掌握C51的数据类型、存储类型及函数等概念的数据类型、存储类型及函数等概念q了解了解C51与标准与标准C的不同之处的不同之处q熟悉熟悉C51的开发工具的开发工具Keil C51北京航空航天大学出版社北京航空航天大学出版社3 单片机的单片机的C语言程序设计语言程序设计3本章内容本章内容qC51的程序结构的程序结构q数据类型、存储类型及存储模式数据类型、存储类型及存储模式q运算符、函数及程序流程控制运算符
2、、函数及程序流程控制qC51的构造数据类型的构造数据类型qC51实例分析及混合编程实例分析及混合编程qKeil C51简介简介.1 51的程序结构的程序结构 q与汇编语言相比,与汇编语言相比,C51在功能、结构性、可读性、在功能、结构性、可读性、可维护性及可移植性上有明显的优势可维护性及可移植性上有明显的优势 。qC51程序结构与一般程序结构与一般C语言没有差别。语言没有差别。北京航空航天大学出版社北京航空航天大学出版社3 单片机的单片机的C语言程序设计语言程序设计5qC51的特点:的特点:q1C51在吸取了汇编语言精华的基础上又有所改进 q2C51继承和发扬了高级语言的长处 q3C51的可移
3、植性好 q4生成的代码质量高,在代码效率方面可以和汇编语言相媲美 51的程序结构的程序结构3.15151的程序结构的程序结构 北京航空航天大学出版社北京航空航天大学出版社3 单片机的单片机的C语言程序设计语言程序设计6qC51程序的结构程序的结构q一个C51程序大体上是一个函数定义的集合,在这个集合中仅有一个名为main的函数(主函数)。 q函数定义由类型、函数名、参数表和函数体四部分组成。q函数的一般格式如下: 类型 函数名(参数表) 参数说明; 数据说明部分; 执行语句部分; 51的程序结构的程序结构3.15151的程序结构的程序结构 北京航空航天大学出版社北京航空航天大学出版社3 单片机
4、的单片机的C语言程序设计语言程序设计7q编写编写C51 程序时应注意以下几点:程序时应注意以下几点:q1.一个C51程序总是从main函数开始执行的,而不论main函数在整个程序中的位置如何。q2C语言程序的书写格式十分自由。一条语句可以写成一行,也可以写成几行,还可以在一行内写多条语句。但每条语句都必须以分号“;”作为结束符。q3C语言对大小字母敏感,C语言编译器编译程序时对同一个字母的大小写作为不同的变量来处理。q4可以用/*/对C程序中的任何部分作注释。程序加上必要的注释,可增加程序的可读性。51的程序结构的程序结构3.15151的程序结构的程序结构 .2 数据类型、存储类型及存储模式数
5、据类型、存储类型及存储模式 q数据类型数据类型q常量和变量常量和变量qC51的存储类型及存储模式的存储类型及存储模式q特殊功能寄存器、并行接口及位变量的定义特殊功能寄存器、并行接口及位变量的定义北京航空航天大学出版社北京航空航天大学出版社3 单片机的单片机的C语言程序设计语言程序设计9q数据类型数据类型 可分为基本数据类型和构造数据类型。构造数据类型由基本数据类型构造而成。qC51的数据类型分类如下所示: 数据类型、存储类型及存储模式数据类型、存储类型及存储模式3.2 数据类型、存储类型及存储模式数据类型、存储类型及存储模式 charintlongfloatdoublearraystructu
6、nionenum字符型()整型()基本类型长整型()浮点型()双精度浮点型()数据类型数组类型()结构体类型()构造类型共用体()枚举()指针类型空类型北京航空航天大学出版社北京航空航天大学出版社3 单片机的单片机的C语言程序设计语言程序设计10北京航空航天大学出版社北京航空航天大学出版社3 单片机的单片机的C语言程序设计语言程序设计11q常量和变量常量和变量 C语言中的数据有常量、变量之分。 常量在程序运行的过程中,其值不能改变的量称为常量。C语言支持4种常量:整数常量、浮点数常量、枚举量常量、字符常量。 变量在程序执行过程中,其值能不断变化的量。使用一个变量之前必须进行定义,用一个标识符作
7、为变量名并指出它的数据类型和存储类型,以便编译系统为它分配相应的存储单元。 数据类型、存储类型及存储模式数据类型、存储类型及存储模式3.2 数据类型、存储类型及存储模式数据类型、存储类型及存储模式 北京航空航天大学出版社北京航空航天大学出版社3 单片机的单片机的C语言程序设计语言程序设计12qC51的存储类型及存储模式的存储类型及存储模式 51系列单片机的存储器采用哈佛结构。即其程序存储器和数据存储器分开,并有各自的寻址机构和寻址方式。以AT89C52为例,其具体结构如下图所示。数据类型、存储类型及存储模式数据类型、存储类型及存储模式3.2 数据类型、存储类型及存储模式数据类型、存储类型及存储
8、模式 北京航空航天大学出版社北京航空航天大学出版社3 单片机的单片机的C语言程序设计语言程序设计13qC51的存储类型及存储模式的存储类型及存储模式AT89C52单片机在物理上有四个存储空间:q1片内程序存储器空间q2片外程序存储器空间q3片内数据存储器空间q4片外数据存储器空间 片内数据存贮区是存放临时性传递变量或使用频率较高的变量片内数据存贮区是存放临时性传递变量或使用频率较高的变量的。访问片内数据存贮器速度较快,经常使用的变量置于片内数的。访问片内数据存贮器速度较快,经常使用的变量置于片内数据存贮器,而将不常用的置于片外数据存贮器中。寻址方式可使据存贮器,而将不常用的置于片外数据存贮器中
9、。寻址方式可使用直接和间接寻址用直接和间接寻址数据类型、存储类型及存储模式数据类型、存储类型及存储模式3.2 数据类型、存储类型及存储模式数据类型、存储类型及存储模式 北京航空航天大学出版社北京航空航天大学出版社3 单片机的单片机的C语言程序设计语言程序设计14 C51 C51在定义变量、常量时,将通过不同的存储类型(在定义变量、常量时,将通过不同的存储类型(datadata、bdatabdata、idataidata、pdatapdata、xdataxdata、codecode)将它们定位在不同的存储区中。存储类)将它们定位在不同的存储区中。存储类型与型与AT89C52AT89C52单片机实
10、际存储空间的对应关系如下所示单片机实际存储空间的对应关系如下所示。qdata 直接寻址内部数据存储区,访问速度快(直接寻址内部数据存储区,访问速度快(128B),),007FHqbdata 可位寻址内部数据存储区,允许位与字节混合访问(可位寻址内部数据存储区,允许位与字节混合访问(16B)qidata 间接寻址内部数据存储区,可访问片内全部间接寻址内部数据存储区,可访问片内全部RAM地址空间地址空间(256B),),00FFHqpdata 分页寻址外部数据存储区(分页寻址外部数据存储区(256B),由),由MOVX Ri访问(高位访问(高位P2)qxdata 外部数据存储区(外部数据存储区(6
11、4KB),由),由MOVX DPTR访问访问qcode 代码存储区(代码存储区(64KB)程序由)程序由MOVC A+DPTR访问访问C51的存储类型的存储类型3.2 数据类型、存储类型及存储模式数据类型、存储类型及存储模式 北京航空航天大学出版社北京航空航天大学出版社3 单片机的单片机的C语言程序设计语言程序设计15q当使用当使用code存贮类型定义数据时,存贮类型定义数据时,C51编译器会将其定编译器会将其定义在代码空间或义在代码空间或FLASHq访问片内数据存贮器访问片内数据存贮器data、bdata、idata比访问片外数比访问片外数存相对要快一些,因此,可将经常使用的变量置于片内存相
12、对要快一些,因此,可将经常使用的变量置于片内数存数存北京航空航天大学出版社北京航空航天大学出版社3 单片机的单片机的C语言程序设计语言程序设计16例:例:code uchar table =1,2,3,”help”,oxff;idata uint temp;data char var; /char data var;等价尽量用后一种等价尽量用后一种static unsigned long xdata array100 ; 静态变量静态变量extern float idata x,y,z;模块化编程模块化编程uint pdata dimension;uchar xdata vector 1044
13、;char bdata flags;北京航空航天大学出版社北京航空航天大学出版社3 单片机的单片机的C语言程序设计语言程序设计17q如果省略掉数据类型存储模式,将自动决定变量的默认如果省略掉数据类型存储模式,将自动决定变量的默认存储类型作为编译的选项。由编译器选用的存储模式决存储类型作为编译的选项。由编译器选用的存储模式决定。定。q存储模式决定了变量的默认存储类型,参数传递区和无存储模式决定了变量的默认存储类型,参数传递区和无明确存储类型说明变量的存储类型。明确存储类型说明变量的存储类型。北京航空航天大学出版社北京航空航天大学出版社3 单片机的单片机的C语言程序设计语言程序设计18存储模式说明
14、存储模式说明qSMALL :可直接寻址的内部数据存储区:可直接寻址的内部数据存储区qCOMPACT: 分页外部数据存储区分页外部数据存储区qLARGE :外部数据存储区参数和局部变量放入:外部数据存储区参数和局部变量放入qCx51允许在变量类型定义前,指定存储类型允许在变量类型定义前,指定存储类型 data char x 与与char data x 等价,但应尽量使用后一等价,但应尽量使用后一种种北京航空航天大学出版社北京航空航天大学出版社3 单片机的单片机的C语言程序设计语言程序设计19q特殊功能寄存器的定义特殊功能寄存器的定义 AT89C52单片机中除了程序计数器PC和4组通用寄存器组(R
15、0-R7)之外,其他所有寄存器均称为特殊功能寄存器(SFR),它们分散在片内RAM区的高128B中,它们只能采用直接寻址方式访问。 为了能直接访问这些SFR,C51扩充了类型说明符sfr、sfr16、sbit。利用它们可在C语言源程序中直接对AT89C52单片机的特殊功能寄存器进行定义。数据类型、存储类型及存储模式数据类型、存储类型及存储模式3.2 数据类型、存储类型及存储模式数据类型、存储类型及存储模式 北京航空航天大学出版社北京航空航天大学出版社3 单片机的单片机的C语言程序设计语言程序设计20北京航空航天大学出版社北京航空航天大学出版社3 单片机的单片机的C语言程序设计语言程序设计21q
16、定义方法如下:定义方法如下:sfrsfr 特殊功能寄存器名特殊功能寄存器名= =地址常数地址常数sfr16sfr16特殊功能寄存器名特殊功能寄存器名= =地址常数地址常数注:注:1、可以与变量名一样,用、可以与变量名一样,用SFR名去存取名去存取SFR。 2、定义时标示符必须使用、定义时标示符必须使用SFR名,且必须把原来分名,且必须把原来分配好的绝对地址赋给预定义标示符配好的绝对地址赋给预定义标示符例:例:sfr Acc=0 xE0; sfr P0=0 x80;北京航空航天大学出版社北京航空航天大学出版社3 单片机的单片机的C语言程序设计语言程序设计22 由于由于51系列中不同的单片机的寄存
17、器数量与类型系列中不同的单片机的寄存器数量与类型不同,所以可采用头文件。不同,所以可采用头文件。 头文件头文件reg52.h中有所有中有所有89C52的的SFR及可位寻址的及可位寻址的位的定义,只要位的定义,只要 # include 北京航空航天大学出版社北京航空航天大学出版社3 单片机的单片机的C语言程序设计语言程序设计23程序的开头可以都加上以下三行程序的开头可以都加上以下三行#include#define uchar unsigned char#define uint unsigned intq头文件头文件reg52.h中有所有中有所有89C52的的SFR 及可位寻址位的定义及可位寻址位
18、的定义北京航空航天大学出版社北京航空航天大学出版社3 单片机的单片机的C语言程序设计语言程序设计24qSFR一般按一般按8位存取,在新的位存取,在新的8051系列产品中有按系列产品中有按16位存取的(如,位存取的(如,8052有有T2),它们需用),它们需用sfr16类类型来说明型来说明(*)q sfr16 T2=0 xCC北京航空航天大学出版社北京航空航天大学出版社3 单片机的单片机的C语言程序设计语言程序设计25定义定义SFR的位的位Sbit可以访问位寻址对象可以访问位寻址对象1、sbit SFR的位标示符的位标示符=可按位寻址可按位寻址 的的SFR 名名常量常量 sfr PSW=0 xD
19、0; sbit OV=PSW2; sbit Cy=PSW7;北京航空航天大学出版社北京航空航天大学出版社3 单片机的单片机的C语言程序设计语言程序设计262、 sbit SFR的位标示符的位标示符=可按位寻址可按位寻址 的的SFR 的绝对地址的绝对地址常量常量其中,绝对地址位于其中,绝对地址位于80HFFH之间,且该地址能被之间,且该地址能被8整除整除 sbit OV=0 xD02; sbit Cy=0 xD07;北京航空航天大学出版社北京航空航天大学出版社3 单片机的单片机的C语言程序设计语言程序设计273、 sbit SFR的位标示符的位标示符=可按位寻址可按位寻址 的的SFR 的绝对位地
20、址的绝对位地址 该绝对位地址位于该绝对位地址位于80HFFH之间之间 sbit OV=0 xD2; sbit Cy=0 xD7; 特殊功能位代表了一个独立的定义类,不能与其特殊功能位代表了一个独立的定义类,不能与其他位定义和位域互换他位定义和位域互换北京航空航天大学出版社北京航空航天大学出版社3 单片机的单片机的C语言程序设计语言程序设计28q并行接口的定义并行接口的定义 AT89C52AT89C52单片机内部有单片机内部有4 4个个8 8位并行口,即位并行口,即SFRSFR中的中的P0-P3P0-P3。这些内部。这些内部并行口既可进行字节寻址,也可进行位寻址。并行口既可进行字节寻址,也可进行
21、位寻址。 除了内部除了内部4 4个并行口之外,个并行口之外,AT89C52AT89C52单片机还可以在片外扩展硬件单片机还可以在片外扩展硬件I/OI/O口,这些口,这些I/OI/O口大多只能进行字节寻址。口大多只能进行字节寻址。 AT89C52AT89C52单片机没有专用的单片机没有专用的I/OI/O指令,它的口地址是和数据存储器统指令,它的口地址是和数据存储器统一编址的。即把一个口看作是数据存储器的一个单元。程序采用访问数一编址的。即把一个口看作是数据存储器的一个单元。程序采用访问数据存储器的指令来访问据存储器的指令来访问I/OI/O口。口。数据类型、存储类型及存储模式数据类型、存储类型及存
22、储模式3.2 数据类型、存储类型及存储模式数据类型、存储类型及存储模式 北京航空航天大学出版社北京航空航天大学出版社3 单片机的单片机的C语言程序设计语言程序设计2951系列并行接口及其系列并行接口及其Cx51定义定义 编程时,片内编程时,片内I/O口与片外扩展口与片外扩展I/O口可统一在口可统一在头文件中定义,也可在程序的开始位置定义,方头文件中定义,也可在程序的开始位置定义,方法如下:法如下:1、片内、片内I/O口(用口(用sfr定义)定义) sfr P0=0 x80 sfr P1=0 x90北京航空航天大学出版社北京航空航天大学出版社3 单片机的单片机的C语言程序设计语言程序设计302、
23、片外扩展、片外扩展I/O口,根据其硬件译码地址,将其视口,根据其硬件译码地址,将其视为片外数据存储器的一个单元,用为片外数据存储器的一个单元,用define定义。定义。#include#define PORTA XBYTE0 xffc0 i=PORTA; PORTA=i;北京航空航天大学出版社北京航空航天大学出版社3 单片机的单片机的C语言程序设计语言程序设计31q定义口地址的目的,便于定义口地址的目的,便于Cx51编译器按编译器按51单片机单片机实际硬件结构建立实际硬件结构建立I/O口变量名与其实际地址的联口变量名与其实际地址的联系,以便使用软件模拟系,以便使用软件模拟51单片机的硬件操作单
24、片机的硬件操作北京航空航天大学出版社北京航空航天大学出版社3 单片机的单片机的C语言程序设计语言程序设计32位变量(位变量(bit)及其)及其Cx51定义定义bit类似于类似于unsigned int等,用来说明变量类型等,用来说明变量类型一、定义位变量一、定义位变量1、bit check_bit ; /*将变量将变量check_bit定义为定义为 位变量位变量*/ 北京航空航天大学出版社北京航空航天大学出版社3 单片机的单片机的C语言程序设计语言程序设计33q位变量总位于位变量总位于8051内部内部RAM中(中(*)bdata bit display_flag ; /*正确正确*/data
25、bit display_flag ; /*正确正确*/idata bit display_flag ; /*正确正确*/ bit display_flag ; /*存储模式为存储模式为small,正确,正确*/pdata bit display_flag ; /*错错*/static bit display_flag ; /*正确正确*/extern bit display_flag ; /*正确正确*/ bit *bptr ; /*错错*/ bit b_array3; /*错错*/注:位变量不能定义成一个指针和数组注:位变量不能定义成一个指针和数组北京航空航天大学出版社北京航空航天大学出版社
26、3 单片机的单片机的C语言程序设计语言程序设计342、函数可包含类型为、函数可包含类型为bit的参数,也可将其作为返回的参数,也可将其作为返回值值 bit func(bit b0, bit b1).return(b1)北京航空航天大学出版社北京航空航天大学出版社3 单片机的单片机的C语言程序设计语言程序设计353、可位寻址对象、可位寻址对象 指可以指可以字节或位字节或位寻址的对象。该对象应位于寻址的对象。该对象应位于89C52片内可位寻址片内可位寻址RAM中。允许数据类型为中。允许数据类型为idata的对的对象放入象放入89C52片内可位寻址片内可位寻址RAM区中。定义可分区中。定义可分为两步
27、:为两步:1)先定义变量的数据类型和存储类型)先定义变量的数据类型和存储类型(*) bdata int ibase ; bdata char bary4;北京航空航天大学出版社北京航空航天大学出版社3 单片机的单片机的C语言程序设计语言程序设计362) 然后可使用然后可使用sbit定义可独立寻址访问的对象位定义可独立寻址访问的对象位sbit mybit0=ibase0;sbit mybit15=ibase15;sbit Ary07=bary07;sbit Ary37=bary37; 对象对象ibase和和bary也可以字节寻址也可以字节寻址 Ary37=0;/*位寻址位寻址*/ bary3=a
28、;/*字节寻址字节寻址*/注:注:1、Sbit定义要求基址对象的存储类型为定义要求基址对象的存储类型为bdata,否则,否则 只有绝对的特殊位(只有绝对的特殊位(SFR中的位定义)定义是合中的位定义)定义是合 法的。法的。 2、位置(、位置(操作符)后的最大值依赖于指定的基操作符)后的最大值依赖于指定的基类类 型型北京航空航天大学出版社北京航空航天大学出版社3 单片机的单片机的C语言程序设计语言程序设计37例:判浮点数的符号为是否为正例:判浮点数的符号为是否为正union float long 高地址高地址 float bdata f ; long bdata l ;fl ; 低地址低地址sb
29、it float_sign=fl.f31 ; if (! float_sign) /*符号位为正符号位为正*/ . else .S EE M M M703.3 运算符、函数及程序流程控制运算符、函数及程序流程控制 qC51的运算符的运算符qC51的函数的函数qC51的流程控制语句的流程控制语句北京航空航天大学出版社北京航空航天大学出版社3 单片机的单片机的C语言程序设计语言程序设计39qC51的运算符的运算符q1.C51的赋值运算符和算术运算符(+、-、*、/、%)q2.C51的关系运算符(、=、=、=、!=)q3.C51逻辑运算符(|、&、!)q4.C51位操作运算符(、|、&、 )q5.自
30、增减运算q6.复合运算符(10种)运算符、函数及程序流程控制运算符、函数及程序流程控制3.3运算符、函数及程序流程控制运算符、函数及程序流程控制 北京航空航天大学出版社北京航空航天大学出版社3 单片机的单片机的C语言程序设计语言程序设计40qC51的函数的函数 函数是C语言中的一种基本模块,一个C语言程序就是由若干个模块化的函数所构成的。q 1.函数的分类 从用户使用角度划分,函数分为标准库函数和用户自定义函数。 用户自定义函数是指用户根据任务自己编写的函数。从函数定义的形式上可划分为三种形式:无参数函数、有参数函数和空函数。 运算符、函数及程序流程控制运算符、函数及程序流程控制3.3运算符、
31、函数及程序流程控制运算符、函数及程序流程控制 北京航空航天大学出版社北京航空航天大学出版社3 单片机的单片机的C语言程序设计语言程序设计41qC51的函数的函数q 2.函数的定义 无参数函数的定义返回值类型 函数名() 函数体语句 有参数函数的定义返回值类型 函数名(形式参数列表) 形式参数类型说明 函数体语句 空函数的定义返回值类型 函数名() 运算符、函数及程序流程控制运算符、函数及程序流程控制3.3运算符、函数及程序流程控制运算符、函数及程序流程控制 北京航空航天大学出版社北京航空航天大学出版社3 单片机的单片机的C语言程序设计语言程序设计42qC51的函数的函数q 3.函数的参数和返回
32、值 形式参数和实际参数形参:定义函数时,位于函数名后面圆括号中的变量名称为“形式参数”。实参:调用函数时,主调用函数名后面括号中的表达式称为“实际参数”。 参数的返回值通过函数调用使主调用函数获得一个确定的值,这就是函数的返回值。函数的返回值是通过return语句获得的。运算符、函数及程序流程控制运算符、函数及程序流程控制3.3运算符、函数及程序流程控制运算符、函数及程序流程控制 北京航空航天大学出版社北京航空航天大学出版社3 单片机的单片机的C语言程序设计语言程序设计43qC51的函数的函数q 4.函数的调用 调用的形式为:函数名(实际参数表列); 函数的调用方式有三种:1.函数调用语句:即
33、把被调用函数名作为调用函数的一个语句,如func( ) 2.被调用函数作为表达式的运算对象:如x=2*func(a,b) 3.被调用函数作为另一个函数的实际参数:如x=min(a,func(a,b); 运算符、函数及程序流程控制运算符、函数及程序流程控制3.3运算符、函数及程序流程控制运算符、函数及程序流程控制 北京航空航天大学出版社北京航空航天大学出版社3 单片机的单片机的C语言程序设计语言程序设计44qC51的函数的函数q 5.对被调用函数的说明在调用一个函数之前,应对该函数的类型进行说明,即“先说明,后调用”。被调用函数必须是已经存在的函数(库函数或用户自定义函数)。q6.函数变量的存储
34、方式 函数变量按其有效作用范围可划分为局部变量和全局变量。 变量按其存储方式可分为四种存储种类,分别是自动变量(auto)、外部变量(extern)、静态变量(static)和寄存器变量(register),这些存储种类与变量的关系为:内部变量可定义为自动变量、静态变量或寄存器变量,外部变量可定义为全局变量或静态变量。 运算符、函数及程序流程控制运算符、函数及程序流程控制3.3运算符、函数及程序流程控制运算符、函数及程序流程控制 北京航空航天大学出版社北京航空航天大学出版社3 单片机的单片机的C语言程序设计语言程序设计45qC51的流程控制语句的流程控制语句 C语言有三种基本结构:顺序结构、选
35、择结构与循环结构。其中选择结构又派生出串行多分支结构和并行多分支结构,循环结构又分为“while”型循环结构和“do while”型循环结构。 运算符、函数及程序流程控制运算符、函数及程序流程控制3.3运算符、函数及程序流程控制运算符、函数及程序流程控制 顺序结构流程图顺序结构流程图 选择结构流程图选择结构流程图 北京航空航天大学出版社北京航空航天大学出版社3 单片机的单片机的C语言程序设计语言程序设计46qC51的流程控制语句的流程控制语句 C语言有三种基本结构:顺序结构、选择结构与循环结构。其中选择结构又派生出串行多分支结构和并行多分支结构,循环结构又分为“while”型循环结构和“do
36、while”型循环结构。 运算符、函数及程序流程控制运算符、函数及程序流程控制3.3运算符、函数及程序流程控制运算符、函数及程序流程控制 循环结构流程图循环结构流程图 北京航空航天大学出版社北京航空航天大学出版社3 单片机的单片机的C语言程序设计语言程序设计47qC51的流程控制语句的流程控制语句 q1.1.选择语句选择语句ififC语言提供了语言提供了3种形式的种形式的if语句:语句:(1)if (条件表达式条件表达式) 语句;语句;(2)if (条件表达式条件表达式) 语句语句1; else 语句语句2;(3)if (条件表达式条件表达式1) 语句语句1; else if (条件表达式条件
37、表达式2) 语句语句2; else if (条件表达式条件表达式3) 语句语句3; else if (条件表达式条件表达式m) 语句语句m; else 语句语句n; 运算符、函数及程序流程控制运算符、函数及程序流程控制3.3运算符、函数及程序流程控制运算符、函数及程序流程控制 北京航空航天大学出版社北京航空航天大学出版社3 单片机的单片机的C语言程序设计语言程序设计48qC51的流程控制语句的流程控制语句 q2. 2. switch/case语句语句 该语句形式如下:switch (表达式) case 常量表达式1: 语句1; break; case 常量表达式2: 语句2; break; c
38、ase 常量表达式n: 语句n; break; default : 语句n+1; 运算符、函数及程序流程控制运算符、函数及程序流程控制3.3运算符、函数及程序流程控制运算符、函数及程序流程控制 北京航空航天大学出版社北京航空航天大学出版社3 单片机的单片机的C语言程序设计语言程序设计49qC51的流程控制语句的流程控制语句 q3. 3. 循环语句循环语句 while语句语句一般形式为:一般形式为:while (条件表达式条件表达式) 语句;语句; /*循环体循环体*/ do while 语句语句一般形式如下:一般形式如下:do 语句;语句; /*循环体循环体*/ while (条件表达式条件表
39、达式);运算符、函数及程序流程控制运算符、函数及程序流程控制3.3运算符、函数及程序流程控制运算符、函数及程序流程控制 北京航空航天大学出版社北京航空航天大学出版社3 单片机的单片机的C语言程序设计语言程序设计50qC51的流程控制语句的流程控制语句 q3. 3. 循环语句 for语句一般形式如下:for (初值设定表达式;循环条件表达式;更新表达式) 语句; /*循环体*/运算符、函数及程序流程控制运算符、函数及程序流程控制3.3运算符、函数及程序流程控制运算符、函数及程序流程控制 3.4 C51的构造数据类型的构造数据类型q数组数组q结构结构q联合联合q枚举枚举q指针指针北京航空航天大学出
40、版社北京航空航天大学出版社3 单片机的单片机的C语言程序设计语言程序设计52q数组数组q一维数组 一维数组的定义方式类型说明符 数组名整型表达式 初始化 q二维数组 二维数组的定义方式类型说明符 数组名常量表达式 常量表达式 二维数组的初始化C51的构造数据类型的构造数据类型3.4 C51C51的构造数据类型的构造数据类型北京航空航天大学出版社北京航空航天大学出版社3 单片机的单片机的C语言程序设计语言程序设计53q结构结构q结构的定义 结构是结构是一种数据类型,通常定义结构数据类型后再用它去定义相关变量。定义结构类型的方法如下: struct 结构名 结构成员说明;结构成员说明的格式为:类型
41、标识符 成员名;q用结构类型去定义变量的方法有三种:先定义结构类型再定义类型为该结构的变量 定义结构类型的同时,定义该结构的变量 直接定义结构类型变量 q结构变量的引用引用的方式为:结构变量名.成员名 C51的构造数据类型的构造数据类型3.4 C51C51的构造数据类型的构造数据类型北京航空航天大学出版社北京航空航天大学出版社3 单片机的单片机的C语言程序设计语言程序设计54q联合联合 又称为共用体。它也是C语言中的一种构造数据类型。在一个联合中可以包含多个不同类型的数据元素。其定义格式为:union 联合类型名 类型说明符 变量名; ; 联合与结构的区别在于:联合所包含的各个成员只能分时共享
42、同一存储空间。定义联合类型变量的方法类似于定义结构变量,同样有三种。引用联合成员的一般格式为:联合变量名.联合元素 或:联合变量名-联合元素C51的构造数据类型的构造数据类型3.4 C51C51的构造数据类型的构造数据类型北京航空航天大学出版社北京航空航天大学出版社3 单片机的单片机的C语言程序设计语言程序设计55q枚举枚举 枚举数据类型是一个有名字的某些整数型常量的集合。这些整数型常量是该类型变量可取的所有的合法值。枚举定义应当列出该类型变量的可取值。定义枚举类型变量的一般格式为:enum 枚举名 枚举值表列 变量表列;C51的构造数据类型的构造数据类型3.4 C51C51的构造数据类型的构
43、造数据类型北京航空航天大学出版社北京航空航天大学出版社3 单片机的单片机的C语言程序设计语言程序设计56q指针指针 指针是C语言的一个重要概念,也是特色之一。使用指针可以有效地表示复杂的数据结构,直接处理内存地址,而且可以更有效地使用数组。 q指针的概念 变量的指针就是变量的地址 q指针变量的定义指针变量定义的一般形式如下:类型标示符 *指针变量名q指针变量的引用 应注意的是:“*”在指针变量定义时和在指针运算时所代表的含义是不同的。在进行指针变量定义时,“*”是指针变量类型说明符。而在进行指针运算时,“*”是指针运算符,表示引用指针所指向的变量。 C51的构造数据类型的构造数据类型3.4 C
44、51C51的构造数据类型的构造数据类型北京航空航天大学出版社北京航空航天大学出版社3 单片机的单片机的C语言程序设计语言程序设计57q5.2.1 指针的基本概念指针的基本概念 变量的指针就是变量的地址。变量的指针就是变量的地址。 指向变量的指针变量:若有一个变量专门来存放另指向变量的指针变量:若有一个变量专门来存放另一个变量的地址,则该变量称为指向变量的指针一个变量的地址,则该变量称为指向变量的指针变量。变量。1、指针变量的定义、指针变量的定义 类型标示符类型标示符 *指针变量名指针变量名 例:例:int *ap ;/*定义定义ap为指针变量,指为指针变量,指 向整型变量向整型变量*/北京航空
45、航天大学出版社北京航空航天大学出版社3 单片机的单片机的C语言程序设计语言程序设计582、指针变量的引用(、指针变量的引用(*) int a; int *ap; ap=&a;/*ap指向变量指向变量a,&为取地址符为取地址符*/ 指针运算符指针运算符“*”,*ap和和a等价等价 *ap表示表示ap所指向的变量所指向的变量 x=*ap;/*ap所指向的变量赋值给所指向的变量赋值给x*/ *ap=0 xff;/*a=0 xff*/ 北京航空航天大学出版社北京航空航天大学出版社3 单片机的单片机的C语言程序设计语言程序设计59关于关于KEIL C51的指针类型的指针类型 支持支持“基于存贮器的基于存
46、贮器的”指针和指针和“一般一般”指针两种类型。指针两种类型。q基于存贮器的指针基于存贮器的指针 在编译时一般被在编译时一般被“行内行内”编码,无须库调用。即指针所指的编码,无须库调用。即指针所指的对象所在的存储空间由定义时对象所在的存储空间由定义时c源代码中的存储器类型决定。源代码中的存储器类型决定。该指针只需该指针只需12字节字节q一般指针一般指针 一般指针包括一般指针包括3个字节。个字节。2字节偏移(即指针的地址)和字节偏移(即指针的地址)和1字字节存储器类型。为了表示这种指针必须用长整数来定义存节存储器类型。为了表示这种指针必须用长整数来定义存贮类型贮类型。北京航空航天大学出版社北京航空
47、航天大学出版社3 单片机的单片机的C语言程序设计语言程序设计60指针定义(指针定义(*) static data unsigned char data *标示符标示符 auto idata char idata register pdata unsigned int pdata extern xdata int xdata code unsinged long code bdata long bdata float struct union北京航空航天大学出版社北京航空航天大学出版社3 单片机的单片机的C语言程序设计语言程序设计61q第二列指出指针变量存放在何处,缺省时决定于第二列指出指针变量
48、存放在何处,缺省时决定于编译用存储模式编译用存储模式q第四列指明指针所指的对象存放在何处,缺省时第四列指明指针所指的对象存放在何处,缺省时为三字节的通用指针。为三字节的通用指针。北京航空航天大学出版社北京航空航天大学出版社3 单片机的单片机的C语言程序设计语言程序设计621、基于存贮器的指针、基于存贮器的指针 由由C源代码中的存贮类型决定。用这种指针可高效访问对象源代码中的存贮类型决定。用这种指针可高效访问对象且只需且只需1至至2字节字节q1个字节个字节idata*, data *,pdata*q2个字节个字节code *,xdata*q例:例:char xdata *px 其中,其中,xda
49、ta为指针指向的对象变量定位存储空间,指针为指针指向的对象变量定位存储空间,指针长度为长度为2个字节,所指的对象是个字符型,指针自身在默认个字节,所指的对象是个字符型,指针自身在默认存储器区(决定于编译模式)存储器区(决定于编译模式)北京航空航天大学出版社北京航空航天大学出版社3 单片机的单片机的C语言程序设计语言程序设计63qchar idata *px ;所指的对象变量在;所指的对象变量在idata 中,指针为中,指针为1个字节个字节 data char xdata *px; 除指明指针所指对象除指明指针所指对象 在在xdata中,还指明指中,还指明指 针自身存放在针自身存放在data中中
50、 char xdata *data px; 与上式等价与上式等价 与早期与早期C51版本兼容版本兼容北京航空航天大学出版社北京航空航天大学出版社3 单片机的单片机的C语言程序设计语言程序设计64q例(例(*) struct time char hour; char min; char sec; struct time xdata *pxtime struct time idata *px; px-pxtime-hour=12;北京航空航天大学出版社北京航空航天大学出版社3 单片机的单片机的C语言程序设计语言程序设计652、一般指针、一般指针 即定义时未指明所指对象的存储空间即定义时未指明所指对