C5单片机的C语言程序设计课件

上传人:文**** 文档编号:240606090 上传时间:2024-04-24 格式:PPT 页数:125 大小:1.08MB
收藏 版权申诉 举报 下载
C5单片机的C语言程序设计课件_第1页
第1页 / 共125页
C5单片机的C语言程序设计课件_第2页
第2页 / 共125页
C5单片机的C语言程序设计课件_第3页
第3页 / 共125页
资源描述:

《C5单片机的C语言程序设计课件》由会员分享,可在线阅读,更多相关《C5单片机的C语言程序设计课件(125页珍藏版)》请在装配图网上搜索。

1、第第第第10101010章章章章 80C5180C5180C5180C51单片机的单片机的单片机的单片机的C C C C语言程语言程语言程语言程序设计序设计序设计序设计 C51C51的数据类型的数据类型 10.2C51C51流程控制语句流程控制语句10.4C51C51的运算符和表达式的运算符和表达式310.3 单片机单片机C C语言概述语言概述310.110.5C51C51的构造数据类型的构造数据类型10.6C51C51编程实例编程实例310.7C51C51的函数的函数10.110.1单片机单片机C语言概述语言概述10.1.1 C5110.1.1 C5110.1.1 C5110.1.1 C51

2、的程序结构的程序结构的程序结构的程序结构 返回 C51 C51的程序结构与标准的程序结构与标准C C语言基本相同。其结语言基本相同。其结构特点如下构特点如下:1.1.函数是函数是C51C51程序的基本单位。程序的基本单位。标准的标准的C51C51程序程序通常是多个函数的集合,在这个集合当中,通常是多个函数的集合,在这个集合当中,有且有且只有一个只有一个mainmain函数(主函数)。不论函数(主函数)。不论mainmain函数在函数在整个程序中所处的位置如何,整个程序中所处的位置如何,C51C51程序总是从程序总是从mainmain函数开始执行。函数开始执行。2.2.C51C51程序书写格式自

