1、单片机编程实例单片机编程实例led等等5、下载程序到单片机并调试、下载程序到单片机并调试(1)在在Vision中把目标程序编辑好,中把目标程序编辑好,(2)编译、连接无错后生成单片机可执行的代码文件,编译、连接无错后生成单片机可执行的代码文件,(3)用下载线下载到单片机系统板中,用下载线下载到单片机系统板中,(4)运行程序运行程序(5)根据运行结果)根据运行结果检查功能实现情况检查功能实现情况,若未达系统要求若未达系统要求,则则在在Vision中修改程中修改程序,然后重复步骤序,然后重复步骤(2)(5),直至达到系直至达到系统要求统要求.在程序反复检查无在程序反复检查无逻辑错误时逻辑错误时,应
2、检查应检查硬件电路是否有问硬件电路是否有问题题.3.2 Vision Vision软件的使用1、新建一个工程、新建一个工程(项目项目),并为该项目选定合适的并为该项目选定合适的CPU然然后保存该工程。后保存该工程。具体步骤:具体步骤:选Project New Project保保存工程存工程在弹出窗口中选所需在弹出窗口中选所需CPU(如选(如选ATMEL),双击该双击该.CPU.选选AT89S51,并确定。并确定。2、设置工程,使编译、连接后能生成可执行代码文件、设置工程,使编译、连接后能生成可执行代码文件右击右击Options for Target 1选择Create HEX 在弹出的窗口选在
3、弹出的窗口选3、新建源文件新建源文件选选FileNewFileNew输入源程序输入源程序保存保存(汇编程序:文件名(汇编程序:文件名.asm;C.asm;C程序:文件名程序:文件名.c.c(存在工程文件夹存在工程文件夹)4、为工程中添加源程序文件、为工程中添加源程序文件在右边在右边Project窗口单击窗口单击 Source Group 1,在下拉菜单,在下拉菜单中选中选 Add Files to GroupSource Group 1选项,选项,在弹出的框中选择你的源文件和文件类型,然后点击在弹出的框中选择你的源文件和文件类型,然后点击ADD,再点击,再点击close。5、编译工程中的源程序
4、,生成、编译工程中的源程序,生成 .HEX(可执行可执行)文件文件 在在Project窗口中窗口中选选 Target 1Build Target F7,(点点击击 )对源程序编译连接。对源程序编译连接。(或点击或点击 RBuild Target)程序有语法错误时程序有语法错误时,会在输出窗口会在输出窗口(Output Windows)中中显示错误信息和警告信息显示错误信息和警告信息,修改编译成功后生成修改编译成功后生成 HEX文件文件生成生成.HEX文件后文件后,可利可利用专门的下载程序用专门的下载程序,将将此可执行程序下载到单此可执行程序下载到单片机内的片机内的ROM中运行中运行 3 3、在
5、窗口中点、在窗口中点击击 ,打开你系统打开你系统的的.hex文件文件 3.3 STC-ISP V3.91 软件的使用1、双击、双击 ,打开在线烧录程序打开在线烧录程序 2 2、在窗口的、在窗口的“MCU TYPE MCU TYPE”下拉菜单中选择下拉菜单中选择(STC89C51RC)(STC89C51RC)4 4、在、在COMCOM栏选下载端口栏选下载端口(一般是一般是COM1COM1)5、关、关电路板上的电源电路板上的电源6 6、点击、点击Download,Download,打开电路板上的电源打开电路板上的电源,烧录程序烧录程序,若若烧录出现问烧录出现问题题,点击点击stopstop。注意:
6、注意:5、6 两步骤的两步骤的顺序不能颠倒!即在点顺序不能颠倒!即在点击击Download之前要先之前要先关掉板上的电源关掉板上的电源。7、打开电路、打开电路板上的电源板上的电源,程序即开始运程序即开始运行。行。3.4 单片机应用系统单片机应用系统C语言程序设计语言程序设计 单片机应用系统的程序设计有两种方法:一种单片机应用系统的程序设计有两种方法:一种是基于汇编语言的,另一种是基于是基于汇编语言的,另一种是基于C语言的。语言的。汇编语言程序的机器代码生成效率高,但可汇编语言程序的机器代码生成效率高,但可读性较差,而读性较差,而C语言程序的可读性和可移植性远超语言程序的可读性和可移植性远超过汇
7、编语言。过汇编语言。C51是一种专门为是一种专门为51单片机设计的高级语言单片机设计的高级语言C编译器,支持符合编译器,支持符合ANSI标准的标准的C语言,同时针语言,同时针对对51单片机的特点做了一些特殊扩展。单片机的特点做了一些特殊扩展。C语言的主要特点:语言的主要特点:语言简洁,使用方便灵活。它是程序设计语语言简洁,使用方便灵活。它是程序设计语言中规模最小的语言之一。言中规模最小的语言之一。ANSI标准标准C语言只有语言只有32个关键字,个关键字,9种流程种流程控制语句。控制语句。程序可移植性好。程序可移植性好。所设计的程序不依赖机器硬件。所设计的程序不依赖机器硬件。表达方式灵活。表达方
8、式灵活。利用利用 C语言的多种运算符可组成各种表达式,语言的多种运算符可组成各种表达式,还可采用多种方法来获得表达式的值,使程序设计还可采用多种方法来获得表达式的值,使程序设计具有更大的灵活性。具有更大的灵活性。表达能力强。表达能力强。具有丰富的数据结构类型和多种运算符。用户具有丰富的数据结构类型和多种运算符。用户可灵活采用多种数据类型和使用各种运算符,实现可灵活采用多种数据类型和使用各种运算符,实现复杂运算。复杂运算。可直接操作计算机硬件。可直接操作计算机硬件。C语言具有直接访问机器物理地址的能力,语言具有直接访问机器物理地址的能力,C51的编译器都的编译器都可直接对单片机内部的可直接对单片
9、机内部的SFR和和I/O端口进端口进行操作,可以直接访问片内、片外存储器,还可以行操作,可以直接访问片内、片外存储器,还可以进行各种为操作进行各种为操作。生成的目标代码质量较高。生成的目标代码质量较高。可进行结构化程序设计。可进行结构化程序设计。C语言以函数作为程序设计的基本单位,非常适语言以函数作为程序设计的基本单位,非常适合结构化程序设计。合结构化程序设计。用用C51语言编写单片机应用程序,不用具体组语言编写单片机应用程序,不用具体组织、分配存储器资源和处理端口数据,但织、分配存储器资源和处理端口数据,但对数据类对数据类型与变量的定义,必须要与单片机的存储结构相关型与变量的定义,必须要与单
10、片机的存储结构相关联,否则编译器不能正确地映射定位。联,否则编译器不能正确地映射定位。与标准与标准C语言相比,语言相比,C51包含的数据类型、变量包含的数据类型、变量存储模式、输入输出处理、函数等方面有一定差存储模式、输入输出处理、函数等方面有一定差异,异,需根据单片机存储结构及内部资源来定义相应的数需根据单片机存储结构及内部资源来定义相应的数据类型和变量,据类型和变量,而其它语法规则、程序结构及设计而其它语法规则、程序结构及设计方法等与标准方法等与标准C语言相同。语言相同。3.4.1 C51的程序结构的程序结构 一、一、C51语言概述语言概述 C语言程序语言程序由若干函数组成,其中有且仅有一
11、由若干函数组成,其中有且仅有一个主函数个主函数,每个函数都是完成某个特殊任务的子程,每个函数都是完成某个特殊任务的子程序段。序段。组成程序的若干函数可保存在一个源程序文件组成程序的若干函数可保存在一个源程序文件中,也可保存在几个源程序文件中,最后将它们连中,也可保存在几个源程序文件中,最后将它们连接在一起。接在一起。函数之间可以互相调用,但主函数只能调用函数之间可以互相调用,但主函数只能调用其它函数而不能被其它函数调用。其它函数而不能被其它函数调用。主函数是程序的入口,主函数中的所有语句执行主函数是程序的入口,主函数中的所有语句执行完毕,则程序结束。完毕,则程序结束。二二.、C51语言程序结构
12、语言程序结构 可实现一个可实现一个LED闪烁控制功能的闪烁控制功能的C51源程序源程序C51语言程序的基本结构:语言程序的基本结构:式中:式中:func1()()funcN()()代代表用户定义的函数,表用户定义的函数,程序体指程序体指C51提供的提供的任何库函数调用语句、任何库函数调用语句、控制流程语句或其它控制流程语句或其它函数调用语句。函数调用语句。3.4.2 C51的数据结构的数据结构 1.C51的变量的变量 变量的基本属性是变量的基本属性是变量名变量名和和变量值变量值。在程序中定义。在程序中定义了变量,了变量,C51编译器就会给这个变量分配相应的存储单编译器就会给这个变量分配相应的存
13、储单元。此后变量名就与存储单元地址相对应元。此后变量名就与存储单元地址相对应,变量值就与,变量值就与存储单元的内容相对应。存储单元的内容相对应。定义一个变量的格式如下:定义一个变量的格式如下:存储种类存储种类数据类型数据类型存储类型存储类型变量名变量名C51的变量概念示意图的变量概念示意图 图中引用变量图中引用变量a实现了对分配内存实现了对分配内存20H单元的数据操作单元的数据操作(1)存储种类)存储种类 存储种类存储种类是指变量在程序执行过程中的作用范围。是指变量在程序执行过程中的作用范围。变量的存储种类有四种:变量的存储种类有四种:自动(自动(auto)用存储种类说明符用存储种类说明符au
14、to定义的变量定义的变量外部(外部(extern)用外部种类存储符用外部种类存储符extern定义的变量定义的变量静态(静态(static)用存储种类说明符用存储种类说明符static定义的变量定义的变量寄存器(寄存器(register)用存储种类说明符用存储种类说明符register定义的定义的 变量变量自动变量:自动变量:自动变量作用范围在定义它的函数体或复合语句内自动变量作用范围在定义它的函数体或复合语句内部部,在定义它的,在定义它的函数体或复合语句被执行时,函数体或复合语句被执行时,C51才为该变量分配内存空间,当函数调用结束或复合才为该变量分配内存空间,当函数调用结束或复合语句执行结
15、束时,自动变量占用的内存空间被释放语句执行结束时,自动变量占用的内存空间被释放。定义变量时若省略存储种类,则变量默认为自定义变量时若省略存储种类,则变量默认为自动变量。通常将函数体内和复合语句中使用频繁的动变量。通常将函数体内和复合语句中使用频繁的变量放在片内变量放在片内RAM中,且定义为自动变量,可有效中,且定义为自动变量,可有效利用片内利用片内RAM资源。资源。外部变量:外部变量:在一个函数内,在一个函数内,要使用已在本函数外或别的程序要使用已在本函数外或别的程序模块文件中定义过的外部变量时,在本函数体内模块文件中定义过的外部变量时,在本函数体内要用要用extern说明该变量说明该变量。通
16、常将多个函数或模块共享的变量定义为外通常将多个函数或模块共享的变量定义为外部变量。部变量。外部变量是全局变量,在程序执行期间一直外部变量是全局变量,在程序执行期间一直占有固定的内存空间。占有固定的内存空间。当片内当片内RAM资源紧张时,资源紧张时,不建议将外部变量放在片内不建议将外部变量放在片内RAM。外部变量被定义后,即分配了固定的内存空间,外部变量被定义后,即分配了固定的内存空间,在程序的整个执行时间内都是有效的。在程序的整个执行时间内都是有效的。静态变量:静态变量:静态变量又分为静态变量又分为内部静态变量内部静态变量和和外部静态变量外部静态变量。在函数体内定义的静态变量为在函数体内定义的
17、静态变量为内部静态变量内部静态变量,它在该函数体内有效,它在该函数体内有效,但在该函数体外不可见,但在该函数体外不可见,这这使变量在定义它的函数体外被保护使变量在定义它的函数体外被保护,实现了离,实现了离开函数时值不会被改变。开函数时值不会被改变。寄存器变量:寄存器变量:通常将使用频率最高的那些变量定义为寄存器通常将使用频率最高的那些变量定义为寄存器变量,但目前已不推荐使用这种方式。变量,但目前已不推荐使用这种方式。外部静态变量外部静态变量是在函数外部定义的静态变量。是在函数外部定义的静态变量。它在程序中一直可见,但在定义的范围之外是不它在程序中一直可见,但在定义的范围之外是不可见的。可见的。
18、在多文件或多模块处理中,外部静态变量只在在多文件或多模块处理中,外部静态变量只在定义其的文件内部或模块内部有效定义其的文件内部或模块内部有效。(2)数据类型)数据类型 数据的不同格式叫做数据类型数据的不同格式叫做数据类型 有符号数据类型可以忽略有符号数据类型可以忽略signed标识符,如标识符,如int 等等价于价于signed int,char 等价于等价于signed char等。等。为了更有效地利用为了更有效地利用51单片机的内部结构,单片机的内部结构,C51还还增加了一些特殊的数据类型增加了一些特殊的数据类型,它们分别对应于,它们分别对应于bit、sfr、sfr16和和sbit四个关键
19、字。四个关键字。bit 位型位型 利用利用bit 位型,可定义一个位变量或位函数,位型,可定义一个位变量或位函数,但不能定义位指针,也不能定义位数组。它的值但不能定义位指针,也不能定义位数组。它的值是一个二进制位,不是是一个二进制位,不是0 就是就是1。C51增加的特殊数据类型增加的特殊数据类型sfr特殊功能寄存器型特殊功能寄存器型 51系列单片机内的系列单片机内的21个特殊功能寄存器个特殊功能寄存器(SFR),分散在片内分散在片内RAM区的高区的高128字节,地址为字节,地址为80HFFH。为了能直接访问这些为了能直接访问这些SFR,需要通过关键字,需要通过关键字“sfr”对对其进行定义其进
20、行定义,语法如下:语法如下:sfr sfr_name=地址常数地址常数;sfr_name是一个特殊功能寄存器名,是一个特殊功能寄存器名,“=”后面必须后面必须是常数,其数值范围必须在特殊功能寄存器地址范围是常数,其数值范围必须在特殊功能寄存器地址范围内,即位于内,即位于0 x80-0 xFF之间。之间。例如,例如,sfr P1=0 x90;/定义定义P1口地址口地址90H sfr PSW=0 xD0;/定义定义PSW地址地址D0H 对于对于16位位SFR,要使用关键字,要使用关键字“sfr16”,定义的地定义的地址必须是址必须是16位位SFR的低端地址。的低端地址。sfr16 DPTR=0 x
21、82;/定义定义DPTR,其,其DPL=82H DPH=83H 注意:不能用注意:不能用sfr16定义定时器定义定时器/计数器计数器0和和1。sbit可寻址位可寻址位 在单片机应用中,经常要访问特殊功能寄存器在单片机应用中,经常要访问特殊功能寄存器中的某些位,中的某些位,用关键字用关键字sbit定义可位寻址的特殊功定义可位寻址的特殊功能寄存器的位寻址对象能寄存器的位寻址对象。定义方法有如下三种:。定义方法有如下三种:sbit 位变量名位变量名=位地址位地址 将位的绝对地址赋给位变量名,位地址必须位于将位的绝对地址赋给位变量名,位地址必须位于0 x80H0 xFF之间。之间。例:例:sbit C
22、Y=0 xD7;/将位的绝对地址赋给变量将位的绝对地址赋给变量sbit 位变量名位变量名=SFR名称名称 位位置位位置 当可寻址位位于特殊功能寄存器中时,可采用这种当可寻址位位于特殊功能寄存器中时,可采用这种方法。其中方法。其中SFR名称必须是已定义的名称必须是已定义的SFR的名字,位位的名字,位位置是一个置是一个07之间的常数。之间的常数。例:例:sfr PSW=0 xD0;sbit CY=PSW7;/定义定义CY位为位为PSW.7,位地址为,位地址为 0 xD7sbit 位变量名位变量名=字节地址字节地址 位位置位位置 这种方法是以一个字节地址作为基地址,该地址必这种方法是以一个字节地址作
23、为基地址,该地址必须在须在0 x80H0 xFF之间。之间。例如,例如,sbit CY=0 xD07;/将位的相对地址赋给变量将位的相对地址赋给变量 注:注:C51编译器把编译器把51单片机常用特殊功能寄存器和特殊位进行单片机常用特殊功能寄存器和特殊位进行了统一定义,并存放在了统一定义,并存放在“reg51.h”或或“reg52.h”头文件中,只须在头文件中,只须在使用前用预处理命令使用前用预处理命令#include 把这头文件包含到程序中,把这头文件包含到程序中,就可使用殊功能寄存器名和特殊位名称。就可使用殊功能寄存器名和特殊位名称。(3)存储类型)存储类型 51系列单片机有三个逻辑存储空间
24、:片内低系列单片机有三个逻辑存储空间:片内低128B RAM,片外,片外64KB RAM和片内外统一编址的和片内外统一编址的64KB ROM。51系列单片机逻辑存储空间示意图 C51的存储类型与存储空间对应关系表的存储类型与存储空间对应关系表 注:注:一个变量除了与存储单元相对应外,还与它所在一个变量除了与存储单元相对应外,还与它所在的存储空间有关,即还需要指出其存储类型。的存储空间有关,即还需要指出其存储类型。如果在如果在定义变量时省略了存储类型标识符,定义变量时省略了存储类型标识符,C51编译器会根据当前编译模式自动认定默认的存储类编译器会根据当前编译模式自动认定默认的存储类型。型。编译模
25、式共分为:小编译模式(编译模式共分为:小编译模式(SMALL)、紧)、紧凑编译模式(凑编译模式(COMPACT)和大编译模式()和大编译模式(LARGE)三种模式三种模式 编译模式与存储类型编译模式与存储类型(4)变量名)变量名 C51对变量名的规定与标准对变量名的规定与标准C类似,由字母、类似,由字母、数字和下划线三种字符组成,且第一个字符必须数字和下划线三种字符组成,且第一个字符必须为字母或下划线,变量名长度无统一规定,随编为字母或下划线,变量名长度无统一规定,随编译系统而定。译系统而定。注意注意:大写和小写字母是两个不同的标识符,习:大写和小写字母是两个不同的标识符,习惯上变量用小写表示
26、。变量名除了不可使用标准惯上变量用小写表示。变量名除了不可使用标准C语言的语言的32个关键字外,还要不可使用个关键字外,还要不可使用C51扩展扩展的新关键字。的新关键字。C51扩展的扩展的21个关键字一览表个关键字一览表 C51扩展的扩展的21个关键字一览表(续)个关键字一览表(续)注:注:所有变量在使用前必须说明,即必须所有变量在使用前必须说明,即必须“先定先定义,后使用义,后使用”,凡未被定义的,不作为变量名。,凡未被定义的,不作为变量名。unsigned char data system_status=0;/定义定义system_status为无符号字符型自动变量,该变量位为无符号字符型
27、自动变量,该变量位于于data区中且初值为区中且初值为0。unsigned char bdata status_byte;/定义定义status_byte为为无符号字符型自动变量,该变量位于无符号字符型自动变量,该变量位于bdata区中。区中。unsigned int code unit_id2=0 x1234,0 x89ab;/定义定义unit_id2为无符号整型自动变量,该变量位于为无符号整型自动变量,该变量位于code区区中,为长度为中,为长度为2的数组,初值为的数组,初值为0 x1234和和0 x89ab。static char m,n;/定义定义m和和n为为2个位于个位于data区中
28、的区中的有符号字符型静态变量。有符号字符型静态变量。extern float xdata var4;/在片外在片外RAM 空间定义空间定义外部实型变量外部实型变量var4。C51的指针与标准的指针与标准C的指针几乎是一样的,都的指针几乎是一样的,都可以简单理解为可以简单理解为“存储某个地址的变量存储某个地址的变量”。2.C51的指针的指针 例如要存取变量例如要存取变量a中的值时,可以先将变量中的值时,可以先将变量a的的地址放在另一个变量地址放在另一个变量b中,访问时先找到变量中,访问时先找到变量b,从,从中取出变量中取出变量a的地址,然后根据这个地址从内存单的地址,然后根据这个地址从内存单元中
29、取出变量元中取出变量a的值。在这里,变量的值。在这里,变量b称为指针变量。称为指针变量。上述说法相当于上述说法相当于 int a=AA;int*b=&a在在C51里定义指针,还需要额外指明两个问题:里定义指针,还需要额外指明两个问题:1)指针变量自身位于哪个存储区域;)指针变量自身位于哪个存储区域;2)该指针的值代表的是哪个存储区域里的地址。)该指针的值代表的是哪个存储区域里的地址。在在SMALL编译模式下的例子编译模式下的例子例例1 char xdata a=A;char*ptr=&a;ptr是一个是一个char型的指针变量型的指针变量,它本身位于默它本身位于默认的认的data存储区存储区(
30、因为它省略了(因为它省略了存储类型)存储类型),它它的值是的值是xdata存储区里变量存储区里变量a的地址的地址。例例2 char xdata a=A;char*ptr=&a;char idata b=B;*ptr=&b;变量变量b位于位于idata存储区中,执行完存储区中,执行完*ptr=&b之后,之后,ptr里的值就是里的值就是idata空间里的空间里的b变量的地址。变量的地址。例例3 char idata a=A;变量变量a是是idata区域里的变量;区域里的变量;char idata*ptr=&a;定义指针时就限定它只能指向某一个区域,例如定义指针时就限定它只能指向某一个区域,例如id
31、ata 例例4 若若例例3中的中的ptr指针自身位于指针自身位于xdata存储区,由于存储区,由于指针变量本质上也是变量,所以,可在例指针变量本质上也是变量,所以,可在例3的的“char idata*ptr”里,为里,为ptr加上指明所在区域的加上指明所在区域的xdata即可即可 char idata a=A;char idata*xdata ptr=&a;xdata指明了指明了ptr本身是在本身是在xdata存储区里的存储区里的,而它是一个而它是一个(char idata*)类型的变量类型的变量,即指向即指向idata区域的一个区域的一个char类型的指针。类型的指针。3.4.3 C51的运
32、算符的运算符说明说明 :(1)关于关于/(除除)运算的结果运算的结果,若若:两个整数相除两个整数相除,运算结果的值为整数运算结果的值为整数(如如 5/3,结果为结果为1)两数中有一个为负值时两数中有一个为负值时,结果向零取整结果向零取整。(如如-5/3为为-1 两数中有一个为实数时两数中有一个为实数时,结,结果为果为 double 型型1 C51的基本算术运算符的基本算术运算符基本算术运算符有基本算术运算符有5种:,种:,*(乘乘),/(除除),(模运算符,又称求余模运算符,又称求余)。-7%4,7%-4,-7%-4的值为多少?(2)参加参加/(模模)运算的两数为运算的两数为整型数据整型数据结
33、果结果,结果为结果为整型数整型数如 7%4 的值为 3(-3,3,-3)关系运算符有关系运算符有6种:种:(小于小于)、(大于大于)、(小于或等于小于或等于)、(大于或等于大于或等于)(相等相等),!(不等于不等于)。2 C51的关系运算符的关系运算符前前4种运算符的优先级别高种运算符的优先级别高(彼此间优先级相同彼此间优先级相同),后两种运算符的优先级较低后两种运算符的优先级较低(彼此间优先级相同彼此间优先级相同)。关系运算的结果只有两种:关系运算的结果只有两种:“真真”(1)和和“假假”(0)。例:设例:设a5,b4,c3,则则ab的值为的值为“真真”,表达式的值为,表达式的值为1若有赋值
34、语句若有赋值语句 d(ab)c按优先级,先算按优先级,先算ab,表达式的值为,表达式的值为1;再算;再算1c,表达式的值为表达式的值为0,所以,所以d0。逻辑运算符有逻辑运算符有3种:种:&(逻辑与逻辑与),(逻辑或逻辑或),!,!(逻逻辑非辑非)。逻辑运算结果只有两个:逻辑运算结果只有两个:“真真”(1)和和“假假”(0)。3 C51的逻辑运算符的逻辑运算符C51的算术、关系、的算术、关系、逻辑运算符的优先级逻辑运算符的优先级别见右图。别见右图。西安电子科技大学出版社西安电子科技大学出版社西安电子科技大学出版社()括号!(非运算)关系运算赋值运算()高优先级算术运算符(先乘除后加减)&(与)
35、和|(或)低优先级位操作运算符有位操作运算符有6种:种:&(按位与按位与),(按位或按位或),(按位异或按位异或),(位取反位取反),(位右移,当位右移,当操作数为无符号数时操作数为无符号数时,高位补零高位补零,为有符号为有符号数数,则则高位保持原状态高位保持原状态)。【例例3-4】设设X1001 1110B,Y1010 0101B,则,则XY的运算过程为:的运算过程为:XY的值为的值为0011 1011B。4 C51位操作运算符位操作运算符自增减运算符有自增减运算符有4种:种:+i(先将先将i加加1,再使用,再使用i),-i(先先将将i减减1,再使用,再使用i),i+(使用使用i后,再将后,
36、再将i加加1),i-(使用使用i后,后,再将再将i减减1)。【例例3-6】设设i值为值为8,则,则j+i,使用前,使用前i为为8,加,加1后为后为9,则,则i、j值都是值都是9;ji+,使用前,使用前i为为8,先将,先将8赋给赋给j,使用后使,使用后使i加加1,所以所以i9,j8。5C51自增、减运算符自增、减运算符复合赋值运算符有复合赋值运算符有10种:,种:,*,/,。6C51赋值运算符赋值运算符7C51复合赋值运算符复合赋值运算符用赋值运算符将变量与表达式连接起来,就用赋值运算符将变量与表达式连接起来,就构成了赋值表达式,在赋值表达式构成了赋值表达式,在赋值表达式 之后加上分号之后加上分
37、号“;”便构成了赋值语句。便构成了赋值语句。X=Y=8;复合赋值运算复合赋值运算首先对变量进行某种运算,然后首先对变量进行某种运算,然后将运算结果再赋给变量将运算结果再赋给变量。采用复合赋值运算符,可。采用复合赋值运算符,可使程序简化和提高程序编译效率。使程序简化和提高程序编译效率。例如,例如,x*y+8 等价于等价于x x*(y+8)8C51的条件运算符的条件运算符条件运算符条件运算符?:它是它是C语言中唯一一个三目运算符语言中唯一一个三目运算符逻辑表达式逻辑表达式?表达式?表达式1:表达式:表达式2逻辑表达式结果为真时,表达式的值等于表达式逻辑表达式结果为真时,表达式的值等于表达式1的值的
38、值,否则,等于表达式,否则,等于表达式2的值的值。此外,还有逗号运算符、指针和地址运算符、强制类此外,还有逗号运算符、指针和地址运算符、强制类型转换运算符、取数据类型运算符。型转换运算符、取数据类型运算符。一个表达式后加上一个表达式后加上“;”就构成了表达式语句,如算术表达就构成了表达式语句,如算术表达式、关系表达式等。最典型的是用赋值表达式组成的赋值语式、关系表达式等。最典型的是用赋值表达式组成的赋值语句。句。例如:例如:i=1;i+;1、表达式语句、表达式语句C 语言所有的操作都是通过表达式来实现的。语言所有的操作都是通过表达式来实现的。表达式语句:表达式语句:表达式表达式;2、函数调用语
39、句、函数调用语句函数调用语句由函数名、括号、实际参数加上分号函数调用语句由函数名、括号、实际参数加上分号“;”组组成成。其一般形式为:。其一般形式为:函数名函数名(实际参数表实际参数表);例:例:printf(Hello,worldn);“函数调用语句函数调用语句”也可以看成是表达式语句,也可以看成是表达式语句,C语言称为语言称为“表表达式语言达式语言”。3.4.4 C语句概述3、控制语句、控制语句 控制语句用于控制程序流程,以实现程序的各种控制语句用于控制程序流程,以实现程序的各种基本结构。共有基本结构。共有9种控制语句,分成三类:种控制语句,分成三类:选择语句选择语句、循环语句循环语句 和
40、和转移语句转移语句。C 使用控制语句控制程序的执行,常用的控制语句有:使用控制语句控制程序的执行,常用的控制语句有:if else switch 选择控制选择控制for while do while 循环控制循环控制continue break return goto 转移控制转移控制条件语句有三种格式:条件语句有三种格式:格式格式1:If (条件表达式)(条件表达式)语句语句1格式格式2:If (条件表达式)(条件表达式)语句语句1 else 语句语句2格式格式3:If (条件表达式(条件表达式1)语句语句1 else if(条件表达式(条件表达式2)语句)语句2 else if(条件表达式
41、(条件表达式3)语句)语句3 .else if(条件表达式(条件表达式m)语句)语句m else 语句语句 n注意注意:1)当条件后面的语句多于一句时,要用一对当条件后面的语句多于一句时,要用一对“”把这些语句括起来。把这些语句括起来。2)用格式用格式3实现多重实现多重if else 嵌套时嵌套时,注意注意if-else的配对,的配对,else总是和其前面最近的总是和其前面最近的if相配。此相配。此外,嵌套层数会增加程序阅读难度。外,嵌套层数会增加程序阅读难度。开关语句开关语句Switch(表达式)(表达式)case 常量表达式常量表达式1:语句:语句1 break;case 常量表达式常量表
42、达式2:语句:语句2 break;.case 常量表达式常量表达式n:语句:语句n break;Default:语句语句d循环语句循环语句while(表达式表达式)其含义是:当条件成立时反复执行循环体中的其含义是:当条件成立时反复执行循环体中的语句,直到条件不成立时为止。语句,直到条件不成立时为止。do while(条件条件)for(;)break语句语句作用:跳出当前的作用:跳出当前的switch语句或循环语句语句或循环语句流程控制语句流程控制语句continue语句语句作用:结束当前这一轮循环,即跳过循环语句中尚未作用:结束当前这一轮循环,即跳过循环语句中尚未执行的语句,开始下一轮循环执行
43、的语句,开始下一轮循环,而不是结束整个循环。而不是结束整个循环。注:注:continue只用在只用在for、while、do-while等循环等循环语句中,一般与语句中,一般与if语句一起使用,可以加速循环。语句一起使用,可以加速循环。返回语句返回语句return return (表达式表达式)return 表达式表达式 作用:作用:使程序控制从被调用函数返回到调用使程序控制从被调用函数返回到调用函数中,同时把返回值带给调用函数函数中,同时把返回值带给调用函数。跳转语句跳转语句goto 语句标号语句标号 作用:作用:无条件转移到指定标号处无条件转移到指定标号处注:最好不使用注:最好不使用got
44、o语句语句4、复合语句、复合语句例:例:while(i 1)sum=sum+i;i=i+1;说明:说明:复合语句的复合语句的 之后不能有之后不能有“;”允许一行写几个语句,或者一条语句写几允许一行写几个语句,或者一条语句写几行行 复合语句中还复合语句中还可以包含复合语句可以包含复合语句由括在由括在 内的若干内的若干C语句组成语句组成5、空语句、空语句 只有一个分号的语句,不产生任何操作只有一个分号的语句,不产生任何操作例:例:for(i=1;i 100;i+);空语句什么也不做,可用来做被转向点,或循环语空语句什么也不做,可用来做被转向点,或循环语句中的循环体(循环体是空语句,表示循环体什么句
45、中的循环体(循环体是空语句,表示循环体什么也不做)。也不做)。当程序中出现连续的两个分号当程序中出现连续的两个分号“;”时,一般时,一般可把后面的分号看作空语句。可把后面的分号看作空语句。rept:;.goto rept;#include char _getkey()char c;while(!RI);/*用空语句等待串口接收结束用空语句等待串口接收结束 C=SBUF;RI=0;return(c);一个读取串口数据的函数一个读取串口数据的函数不要滥用空语句,以免引起程序误操作或语法错误不要滥用空语句,以免引起程序误操作或语法错误 赋值语句是由赋值表达式加上一个分号构成的,是用赋值语句是由赋值表
46、达式加上一个分号构成的,是用于实现计算和赋值的一类最基本的语句。于实现计算和赋值的一类最基本的语句。其一般形式如下:其一般形式如下:可赋值对象可赋值对象v=表达式表达式e;注意:注意:(1)如果赋值运算符两边的类型不一致,则系统在算出表)如果赋值运算符两边的类型不一致,则系统在算出表达式的值之后,先将该值转换为左边变量的类型,然后再达式的值之后,先将该值转换为左边变量的类型,然后再赋值给左边的变量。赋值给左边的变量。(2)赋值运算符)赋值运算符“=”右边的表达式可以又是一个赋值表右边的表达式可以又是一个赋值表达式,形式为:达式,形式为:变量变量=变量变量=表达式表达式;(3)在变量说明中,不允
47、许连续给多个变量赋初值。)在变量说明中,不允许连续给多个变量赋初值。6、赋值语句、赋值语句一、一、函数的分类与定义函数的分类与定义1函数的分类函数的分类(1)从语言结构划分,函数分为主函数从语言结构划分,函数分为主函数main()和普和普通函数两类。通函数两类。(2)从使用角度划分,函数分为标准库函数和用户从使用角度划分,函数分为标准库函数和用户自定义函数两类。自定义函数两类。库函数是库函数是C编译系统提供的一系列标准函数,它们编译系统提供的一系列标准函数,它们放在一些头文件中,用户可直接调用,使用它们必须先放在一些头文件中,用户可直接调用,使用它们必须先用用#include语句将相应头文件包
48、含在程序中。语句将相应头文件包含在程序中。用户自定义函数是用户按任务需要编写的函数。用户自定义函数是用户按任务需要编写的函数。3.4.5 C51函数及功能函数及功能(3)从参数形式上划分,函数分为无参数函数、有参从参数形式上划分,函数分为无参数函数、有参数函数和空函数三类。数函数和空函数三类。无参数函数调用时无须输入参数,也无结果返回。无参数函数调用时无须输入参数,也无结果返回。有参数函数调用时要给被调用函数提供实质参数,有参数函数调用时要给被调用函数提供实质参数,被调用函数运行后产生的结果也要返回给调用函数使用。被调用函数运行后产生的结果也要返回给调用函数使用。空函数是内无语句的空白函数,调
49、用时不产生任空函数是内无语句的空白函数,调用时不产生任何操作,这种函数用于功能备用,以便扩充。何操作,这种函数用于功能备用,以便扩充。2函数的定义函数的定义(1)无参数函数的定义形式:无参数函数的定义形式:返回值类型标识符返回值类型标识符 函数名函数名()函数体语句函数体语句无参数函数通常不带返回值,因此标识符可省略或无参数函数通常不带返回值,因此标识符可省略或用用void。(2)有参数函数的定义形式:有参数函数的定义形式:返回值类型标识符返回值类型标识符 函数名函数名(形式参数表形式参数表)形式参数说明形式参数说明函数体语句函数体语句return(返回参数名返回参数名)(3)空函数的定义形式
50、:空函数的定义形式:返回值类型说明符返回值类型说明符 函数名函数名()用用return(返回)语句(返回)语句使程序控制从被调用使程序控制从被调用函数返回到调用函数中,同时把返回值带给函数返回到调用函数中,同时把返回值带给调用函数调用函数。3.函数的返回值函数的返回值 void型函数型函数(不需要返回值不需要返回值),无,无return语句。语句。对于对于int类型的函数,不写类型的函数,不写return语句时,相语句时,相当于执行了当于执行了rerun 0;语句。语句。return 语句中表达式的值一般应与函数类型一语句中表达式的值一般应与函数类型一致。致。二、二、函数的调用函数的调用函数一