C语言程序设计及仿真调试课件

上传人:hknru****knru 文档编号:240977131 上传时间:2024-05-22 格式:PPT 页数:96 大小:889.73KB
返回 下载 相关 举报
C语言程序设计及仿真调试课件_第1页
第1页 / 共96页
C语言程序设计及仿真调试课件_第2页
第2页 / 共96页
C语言程序设计及仿真调试课件_第3页
第3页 / 共96页
点击查看更多>>
资源描述
刘忠国:刘忠国:刘忠国:刘忠国:电话电话电话电话:18764171197:18764171197:18764171197:18764171197 Tel:84 Tel:84 Tel:84 Tel:84192192192192山东大学生物医学工程山东大学生物医学工程山东大学生物医学工程山东大学生物医学工程微机原理及单片机接口技术微机原理及单片机接口技术第五章第五章单片机的单片机的C语言程序设语言程序设计及仿真调试计及仿真调试disable第五章 单片机的C语言程序设计及仿真调试disable任课教师:刘忠国刘忠国山东大学课程中心网站:http:/ 单片机的C语言程序设计及仿真调试本章学习目标3第五章第五章单片机的单片机的C语言程序设计及仿真调试语言程序设计及仿真调试5.1 C515.1 C51程序的基本语法程序的基本语法5.1.1 5.1.1 关键字关键字 5.1.2 C515.1.2 C51程序的程序的一般结构一般结构5.1.3 5.1.3 数据类型数据类型 5.1.4 5.1.4 运算符和表达运算符和表达式式5.2 Keil C515.2 Keil C51程序的语句程序的语句5.2.1 5.2.1 表达式语句表达式语句 5.2.2 5.2.2 条件条件语句语句5.2.3 5.2.3 开关语句开关语句 5.2.4 5.2.4 循循环语句环语句5.2.5 goto5.2.5 goto、breakbreak、continuecontinue和和returnreturn语句语句 5.3 5.3 函数函数 5.3.1 5.3.1 函数的定义与调用函数的定义与调用 5.3.2 Keil C515.3.2 Keil C51函数函数5.4 Keil C515.4 Keil C51库函数库函数5.5 5.5 预处理命令预处理命令5.6 5.6 单片机单片机C C语言程序框架语言程序框架4第五章 单片机的C语言程序设计及仿真调试5.1 C51程汇编语言和汇编语言和C语言的选择问题语言的选择问题设计规模模较小的嵌入式小的嵌入式应用系用系统时,可以使用,可以使用汇编语言言。因。因为代代码一般不一般不长,且,且较简单。当程序比当程序比较复复杂,且没有很好的注,且没有很好的注释时,使用,使用汇编语言言编写的程序,写的程序,可可读性和可性和可维护性会很差,性会很差,代代码的可重用性也比的可重用性也比较低。低。使用使用C语言言编程,程,编写写简单、直、直观易易读、便于、便于维护、通用性好通用性好。在控制任在控制任务比比较复复杂或者具有大量运算的系或者具有大量运算的系统中,中,C语言言优势明明显。由于模由于模块化化,用,用C语言言编写的程写的程序具有很好的序具有很好的可移植性可移植性。5汇编语言和C语言的选择问题设计规模较小的嵌入式应用系统时,可5.1 C515.1 C51程序的基本语法程序的基本语法1标准准C语言(言(ANSIC)的关)的关键字字(1)数据数据类型关型关键字字1)基本数据)基本数据类型型void、char、int、float、double2)类型修型修饰关关键字字short、long、signed、unsigned3)复)复杂类型关型关键字字struct、union、enum、typedef、sizeof4)存)存储级别关关键字字auto、static、register、extern、const、volatile5.1.1 5.1.1 关键字关键字65.1 C51程序的基本语法1标准C语言(ANSI C)5.1.1 5.1.1 关键字关键字(2)流程控制关)流程控制关键字字1)跳)跳转结构构return、continue、break、goto2)分支)分支结构构if、else、switch、case、default3)循)循环结构构for、do、while2KeilC51编译器支持的关器支持的关键字字bit、sbit、sfr、sfr16、data、bdata、idata、pdata、xdata、code、interrupt、reentrant、using75.1.1 关键字(2)流程控制关键字7预处理命令理命令/以以#开开头的命令,用于包含的命令,用于包含头文件、定文件、定义常数等常数等全局全局变量声明量声明/全局全局变量量虽然方便然方便传递参数,但不宜多参数,但不宜多函数函数1的声明的声明.函数函数n的声明的声明voidmain(void)/主函数主函数局部局部变量声明量声明/局部局部变量只能在所定量只能在所定义的函数内部引用的函数内部引用可可执行行语句句函数函数调用用无限循无限循环5.1.2 C515.1.2 C51程序的一般结构程序的一般结构8预处理命令/以#开头的命令,用于包含头文件、定义常数等/一般函数的定一般函数的定义函数函数1(形式参数声明)(形式参数声明)局部局部变量声明量声明可可执行行语句句.函数函数n(形式参数声明)(形式参数声明)局部局部变量声明量声明可可执行行语句句5.1.2 C515.1.2 C51程序的一般结构程序的一般结构9/一般函数的定义5.1.2 C51程序的一般结构9/中断函数的中断函数的实现voidISRname(void)interruptn/n为中断号中断号局部局部变量声明量声明可可执行行语句句注意如下几点:注意如下几点:(1)所有函数以花括号)所有函数以花括号“”开始,以花括号开始,以花括号“”结束,包束,包含在含在“”内的部分称内的部分称为函数体。花括号必函数体。花括号必须成成对出出现,如果一个函数内有多如果一个函数内有多对花括号,花括号,则最外最外层的花括号的花括号为函数体的范函数体的范围。为了增加程序的可了增加程序的可读性,性,应采用采用缩进方式方式书写。写。5.1.2 C515.1.2 C51程序的一般结构程序的一般结构10/中断函数的实现注意如下几点:5.1.2 C51程序的注意如下几点:注意如下几点:(2)建)建议一行写一条一行写一条语句,每条句,每条语句最后必句最后必须以一以一个分号个分号“;”结尾。尾。(3)每个每个变量必量必须先定先定义后引用后引用。在函数内部定。在函数内部定义的的变量量为局部局部变量,又称量,又称为内部内部变量量,只有定,只有定义它它的那个函数才能使用。在函数外部定的那个函数才能使用。在函数外部定义的的变量量为全全局局变量,又称量,又称为外部外部变量量,在定,在定义它的那个程序文它的那个程序文件中的函数都可以使用。件中的函数都可以使用。(4)程序)程序语句的句的注注释放在双斜杠放在双斜杠“/”之后之后,或者放在,或者放在“/*.*/”之内。之内。5.1.2 C515.1.2 C51程序的一般结构程序的一般结构11注意如下几点:5.1.2 C51程序的一般结构111常量和常量和变量量常量常量包括包括整形常量、浮点型常量、字符型常量整形常量、浮点型常量、字符型常量(如如a:单引号字符引号字符)及及字符串常量字符串常量(双引号双引号单个或多个字符,个或多个字符,如如a,Happy)等。)等。变量量是一种在程序是一种在程序执行行过程中其程中其值不断不断变化的量。化的量。使用一个使用一个变量之前,必量之前,必须先先进行定行定义。5.1.3 5.1.3 数据类型数据类型 1 1常量和变量常量和变量2数据数据类型型(1)基本数据)基本数据类型型基本数据基本数据类型是不可以再分解型是不可以再分解为其他其他类型的数据型的数据类型。如型。如char(字符型字符型)、int(整型整型)、long(长整型整型)、float(浮点型浮点型)等。等。121常量和变量5.1.3 数据类型 1常量和变量22数据数据类型型(2)构造数据)构造数据类型型构造数据构造数据类型是型是根据已定根据已定义的一个或多个数据的一个或多个数据类型用构造型用构造的方法来定的方法来定义的。的。5.1.3 数据类型数据类型 2 2数据类型数据类型在在C语言中,构造言中,构造类型有以下几种:型有以下几种:数数组类型型结构构类型型联合合类型型132数据类型5.1.3 数据类型 2数据类型 (3)指)指针类型型指指针是一种特殊的,具有重要作用的数据是一种特殊的,具有重要作用的数据类型。型。用来用来表示某个量在内存中的地址表示某个量在内存中的地址。5.1.3 数据类型数据类型 2 2数据类型数据类型(4)空)空类型型函数函数调用后并不需要向用后并不需要向调用者返回函数用者返回函数值,这种函数可以定种函数可以定义为“空空类型型”。其。其类型型说明符明符为void。14(3)指针类型5.1.3 数据类型 2数据类型(4)C51编译器除了支持上述数据器除了支持上述数据类型外型外,还支持以下几支持以下几种种扩充数据充数据类型:型:(1)bit:位:位类型。型。bit型型变量的位地址由量的位地址由编译器分配。器分配。(2)sfr:特殊功能寄存器,用来控制中断、定:特殊功能寄存器,用来控制中断、定时器、器、计数器、串口、数器、串口、I/O及其他部件。及其他部件。(3)sfr16:16位特殊功能寄存器。位特殊功能寄存器。(4)sbit:位:位寻址。址。5.1.3 数据类型数据类型 2 2数据类型数据类型bit与与sbit的用法区的用法区别:定定义的的bit型型变量量的位地址在的位地址在00H7FH之之间,具体地址具体地址值不定不定,由由编译器随机分配。器随机分配。sbit位位寻址址:该数据数据类型型用一个指定的用一个指定的变量作量作为基地址基地址然后然后用其位的位置来得到一个用其位的位置来得到一个实际的位地址。的位地址。15C51编译器除了支持上述数据类型外,还支持以下几种扩充数据(1)bit:位位类型型。可以定可以定义一个一个位位变量量,但不能定但不能定义位位指指针,也不能定也不能定义位数位数组。C51程序中程序中,函数参数和返回函数参数和返回值也可以是位也可以是位变量。例:量。例:bitfinish_flag=0;bittestfunc(bitvar1,bitvar2).return(0);5.1.3 数据类型数据类型 2 2数据类型数据类型所有所有bit型型变量量的都被定位在的都被定位在8051片内片内RAM的的可位可位寻址区址区20H2FH,共共16个字个字节,所以最多只能声明所以最多只能声明128个个bit型位型位变量。量。16(1)bit:位类型。可以定义一个位变量,但不能定义位指针(2)sfr:字:字节寻址。址。语法如下:法如下:sfrsfr_name=int_constant;如如sfrP0=0 x80;0 x80为P0口的地址口的地址,“=”后后为常数常数,且且这个常数必个常数必须在在特殊功能寄存器的地址范特殊功能寄存器的地址范围内内,即即0 x80到到0 xFF之之间。5.1.3 数据类型数据类型 2 2数据类型数据类型(3)sfr16:字:字寻址址如如sfr16DPTR=0 x82;指定指定DPTR的地址的地址DPL=0 x82,DPH=0 x83。(4)sbit:位:位寻址。用于定址。用于定义可位可位寻址址变量。可定量。可定义8051片内片内RAM的的可可寻址位址位,或特殊功能寄存器的可或特殊功能寄存器的可寻址位。址位。17(2)sfr:字节寻址。语法如下:5.1.3 数据类型 5.1.3 数据类型数据类型 2 2数据类型数据类型(4)sbit:位:位寻址。定址。定义可位可位寻址址变量量。定。定义片内片内RAM的的可可寻址位址位,或或特殊功能寄存器的特殊功能寄存器的可可寻址位址位。C51编译器提供了器提供了存存储类型型bdata,bdata存存储类型型变量位量位于片内于片内RAM的可位的可位寻址区址区,可字可字节寻址址,或位或位寻址址,因此因此bdata型型变量可量可用用sbit指定指定其中任意位其中任意位为可位可位寻址址变量量。需注意:使用需注意:使用bdata和和sbit定定义的的变量必量必须是是全局全局变量量,并且用并且用sbit定定义为位位寻址址变量量时要求要求基址基址对象象的存的存储器器类型必型必须为bdata(特殊功能寄存器除外特殊功能寄存器除外)。sbit声明方法声明方法:sbitbitname=bdata型型变量量或或sfr_namebit_number;其中其中,sfr_name是已定是已定义SFR的名字的名字,bit_number是位号是位号,其其数数值取决于取决于基址基址对象象的数据的数据类型型,对char和和SFR而言是而言是(07),对int型型而言是而言是(015),对long型型而言是而言是(031)。185.1.3 数据类型 2数据类型(4)sbit:5.1.3 数据类型数据类型 2 2数据类型数据类型sbit声明方法声明方法:sbitbitname=bdata型型变量量或或sfr_namebit_number;其中其中,sfr_name是已定是已定义SFR的名字的名字,bit_number是位号是位号,其数其数值取决于取决于基址基址对象象的数据的数据类型型,对char和和SFR而言而言是是(07),对int型型而言是而言是(015),对long型型而言是而言是(031)。如如:unsignedcharbdataflag;/flag为bdata型无符号字符型无符号字符变量量intbdataibase;/定定义ibase为bdata整型整型变量量使用使用sbit可位可位寻址址变量如下量如下:sbitflag0=flag0;/定定义flag0为flag的第的第0位位sbitmybit15=ibase15;/mybit15为ibase的第的第15位位sbitCY=PSW7;/定定义CY为PSW的第的第7位位sbitP00=P00;/定定义P0.0口口线的名称是的名称是P00195.1.3 数据类型 2数据类型sbit声明方法:KeilC51编译器支持的数据器支持的数据类型如表型如表5-1所示。所示。数据类型数据类型位数位数(bit)字节数字节数(byte)取值范围取值范围bit11/80或或1signedchar81-128+127unsignedchar810255enum8/161or2-128+127or-32768+32767signedshort162-32768+32767unsignedshort162065535signedint162-32768+32767unsignedint162065535signedlong324-2147483648+2147483647unsignedlong32404294967295float324+1.175494E38+3.402823E+38sbit11/80或或1sfr810255sfr16162065535表表5-1KeilC51编译器支持的数据类型编译器支持的数据类型5.1.3 数据类型数据类型 2 2数据类型数据类型21Keil C51编译器支持的数据类型如表5-1所示。数据类型3存存储器器类型型存储器类型存储器类型取值范围取值范围data默默认认存存储储器器类类型型,低低128字字节节内内部部RAM,DATA区区(00H7FH地址空间地址空间),访问速度最快。,访问速度最快。bdata可可位位寻寻址址内内部部RAM,BDATA区区(20H2FH地地址址空空间),允许位和字节混合访问。间),允许位和字节混合访问。idata256字字节节内内部部RAM,IDATA区区(00HFFH地地址址空空间间),允许访问全部内部单元。,允许访问全部内部单元。pdata分分页页寻寻址址外外部部RAM,PDATA区区(0000HFFFFH地地址空间),用址空间),用MOVXRi指令访问。指令访问。xdata外外部部RAM,XDATA区区(0000HFFFFH地地址址空空间间),用用MOVXDPTR指令访问。指令访问。code程程序序存存储储区区,CODE区区(0000HFFFFH地地址址空空间间),用用MOVCA+DPTR指令访问。指令访问。表表5-2 Keil C515-2 Keil C51编译器支持的存器支持的存储器器类型型对变量定量定义格式:格式:数据数据类型型存存储器器类型型变量名表量名表;5.1.3 数据类型数据类型 3 3存储器类型存储器类型例如例如:unsignedchardatabuffer;223存储器类型存储器类型取值范围data默认存储器类型,低1存存储类型的指定型的指定:变量或参数的存量或参数的存储类型可由型可由存存储模式模式指定缺省指定缺省类型型,也也可由关可由关键字字code、data、idata、xdata、pdata直接声明直接声明指定指定。例如:例如:unsignedchardatabuffer;databuffer;/没有指定数据没有指定数据类型型,默默认为int型型unsignedcharcodenumtab16=0 xC0,0 xF9,0 xA4,0 xB0,0 x99,0 x92,0 x82,0 xFB,0 x80,0 x90,0 x88,0 x83,0 xC6,0 xA1,0 x86,0 x8E;/定定义LED显示字模示字模(参参见137页)unsignedcharxdataarr1044;5.1.3 数据类型数据类型 3 3存储器类型存储器类型对变量定量定义格式:格式:数据数据类型型存存储器器类型型变量名表量名表;23存储类型的指定:5.1.3 数据类型 3存储器类型对5.1.3 数据类型数据类型 3.3.存储器类型存储器类型数据存数据存储类型的指定型的指定:变量变量或函数或函数参数参数存存储类型可由型可由存存储模式模式(Small,large,Compact)(OptionsforTargetTarget1.选项)指定缺指定缺省存省存储类型型;u在在small模模式式下下,函函数数参参数数和和局局部部变量量位位于于由由data定定义的的单片机片内数据片机片内数据RAM(007FH)中;中;u在在compact模模式式下下,函函数数参参数数和和局局部部变量量位位于于pdata定定义的的扩展数据展数据RAM中中(访问用用MOVXRi)。u在在large模模式式下下,函函数数参参数数和和局局部部变量量位位于于xdata定定义的的扩展数据展数据RAM中中(访问用用MOVXDPTR)数据数据存存储模式模式(Small,large,Compact)245.1.3 数据类型 3.存储器类型数据存储类型的指定:数4关于指关于指针数据数据类型型指指针变量的量的值是一个地址是一个地址,这个地址不个地址不仅可以是可以是变量量的地址的地址,也可以是其他数据也可以是其他数据结构的地址。构的地址。KeilC51编译器支持两种指器支持两种指针类型:型:一般指一般指针(GenericPointer)和和存存储器指器指针(MemorySpecificPointer,指定存指定存储区指区指针)。一般指一般指针的声明和使用均与的声明和使用均与标准准C相同相同,同同时还可可以以说明指明指针的的存存储类型型(见下下页)。char*s;/*stringptr*/int*numptr;/*intptr*/5.1.3 数据类型数据类型 4 4关于指针数据类型关于指针数据类型264关于指针数据类型5.1.3 数据类型 4关于指针一般指一般指针的声明和使用均与的声明和使用均与标准准C相同相同,同同时还可可以以说明指明指针的的存存储类型型。char*s;/*stringptr*/int*numptr;/*intptr*/可用可用存存储类型型标识符符指定一个指定一个通用指通用指针的存的存储区区如如:char*xdatastrptr;/*genericptrstoredinxdata*/int*datanumptr;/*genericptrstoredindata*/long*idatavarptr;/*genericptrstoredinidata*/这些例子指向可能保存在任何存些例子指向可能保存在任何存储区中的区中的变量量但是但是指指针分分别保存在保存在xdata、data和和idata中中。5.1.3 数据类型数据类型 4 4关于指针数据类型关于指针数据类型27一般指针的声明和使用均与标准C相同,同时还可以说明指针的一般指一般指针用用3个字个字节存放存放:存存储器器类型型,存存储器地址高器地址高8位位偏移量偏移量和和低低8位偏移量位偏移量。chardata*str;/str指向指向data区中区中char型数据型数据intxdata*pow;/pow指向指向外部外部RAM的的int型整数型整数这种指种指针存放存放时,只需只需1(或或2)个字个字节就就够了了,因只需存放偏移因只需存放偏移量。量。存储器存储器指针指针(指定存储区指针指定存储区指针),说明时即指定了说明时即指定了存储类型存储类型,例如例如:4.4.关于指针数据类型关于指针数据类型存储类型存储类型 Idata/data/bdata pdataxdataCode编码值编码值0 x000 xFE0 x010 xFF存放存放数据数据的存的存储器器类型型存储器类型是在存储器类型是在编译时编译时需要的需要的,既已指出既已指出,所以所以指针只需存偏移量即可指针只需存偏移量即可,参考参考:KeilHelp:Cx51CompilerUsersGuideLanguageExtensionsPointers28一般指针用3个字节存放:存储器类型,存储器地址高8位偏移5.1.3 数据类型数据类型 4.4.关于指针数据类型关于指针数据类型象象一般指一般指针一一样可指定一个可指定一个存存储器器指指针的的保存存保存存储区区,即在指即在指针声明前加存声明前加存储类型型标识符符,例如例如:unsignedcharxdata*pt;/pt本身本身依依存存储模式模式存放存放unsignedcharxdata*datapt;/pt被保存在被保存在内部内部RAM中中unsignedcharxdata*xdatapt;/pt被保存在被保存在外部外部RAM中中上面的上面的语句都声明句都声明pt为指向保存在指向保存在外部外部RAM中中unsignedchar数据数据的指的指针,但但pt本身本身的的保存位置保存位置却不同。却不同。存储器指针存储器指针295.1.3 数据类型 4.关于指针数据类型象一般指针一样运算符运算符是告是告诉编译程序程序执行特定算行特定算术或或逻辑操作操作的符号,的符号,表达式表达式则是由运算符及运算是由运算符及运算对象所象所组成的具成的具有特定含有特定含义的一个式子。的一个式子。在任意一个表达式的后面加一个分号在任意一个表达式的后面加一个分号“;”就构成就构成了一个了一个表达式表达式语句句。C51程序程序就是由多个表达式就是由多个表达式语句句构成的构成的语句集合。句集合。运算符可以分运算符可以分为赋值运算符运算符、算算术运算符运算符、关系关系运算符运算符、逻辑运算符运算符、位运算符位运算符、复合复合赋值运算符运算符、逗号运算符逗号运算符、条件运算符条件运算符、指、指针和地址运算符和地址运算符、强强制制类型型转换运算符运算符等。等。5.1.4 运算符和表达式运算符和表达式30运算符是告诉编译程序执行特定算术或逻辑操作的符号,表达式则是1赋值运算符运算符符号符号“=”为赋值运算符运算符,它的作用是将一个,它的作用是将一个数据的数据的值或表达式的或表达式的值赋给一个一个变量。利用量。利用赋值运算符将一个运算符将一个变量与一个表达式量与一个表达式连接起来的接起来的式子成式子成为赋值表达式表达式,在,在赋值表达式的后面加表达式的后面加一个分号一个分号“;”便构成了便构成了赋值语句句。5.1.4 运算符和表达式运算符和表达式 1 1赋值运算符赋值运算符311赋值运算符5.1.4 运算符和表达式 1赋值运算2算算术运算符运算符算算术运算符用于各运算符用于各类数数值运算。包括加运算。包括加(+)、)、减或取减或取负值(-)、乘()、乘(*)、除()、除(/)、取余(或称模)、取余(或称模运算,运算,%)、自增()、自增(+)、自减()、自减(-)共七种)共七种。在在除法运算除法运算中中,如果是两个整数相除,其,如果是两个整数相除,其结果果为整数,舍去小数部分整数,舍去小数部分。用算用算术运算符将运算运算符将运算对象象连接起来的式子就是接起来的式子就是算算术表达式表达式。5.1.4 运算符和表达式运算符和表达式 2 2算术运算符算术运算符322算术运算符5.1.4 运算符和表达式 2算术运算计算一个算算一个算术表达式的表达式的值时,要按照运算符的要按照运算符的优先先级高低高低顺序序进行行。算。算术运算符中,运算符中,取取负值(-)的)的优先先级最高,其次是乘法(最高,其次是乘法(*)、除法()、除法(/)和取余)和取余(%)运算符,加法()运算符,加法(+)和减法()和减法(-)运算符的)运算符的优先先级最低最低。需要。需要时,可在算,可在算术表达式中必要的地方采用表达式中必要的地方采用圆括号来改括号来改变优先先级,括号的括号的优先先级最高最高。在使用自增(在使用自增(+)运算符和自减()运算符和自减(-)运算符)运算符时,要注意运算符的位置。例如,要注意运算符的位置。例如,+i和和i+的意的意义完全不完全不同同,前者,前者为在使用在使用i之前先使之前先使i加加1,而后者,而后者则是在使用是在使用i之后再使之后再使i加加1。在。在实际应用中,尽可能使用后者的方用中,尽可能使用后者的方式,即式,即i+的形式。的形式。5.1.4 运算符和表达式运算符和表达式 2 2算术运算符算术运算符33计算一个算术表达式的值时,要按照运算符的优先级高低顺序进行。3关系运算符关系运算符关系运算符关系运算符用于比用于比较运算运算。包括。包括大于(大于()、小)、小于(于(=)、小于等于()、小于等于(=)、等于)、等于(=)和不等于()和不等于(!=)六种。六种。前四种关系运算符具有相同的前四种关系运算符具有相同的优先先级,后两种关,后两种关系运算符也具有相同的系运算符也具有相同的优先先级;但前四种的;但前四种的优先先级高高于后两种。用关系运算符将两个表达式于后两种。用关系运算符将两个表达式连接起来即构接起来即构成成关系表达式关系表达式。5.1.4 运算符和表达式运算符和表达式 3关系运算符关系运算符343关系运算符5.1.4 运算符和表达式 3关系运算4逻辑运算符运算符逻辑运算符包括运算符包括与(与(&)、或()、或(|)、非()、非(!)3种,种,用于用于对包含关系运算符的表达式(称包含关系运算符的表达式(称为条件)条件)进行合并或取非运算行合并或取非运算。关系运算符和关系运算符和逻辑运算符通常用来判运算符通常用来判别某个或某某个或某些条件是否些条件是否满足,条件足,条件满足足时结果果为1,条件不,条件不满足足时结果果为0。5.1.4 运算符和表达式运算符和表达式 4逻辑运算符逻辑运算符354逻辑运算符5.1.4 运算符和表达式 4逻辑运算与运算符(与运算符(&)表示)表示2个条件同个条件同时满足足时(即(即2个条件都个条件都为真真时),返回),返回结果才果才为真。真。或运算符(或运算符(|)用于)用于检查2个条件中是否有个条件中是否有1个个为真的运算符,只要有真的运算符,只要有1个条件个条件为真,运算真,运算结果就果就为真。真。逻辑非运算符(非运算符(!)表示)表示对表达式的表达式的值取反。取反。上述几种运算符的上述几种运算符的优先先级依次依次为(由高到低):(由高到低):逻辑非非算算术运算符运算符关系运算符关系运算符逻辑与与逻辑或。或。5.1.4 5.1.4 运算符和表达式运算符和表达式 4逻辑运算符逻辑运算符36与运算符(&)表示2个条件同时满足时(即2个条件都为真时)5位运算符位运算符语言提供了言提供了6种位运算符:种位运算符:按位与(按位与(&)、按位或()、按位或(|)、按位异或()、按位异或()、)、取反(取反()、左移()、左移()。位运算符的位运算符的优先先级从高到低依次从高到低依次为:按位取反按位取反()左移(左移()和右移()和右移()按位与(按位与(&)按位按位异或(异或()按位或(按位或(|)。5.1.4 运算符和表达式运算符和表达式 5位运算符位运算符其功能是参与运算的两数各其功能是参与运算的两数各对应的二的二进位位进行如下运算:行如下运算:375位运算符5.1.4 运算符和表达式 5位运算符(1)按位与运算)按位与运算按位与运算符按位与运算符“&”是双目运算符。其功能是参与是双目运算符。其功能是参与运算的两数各运算的两数各对应的二的二进位相与。只有位相与。只有对应的的2个二个二进位均位均为1时,结果位才果位才为1,否,否则为0。(2)按位或运算)按位或运算按位或运算符按位或运算符“|”是双目运算符。其功能是参与运是双目运算符。其功能是参与运算的两数各算的两数各对应的二的二进位相或。只要位相或。只要对应的的2个二个二进位位有有1个个为1时,结果位就果位就为1。5.1.4 运算符和表达式运算符和表达式 5位运算符位运算符38(1)按位与运算5.1.4 运算符和表达式 5位运算(3)按位异或运算)按位异或运算按位异或运算符按位异或运算符“”是双目运算符。其功能是参是双目运算符。其功能是参与运算的两数各与运算的两数各对应的二的二进位相异或。当位相异或。当2个个对应的二的二进位相异位相异时,结果果为1。(4)求反运算)求反运算求反运算符求反运算符“”为单目运算符,具有右目运算符,具有右结合性。其合性。其功能是功能是对参与运算的数的各二参与运算的数的各二进位按位求反。位按位求反。5.1.4 5.1.4 运算符和表达式运算符和表达式 5位运算符位运算符39(3)按位异或运算5.1.4 运算符和表达式 5(5)左移运算)左移运算左移运算符左移运算符“”是双目运算符。其功能把是双目运算符。其功能把“”左左边的运算数的各二的运算数的各二进位全部左移若干位,由位全部左移若干位,由“”是双目运算符。其功能是把是双目运算符。其功能是把“”左左边的运算数的各二的运算数的各二进位全部右移若干位,位全部右移若干位,“”右右边的数指的数指定移定移动的位数。的位数。对于有符号数,右移于有符号数,右移时,符号位将随同移,符号位将随同移动。当。当为正正数数时,最高位,最高位补0;为负数数时,符号位,符号位为1,最高位,最高位补1。5.1.4 运算符和表达式运算符和表达式 5位运算符位运算符40(5)左移运算5.1.4 运算符和表达式 5位运算符6复合复合赋值运算符运算符在在赋值运算符运算符“=”之前加上其他二目运算符之前加上其他二目运算符可构成复可构成复合合赋值运算符。构成复合运算符。构成复合赋值表达式的表达式的一般形式一般形式为:变量量双目运算符双目运算符=表达式表达式它等效于:它等效于:变量量=变量量运算符运算符表达式表达式复合复合赋值运算符有:运算符有:+=,-=,*=,=,%=,=,&=,=,=,|=。5.1.4 运算符和表达式运算符和表达式 6复合赋值运算符复合赋值运算符416复合赋值运算符5.1.4 运算符和表达式 6复合7逗号运算符逗号运算符逗号运算符用于把若干表达式逗号运算符用于把若干表达式组合成一个表达式合成一个表达式(称(称为逗号表达式)。程序运行逗号表达式)。程序运行时,对于逗号表达式的于逗号表达式的处理,是从左至右依次理,是从左至右依次计算出各个表达式的算出各个表达式的值,而整个,而整个逗号表达式的逗号表达式的值是最右是最右边表达式的表达式的值。例如:。例如:inta1,a2,b=2,c=7,d=5;/第1行a1=(+b,c-,d+3);/第2行,a1的值为8a2=+b,c-,d+3;/第3行,a2的值为45.1.4 运算符和表达式运算符和表达式 7逗号运算符逗号运算符427逗号运算符5.1.4 运算符和表达式 7逗号运8条件运算符条件运算符条件运算符条件运算符(?:)是一个三目运算符)是一个三目运算符,用于条件求用于条件求值。它要求有三个运算。它要求有三个运算对象,使用它可以将三个表达式象,使用它可以将三个表达式连接构成一个条件表达式。条件表达式的一般形式接构成一个条件表达式。条件表达式的一般形式为:逻辑表达式表达式?表达式?表达式1:表达式:表达式2其功能是,首先其功能是,首先计算算逻辑表达式的表达式的值,当当逻辑表达表达式的式的值为真(非真(非0值)时,将,将表达式表达式1的的值作作为整个条件整个条件表达式的表达式的值;当;当逻辑表达式的表达式的值为假(假(0值)时,将,将表表达式达式2的的值作作为整个条件表达式的整个条件表达式的值。5.1.4 运算符和表达式运算符和表达式 8条件运算符条件运算符438条件运算符5.1.4 运算符和表达式 8条件运9指指针和地址运算符和地址运算符变量的指量的指针就是就是该变量的地址量的地址,而存放而存放变量地址的量地址的变量称量称为指指针变量量。为表示指表示指针变量和它所指向的量和它所指向的变量地量地址之址之间的关系的关系,C语言有运算符言有运算符:取内容取内容(*)和和取地址取地址(&),其运算的一般形式分其运算的一般形式分别为:变量量=*指指针变量量指指针变量量=&目目标变量量取内容取内容(*)运算的含运算的含义是将指是将指针变量所指向的目量所指向的目标变量的量的值赋给等号(等号(=)左)左边的的变量量;取地址取地址(&)运算的含运算的含义是是将目将目标变量的地址量的地址赋给等号(等号(=)左)左边的指的指针变量量。5.1.4 运算符和表达式运算符和表达式 9指针和地址运算符指针和地址运算符44unsignedchar*txp;unsignedchartxbuffer50;txp=txbuffer;例例9指针和地址运算符5.1.4 运算符和表达式 9指使用指使用指针可以可以进行外部行外部扩展展I/O口的口的访问。在。在C51中中有两种方法有两种方法访问外部外部I/O端口。端口。方法方法1:使用自定:使用自定义指指针。由于由于片外片外I/O端口与片外存端口与片外存储器器统一一编址址,所以可以,所以可以定定义xdata类型的指型的指针访问外外部部I/O端口。端口。例如例如,某某单片机片机应用系用系统中中,使用使用8255(见第第1版版8.3节)扩展展I/O端口端口,采用采用线选法法对8255进行地址行地址译码,单片机片机的的P2.7(A15)接接8255的片的片选引脚引脚,因因8255的命令口地址的命令口地址为7FF3H,PA口地址口地址为7FF0H,PB口地址口地址为7FF1H,PC口口地址地址为7FFF2H。访问8255的的C程序如下:程序如下:5.1.4 运算符和表达式运算符和表达式 9指针和地址运算符指针和地址运算符458255因目前停产较少用因目前停产较少用,本版教材不再介绍本版教材不再介绍(用法用法见第见第1版版8.3节节)使用指针可以进行外部扩展I/O口的访问。在C51中有两种方法方法方法1:使用自定义指针访问外部扩展:使用自定义指针访问外部扩展I/O口口写端口程序:写端口程序:charxdata*com8255;/定定义指向外部存指向外部存储区区(片外片外I/O端口端口)的的指指针com8255=0 x7ff3;/使指使指针指向指向8255的的控制口控制口(命令口命令口)地址地址7FF3H*com8255=0 x81;/输出命令字出命令字81H到命令口寄存器到命令口寄存器/81H:PA,PB口都是模式口都是模式0,直接直接输出出,PC口直接口直接输入入以上以上C程序相当于下面的程序相当于下面的汇编语言程序:言程序:MOVDPTR,#7FF3HMOVA,#81HMOVXDPTR,A具体命令介绍见具体命令介绍见见第见第1版版8.3节节:并行接口扩展方法并行接口扩展方法,309页图页图8-5246方法1:使用自定义指针访问外部扩展I/O口写端口程序:具体命方法方法1:使用自定义指针访问外部扩展:使用自定义指针访问外部扩展I/O口口读端口程序:端口程序:charxdata*com8255;/定定义指指针chari;com8255=0 x7FF0;/使指使指针指向指向8255的的PA口地址口地址7FF0Hi=*com8255;/读PA端口内容到端口内容到变量量i47方法1:使用自定义指针访问外部扩展I/O口读端口程序:475.1.4 运算符和表达式运算符和表达式 9指针和地址运算符指针和地址运算符为了方便了方便访问外部存外部存储器及器及I/O端口端口,在在C51的的absacc.h头文件做了如下定文件做了如下定义,利用利用这些定些定义可以方便地可以方便地访问外外部部I/O端口。端口。#defineCBYTE(unsignedcharvolatilecode*)0)#defineDBYTE(unsignedcharvolatiledata*)0)#definePBYTE(unsignedcharvolatilepdata*)0)#defineXBYTE(unsignedcharvolatilexdata*)0)volatile修饰了的变量随程序的执行其值会被改变,“易变”方法方法2:使用:使用C51预定义指针访问外部扩展预定义指针访问外部扩展I/O口口485.1.4 运算符和表达式 9指针和地址运算符为了#defineXBYTE(unsignedcharvolatilexdata*)0)以以XBYTE为例介例介绍上述宏定上述宏定义使用方法使用方法,XBYTE使用格式使用格式:XBYTE地址地址方法方法2:使用:使用C51预定义指针访问外部扩展预定义指针访问外部扩展I/O口口例如:例如:#include#definePORTAXBYTE0 x7ff0/其中其中,PORTA为程序定程序定义的的I/O端口名称端口名称,内的内容内的内容/7ff0H为PORTA的地址的地址voidmain(void)chara;PORTA=0 x81;/*输出出81H到端口到端口7ff0Ha=PORTA;/读端口端口7ff0H到到变量量a定定义XBYTE数数组的首地址是的首地址是0XBYTE0 x7ff0的中括号内的的中括号内的值值0 x7ff0,指出了指出了(定义定义)数组数组XBYTE首地址的首地址的偏移地址偏移地址49#define XBYTE(unsigned char 10强强制制类型型转换运算符运算符强强制制类型型转换运算符的作用是将表达式或运算符的作用是将表达式或变量的量的类型型强强制制转换成成为括号内所指定的括号内所指定的类型。型。强强制制类型型转换运算符的一般使用形式运算符的一般使用形式为:变量量=(类型)型)表达式表达式如如:pxdata=(charxdata*)0 x3000;/pxdata为在在xdata中中定定义的的char类型指型指针变量量5.1.4运算符和表达式运算符和表达式 10强制类型转换运算符强制类型转换运算符5010强制类型转换运算符5.1.4 运算符和表达式 10表达式表达式语句是最基本的一种句是最基本的一种语句。在表达式的句。在表达式的后面加一个分号后面加一个分号“;”就构成了表达式就构成了表达式语句。句。表达式表达式语句也可以句也可以仅由一个分号由一个分号“;”构成,构成,这种种语句称句称为空空语句。空句。空语句不句不执行具体的行具体的动作。程作。程序序设计时,有,有时需要用到空需要用到空语句。例如,使用循句。例如,使用循环语句延句延时程序中的循程序中的循环体内可以使用空体内可以使用空语句。句。5.2 Keil C515.2 Keil C51程序的语句程序的语句5.2.1 5.2.1 表达式语句表达式语句51表达式语句是最基本的一种语句。在表达式的后面加一个分号“;”条件条件语句又称句又称为分支分支语句,使用关句,使用关键字字“if”构成。构成。C51提供了三种形式的条件提供了三种形式的条件语句句。1if(条件表达式)(条件表达式)语句体;句体;5.2.2 5.2.2 条件语句条件语句522if(条件表达式)(条件表达式)语句体句体1;else语句体句体2;条件语句又称为分支语句,使用关键字“if”构成。C51提供3.if(条件表达式(条件表达式1)语句体句体1;elseif(条件表达式(条件表达式2)语句体句体2;elseif(条件表达式(条件表达式m)语句体语句体m;Else语句体语句体n;5.2.2 5.2.2 条件语句条件语句533.if(条件表达式1)5.2.2 条件语句5开关开关语句也是一种用来句也是一种用来实现多条件分支的多条件分支的语句。句。case常量表达式常量表达式n:语句体语句体n;break;default:语句体语句体d5.2.3 5.2.3 开关语句开关语句54switch(表达式)(表达式)case常量表达式常量表达式1:语句体句体1;break;case常量表达式常量表达式2:语句体句体2;break;开关语句也是一种用来实现多条件分支的语句。5.2.3 1while语句句利用利用while语句构成循句构成循环结构的一般形式如下:构的一般形式如下:while(条件表达式)(条件表达式)语句体;句体;5.2.4 5.2.4 循环语句循环语句552do-while语句句采用采用do-while语句构成循句构成循环结构的一般形式如下:构的一般形式如下:do语句体;句体;while(条件表达式);(条件表达式);1while语句5.2.4 循环语句552do-wh3for语句句采用采用for语句构成循句构成循环结构的一般形式如下:构的一般形式如下:for(初初值设定表达式定表达式;循循环条件表达式条件表达式;更新表达式更新表达式)语句体;句体;5.2.4 5.2.4 循环语句循环语句563for语句5.2.4 循环语句56goto语句句是一个无条件是一个无条件转向向语句,其一般形式句,其一般形式为:goto语句句标号号;break语句句也可以用于跳出循也可以用于跳出循环语句,其一般形式句,其一般形式为:break;continue是一种中断是一种中断语句,其功能是中断本次循句,其功能是中断本次循环,继续下一次循下一次循环,一般形式,一般形式为:continue;return语句句用于用于终止函数的止函数的执行,并控制程序返回到行,并控制程序返回到调用用该函数的位置。一般形式函数的位置。一般形式为:(1)return(表达式表达式);(2)return;5.2.5goto、break、continue和和return语句语句57goto语句是一个无条件转向语句,其一般形式为:5.2.5两种两种函数函数:KeilC51定定义的的标准准库函数和用函数和用户自定自定义函数。函数。5.3.1 5.3.1 函数的定义与调用函数的定义与调用5.3函数函数58函数定函数定义的一般形式的一般形式为:函数返回函数返回值类型型函数名函数名(形式参数表形式参数表)局部局部变量定量定义函数体函数体语句句函数函数调用的一般形式用的一般形式为:变量量=函数名函数名(实际参数表参数表)两种函数:Keil C51定义的标准库函数和用户自定义函数5.3.2KeilC51函数函数C51的函数声明的函数声明对ANSIC作了作了扩展,具体包括:展,具体包括:1、中断函数声明、中断函数声明中断函数通中断函数通过使用使用interrupt关关键字和字和中断号中断号(031)来声明。来声明。中断号告中断号告诉编译器中断服器中断服务程序入口地址。程序入口地址。IAP15W4K58S4单片机的单片机的中断号及中断号及中断服务程序入口地址中断服务程序入口地址如如表表5-3 中断号中断号中断源中断源入口地址入口地址中断号中断号中断源中断源入口地址入口地址0外部中断外部中断INT00003H11外部中断外部中断INT3005BH1T0溢出中断溢出中断000BH12T2溢出中断溢出中断0063H2外部中断外部中断INT10013H16外部中断外部中断INT40083H3T1溢出中断溢出中断001BH17串口串口3中断中断008BH4串行口串行口UART1中断中断 0023H18串口串口4中断中断0093H5ADC中断中断002BH19T3溢出中断溢出中断009BH6LVD中断中断0033H20T4溢出中断溢出中断3H7PCA中断中断003BH21比较器中断比较器中断00ABH8串行口串行口UART2中断中断 0043H22PWM中断中断00B3H9SPI中断中断004BH23PWM异常检测中断异常检测中断00BBH10外部中断外部中断INT20053H595.3.2 Keil C51函数C51的函数声明对ANSI中断服中断服务函数的一般形式函数的一般形式为:void函数名函数名(void)interrupt中断号中断号usingn中断函数通中断函数通过使用使用interrupt关关键字和字和中断号中断号来声明。来声明。中断号中断号告告诉编译器中断服器中断服务程序的入口地址程序的入口地址。也就是。也就是说,C51通通过中断号中断号来区分各个不同的中断来区分各个不同的中断,而,而与中断与中断函数的名字无关函数的名字无关。其中其中usingn用于用于选择单片机不同的片机不同的寄存器寄存器组,n为03的常整型数的常整型数,分分别选中中4个不同寄存器个不同寄存器组中的一个中的一个。Using是一个可是一个可选项,可以不用。不用,可以不用。不用时,由,由编译器自器自动选择一个寄存器一个寄存器组。60/785.3.2KeilC51函数函数1、中断函数声明、中断函数声明中断服务函数的一般形式为:60/785.3.2 Keil 5.3.2KeilC51函数函数1、中断函数声明、中断函数声明例如,例如,串行口串行口1的中断函数的中断函数(4号中断号中断)可以声明如下:可以声明如下:voidUART1_ISR(void)interrupt4using1/*中断服中断服务程序的代程序的代码*/上述代上述代码声明了串行口声明了串行口1中断服中断服务函数。其中函数。其中,interrupt4指明是串行口指明是串行口1的中断的中断,using1指明采用工作指明采用工作寄存器区寄存器区1区区,using1在中括号中在中括号中,说明明该部分可省略。部分可省略。其他中断函数的定其他中断函数的定义与此与此类似。似。中断函数具体是哪个中中断函数具体是哪个中断的函数断的函数,与中断号有关与中断号有关,而与函数名而与函数名(如如UART1_ISR)无关无关,但一般但一般赋予与相予与相应中断相符合的名称。中断相符合的名称。无输入参数无输入参数无返回参数无返回参数615.3.2 Keil C51函数 1、中断函数5.3.2KeilC51函数函数2、指定存储模式、指定存储模式用用户可以使用可以使用small,compact及及large说明明存存储模式模式。例如:例如:voidfun1(void)small提示:提示:small说明的函数内部明的函数内部变量全部使用内部量全部使用内部RAM。关关键的、的、经常性的、耗常性的、耗时的地方可以的地方可以这样声明,以提声明,以提高运行速度。高运行速度。2、指定存储模式、指定存储模式65用用compact说明明时,函函数数参参数数和和局局部部变量量位位于于pdata定定义的的扩展数据展数据RAM中。中。用用large说明明时,函函数数参参数数和和局局部部变量量位位于于xdata定定义的的扩展数据展数据RAM中。中。5.3.2 Keil C51函数2、指定存储模式用户可5.3.2KeilC51函数函数3、函数的重入、函数的重入一个一个可重入函数可重入函数,简单来来说,就是就是可以被中断的函数可以被中断的函数,即即可以在可以在这个函数个函数执行的任何行的任何时刻中断它刻中断它,可重入函数可重入函数可可以被以被递归调用用。递归或可重入函数或可重入函数在在单片机系片机系统中容易中容易产生生问题,因因为单片机和片机和PC不同不同,PC使用使用(调用用)堆堆栈传递参数参数,且静且静态变量以外的内部量以外的内部变量都在堆量
展开阅读全文
相关资源
相关搜索

最新文档


当前位置:首页 > 办公文档 > 教学培训


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

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


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