3、由,一行内可以写几个语程序书写格式自由,一行内可以写几个语句。句。3.分号是分号是C51C51语句的重要组成部分,语句的重要组成部分,每个语句和数每个语句和数据定义(函数除外)的最后必须有一个分号。据定义(函数除外)的最后必须有一个分号。4.C51本身没有输入输出语句。本身没有输入输出语句。标准的输入和输标准的输入和输出是由出是由scanf和和printf等库函数来完成的。对于等库函数来完成的。对于用户定义的输出,比如直接以输出端口读取键用户定义的输出,比如直接以输出端口读取键盘输入或驱动盘输入或驱动LED,则需要自行编制输出函数。,则需要自行编制输出函数。5.可以用可以用/*/对对C51程序

4、中的任何部分作注释。程序中的任何部分作注释。10.1.2 C5110.1.2 C51编译器介绍编译器介绍单片机不能直接执行单片机不能直接执行C51C51程序,程序,执行前必须经过编执行前必须经过编译译,形成相应的可执行代码,形成相应的可执行代码,目前开发的编译器种目前开发的编译器种类繁多类繁多,并非所有的并非所有的C51C51编译器产生高效代码。编译器产生高效代码。lAMERICAN AUTOMATIONAMERICAN AUTOMATION编译器编译器:该编译器通过:该编译器通过#asmasm和和endasmendasm预处理选择支持汇编语言预处理选择支持汇编语言,此编译此编译器的编译速度较

5、慢。器的编译速度较慢。lIARIAR编译器编译器:IARIAR编译器是由瑞典开发的,它和编译器是由瑞典开发的,它和ANSI CANSI C兼容,但需要一个较复杂的链接程序才能兼容,但需要一个较复杂的链接程序才能运行。运行。lBSOBSOTASKingTASKing编译器编译器:它是基于:它是基于windowswindows下的下的集成开发环境软件集成开发环境软件(EDE)(EDE),支持鼠标操作,人,支持鼠标操作,人机界面友好,它的汇编器和机界面友好,它的汇编器和IntelIntel汇编器兼容汇编器兼容lKEILKEIL编译器编译器:KEILKEIL编译器效率很高。它支持浮编译器效率很高。它支

6、持浮点和长整数、重入和递归,支持点和长整数、重入和递归,支持DOSDOS和和WindowWindow环境,但它不提供库源代码,只能产生混合代环境,但它不提供库源代码,只能产生混合代码,若使用汇编语言,必须分开汇编程序,然码,若使用汇编语言,必须分开汇编程序,然后手工连接。若使用单片模式,它是后手工连接。若使用单片模式,它是最好的最好的选选择。择。10.1.3 C5110.1.3 C51的特点的特点(1)C(1)C语言采用与人的思维更接近的关键字和语言采用与人的思维更接近的关键字和操作操作函数。函数。(2)C(2)C语言提供了大量的标准语言提供了大量的标准库文件库文件 (3)C(3)C语言采用模

7、块化语言采用模块化编程思想编程思想(4)C(4)C语言可移植性好语言可移植性好 (5)(5)通用性好通用性好(6)(6)寄存器分配和寻址方式由编译器进行管理寄存器分配和寻址方式由编译器进行管理很多系统特别是实时时钟系统都是用很多系统特别是实时时钟系统都是用C C 语言和语言和汇编语言联合编写的,尤其是对时序要求很严汇编语言联合编写的,尤其是对时序要求很严格的驱动程序来说使用汇编语言是唯一的方法。格的驱动程序来说使用汇编语言是唯一的方法。10.2 C5110.2 C51的数据类型的数据类型返回 数据数据是具有一定格式的数字或数值,是计算是具有一定格式的数字或数值,是计算机操作的对象。机操作的对象

8、。任何语言编写的程序最终在计算任何语言编写的程序最终在计算机中运行的只有数据流。编程的目的就是让机中运行的只有数据流。编程的目的就是让CPUCPU按照程序流程对各种数据进行相应的操作,并得按照程序流程对各种数据进行相应的操作,并得到编程者所期望的运算结果。到编程者所期望的运算结果。数据操作会因数据数据操作会因数据类型不同而有较大的差异,其差异主要体现在取类型不同而有较大的差异,其差异主要体现在取值范围、存储位置和存储空间大小等几个值范围、存储位置和存储空间大小等几个方面。方面。数据数据类型型长度度取取值范范围字符型字符型Unsigned char80255Signed char8-128127

9、整型整型Unsigned int16065535Signed int16-3276832767长整型整型Unsigned long3204294967295Signed long32-21474836482147483647浮点型浮点型float321.18e-383.40e38位型位型bit10或或1sbit10或或1SFRsfr80-255Sfr1616065535C51C51的的数据类型数据类型 C51和标准和标准C的区别的区别:1.C语言的基本数据类型有语言的基本数据类型有char、int、short、long、float、double等六种类型。对于等六种类型。对于C51来说,来说,

10、short、int、float和和double类型都是一样的。因为类型都是一样的。因为C51主要主要针对控制类的应用,所以针对控制类的应用,所以C51C51不支持复杂的双精度浮不支持复杂的双精度浮点运算点运算(double)。)。2.float也与标准也与标准C一样符合一样符合IEEE-754标准,但标准,但float的的使用和运算,需要调用数学库使用和运算,需要调用数学库“math.h”函数的函数的支持。支持。3.布尔处理器是布尔处理器是8051单片机的特色,位类型(单片机的特色,位类型(bit)可)可以定义一个位变量,由以定义一个位变量,由C51编译器在编译器在8051内部内部RAM区区2

11、0H-2FH的的128个位地址中分配一个位地址。需要个位地址中分配一个位地址。需要注意的是,位类型不能定义指针和数组。注意的是,位类型不能定义指针和数组。4.特殊功能寄存器(特殊功能寄存器(sfr和和sfr16):):8051及其兼容产及其兼容产品的特殊功能寄存器必须采用直接寻址的方式来访问,品的特殊功能寄存器必须采用直接寻址的方式来访问,sfr可以对可以对8051的特殊功能寄存器进行定义,数据占的特殊功能寄存器进行定义,数据占用一个字节。用一个字节。sfr16为为16位特殊功能寄存器,位特殊功能寄存器,8051及其兼容产品的及其兼容产品的16位特殊功能寄存器(如位特殊功能寄存器(如DPTR)

12、可以用可以用sfr16来定义,数据占用两个字节。来定义,数据占用两个字节。5.在在C51C51编译器提供的头文件编译器提供的头文件reg51.hreg51.h中已经把所有的特中已经把所有的特殊功能寄存器进行了定义,殊功能寄存器进行了定义,我们可以直接用我们可以直接用include命命令使其包括在程序中。注意:在使用时,令使其包括在程序中。注意:在使用时,所有的所有的sfr的的名称都必须大写。名称都必须大写。6.可寻址位类型(可寻址位类型(sbitsbit):利用:利用sbit可以对可以对8051内部内部RAM的位寻址空间及特殊功能寄存器的可寻址位进行的位寻址空间及特殊功能寄存器的可寻址位进行定

13、义。定义。7.数据类型的转换数据类型的转换:不同类型的数据是可以相互转换的,不同类型的数据是可以相互转换的,可以通过赋值或者强制转换。可以通过赋值或者强制转换。赋值转换次序为:赋值转换次序为:bit-bit-char-char-intint-long-float-long-float,如果反向赋值,则结果丢弃高,如果反向赋值,则结果丢弃高位位。10.2.2 C5110.2.2 C51数据的存储数据的存储类型类型 C51C51是面向是面向5151单片机的程序语言,单片机的程序语言,所以任何数所以任何数据都必须以一定的方式存储在不同的位置。数据据都必须以一定的方式存储在不同的位置。数据分为常量和变

14、量两种形式。分为常量和变量两种形式。常量可以用一个标志常量可以用一个标志符号来代表。变量由变量名和变量值组成,每一符号来代表。变量由变量名和变量值组成,每一个变量占据一定的存储空间用以存放变量的个变量占据一定的存储空间用以存放变量的值。值。存储器类型存储器类型长度长度存储位置存储位置说说 明明data8片内片内RAM直接寻址:直接寻址:007FH,速度最快,速度最快bdata8可位寻址:可位寻址:20H2FHidada8间接寻址:间接寻址:00FFHpdata8片外片外RAM分页间址:分页间址:00FFH,MOVX Ri指令访问指令访问xdata16间接寻址:间接寻址:0000FFFFH MO

15、VX DPTR访问访问code16ROM间接寻址:间接寻址:0000FFFFH MOVC A+DPTR访问访问lC51对变量定义时,既可以定义数据类型,还可对变量定义时,既可以定义数据类型,还可以定义存储类型。其格式为:以定义存储类型。其格式为:“数据类型数据类型 存储类型存储类型 变量名变量名”。例如例如:char data name_varchar data name_var;/*/*字符变量字符变量name_varname_var存储在片内存储在片内RAMRAM区区*/float idata x float idata x;/*/*浮点型变量浮点型变量x x存储在片内间址存储在片内间址R

16、AMRAM区区*/bit bdata flags bit bdata flags;/*/*位变量位变量flagsflags存存储在片内储在片内RAMRAM位寻址区位寻址区*/l存储类型为可选项,如果不做存储类型的定义,存储类型为可选项,如果不做存储类型的定义,系统将选择默认存储模式来存储,默认类型由编系统将选择默认存储模式来存储,默认类型由编译控制命令指令译控制命令指令限制。限制。存储存储存储存储模式与默认存储类型模式与默认存储类型模式与默认存储类型模式与默认存储类型存储模式存储模式默认存储类型默认存储类型特点说明特点说明SMALLSMALLdata(data(小模式小模式)存储于片内存储于片

17、内RAMRAM,速度快速度快COMPACTCOMPACTpdatapdata(紧凑模式)(紧凑模式)存储于片外分页存储于片外分页RAMRAMLARGELARGExdataxdata(大模式)(大模式)存储于片外存储于片外64K64K的的RAMRAM,速度慢,速度慢例如,若声明例如,若声明char v,在,在SMALL模式下,模式下,v被定被定位在位在data区;在使用区;在使用COMPACT模式下,则模式下,则v被被定位在定位在pdata区;在使用区;在使用LARGE模式情况下,模式情况下,v被定位在被定位在xdata区中。区中。10.2.3 805110.2.3 805110.2.3 805

18、110.2.3 8051单片机特殊功能寄存器的单片机特殊功能寄存器的单片机特殊功能寄存器的单片机特殊功能寄存器的C51C51C51C51定义定义定义定义一一一一 、特殊功能寄存器的声明、特殊功能寄存器的声明、特殊功能寄存器的声明、特殊功能寄存器的声明如何对如何对如何对如何对SFRSFRSFRSFR操作操作操作操作l对对SFRSFR的操作,只能用直接寻址方式。的操作,只能用直接寻址方式。l为了能直接访问这些特殊功能寄存器为了能直接访问这些特殊功能寄存器SFR,C51提供了一种独特的定义方法,这种定义方提供了一种独特的定义方法,这种定义方法与标准法与标准C语言不兼容,只适用于对语言不兼容,只适用于

19、对8051系列系列单片机进行编程。单片机进行编程。l其定义语法如下:其定义语法如下:sfrsfr name nameadressadress “sfr”为保留关键字,其后面必须跟一个特为保留关键字,其后面必须跟一个特殊寄存器名称,殊寄存器名称,“”后面的地址必须是常后面的地址必须是常数,不允许带有运算表达式,其常数值范围必数,不允许带有运算表达式,其常数值范围必须在特殊功能寄存器地址范围须在特殊功能寄存器地址范围0 x80到到0 xFF之之间。间。例例:sfr SCON0 x90;*串口控制寄存器地址串口控制寄存器地址 90H*特殊功能寄存器位的声明特殊功能寄存器位的声明l在在8051单片机的

20、应用中,经常需要对单片机的应用中,经常需要对SFR进行位进行位操作,特殊位的定义利用关键字操作,特殊位的定义利用关键字sbit进行说明,与进行说明,与sfr定义一样,用关键字定义一样,用关键字“sbit”定义某些持殊位定义某些持殊位时能接受任何符号名称,这种地址分配有三种方式:时能接受任何符号名称,这种地址分配有三种方式:l第第1种方式:种方式:sbitsbit 位变量位变量=特殊功能寄存器名特殊功能寄存器名 位位置位位置(0-7有有效)效)例如:例如:sfrsfr PSW PSW0 xD00 xD0;/*/*定义定义PSWPSW寄存器地址寄存器地址为为0 xD0*/0 xD0*/第第2种方式

