




已阅读5页,还剩143页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
12.05.2020,1,.,单片机原理与接口技术,太原理工大学,电子工业出版社,第5章MCS-51单片机C51程序设计,制作张兴忠修审牛昱光,12.05.2020,2,.,熟悉C51语法基础和程序结构;掌握C51结构化程序设计;掌握C51对单片机硬件的访问方法;掌握C51函数定义与调用;了解汇编语言和C51的混和编程。,本章教学要求,第5章MCS-51单片机C51程序设计,12.05.2020,3,.,5.1C51概述5.2C51语法基础5.2.1标识符和关键字5.2.2数据类型5.2.3运算符和表达式5.2.4程序结构,第5章MCS-51单片机C51程序设计,本章目录,5.3C51对MCS-51单片机的访问5.3.1存储类型5.3.2存储模式5.3.3对特殊功能寄存器的访问5.3.4对存储器和并行口的访问5.3.5位地址访问,12.05.2020,4,.,5.4C51函数5.4.1函数的分类5.4.2函数的定义5.4.3函数的调用5.4.4对被调函数的说明5.4.5中断函数5.5C51结构化程序设计5.5.1顺序结构程序5.5.2选择结构程序,第5章MCS-51单片机C51程序设计,本章目录,5.5.3循环结构程序5.5.4查表程序5.6C51程序设计实例5.6.1单片机内/外部资源应用程序设计5.6.2C51语言和MCS-51汇编语言混合编程5.6.3编程优化的概念习题与思考题,12.05.2020,5,.,5.1C51概述,C语言是一种通用的程序设计语言,其代码率高,数据类型及运算符丰富,位操作能力强,适用于各种应用的程序设计。使用C语言进行单片机应用系统开发,具有编程灵活、调试方便、目标代码编译效率高的特点。C语言也是目前使用最广的单片机应用系统编程语言。由C语言编程的单片机应用程序,称为单片机C语言程序。MCS-51系列单片机开发系统的编译软件可以对51单片机C语言源程序进行编译,称为C51编译器。在C51编译软件中可进行51单片机C语言程序的调试。,-C51编译器,12.05.2020,6,.,1)扩展了专门访问MCS-51单片机硬件的数据类型;2)存储类型按MCS-51单片机存储空间分类;3)存储模式遵循存储空间选定编译器模式;4)指针分为通用指针和存储器指针;5)函数增加了中断函数和再入函数。,5.1C51概述,-C51特点,C51编译器针对MCS-51单片机硬件在下列几方面对ANSIC进行了扩展。,12.05.2020,7,.,使用具有C51编译扩展功能的C语言进行MCS-51单片机应用系统的开发编程,简称C51编程。C51编程具有以下特点。1)可管理内部寄存器和存储器的分配,编程时,无需考虑不同存储器的寻址和数据类型等细节问题;2)程序由若干函数组成,具有良好的模块化结构、可移植性好、便于项目维护管理;3)有丰富的子程序库可直接引用,从而大大减少用户编程工作量,提高编程效率;4)与汇编语言交叉编程。用汇编语言编写与硬件有关的程序,用C51编写与硬件无关的运算程序,充分发挥两种语言的长处,提高开发效率。,5.1C51概述,-C51特点,12.05.2020,8,.,C51编程和汇编语言编程过程一样。单片机C语言源程序经过编辑、编译、连接后生成目标程序(.BIN和.HEX)文件,然后运行即可。调试51单片机C语言程序可用KeilC51编译器。注意,使用C51编程可以取代繁琐的汇编语言编程,但仍需要了解MCS-51单片机的硬件结构。所以对于单片机系统的开发应采用汇编语言与C51混合编程的方法更为有效。,5.1C51概述,-C51特点,12.05.2020,9,.,5.2C51语法基础,标识符用来标识源程序中某个对象的名字,这些对象可以是语句、数据类型、函数、变量、数组等。标识符由字符串、数字和下划线等组成,应该注意的是第一个字符必须是字母或下划线,不能用数字开头,如“1_a”是错误的,编译时会有错误提示。在C51编译器中,只支持标识符的前32位为有效标识。C51语言是区分大小写的一种高级语言,如“a_1”和“A_1”是两个完全不同的标识符。,5.2.1标识符和关键字,-标识符,12.05.2020,10,.,C51中有些库函数的标识符是以下划线开头的,所以一般不要以下划线开头命名用户自定义标识符。标识符在命名时应当简单,含义清晰,这样有助于阅读理解程序。关键字则是编程语言保留的特殊标识符,它们具有固定的名称和含义,在程序编写中不允许将关键字另做他用。C51中的关键字除了有ANSIC标准的32个关键字外,还根据MCS-51单片机的特点扩展了相关的关键字。C51关键字如表5-1所示。在C51的文本编辑器中编写C程序,系统可以把保留关键字以不同颜色显示,如int关键字的默认颜色为天蓝色。,5.2.1标识符和关键字,-关键字,12.05.2020,11,.,5.2.1标识符和关键字,-关键字列表,12.05.2020,12,.,5.2.1标识符和关键字,-关键字列表,12.05.2020,13,.,5.2.1标识符和关键字,-关键字列表,12.05.2020,14,.,5.2.2数据类型,C51具有ANSIC的所有标准数据类型。其基本数据类型包括:char、int、short、long、float和double。对C51编译器来说,short类型和int类型相同,double类型和float类型相同。,-C51的数据类型,12.05.2020,15,.,除此之外,为了更加有利地利用MCS-51的结构,C51还增加了一些特殊的数据类型,包括bit、sbit、sfr、sfr16。数据类型如表5-2所示。,5.2.2数据类型,-C51的数据类型,12.05.2020,16,.,char类型的长度是1B,通常用于定义处理字符数据的变量或常量。unsignedchar类型用字节中所有的位表示数值,可以表达的数值范围是0255。signedchar类型用字节中最高位表示数据的符号,0表示正数,1表示负数,负数用补码表示,能表示的数值范围是-128+127。unsignedchar常用于处理ASCII字符或用于处理小于或等于255的整型数。,1char字符类型,5.2.2数据类型,-char字符类型,12.05.2020,17,.,2int整型,int整型长度为2B,用于存放一个双字节数据。signedint表示的数值范围是-32768+32767,字节中最高位表示数据的符号,0表示正数,1表示负数。unsignedint表示的数值范围是065535。,5.2.2数据类型,-int整型,12.05.2020,18,.,long长整型长度为4B,用于存放一个四字节数据。分有符号long长整型signedlong和无符号long长整型unsignedlong,默认值为signedlong类型。signedint表示的数值范围是-2147483648+2147483647,字节中最高位表示数据的符号,0表示正数,1表示负数。unsignedlong表示的数值范围是04294967295。,3long长整型,5.2.2数据类型,-long长整型,12.05.2020,19,.,4float浮点型,float浮点型在十进制中具有7位有效数字,是符合IEEE-754标准(32)的单精度浮点型数据,占用4B。具有24位精度。,5.2.2数据类型,-float浮点型,12.05.2020,20,.,5*指针型,指针型本身就是一个变量,在这个变量中存放着指向另一个数据的地址。这个指针变量要占据一定的内存单元,对不同的处理器长度也不尽相同,在C51中它的长度一般为13个字节。,5.2.2数据类型,-*指针型,12.05.2020,21,.,bit位标量是C51编译器的一种扩充数据类型,利用它可定义一个位标量。它的值是一个二进制位,不是0,就是1,类似一些高级语言中的boolean型数据的True和False。,6bit位标量,5.2.2数据类型,-bit位标量,12.05.2020,22,.,7sfr特殊功能寄存器,sfr是一种C51扩充数据类型,占用一个内存单元,值域为0255。利用它可以访问MCS-51单片机内部的所有特殊功能寄存器。如用sfrP1=0 x90定义一个特殊功能寄存器变量“P1”,0 x90是指51单片机的P1端口地址90H,变量P1即指51单片机的P1端口。在后面的语句中可以用P1=255(对P1端口的所有引脚置高电平)之类的语句操作特殊功能寄存器。,5.2.2数据类型,-sfr特殊功能寄存器,12.05.2020,23,.,8.sfr1616位特殊功能寄存器,sfr16也是一种C51扩充数据类型,用于定义存在于MCS-51单片机内部RAM的16位特殊功能寄存器,如定时器T0和T1。sfr16型数据占用2个内存单元,取值范围为065535。,5.2.2数据类型,-16位特殊功能寄存器,12.05.2020,24,.,sbit也是一种C51扩充数据类型,利用它可以访问芯片内部RAM中的可寻址位或特殊功能寄存器中的可寻址位。定义方法有如下三种:(1)sbit位变量名=位地址将位的绝对地址赋给位变量,位地址必须位于80HFFH(特殊功能寄存器的位地址)之间。,9sbit可寻址位,5.2.2数据类型,-sbit可寻址位,12.05.2020,25,.,(2)sbit位变量名=特殊功能寄存器名位位置当可寻址位位于特殊功能寄存器中时,可采用这种方法。位位置是一个07之间的常数。(3)sbit位变量名=字节地址位位置这种方法是以一个常数(字节地址)作为基地址,该常数必须在80HFFH(特殊功能寄存器的字节地址)之间。位位置是一个07之间的常数。,9sbit可寻址位,5.2.2数据类型,-sbit可寻址位,12.05.2020,26,.,MCS-51单片机中的特殊功能寄存器及其可寻址位,已被预先定义放在文件reg51.h中,在程序的开头只需加上#include或#include即可。另外,bit还可访问MCS-51单片机片内20H2FH范围内的位对象。C51编译器提供了一个bdata存储器类型,允许将具有bdata类型的对象放入MCS-51单片机片内可位寻址区。,5.2.2数据类型,-reg51.h,12.05.2020,27,.,sbit和bit的区别:sbit定义特殊功能寄存器中的可寻址位;而bit则定义了一个普通的位变量,一个函数中可包含bit类型的参数,函数返回值也可为bit类型。,5.2.2数据类型,-sbit和bit,12.05.2020,28,.,5.2.3运算符和表达式,C51算术运算符有五种。+加法运算符或正号-减法运算符或负号*乘法运算符/除法运算符%模(求余)运算符优先级:先乘除,后加减,先括号内,再括号外。结合性:自左至右方向。模运算即求余数,如7%3,结果是7除以3所得余数1。,1C51的算术运算符,-算术运算符,12.05.2020,29,.,C51关系运算符有六种。大于=大于等于=相等!=不相等优先级:前四个高,后两个“=”和“!=”级别低。结合性:自左至右方向。关系表达式的结果是逻辑值“真”或“假”,C51中以“1”代表真,“0”代表假。,2C51关系运算符,5.2.3运算符和表达式,-关系运算符,12.05.2020,30,.,C51逻辑运算符有三种。/*在MCS-51片内直接寻址RAM中定义了3个变量,默认为自动变量*/chari,j,k;/*未指明存储类型,由#pragmasmall决定,与前一句完全等价*/intxdatam,n;/*在MCS-51片外RAM中定义了两个自动变量*/staticcharm,n;/*在MCS-51片内直接寻址RAM中定义了两个静态变量*/unsignedcharxdataram10;/*在MCS-51片外RAM中定义了大小为10B的数组变量*/,-【例5-1】变量和函数的存储模式设置,12.05.2020,48,.,5.3.2存储器模式,intfunc1(inti,intj)large/*指定函数中变量是LARGE模式*/return(i+j);intfunc2(inti,intj)/*未指明存储模式,按默认的SMALL模式*/return(i-j);,-【例5-1】变量和函数的存储模式设置,12.05.2020,49,.,5.3.3特殊功能寄存器的访问,MCS-51系列单片机片内有21个特殊功能寄存器(SFR),分散在片内RAM区的0 x800 xFF地址范围内。对SFR的操作只能用直接寻址方式。为了能直接访问这些特殊功能寄存器,C51提供了定义sfr的方法。这与ANSIC不兼容,只适用于MCS-51系列单片机。,-定义sfr的方法,12.05.2020,50,.,-1sfr数据类型,特殊功能寄存器数据类型来实现。定义特殊功能寄存器名的语法如下:sfr特殊功能寄存器名=整型常量;,5.3.3特殊功能寄存器的访问,1sfr数据类型,12.05.2020,51,.,-1sfr数据类型,5.3.3特殊功能寄存器的访问,sfrPSW=0 xD0;/*定义程序状态字PSW,因MCS-51单片机的PSW地址为D0H*/sfrTMOD=0 x89;/*定义定时/计数器方式控制寄存器TMOD,因MCS-51单片机的TMOD地址为89H*/sfrP1=0 x90;/*定义P1口,因MCS-51单片机的P1口地址为90H*/sfrSCON=0 x98;/*定义串口控制寄存器SCON,因MCS-51单片机的SCON地址为8H*/,12.05.2020,52,.,2用sbit数据类型访问可位寻址的特殊功能寄存器中的位,MCS-51系列单片机片内21个特殊功能寄存器(SFR)中有11个特殊功能寄存器是可位寻址的。访问这些可位寻址的特殊功能寄存器中的位的方法可由关键字sbit定义特殊功能寄存器位寻址数据类型来实现。定义特殊功能寄存器位名的语法有下列三种:sbit特殊功能寄存器位名=特殊功能寄存器名整型常量其中,特殊功能寄存器名是已由sfr定义了的特殊功能寄存器名,整型常量是位可寻址特殊功能寄存器中的位(是一个07之间的常数)。,5.3.3特殊功能寄存器的访问,-2sbit数据类型,12.05.2020,53,.,sbit特殊功能寄存器位名=整型常量1整型常量2其中,整型常量1是指可位寻址特殊功能寄存器的字节地址(在80HFFH之间),整型常量2是指该寄存器中的位(是一个07之间的常数)。sbit特殊功能寄存器位名=整型常量其中,整型常量是可位寻址特殊功能寄存器的绝对位地址(位于80HFFH之间)。,5.3.3特殊功能寄存器的访问,-定义方法,12.05.2020,54,.,标准SFR在reg51.h、reg52.h等头文件中已经被定义,只要用文件包含做出申明即可使用。,5.3.3特殊功能寄存器的访问,sfrPSW=0 xD0;/*首先定义程序状态字PSW,因MCS-51单片机的PSW地址为D0H*/sbitOV=PSW2;/*在前面定义了PSW后,OV位于PSW的第2位*/sbitAC=0 xD06;/*D0H是程序状态字PSW的字节地址,辅助进位标志位AC位于PSW的第6位*/sbitRS0=0 xD03;/*工作寄存器组控制位RS0位于PSW的第3位*/sbitCY=0 xD7;/*进位标志位Cy的绝对位地址为D7H*/,-实例,12.05.2020,55,.,例5-2特殊功能寄存器的访问。,#include”reg51.h”sbitP10=P10;/*定义P10为P1口第0位,即P1.0口*/sbitP12=P12;/*定义P12为P1口第2位,即P1.2口*/voidmain()P10=1;/*置位P1.0口*/P12=0;/*复位P1.2口*/PSW=0 x08;/*程序状态字置0 x08*/,5.3.3特殊功能寄存器的访问,-应用实例,12.05.2020,56,.,5.3.4存储器和并行口的访问,MCS-51单片机片内有128个字节的RAM区(00H7FH),可扩展片外64KB的ROM和RAM,有P0、P1、P2、P3四个8位双向并行I/O口,每个端口可以按字节输入或输出,也可以按位进行输入或输出,四个口共32根口线。使用C51编程时,片内/外存储器、片内I/O口与片外扩展I/O口可以统一在头文件中定义,也可以在程序中进行定义(一般在程序开始的位置)。C51定义存储器、并行口方法如下。,-在头文件中定义,12.05.2020,57,.,1对存储器使用绝对地址访问,C51编译器提供了一组宏定义用来对MCS-51系列单片机的CODE、DATA、PDATA和XDATA空间进行绝对地址访问。函数原型如下:#defineCBYTE(unsignedcharvolatile*)0 x50000L)#defineDBYTE(unsignedcharvolatile*)0 x40000L)#definePBYTE(unsignedcharvolatile*)0 x30000L)#defineXBYTE(unsignedcharvolatile*)0 x20000L)#defineCWORD(unsignedintvolatile*)0 x50000L)#defineDWORD(unsignedintvolatile*)0 x40000L)#definePWORD(unsignedintvolatile*)0 x30000L)#defineXWORD(unsignedintvolatile*)0 x20000L)这些函数原型放在absacc.h文件中。,5.3.4存储器和并行口的访问,-绝对地址访问,12.05.2020,58,.,CBYTE以字节形式对CODE区寻址,DBYTE以字节形式对DATA区寻址,PBYTE以字节形式对PDATA区寻址,XBYTE以字节形式对XDATA区寻址,CWORD以字形式对CODE区寻址,DWORD以字形式对DATA区寻址,PWORD以字形式对PDATA区寻址,XWORD以字形式对XDATA区寻址。,5.3.4存储器和并行口的访问,-绝对地址访问,12.05.2020,59,.,例5-3使用绝对地址访问存储器,#include#include#defineuintunsignedint#defineucharunsignedcharvoidmain(void)uintui_var1;ucharuc_var1;,5.3.4存储器和并行口的访问,-绝对地址访问,12.05.2020,60,.,例5-3使用绝对地址访问存储器,ui_var1=XWORD0 x0000;/*访问外部RAM的0000H0001H地址的内容*/uc_var1=XBYTE0 x0002;/*访问外部RAM的0002H地址的内容*/XWORD0 x0000=0 xAABB;/*将0 xAABB送入外部RAM的0000H0001H地址中*/XBYTE0 x0002=0 xAA;/*将0 xAA送入外部RAM的0002H地址中*/for(;);,5.3.4存储器和并行口的访问,-绝对地址访问,12.05.2020,61,.,2对存储器使用指针访问,例5-4使用指针访问存储器。#defineucharunsignedchar#defineuintunsignedintvoidtest_memory(void)ucharidataivar1;/*定义一个指向idata存储空间的变量*/ucharxdata*xdp;/*定义一个指向XDATA存储器空间的指针*/chardata*dp;/*定义一个指向DATA存储器空间的指针*/,采用指针的方法,可实现在C51程序中对任意指定的存储器地址进行操作。,5.3.4存储器和并行口的访问,-指针访问,12.05.2020,62,.,ucharidata*idp;/*定义一个指向IDATA存储器空间的指针*/xdp=0 x1000;/*XDATA指针赋值,指向XDATA存储器地址1000H处*/*xdp=0 x5A;/*将数据5AH送到XDATA区的1000H单元*/dp=0 x61;/*DATA指针赋值,指向DATA存储器地址61H处*/*dp=0 x23;/*将数据23H送到DATA区的61H单元*/idp=/*数据16H送到IDATA区的变量ivar1所在的地址单元中,等价于ivar1=0 x16*/,5.3.4存储器和并行口的访问,-指针访问,12.05.2020,63,.,3C51定义片内I/O口,单片机内部并行口可用关键字sfr定义,I/O口定义格式举例:sfrP0=0 x80;/*定义P0口,地址80H*/sfrP1=0 x90;/*定义P1口,地址90H*/,5.3.4存储器和并行口的访问,-sfr定义片内I/O,12.05.2020,64,.,-例5-5操作片内I/O口,sfrP1=0 x90;/*定义P1口,地址90H*/sfrP3=0 xB0;/*定义P3口,地址B0H*/sbitDIPswitch=P14;/*P1口第4位(P1.4口)为DIP开关的输入*/sbitLEDgreen=P35;/*P3口第5位(P3.5口)为LED的输出*/voidmain()unsignedcharinval=0;for(;)if(DIPswitch=1)/*检查P1.4口输入是否为高*/inval=P1/*P1口03位输出与P3口的03位相或输出*/,5.3.4存储器和并行口的访问,12.05.2020,65,.,4C51定义外部并行口,对片外扩展的I/O口,则根据其硬件译码地址,将其看作片外数据存储器的一个单元,使用#define语句进行定义。用指针定义,指针的定义在absacc.h头文件中。,5.3.4存储器和并行口的访问,-#define语句定义片外I/O,12.05.2020,66,.,-例5-6操作片外I/O口,#include“absacc.h”#definePAXBYTE0 xffec/*将PA定义为外部I/O口,地址为0 xffec*/voidmain()PA=0 x5A;/*将数据5AH写入地址为0 xffec的存储单元或I/O端口*/,5.3.4存储器和并行口的访问,12.05.2020,67,.,-例5-6操作片外I/O口,在头文件或程序中对片内/外I/O口进行定义以后,在程序中就可以使用这些口了。定义口地址的目的是为了便于C51编译器按MCS-51单片机系统的实际硬件结构建立I/O口变量名与其实际地址的联系,以便程序员能用软件模拟MCS-51单片机系统的硬件操作。,5.3.4存储器和并行口的访问,12.05.2020,68,.,5.3.5位地址访问,C51对位变量的定义有3种方法:1用bit关键字定义C51位变量例如:bitlock;/*将lock定义为位变量*/bitdirention;/*将direction定义为位变量*/bitdisplay;/*将display定义为位变量*/注意:不能定义位变量指针;也不能定义位变量数组。,-对位变量的定义,12.05.2020,69,.,例如:bitfun(bita1,bita2)return(a1);,5.3.5位地址访问,2函数可包含bit的参数和返回值,-函数的定义,12.05.2020,70,.,3可位寻址存储区的位变量定义,C51编译器允许数据类型为bdata的变量放入片内RAM可位寻址区中。例如:先定义变量的数据类型和存储类型,然后使用sbit定义位变量。bdataintibdata;/*ibdata定义为bdata整型变量*/bdatacharcarry5;/*carry定义为bdata字符数组*/sbitmybit0=ibdata0;/*mybit0定义为ibdata的第0位*/sbitmybit15=ibdata15;/*mybit15定义为ibdata的第15位*/,5.3.5位地址访问,12.05.2020,71,.,3可位寻址存储区的位变量定义,sbitarrybit07=carry07;/*arrybit07定义为carry0的第7位*/sbitarrybit37=carry37;/*arrybit37定义为carry3的第7位*/arrybit37=0;/*carry3的第7位赋值为0(位寻址)*/carry0=A;/*carry0赋值为A(字节寻址)*/位置(操作符)后的最大值取决于指定的基本数据类型。对于char而言是07;对于int而言是015;对于long而言是031。,5.3.5位地址访问,12.05.2020,72,.,5.4C51函数,C51程序是由一个个函数构成的,在构成C51程序的若干个函数中,必须有一个主函数main(),主函数可根据需要来调用其它函数。同一个函数可以在不同的地方被调用。,12.05.2020,73,.,5.4.1函数的分类,从用户使用角度划分,函数分为库函数和用户自定义函数。库函数是编译系统为用户设计的一系列标准函数,用户只需调用,而无需自己去编写这些复杂的函数。在调用前要先使用#include包含命令包含和该函数有关的头文件,然后才能调用。如前面所用到的头文件reg51.h等,每一种头文件中包括一系列函数。,12.05.2020,74,.,用户自定义函数是用户根据任务编写的函数。从函数定义形式上可划分为三种:无参函数、有参函数和空函数。无参函数:函数中无参数定义,该函数调用时无参数传递。有参函数:函数中定义形式参数。在调用函数时,实际参数值传递给形式参数,调用后返回结果给调用它的函数使用。空函数:函数中无参数,也无语句。该函数可以调用但没有任何功能,该函数是为了开发程序时将一些非基本模块的功能函数定义成空函数,先占好位置,以后再用编好的函数替换它。,5.4.1函数的分类,-无参函数、有参函数和空函数,12.05.2020,75,.,5.4.2函数的定义,函数类型函数名()函数体语句如果函数没有返回值,可以将返回值类型设为void,函数以“”开始,以“”结束。,1无参函数的定义,-函数的定义,12.05.2020,76,.,例5-7无参函数的定义与调用。#includevoidfun1()printf(“ThisisaC51Programn”);voidmain()fun1();,5.4.2函数的定义,-函数的定义,12.05.2020,77,.,2有参函数的定义,函数类型函数名(形式参数表列)函数体语句return(返回形参名)其中形式参数表列的各项要用,隔开,通过return语句将需返回的值返回给调用函数。,5.4.2函数的定义,-函数的定义,12.05.2020,78,.,voidfun2(inta,intb)intsum;sum=a+b;returnsum;voidmain()intx=123,y=456,sum;sum=fun2(x,y);,5.4.2函数的定义,例5-8有参函数的定义与调用。,12.05.2020,79,.,3空函数的定义,函数类型函数名()函数可以将返回值类型设为void。例5-9空函数的定义与调用。voidfun3()voidmain()fun3();,5.4.2函数的定义,12.05.2020,80,.,5.4.3函数的调用,函数名(实际参数表列);函数的调用方式有三种:1)把被调函数作为主调函数中的一个语句。例如fun1();2)把被调函数作为表达式的一个运算对象。例如sum=2*fun2(x,y);3)把被调函数作为另一个函数的参数。例如printf(“sumis%dn”,fun2(x,y);,-函数调用的形式,12.05.2020,81,.,5.4.4对被调函数的说明,1)被调用函数必须是已经存在的函数(库函数和用户自定义函数)。2)调用库函数需要#include包含和该函数有关的头文件,然后才能调用。3)调用用户自定义函数,如果被调函数出现在主调函数之后,在主调函数前应对被调函数作声明。形式为:函数类型函数名(形参表列);,-函数调用条件,12.05.2020,82,.,voidmain()/*主函数*/intfun1(inta,intb);/*函数声明*/intd,u=3,v=2;d=2*fun1(u,v);intfun1(inta,intb)intc;c=a+b;return(c);,5.4.4对被调函数的说明,-例5-10函数的定义与声明,12.05.2020,83,.,intfun1(inta,intb)intc;c=a+b;return(c);voidmain()intd,u=3,v=2;d=2*fun1(u,v);,5.4.4对被调函数的说明,-函数的调用,上例中被调函数在主调函数之后,在主调函数一开始对被调函数进行了声明。若被调函数出现在主调函数之前时,可以不对被调函数进行声明。上例可修改如下。,12.05.2020,84,.,5.4.5中断函数,中断服务程序在C51程序中是以中断函数的形式出现的,中断函数的格式为:void函数名()interruptnusingm函数体语句interrupt是中断函数的关键字,n是中断号,MCS-51的中断号与中断源的对应关系如表5-5所示。using是指定中断函数中选用工作寄存器组的关键字,m是03范围的常数,若不用该选项,编译器会自动选择默认工作寄存器组(0组寄存器)。,-中断函数的格式,12.05.2020,85,.,表5-5MCS-51中断源和中断的关系,void函数名()interruptnusingm,5.4.5中断函数,-中断函数的中断号,12.05.2020,86,.,void函数名()interruptnusingm,例如:voidT0_srv(void)interrupt1using1/*定时/计数器0中断函数*/*定时/计数器0中断服务程序*/,5.4.5中断函数,-中断函数的格式,12.05.2020,87,.,1)中断函数不能进行参数传递。2)中断函数没有返回值,应定义为void型。3)禁止对中断函数的直接调用。4)如果中断函数调用了其他函数,被调函数与中断函数使用相同的寄存器组。5)中断函数最好写在程序尾部。,void函数名()interruptnusingm,5.4.5中断函数,-编写中断函数要点,12.05.2020,88,.,5.5C51结构化程序设计,C51程序是一种结构化程序,由若干模块组成,每个模块中包含若干个基本结构,而每个基本结构中可以有若干条语句。基本结构有三种,顺序结构、选择结构和循环结构。5.5.1顺序结构程序顺序结构是一种最基本、最简单的程序结构。在这种结构中,语句被依次逐条地顺序执行。,-顺序结构程序,12.05.2020,89,.,例5-11设计一乘法程序,乘积放在外部RAM中的0000H单元。,voidmain()unsignedlongxdata*p;/*设定p是指向外部RAM区的unsignedlong指针*/unsignedlongx=12345,y=67890,mum;mum=x*y;p=0;/*p指向外部RAM区0000H单元*/*p=mum;/*乘积存入外部RAM区0000H单元*/,5.5C51结构化程序设计,-顺序程序设计,12.05.2020,90,.,5.5.2选择结构程序,用if语句可以构成选择结构。它根据给定的条件进行判断,以决定执行某个分支程序段。语言的if语句有三种基本形式。1单分支语句if(条件表达式)语句组;,其语义是:如果条件表达式的值为真,则执行其后的语句组,否则不执行其后的语句组。单分支语句执行过程可表示为图5-1所示。,-单分支程序,12.05.2020,91,.,例5-12寻找两个数中的大数输出,voidmain()unsignedxdata*p;unsigneda=35,b=78,max;max=a;if(maxb)max=a;elsemax=b;p=0;/*p指向外部RAM区0000H单元*/*p=max;/*最大值存入外部RAM区0000H单元*/,5.5.2选择结构程序,-双分支程序设计,12.05.2020,94,.,3多分支语句,当有多个分支选择时,可采用if-else-if语句结构,其一般形式为:if(条件表达式1)语句组1;elseif(条件表达式2)语句组2;elseif(条件表达式3)语句组3;elseif(条件表达式n)语句组n;else语句m;,5.5.2选择结构程序,-多分支程序,12.05.2020,95,.,例5-14,如图5-3所示,单片机P1口的P1.0和P1.1各接一个开关K1、K2,P1.4、P1.5、P1.6和P1.7各接一只发光二极管。由K1和K2的不同状态来确定哪个发光二极管被点亮。,5.5.2选择结构程序,-多分支程序设计,12.05.2020,96,.,例5-14,#include“reg51.h”voidmain()chara;a=P1;a=a,5.5.2选择结构程序,-多分支程序设计,12.05.2020,97,.,4开关选择switch语句,switch语句结构的一般形式为:switch(表达式)case常量表达式1:语句组1;case常量表达式2:语句组2;case常量表达式n:语句组n;default:语句组n+1;,5.5.2选择结构程序,-多分支程序,12.05.2020,98,.,【例5-15】用switch语句完成例5-14任务。程序如下。#includevoidmain()chara;a=P1;a=a,5.5.2选择结构程序,-多分支程序设计,12.05.2020,99,.,在使用switch语句时还应注意以下几点。(1)在case后的各常量表达式的值不能相同,否则会出现错误。(2)在case后,允许有多条语句,可以不用括起来。(3)各case和default子句的先后顺序可以变动,而不会影响程序执行结果。(4)default子句可以省略不用。(5)在每一case语句之后增加break语句,使每一次执行之后均可跳出switch语句,这样才能实现多分支结构。,5.5.2选择结构程序,-注意,12.05.2020,100,.,5.5.3循环结构程序,其特点是,在给定条件成立时,反复执行某程序段,直到条件不成立为止。给定的条件称为循环条件,反复执行的程序段称为循环体。语言提供了多种循环语句,可以组成各种不同形式的循环结构。语言提供的循环语句有:1)用while语句;2)用do-while语句;3)用for语句。,-语言提供的循环语句,12.05.2020,101,.,1while循环语句,while循环语句的一般形式为:while(表达式)语句组其中表达式是循环条件,语句组为循环体。,while语句的语义是:计算表达式的值,当值为真(非0)时,执行循环体语句组。,5.5.3循环结构程序,-while循环语句,12.05.2020,102,.,【例5-16】前面的例5-15程序只能执行一遍,用while语句使其无穷循环执行。程序如下。#includevoidmain()chara;while(1)/*循环条件表达式的值始终为1,无穷循环*/a=P1;a=a,5.5.3循环结构程序,-while循环语句,12.05.2020,103,.,【例5-17】用do-while语句实现例5-16。程序如下。#includevoidmain()chara;doa=P1;a=a/*循环条件表达式的值始终为1,无穷循环*/,5.5.3循环结构程序,-do-while循环语句应用,12.05.2020,104,.,-3for循环语句,for(表达式1;表达式2;表达式3)语句组for循环语句的执行过程如下:1)先求解表达式1。2)求解表达式2,若其值为真(非0),则执行for语句中指定的内嵌语句,然后执行下面第3步;若其值为假(0),则转到第5步,结束循环。,5.5.3循环结构程序,12.05.2020,105,.,-3for循环语句,3)求解表达式3。4)转回上面第2步继续执行。5)循环结束,执行for语句体后面的一个语句。for循环语句的执行过程如图5-6所示。,5.5.3循环结构程序,12.05.2020,106,.,1)for循环中的“表达式1(循环变量赋初值)”、“表达式2(循环条件)”和“表达式3(循环变量增量)”都是选择项,即可以缺省,但“;”不能缺省。2)省略了“表达式1(循环变量赋初值)”,表示不对循环控制变量赋初值。,5.5.3循环结构程序,-for循环语句使用说明,12.05.2020,107,.,3)省略了“表达式2(循环条件)”,则不做其它处理时便成为死循环。4)省略了“表达式3(循环变量增量)”,则不对循环控制变量进行操作,这时可在语句体中加入修改循环控制变量的语句。,5.5.3循环结构程序,-for循环语句使用说明,12.05.2020,108,.,5)“表达式1(循环变量赋初值)”和“表达式3(循环变量增量)”可同时省略,结果如同前面第2、4两种情况。6)3个表达式都可同时省略,结果如同前面第2、3、4三种情况的综合效果。7)表达式2一般是关系表达式或逻辑表达式,但也可是数值表达式或字符表达式,只要其值非零,就执行循环体。,5.5.3循环结构程序,-for循环语句使用说明,12.05.2020,109,.,例5-18用for语句实现例5-16。,#include“reg51.h”voidmain()chara;for(;)/*无循环条件,无穷循环*/a=P1;/*读P1口的值*/a=a,5.5.3循环结构程序,-for循环程序设计,12.05.2020,110,.,4break语句,break语句通常用在循环语句和开关语句中。当break用于开关语句switch中时,可使程序跳出switch而执行switch以后的语句。当break语句用于do-while、for、while循环语句中时,可使程序终止循环而执行循环结构后面的语句,通常break语句总是与if语句联在一起。即满足条件时便跳出循环。,5.5.3循环结构程序,-break语句,12.05.2020,111,.,-5continue语句,continue语句的作用是跳过循环体中剩余的语句而强行开始执行下一次循环。continue语句只用在for、while、do-while等循环体中,常与if条件语句一起使用,用来加速循环。,5.5.3循环结构程序,12.05.2020,112,.,5.5.4查表程序,在许多单片机嵌入式应用系统中,经常采用查表法代替数学公式的计算。特别是对传感器的非线性补偿的场合,使用查表法比采用复杂的曲线拟合效果更好。可以将预先计算好的数据随程序装入到EPROM的一块指定区间,形成数据表。查表程序可以用数组实现。,12.05.2020,113,.,例5-19,#defineUCHunsigenedcharUCHcodetem=32,34,36,37,39,41;UCHf_to_c(UCHdeg)returntemdeg;voidmain()UCHx;x=f_to_c(3);,5.5.4查表程序,编写一个将摄氏温度转换为华氏温度的查表程序,已知摄氏温度0、1、2、3、4、5对应的华氏温度为32,34,36,37,39,41。,-查表程序应用,12.05.2020,114,.,例5-20,片内RAM的20H单元存放着一个005H的数,用查表法求出该数的平方值放入内部RAM的21H单元中。main()charx,*p;charcodetab6=0,1,4,9,16,25;p=0 x20;x=tab*p;p+;*p=x;,5.5.4查表程序,-查表程序应用,12.05.2020,115,.,5.6C51程序设计实例,本节介绍一些使用8051单片机内部资源(中断、定时器、I/O)和扩展资源(并口、A/D、D/A、键盘、显示器)的C51实用程序。程序中用到了一些后续章节的内容(如中断、定时/计数器等)。,12.05.2020,116,.,5.6.1单片机内/外部资源应用程序设计,#include“reg51.h”#include“intrins.h”sbitP1_0=P10;voiddelay(void)/*延时函数*/inta=5000;While(a-)_nop_();,例5-21外部中断0引脚(P3.2口)接一个开关,P1.0口接一个发光二极管。开关闭合一次,发光二极管改变一次状态。,12.05.2020,117,.,voidint_srv(void)interrupt0using1/*外中断函数*/delay();If(INT0=0)/*测试INT0=0后P1.0取反*/P1_0=!P1_0;while(INT0=0);voidmain()P1_0=0;EA=1;/*开中断*/EX0=1;While(1);,5.6.1单片机内/外部资源应用程序设计,12.05.2020,118,.,例5-22用定时器T0实现从P1.0口输出方波信号,周期为50ms。设单片机的focs=6MHz。,#include“reg51.h”sbitP1_0=P10;voidmain()/*主函数*/TMOD=0 x01;/*写定时器方式控制字,定时器16位方式*/TH0=-12500/256;/*写定时器初始值*/TL0=-12500%256;ET0=1;/*开中断*/EA=1;TR0=1;/*启动定时器工作*/While(1);/*等待中断*/,5.6.1单片机内/外部资源应用程序设计,12.05.2020,119,.,voidT0_srv(void)interrupt1using1/*中断函数*/TH0=-12500/256;/*重写定时器初始值*/TL0=-12500%256;P1_0=!P1_0;/*P1.0取反*/,5.6.1单片机内/外部资源应用程序设计,12.05.2020,120,.,5.
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 人教版五年级下册分数的产生第1课时教案及反思
- 暑假预习云名著《世说新语》之“德行”卷
- 2024中航信移动科技有限公司航旅纵横校招新增岗位招聘笔试参考题库附带答案详解
- 2024中煤陕西能源化工集团有限公司面向社会公开招聘40人笔试参考题库附带答案详解
- 动画片的今昔(教案)-2023-2024学年人美版(2012)美术六年级下册
- 人教版四年级音乐下册(简谱)第一单元《音乐实践》教学设计
- 人教版 (PEP)三年级下册Unit 1 Welcome back to school!Part A第一课时教案及反思
- 人教版八年级历史与社会下册教学设计:5.3.1《皇权膨胀》
- 人教新目标 (Go for it) 版八年级上册Unit 3 Im more outgoing than my sister.Section B教学设计
- 奥尔夫音乐节奏课件培训
- 2024年高等教育工学类自考-06090人员素质测评理论与方法考试近5年真题附答案
- 《西亚》教学课件(第1课时)(25张)公开课教案课件
- 2022年四川省绵阳市(初三学业水平考试)中考数学真题试卷含详解
- 黑产大数据 信贷欺诈虚假流水研究报告 2024
- 统编版语文六年级下册10 古诗三首《石灰吟》公开课一等奖创新教学设计
- 《刨花板介绍》课件
- 垃圾清运服务投标方案技术标
- 吞咽障碍膳食营养管理中国专家共识(2019)解读
- 新闻采访与写作-马工程-第二章
- 2024年南阳农业职业学院单招职业适应性测试题库附答案
- 国开可编程控制器应用形考实训任务六
评论
0/150
提交评论