《片机的C语言编程》PPT课件.ppt

上传人:sh****n 文档编号:12736844 上传时间:2020-05-20 格式:PPT 页数:33 大小:540KB
返回 下载 相关 举报
《片机的C语言编程》PPT课件.ppt_第1页
第1页 / 共33页
《片机的C语言编程》PPT课件.ppt_第2页
第2页 / 共33页
《片机的C语言编程》PPT课件.ppt_第3页
第3页 / 共33页
点击查看更多>>
资源描述
内容提要C51程序结构C51的数据类型及运算符C51的函数C51程序设计小结,第4章单片机的C语言编程,应用C51编程具有以下优点:(1)C51管理内部寄存器和存贮器的分配,编程时,无需考虑不同存储器的寻址和数据类型等细节问题;()程序由若干函数组成,具有良好的模块化结构;()有丰富的子程序库可直接引用,从而大大减少用户编程的工作量。()C51和汇编语言可以交叉使用.汇编语言程序代码短、运行速度快、但复杂运算编程耗时。如果用汇编语言编写与硬件有关的部分程序,用C51编写与硬件无关的运算部分程序,充分发挥两种语言的长处,可以提高开发效率。,4.1C51程序结构,同标准C一样,C51的程序由一个个函数组成,这里的函数和其他语言的“子程序”或“过程”具有相同的意义。其中必须有一个主函数main(),程序的执行从main()函数开始,调用其他函数后返回主函数main(),最后在主函数中结束整个程序而不管函数的排列顺序如何。,全局变量说明/*可被各函数引用*/main()/*主函数*/局部变量说明/*只在本函数引用*/执行语句(包括函数调用语句)fun1(形式参数表)/*函数1*/形式参数说明,局部变量说明执行语句(包括调用其他函数语句)funn(形式参数表)/*函数n*/形式参数说明局部变量说明执行语句,C语言程序的组成结构如下所示:,C语言的语句规则:1.每个变量必须先说明后引用,变量名英文大小写是有差别的。2.C语言程序一行可以书写多条语句,但每个语句必须以“;”结尾,一个语句也可以多行书写为好。3.C语言的注释用/*/表示。4.“”花括号必须成对,位置随意,可在紧挨函数名后,也可另起一行,多个花括号可以同行书写,也可逐行书写,为层次分明,增加可读性,同一层的“”花括号对齐,采用逐层缩进方式书写。,4.2C51的数据类型及运算符4.2.1C51的存贮类型,访问内部数据存贮器(idata)比访问外部数据存贮器(xdata)相对要快一些,因此,可将经常使用的变量置于内部数据存贮器中,而将较大及很少使用的数据变量置于外部数据存贮器中。例如定义变量x语句:datacharx(等价于chardatax)。如果用户不对变量的存贮类型定义,则编译器承认默认存贮类型,默认的存贮类型由编译控制命令的存贮的模式部分决定。,4.2.2C51的存贮器模式,存贮器模式决定了变量的默认存贮器类型、参数传递区和无明确存贮区类型的说明。C51的存贮器模式有SMALL、LARGE和COMPACT。在固定的存贮器地址进行变量参数传递是C51的一个标准特征,在SMALL模式下参数传递是在内部数据存贮区中完成的。LARGE和COMPACT模式允许参数在外部存贮器中传递。C51同时也支持混合模式,例如在LARGE模式下生成的程序可将一些函数分页放入SMALL模式中从而加快执行速度。,例如设C语言源程序为PROR.C,若使程序中的变量类型和参数传递区限定在外部数据存贮区,有两种方法:方法1:用C51对PROR.C进行编译时,使用命令C51PROR.CCOMPACT。方法2:在程序的第一句加预处理命令#pragmacompact,存贮器模式表,4.2.3C51的数据类型,无论哪种数据都是存放在存贮单元中的,每一个数据究竟要占用几个单元(即数据的长度)都要提供给编译系统,正如汇编语言中存放数据的单元要用DB或DW伪指令进行定义一样,编译系统以此为根据预留存贮单元,这就是定义数据类型的意义。C51编译器支持数据类型见下表。,C51的数据类型,对上表作如下说明:1.字符型(char)、整型(int)和长整型(long)均有符号型(signed)和无符号型(unsigned)两种,如果不是必须,尽可能选择unsigned型,这将会使编译器省却符号位的检测,使生成的程序代码比signed类型短得多。2.程序编译时,C51编译器会自动进行类型转换,例如将一个位变量赋值给一个整型变量时,位型值自动转换为整型值;当运算符两边为不同类型的数据时,编译器先将低级的数据类型转换为较高级的数据类型,运算后,运算结果为高级数据类型。3.51单片机内部数据存贮器的可寻址位(20H2FH)定义为bit型,而特殊功能寄存器的可寻址位(即地址为X0H和X8H的SFR的各位)只能定义为sbit类型。,4.2.4C51的指针,(1)关于指针型变量在汇编语言程序中,要取存贮单元m的内容可用直接寻址方式,也可用寄存器间接寻址方式,如果用R1寄存器指示m的地址,用R1取m单元的内容。相对应的在C语言中用变量名表示取变量的值(相当于直接寻址),也可用另一个变量(如P)存放m的地址,P就相当于R1寄存器。用*P取得m单元的内容(相当于汇编的间接寻址方式)这里P即为指针型变量。下面表格表示两种语言将m单元的内容送n单元的对照语句。,注:上表省略了汇编语言程序中对符号地址n和m用EQU伪指令进行具体地址定义的语句以及C语言对变量n、m和指针变量P进行类型定义的语句,实际程序设计中,此步是不可缺少的。表中=(相等);!=(不相等)优先级:前四个高,后二个“=”和“!=”级别低。,4C51的逻辑运算符有三种:逻辑表达式和关系表达式的值相同,以0代表假,以1代表真。以上三种运算的优先级见右图所示。5C51的按位操作的运算符有六种:说明函数是一个可重入函数。函数定义格式为:返回值类型函数名(参数)存储模式reentrantinterruptnusingn1.格式中中的内容为可省略的选项。如果函数没有返回值,返回值类型应该声明为void,省略时默认返回值类型为int。2.存储模式:说明函数的存储模式,可以为small、compact或lagre,省略时使用程序设定的存储模式。3.reentrant:说明函数为可重入函数。4.interruptn:说明函数是中断类型号n的中断服务子程序。5.usingn:指定函数使用第n个寄存器组,n可以为0、1、2或3。函数声明中不能包括usingn选项。,4.3.2C51函数参数传递及返回值传递,1函数参数传递为了避免函数调用占用过多的堆栈空间,C51编译器在调用函数时,只将函数的返回地址压入堆栈,而通过寄存器或固定地址的存储单元来传递参数。默认情况下,编译器最多可以通过寄存器传递3个参数,寄存器传递参数的具体情况如下表所示。寄存器传递参数表,可以用指令REGPARMS和NOREGPARMS说明是否要通过寄存器传递参数。不用寄存器传递参数或传递3个以上参数时,C51编译器会通过固定地址的存储单元进行参数传递。此外,由于bit类型的参数不能用寄存器传递,函数中bit型参数之后的参数都不会用寄存器传递,因此bit型参数应该在参数列表的最后声明。,2函数返回值的传递C51编译器始终通过寄存器传递函数的返回值,传递返回值的寄存器如下表所示。传递函数返回值所用的寄存器,例1:定义函数sum,实现两个参数求和功能。unsignedintsum(unsignedintvar1,var2);voidmain()unsignedintrlt;bgn:rlt=sum(100,200);gotobgn;unsignedintsum(unsignedintvar1,var2)return(var1+var2);,在程序开始处添加代码#pragmaREGPARMS,通过寄存器传递参数,则指令编译后的汇编程序如下:代码地址机器码汇编指令C:0 x00037DC8MOVR5,#0 xC8C:0 x00057C00MOVR4,#0 x00C:0 x00077F64MOVR7,#0 x64C:0 x00097E00MOVR6,#0 x00C:0 x000B120020LCALLsum(C:0020)C:0 x000E8E0AMOV0 x0A,R6C:0 x00108F0BMOV0 x0B,R7,在程序开始处添加代码#pragmaNOREGPARMS,通过存储单元传递参数,则指令编译后的汇编程序如下:代码地址机器码汇编指令C:0 x0003750A00MOV0 x0A,#0 x00C:0 x0006750B64MOV0 x0B,#0 x64C:0 x0009750C00MOV0 x0C,#0 x00C:0 x000C750DC8MOV0 x0D,#0 xC8C:0 x000F120024LCALLsum(C:0024)C:0 x00128E08MOV0 x08,R6C:0 x00148F09MOV0 x09,R7,参数传递情况分析,例2:定义中断函数。unsignedintintercnt;unsignedcharsecond;voidtimer0(void)interrupt1using3if(+intercnt=4000)second+;intercnt=0;程序编译链接后,汇编程序如下:代码地址机器码汇编指令C:0 x000B02000ELJMPtimer0(C:000E)/中断向量/中断程序timer0,压栈保护函数中使用了的ACC、PSW寄存器C:0 x000EC0E0PUSHACC(0 xE0)C:0 x0010C0D0PUSHPSW(0 xD0)C:0 x001275D018MOVPSW(0 xD0),#0 x18/修改PSW,使用寄存器组3/省略实现函数功能的代码C:0 x002ED0D0POPPSW(0 xD0)C:0 x0030D0E0POPACC(0 xE0)C:0 x003232RETI,4.3.3C51函数的调用,对被调函数的说明:返回值类型被调函数名(形参表列);如果被调函数出现在主调函数之后,在主调函数前应对被调函数作以说明。如果被调函数出现在主调函数之前,可以不对被调函数说明。函数调用的形式为:函数名(实际参数表列);实参和形参的数目相等类型一致,对于无参函数当然不存在实际参数表列。函数的调用方式有三种:函数调用语句:即把被调函数名作为调用函数的一个语句;如fun1()。被调函数作为表达式的运算对象,如result=2*get(a,b)此时get函数中的a,b应为实参,其以返回值参予式中的运算。被调函数作为另一个数的实际参数如m=max(a,get(a,b);函数get(a,b)作为函数max()的一个实际参数。,4.4C51程序设计,进行程序设计时,为使程序简明清晰,易于阅读、测试、交流、移植以及与其他程序连接和共享,通常需采用模块化程序设计方法。设计一个实际的应用系统时,通常会创建一个项目,将整个应用程序划分为多个功能模块,每个模块完成一个方面的功能,如输入模块、输出模块、通讯模块等。每个功能模块细分为多个具体的子功能,例如串行通讯模块可以细分为初始化、接收一个字节、发送一个字节、接收多个字节和发送多个字节等多个具体的子功能模块,每个具体的子功能定义一个函数实现。利用模块化设计方法简化了编程和调试的难度,提高了程序的复用性和灵活性。常用的功能模块可以在其他应用程序中直接使用,避免重复开发。,小结,本章介绍了C51的基本数据类型、存贮类型及对C51对单片机内部部件的定义等,这些都是利用C51编单片机程序的基础,都应该掌握并灵活应用,只有多编程,多上机才能不断提高编程的能力。如何编写高效的C51程序,通常应注意以下问题:1.定位变量经常访问的数据对象放入在片内数据RAM中,这可在任一种模式(COMPACT/LARGE)下用输入存贮器类型的方法实现。访问片内RAM要比访问片外RAM快得多。在片内RAM由寄存器组、位数据区、栈和其它由用户用“data”类型定义的变量共享。由于片内RAM容量的限制(128256字节,由使用的处理器决定),必须权衡利弊以解决访问效率和这些对象的数量之间的矛盾。,2.尽可能使用最小数据类型MCS-51系列单片机是8位机,因此对具有“char”类型的对象的操作比“int”或“long”类型的对象方便得多。建议尽量使用最小数据类型。C51编译器直接支持所有的字节操作,因而如果不是运算符要求,就不作“int”类型的转换,这可用一个乘积运算来说明,两“char”类型对象的乘积与8XX51操作码“MULAB”刚好相符。如果用整型完成同样的运算,则需调用库函数。3.只要有可能,使用“unsigned”数据类型8XX51单片机的CPU不直接支持有符号数的运算。因而C51编译必须产生与之相关的更多的代码以解决这个问题。如果使用无符号类型,产生的代码要少得多。4.只要有可能,使用局部函数变量编译器总是尝试在寄存器里保持局部变量。这样,将索引变量(如FOR和WHILE循环中计数变量)声明为局部变量是最好的,这个优化步骤只为局部变量执行。使用“unsignedchar/int”的对象通常能获得最好的结果。,
展开阅读全文
相关资源
相关搜索

当前位置:首页 > 图纸专区 > 课件教案


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

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


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