21、:种方式:sbitsbit 位变量名位变量名=字节地址字节地址 位位置位位置(0-7)例如:例如:sbitsbit OV OV0 xD020 xD02;*OVOV位地址为位地址为0 xD2*0 xD2*这种方法以一个整常数作为基地址,该值这种方法以一个整常数作为基地址,该值必须在必须在0X800 xFF0X800 xFF之间,并能被之间,并能被8 8整除。整除。第第3种方式:种方式:sbitsbit 位变量名位变量名=位地址位地址 这种方法将位的绝对地址赋给变量,地址必这种方法将位的绝对地址赋给变量,地址必须位于须位于0 x800 x80到到0 xFF0 xFF之间。之间。例如:例如:sbit

22、sbit OV OV0XD20XD2;10.3 C5110.3 C51的运算符和表达式的运算符和表达式运算符就是完成某种特定运算的符号,运算符就是完成某种特定运算的符号,按按运算符在表达式中与运算对象的数量可分为单目运算符在表达式中与运算对象的数量可分为单目运算符,双目运算符和三目运算符。运算符,双目运算符和三目运算符。单目就是指需要有一个运算对象单目就是指需要有一个运算对象双目就要求有两个运算对象双目就要求有两个运算对象表达式则是由运算及运算对象所组成的具有特定表达式则是由运算及运算对象所组成的具有特定含义的式子。含义的式子。返回10.3.1 10.3.1 赋值运算符赋值运算符将数据赋给变量

23、:将数据赋给变量:变量变量 =表达式表达式l例如:例如:a=0 xFFa=0 xFF;/将常数将常数0 xFF0 xFF赋于变量赋于变量a a b=c=33b=c=33;/同时将同时将3333赋值给变量赋值给变量b,cb,c f=f=a+ba+b;/将变量将变量a+ba+b的值赋于变量的值赋于变量f fl先计算出先计算出=右边的表达式的值,然后将得到的值右边的表达式的值,然后将得到的值赋给左边的变量。而且右边的表达式可以是一个赋赋给左边的变量。而且右边的表达式可以是一个赋值表达式。值表达式。l注意:赋值符号注意:赋值符号“=”“=”与关系运算符与关系运算符“=”“=”(相等)(相等)不能混淆。

24、不能混淆。10.3.2 10.3.2 10.3.2 10.3.2 算术运算算术运算算术运算算术运算符符符符l+加或取正值运算符加或取正值运算符 -减或取负值运算符减或取负值运算符*乘运算符乘运算符 /除运算符除运算符%取余运算符取余运算符 l算术表达式的形式:算术表达式的形式:表达式表达式1 1 算术运算符算术运算符 表达式表达式2 2l算术运算符的优先级:算术运算符的优先级:先乘除模,后加减,括号最优先。先乘除模,后加减,括号最优先。算术运算符的结合性:算术运算符的结合性:算术运算符的结合性规算术运算符的结合性规定为自左至右方向,定为自左至右方向,又称为又称为“左结合性左结合性”。10.3.

25、3 10.3.3 10.3.3 10.3.3 关系关系关系关系运算符运算符运算符运算符当指定的条件满足时结果为当指定的条件满足时结果为1 1(真),不满足时(真),不满足时结果为结果为0 0(假)。(假)。关系运算符的优先级别:关系运算符的优先级别:前四个具有相同的优先级,后两个也具有相同的前四个具有相同的优先级,后两个也具有相同的优先级,但是前四个的优先级要高于后两个。优先级,但是前四个的优先级要高于后两个。例例 若若a=4,b=3,c=2 则则 ab的值为的值为“真真”,表达式值为,表达式值为1;b+cbc,由于关系运算符的结合性为左结合,由于关系运算符的结合性为左结合,故故ab值为值为1

26、。而。而1c位为位为0,故,故f值为值为0。10.3.4 10.3.4 10.3.4 10.3.4 逻辑运算符逻辑运算符逻辑运算符逻辑运算符 逻辑运算逻辑运算符则是用于符则是用于求条件式的逻辑值,求条件式的逻辑值,逻辑运算结果只有真逻辑运算结果只有真与假与假两种。两种。l&:逻辑与(:逻辑与(ANDAND)l|:逻辑或:逻辑或(OR)(OR)l!:!:逻辑非逻辑非(NOT)(NOT)常用运算符的优先级常用运算符的优先级 l“与与”逻辑和逻辑和“或或”逻辑是双目运算符,而逻辑是双目运算符,而“非非”逻辑是单目运算符。逻辑是单目运算符。l逻辑运算符优先级别:逻辑非最高,逻辑与次逻辑运算符优先级别:

27、逻辑非最高,逻辑与次之,逻辑或最低。之,逻辑或最低。lC51逻辑运算符、算术运算符、关系运算符和逻辑运算符、算术运算符、关系运算符和赋值运算符之间优先级的次序中,赋值运算符之间优先级的次序中,!(非非)运算符运算符优先级最高,算术运算符次之,关系运算符再优先级最高,算术运算符次之,关系运算符再次之,与和或再次之,最低为赋值运算符。次之,与和或再次之,最低为赋值运算符。例:例:a=1,b=2,c=3,d=4,m=0,n=0,则则lm=ab:因为因为ab为假为假(0),即,即m=0。l(m=cd):因为因为=运算符的优先级比运算符的优先级比运算符的运算符的低,所以先判断低,所以先判断cb)&(n=

28、cd):因为因为ab为假为假(0),即,即m=0为真(为真(1),故需继续向右执行,又因为),故需继续向右执行,又因为cd为假为假(0),即,即n=0为真(为真(1),两者相与结果),两者相与结果为真(为真(1),故表达式值为),故表达式值为1。10.3.5 10.3.5 10.3.5 10.3.5 位运算符位运算符位运算符位运算符位运算符位运算符:是按位对变量进行运算,但是并不改变参是按位对变量进行运算,但是并不改变参与运算和变量的值。与运算和变量的值。l&按位与;按位与;|按位或;按位或;l 按位异或;按位异或;按位取反;按位取反;l 位右移;位右移;l位运算一般的表达形式为:位运算一般的

29、表达形式为:变量变量1 1 位运算符位运算符 变量变量2 2l位运算符的优先级:高到低依次是位运算符的优先级:高到低依次是:(按位取反按位取反)()()(右移右移)&(&(按位与按位与)()(按位异或按位异或)|()|(按位或按位或)l位运算符对象只能是整型或字符型数据,不能为位运算符对象只能是整型或字符型数据,不能为实型数据实型数据例:例:a=0 xff,b=0 x01,则则lc=a&b:c=0 x01lc=a|b:c=0 xfflc=ab:c=0 xfelc=a:c=0 x00lc=ab:c=0 x7f10.3.6 10.3.6 10.3.6 10.3.6 其他运算符其他运算符其他运算符其

30、他运算符1.1.条件条件条件条件运算符运算符运算符运算符lC51中有一个中有一个三目运算符三目运算符,它就是条件运算符,它就是条件运算符?。逻辑表达式逻辑表达式?表达式表达式1:1:表达式表达式2 2;当当逻辑表达式的值为真时(逻辑表达式的值为真时(1)时,整个表达)时,整个表达式的值为表达式式的值为表达式1的的值;值;当当逻辑表达式的值为假(逻辑表达式的值为假(0)时,整个表达式)时,整个表达式的值为表达式的值为表达式2的的值。值。返回例:将例:将a a和和b b两数中的较小的值放入两数中的较小的值放入minmin变量中。变量中。l程序程序1if(ab)min=a;elsemin=b;l 程

31、序程序2min=(a=右移位赋值右移位赋值 -=减法赋值减法赋值&=逻辑与赋值逻辑与赋值 *=乘法赋值乘法赋值|=逻辑或赋值逻辑或赋值 /=除法赋值除法赋值 =逻辑异或赋值逻辑异或赋值%=取模赋值取模赋值 !=逻辑非赋值逻辑非赋值 20|x20|x-10)l l if(yx)if(yx)l printf(Good);printf(Good);l l else else l printf(Bad);printf(Bad);l 4.4.可用阶梯式可用阶梯式if-else-ifif-else-if结构结构 if(if(表达式表达式1)1)语句语句1;1;else if(else if(表达式表达式2

32、)2)语句语句2;2;else if(else if(表达式表达式3)3)语句语句3;3;else else 语句语句n;n;这种结构是从上到下逐个对条件进行判断这种结构是从上到下逐个对条件进行判断,一一旦发现条件满点足就执行与它有关的语句旦发现条件满点足就执行与它有关的语句,并跳并跳过其它剩余阶梯过其它剩余阶梯;若没有一个条件满足若没有一个条件满足,则执行则执行最后一个最后一个elseelse语句语句n n。10.4.2 10.4.2 10.4.2 10.4.2 循环语句循环语句循环语句循环语句一一一一 .for.for.for.for循环循环循环循环lfor(for(;)语句;语句;初始化

33、初始化一般是一个赋值语句一般是一个赋值语句,它用来给循环控制变量它用来给循环控制变量赋初值赋初值;条件条件表达式表达式是一个关系表达式是一个关系表达式,它决定什么时候退出它决定什么时候退出循环;循环;更新更新表达式表达式说明循环控制变量每循环一次后按什么方说明循环控制变量每循环一次后按什么方式变化,式变化,若更新后条件表达式为假(若更新后条件表达式为假(FALSE)则退)则退出循环。出循环。例如例如:for(i=1;i10)(i10)时结束循环。时结束循环。注意注意:1.for循环中语句可以为语句体循环中语句可以为语句体,但要用但要用“”将参将参加循环的语句括起来。加循环的语句括起来。2.fo

34、r循环中的初始化、条件表达式和更新表达式循环中的初始化、条件表达式和更新表达式都是选择项都是选择项,可缺省可缺省,但分号但分号“;”不能缺省。不能缺省。3.for循环可以多层嵌套。循环可以多层嵌套。二二 、whilewhile循环循环 while(while(条件条件)语句;语句;l 若若while循环条件为真时循环条件为真时,则执行语句,为假则循则执行语句,为假则循环结束。环结束。l与与for循环一样循环一样,while循环总是在循环的循环总是在循环的开始检验开始检验条件条件,如果一开始条件就不满足,则意味着循环如果一开始条件就不满足,则意味着循环语句可能一次也不执行就退出。语句可能一次也不

35、执行就退出。注意注意:1、在、在while循环体内允许空循环体内允许空语句。语句。2、可以有多层循环嵌套。、可以有多层循环嵌套。3、语句可以是语句体、语句可以是语句体,此时此时必须用必须用“”括起来。括起来。4、当条件恒为真时,则程、当条件恒为真时,则程序进入一个死循环。单片机序进入一个死循环。单片机系统中经常利用这一特性实系统中经常利用这一特性实现前后台系统的调用。现前后台系统的调用。三、三、三、三、do-while do-while do-while do-while 循环循环循环循环 do do 语句语句;while(while(条条件件););该循环与该循环与while循环的循环的不同

36、在于它不同在于它先执行循环先执行循环中的语句中的语句,然后再判断然后再判断条件是否为条件是否为真真,如果为真如果为真则继续循环,则继续循环,如果为假如果为假,则则终止循环。终止循环。10.4.3 10.4.3 开关语句开关语句lswitch(switch(变量变量)l case case 常量常量1:1:l 语句语句1 1或空或空;l case case 常量常量2:2:l 语句语句2 2或空或空;l .l .l .l case case 常量常量n;n;l 语句语句n n或空或空;l default:default:l 语句语句n+1n+1或空或空;l l执行执行switch开关语句时开关语

37、句时,将变量逐个与将变量逐个与case后的后的常量进行比较常量进行比较,若与其中一个相等若与其中一个相等,则执行该常则执行该常量下的语句量下的语句,若不与任何一个常量相等若不与任何一个常量相等,则执行则执行default 后面的语句。后面的语句。注意注意:l1.switch1.switch中变量可以是数值中变量可以是数值,也可以是字符。也可以是字符。l2.2.可以省略一些可以省略一些casecase和和defaultdefault。l3.3.每个每个casecase或或defaultdefault后的语句可以是语句体后的语句可以是语句体,同样要使用同样要使用“”括起来。括起来。10.4.4 b

38、reak10.4.4 break10.4.4 break10.4.4 break、continue continue continue continue 和和和和 gotogotogotogoto 语句语句语句语句一一.break.break语句语句lbreak语句可以跳出循环而执行循环后面的语语句可以跳出循环而执行循环后面的语句,通常用在循环语句和开关语句中配合使用。句,通常用在循环语句和开关语句中配合使用。lbreakbreak用于开关语句用于开关语句switchswitch中时中时,可使程序跳可使程序跳出出switchswitch而执行而执行switchswitch以后的语句;以后的语句

39、;如果没有如果没有break语句语句,则将成为一个死循环而无法退出。则将成为一个死循环而无法退出。l当当break语句用于语句用于for、do-while、while循环循环语句中时语句中时,可使程序终止循环而执行循环后面可使程序终止循环而执行循环后面的语句的语句,通常通常break语句总是与语句总是与if语句联在一起,语句联在一起,即满足条件时便跳出循环。即满足条件时便跳出循环。二二.continue.continue 语句语句 lcontinuecontinue语句的作用是跳过本次循环中剩余的语句的作用是跳过本次循环中剩余的语句而强行执行下一次循环。语句而强行执行下一次循环。这是与这是与b

40、reak语语句的最大句的最大差别。差别。lcontinue语句通常只用在语句通常只用在for、while、do-while等循环体中等循环体中,常与常与if条件语句一起使用条件语句一起使用,用用来加速循环。来加速循环。三三.gotogoto 语句语句 l是是一种一种无条件转移语句无条件转移语句lgotogoto 语句的使用格式为语句的使用格式为:gotogoto标号:标号:标号标号是一个有效的标识符是一个有效的标识符,这个标识符加上一这个标识符加上一个个“:”一起出现在函数内某处一起出现在函数内某处,执行执行gotogoto语句后语句后,程序将跳转到该标号处并执程序将跳转到该标号处并执行其后的

41、行其后的语句。语句。另外另外标号必须与标号必须与gotogoto语句同处于一个函数中语句同处于一个函数中,但但可以不在一个循环层可以不在一个循环层中。中。在在编程时编程时gotogoto语句要尽量少用语句要尽量少用,因为它将使程序因为它将使程序层次不清,但在多层嵌套退出时层次不清,但在多层嵌套退出时,用用gotogoto语句则语句则比较合理比较合理。10.5 C5110.5 C51的构造数据类型的构造数据类型10.5.1 10.5.1 数组数组数组数组l数组是一组具有固定数目和相同类型成分分量数组是一组具有固定数目和相同类型成分分量的有序集合,的有序集合,其成分分量的类型为该数组的基其成分分量

42、的类型为该数组的基本类型。常用的有整型数组、字符型数组等。本类型。常用的有整型数组、字符型数组等。数组的各元素必须是同一类型的数组的各元素必须是同一类型的变量。变量。1.1.1.1.数组的定义数组的定义数组的定义数组的定义数组是用同一个名字的不同下标访问的,数组的数组是用同一个名字的不同下标访问的,数组的数组是用同一个名字的不同下标访问的,数组的数组是用同一个名字的不同下标访问的,数组的下标放在方括号中,是从下标放在方括号中,是从下标放在方括号中,是从下标放在方括号中,是从0 0 0 0开始的一组有序整数。开始的一组有序整数。开始的一组有序整数。开始的一组有序整数。例如数组例如数组例如数组例如

43、数组bibibibi ,当,当,当,当i=0i=0i=0i=0,1 1 1 1,2 2 2 2,n n n n时,时,时,时,b0b0b0b0,b1b1b1b1,,bnbnbnbn 分别是数组分别是数组分别是数组分别是数组b b b b的元素。的元素。的元素。的元素。一维数组一维数组类型说明类型说明 存储器类型存储器类型 数组名数组名 整型整型=初始值初始值 l例:例:char a6=“shiwei”;/*字符数组字符数组a0=s,,a5=i*/int idata b5=0,1,2,3,4;/*字符数组字符数组b存储于存储于片内片内RAM,且且b0=0,,b4=4*/l二维数组二维数组类型说明

44、类型说明 存储器类型存储器类型 数组名数组名 整型整型整整型型=初始值初始值l二维数组的存取顺序是按行存取,即二维数组的存取顺序是按行存取,即先依次存取先依次存取第第1 1行元素的所有列,再存储第行元素的所有列,再存储第2 2行,行,依次类推。依次类推。l例例 int a22=1,2,3,4/*整型数组整型数组a有有4个元素,个元素,且且a00=1,a01=2,a10=3,a11=4*/。l二维数组的初始化有多种形式,下面的初始化结二维数组的初始化有多种形式,下面的初始化结果是等效的:果是等效的:int a22=1,2,3,4;int a22=1,2,3,4;2.2.数组数组的应用的应用l例例

45、:设单片机的设单片机的P0引脚和数码管代码段相连,引脚和数码管代码段相连,P1.0和数码管公共段相连(共阴),请在数码管和数码管公共段相连(共阴),请在数码管上依次显示上依次显示0-9个数字,显示时间间隔为个数字,显示时间间隔为1秒,试秒,试利用数组编写程序。利用数组编写程序。#includelint code=0 x3f,0 x06,0 x5b,0 x4f,0 x66,0 x6d,0 x7d,0 x07,0 x7f,0 x6f;lvoid main()l lfor(i=0;i=9;i+)/*数组的访问下标从数组的访问下标从0开始开始*/llP1=0 xff;/*消隐消隐*/l P0=code

46、i;/*段译码段译码*/lP1=0 xfe;/*使能使能*/l Delay(1000);/*延时延时1秒秒*/ll 10.5.2 10.5.2 10.5.2 10.5.2 指针指针指针指针l指针指针就是指变量或数据所在的存储区的地址,就是指变量或数据所在的存储区的地址,它为变量的访问提供了一个特殊的它为变量的访问提供了一个特殊的方式。方式。返回1.1.指针指针的基本概念的基本概念l如果如果程序中定义了一个变量,程序中定义了一个变量,C51编译器在编译时编译器在编译时就给这个变量在内存中分配相应的就给这个变量在内存中分配相应的存储空间。存储空间。l变量变量有变量名和变量值两个概念,其中有变量名和

47、变量值两个概念,其中变量名是变量名是数据的标号数据的标号,变量值则是数据的变量值则是数据的内容内容。l内存单元也有两个概念,内存单元也有两个概念,一个是内存单元的地址,一个是内存单元的地址,一个是内存单元的内容。一个是内存单元的内容。前者是内存对该单元的前者是内存对该单元的编号,它表示在内存中的位置。后者指的是在该编号,它表示在内存中的位置。后者指的是在该内存单元中存放的数据。内存单元中存放的数据。在变量与内存单元的对应关系中,在变量与内存单元的对应关系中,变量的变量的变量名与内存单元的地址相变量名与内存单元的地址相对应。对应。变量的变量的变量值与内存单元的变量值与内存单元的内容相对应。内容相

48、对应。假设程序中定义了两个整型变量假设程序中定义了两个整型变量a和和b,它们的值分别为,它们的值分别为2、3,而,而C51编编译系统将地址为译系统将地址为1000和和1001的两个的两个字节内存单元分配给了变量字节内存单元分配给了变量a,将地,将地址为址为1002和和1003的两字节内存单元的两字节内存单元分配给了变量分配给了变量b,则变量,则变量a和和b的地址的地址为为1000和和1002,在内存中变量名在内存中变量名a、b是不存在的,是不存在的,对变量值的存取是通对变量值的存取是通过地址进行的。过地址进行的。存取的方式有两种:存取的方式有两种:1)直接访问直接访问方式方式例例:x=a,找到

49、变量,找到变量a在内存中的位置,即地址在内存中的位置,即地址l000,然,然后由地址后由地址1000开始的两个字节中取出开始的两个字节中取出2并赋给并赋给x。2)间接访问方式间接访问方式例如例如:char data*char data*bpbp ;/*/*定义指针变量定义指针变量bpbp*/*/bpbp=&b=&b;/*/*将将b b的地址赋给指针变量的地址赋给指针变量bpbp*/*/X=*X=*bpbp ;/*/*将将b b的内容的内容3 3送给送给X*/X*/要读取变量要读取变量b的值时,可以将变量的值时,可以将变量b的地址放在另的地址放在另一个内存单元中一个内存单元中(如放在如放在201

50、2、2013中中),访问时,先找,访问时,先找到存放变量到存放变量b的地址的内存单元的地址的地址的内存单元的地址(2012、2013),然后从中取出变量然后从中取出变量b的地址的地址(1002),然后从地址为,然后从地址为(1002、1003)的两字节内存单元中取出变量的两字节内存单元中取出变量b的值的值3,该读取过该读取过程中就使用了指针。程中就使用了指针。l为了使用指针进行间接访问,必须弄清关于指针为了使用指针进行间接访问,必须弄清关于指针的两个基本概念,即的两个基本概念,即变量的指针变量的指针和指向变量的和指向变量的指指针变量针变量(简称指针变量简称指针变量)。l变量的指针变量的指针:变

51、量的指针就是变量的地址变量的指针就是变量的地址。对于。对于上面提到的变量上面提到的变量a而言,其指针就是而言,其指针就是1000。指向变量的指针变量指向变量的指针变量:若有一个变量专门用来存放若有一个变量专门用来存放另一个变量的地址另一个变量的地址(即指针即指针),则该变量称为指向变,则该变量称为指向变量的指针变量量的指针变量(简称指针变量简称指针变量)。上例中提到的地址为上例中提到的地址为2010的内存单元,如果我们定的内存单元,如果我们定义一个变量义一个变量ap,并使其定位在地址为,并使其定位在地址为2010的这个内的这个内存单元上,则存单元上,则ap就是一个指针变量。因为就是一个指针变量

52、。因为ap中中(即即2010址址单元中址址单元中)存放着变量存放着变量a的地址的地址1000。上例中我们可以说变量上例中我们可以说变量a的指针的指针(地址地址)为为1000,不能说,不能说a的指针变量是的指针变量是1000。变量。变量a的指针变量应的指针变量应该是该是ap,ap的指针是的指针是2010。2.2.2.2.指针的基本类型指针的基本类型指针的基本类型指针的基本类型l变量变量的指针就是变量的地址,用取地址运算符的指针就是变量的地址,用取地址运算符“&”取得。取得。l语句语句ap=&a 就能把所取得的就能把所取得的a指针(地址)指针(地址)存放在存放在ap指针变量中。指针变量中。ap的值

53、就变为的值就变为 1000H。可见可见指针变量的内容是另一个变量的指针变量的内容是另一个变量的地址地址。l指针指针定义的一般定义的一般的格式:的格式:数据类型数据类型指向对象的存储器类型指向对象的存储器类型*指针存储器类型变量名;指针存储器类型变量名;一般指针类型一般指针类型l当指向对象的存储类型缺省时指针变量为一般类型,当指向对象的存储类型缺省时指针变量为一般类型,一般指针占用一般指针占用3个字节个字节,第一个字节存放指针的存储第一个字节存放指针的存储类型编码,第二、三字节分别存放指针的高位和低类型编码,第二、三字节分别存放指针的高位和低位位的地址。的地址。存储类型存储类型data/bdat

54、a/idataxdatapdatacode编码编码0 x000 x010 xfe0 xffl例如:例如:char*xdata pi 指针指针pi本身存于本身存于xdata空间,它指向空间,它指向char 型数型数据,任何区域的对象都可以赋值给它,第一字据,任何区域的对象都可以赋值给它,第一字节为节为0 x01,其余字节为地址。其余字节为地址。l由于指针变量的指向对象没有确定存储位置,由于指针变量的指向对象没有确定存储位置,所以在编译不能确定对象的存储位置,只能在所以在编译不能确定对象的存储位置,只能在程序运行时才能确定,故程序运行速度比较慢,程序运行时才能确定,故程序运行速度比较慢,但由于一般

55、指针可以存储任何变量而不必考虑但由于一般指针可以存储任何变量而不必考虑变量在单片机的存储位置,所以变量在单片机的存储位置,所以在单片机编程在单片机编程时绝大多数的指针都可采用一般指针形式。时绝大多数的指针都可采用一般指针形式。基于存储器的指针类型基于存储器的指针类型基于存储器的指针类型基于存储器的指针类型l当当指向对象的存储器类型缺省时,指针变量为基于指向对象的存储器类型缺省时,指针变量为基于存储器的指针类型。存储器的指针类型。由于不必为指针选择存储器,由于不必为指针选择存储器,指针的长度可以为指针的长度可以为1字节(字节(idata,data,pdata)或)或2字节(字节(code,xda

56、ta)l 例如:例如:char data *xdata pi;指针指针pi本身存于本身存于xdata空间,它指向空间,它指向char 型数据,型数据,且只能将且只能将data区域的对象赋值给区域的对象赋值给pi,pi只占用只占用1个字个字节。节。char xdata *pi;指针指针pi本身存于任意空间,它指向本身存于任意空间,它指向char 型数据,型数据,但只能将但只能将xdata区域的对象赋值给它,区域的对象赋值给它,pi占用占用2字节。字节。l明确定义指针对象的存储类型可以高效访问对明确定义指针对象的存储类型可以高效访问对象,还能节省存储器的开销,这在严格要求程象,还能节省存储器的开销

57、,这在严格要求程序体积的项目中很有用处,但序体积的项目中很有用处,但只能将符合定义只能将符合定义条件的变量赋值与它,兼容性较差条件的变量赋值与它,兼容性较差,初学者要初学者要慎用。慎用。3.3.3.3.指针指针指针指针的应用的应用的应用的应用l指针指针变量中只能存放指针型数据(即地址),不变量中只能存放指针型数据(即地址),不能将非指针型数据赋值给一个指针变量。能将非指针型数据赋值给一个指针变量。如果有如果有一个变量一个变量a,则可以利用,则可以利用&a表示变量表示变量a的地址,的地址,如果执行以下语句如果执行以下语句P=&a;则表示将;则表示将a的地址赋的地址赋给了指针变量给了指针变量P,即

58、,即P指向了变量指向了变量a。为了获取指。为了获取指针所指向的内容,可利用指针运算符针所指向的内容,可利用指针运算符“*”来来实实现。现。例:例:char data*P;/*/*定义指针变量定义指针变量P P为为charchar类类型,且指向型,且指向datadata存储器存储器*/P=&a;/*/*将将a a的地址赋给指针变量的地址赋给指针变量P P,a a的地址为片内的地址为片内RAMRAM区区*/X=*P;/*/*将将a a的地址的内容送给的地址的内容送给X*/X*/10.5.3 10.5.3 10.5.3 10.5.3 结构结构结构结构l将字符,整型,浮点等简单数据类型按层次产生将字符

59、,整型,浮点等简单数据类型按层次产生各种构造数据类型各种构造数据类型,这些组合在一起的数据是互相这些组合在一起的数据是互相关联的,关联的,这种这种按固定模式聚集在一起而构成的数按固定模式聚集在一起而构成的数据就是结构。据就是结构。l结构的定义和使用:结构的定义和使用:1.将有共同属性的一组变量放在一个结构体里,将有共同属性的一组变量放在一个结构体里,既可方便理解和规范编程,也有利于程序的移植既可方便理解和规范编程,也有利于程序的移植和维护。和维护。2.用结构可以分配一连续内存,方便与指针结合用结构可以分配一连续内存,方便与指针结合起来使用。起来使用。3.同一结构中不同分量不能同名。同一结构中不

60、同分量不能同名。返回.l例例:#include lstructllfloat amplitude;int frequency;int offset;lwaveform ;/*结构体定义结构体定义*/lmain()l int asizeof(waveform);l unsigned char*ptr=&waveform;lunsigned char i;waveform.amplitude=1 ;/*结构体赋值结构体赋值*/lwaveform.frequency=2 ;/*结构体赋值结构体赋值*/waveform.offset=3 ;/*结构体赋值结构体赋值*/lfor(i=0;isizeof(

61、waveform);i+)lai=*(ptr+i);/*将结构体的值分别存储到数组将结构体的值分别存储到数组a中中*/ll显然,结构体数据利用指针和数组就可以将数据读出来,显然,结构体数据利用指针和数组就可以将数据读出来,当然也可以将这些数据保存到对应的存储区。当然也可以将这些数据保存到对应的存储区。10.5.4 10.5.4 10.5.4 10.5.4 枚举枚举枚举枚举l枚举是一个被命名的整型常数的集合。枚举是一个被命名的整型常数的集合。l例如表示星期的例如表示星期的SUNDAY,MONDAY,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY,SATURDAY。l枚举的说明

62、:枚举的说明:lenumenum 枚举名枚举名 l标识符标识符=整型常数整型常数,l标识符标识符=整型常数整型常数,l标识符标识符=整型常数整型常数,l 枚举变量;枚举变量;返回l如果枚举没有初始化如果枚举没有初始化,即即“=整型常数整型常数”部分缺省,部分缺省,则从第一个标识符开始则从第一个标识符开始,顺次赋给标识符顺次赋给标识符0,1,2,但,但当枚举中的某个成员赋值后当枚举中的某个成员赋值后,其后的成员按依次加其后的成员按依次加1的规则确定其值。的规则确定其值。l例如例如:enumenum string string x1 x1,x2x2,x3=50 x3=50,x4x4 则则x1=0,

63、x2=1,x3=50,x4=51x1=0,x2=1,x3=50,x4=51注意:注意:1.1.枚举中每个成员间用逗号隔离枚举中每个成员间用逗号隔离,不是分号,且最后不是分号,且最后一个逗号可省。一个逗号可省。2.2.初始化时可以赋负数,以后的标识符仍依次加初始化时可以赋负数,以后的标识符仍依次加1 1。3.3.枚举变量只能取枚举说明结构中的某个标识符常枚举变量只能取枚举说明结构中的某个标识符常量。量。10.6 C5110.6 C51的函数的函数 返回 main()也算是一个函数,只不过它比较特殊,编也算是一个函数,只不过它比较特殊,编译时以它做为程序的开始段。译时以它做为程序的开始段。C51函

64、数分为函数分为:库函数库函数,自定义函数自定义函数。库函数是库函数是C51C51在库文件中已定义的函数,其函数在库文件中已定义的函数,其函数说明在相关的头文件中。对于这类函数,用户在说明在相关的头文件中。对于这类函数,用户在编程时只要用编程时只要用#include#include预处理指令将头文件包含预处理指令将头文件包含在用户文件中就可直接调用。在用户文件中就可直接调用。用户函数是用户自己定义和调用的一类函数。用户函数是用户自己定义和调用的一类函数。一个函数在程序中可以有三种形态:一个函数在程序中可以有三种形态:函数定义、函数调用和函数说明。函数定义、函数调用和函数说明。函数定义和函数调用不

65、分先后,但若调用的函数在函数定义和函数调用不分先后,但若调用的函数在定义之前,那么在调用前必须先进行函数说明。定义之前,那么在调用前必须先进行函数说明。函数说明是一个没有函数体的函数定义,而函数调函数说明是一个没有函数体的函数定义,而函数调用则要求有函数名和实参数表。用则要求有函数名和实参数表。#include/使用使用include预处理伪指令将所需库预处理伪指令将所需库函数包含进来函数包含进来unsigned int z ;/变量定义变量定义int max(x,y);/函数说明函数说明unsigned int a=2;unsigned int b=3;main()while(1)z=max

66、(a,b);/函数调用函数调用 int max(x,y)/函数定义函数定义if(xy)return x;elsereturn y;10.6.1 C5110.6.1 C5110.6.1 C5110.6.1 C51函数定义函数定义函数定义函数定义l函数函数定义定义的形式:的形式:函数函数返回值类型返回值类型 函数名(形式参数)函数名(形式参数)函数函数体体l函数函数返回值其实就是一个变量,只要按变量类型返回值其实就是一个变量,只要按变量类型来定义函数类型就行。函数体返回值的类型一定来定义函数类型就行。函数体返回值的类型一定要和函数类型一致,否则会造成错误。要和函数类型一致,否则会造成错误。如果函数如果函数不需要返回值应用关键字不需要返回值应用关键字“void”void”明确表明确表示。示。返回l函数名的定义在遵循函数名的定义在遵循C语言变量命名规则的同时,语言变量命名规则的同时,不能在同一程序中定义同名的函数不能在同一程序中定义同名的函数。l形式参数是指调用函数时要传入到函数体内参形式参数是指调用函数时要传入到函数体内参与运算的变量,它可以有多个或没有,与运算的变量,它可以有多个或没有,没

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!