版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、内 容 提 要 C51程序结构 C51的数据类型及运算符 C51的函 数 C51程序设计 小结,第4章 单片机的C语言编程,应用C51编程具有以下优点: (1)C51管理内部寄存器和存贮器的分配,编程时,无需考虑不同存储器的寻址和数据类型等细节问题; ()程序由若干函数组成,具有良好的模块化结构; ()有丰富的子程序库可直接引用,从而大大减少用户编程的工作量。 ()C51和汇编语言可以交叉使用. 汇编语言程序代码短、运行速度快、但复杂运算编程耗时。如果用汇编语言编写与硬件有关的部分程序,用C51编写与硬件无关的运算部分程序,充分发挥两种语言的长处,可以提高开发效率。,4.1 C51程序结构,同
2、标准C一样,C51的程序由一个个函数组成,这里的函数和其他语言的“子程序”或“过程 ”具有相同的意义。其中必须有一个主函数main(),程序的执行从main()函数开始,调用其 他函数后返回主函数main(),最后在主函数中结束整个程序而不管函数的排列顺序如何。,全局变量说明 /*可被各函数引用*/ main() /*主函数*/ 局部变量说明 /*只在本函数引用*/ 执行语句(包括函数调用语句) fun1(形式参数表) /*函数1*/ 形式参数说明, 局部变量说明 执行语句(包括调用其他函数语句) funn(形式参数表) /*函数n*/ 形式参数说明 局部变量说明 执行语句 ,C语言程序的组成
3、结构如下所示:,C语言的语句规则: 1. 每个变量必须先说明后引用,变量名英文大小写是有差别的。 2. C语言程序一行可以书写多条语句,但每个语句必须以“;”结尾,一个语句也可以多行书写为好。 3. C语言的注释用/*/表示。 4. “”花括号必须成对,位置随意,可在紧挨函数名后,也可另起一行,多个花括号可以同行书写,也可逐行书写,为层次分明,增加可读性,同一层的“”花括号对齐,采用逐层缩进方式书写。,4.2 C51的数据类型及运算符4.2.1 C51的存贮类型,访问内部数据存贮器(idata)比访问外部数据存贮器(xdata)相对要快一些,因此,可将经常使用的变量置于内部数据存贮器中,而将较
4、大及很少使用的数据变量置于外部数据存贮器中。例如定义变量x语句:data char x (等价于char data x)。如果用户不对变量的存贮类型定义,则编译器承认默认存贮类型,默认的存贮类型由编译控制命令的存贮的模式部分决定。,4.2.2 C51的存贮器模式,存贮器模式决定了变量的默认存贮器类型、参数传递区和无明确存贮区类型的说明。C51的存贮器模式有SMALL、LARGE和COMPACT。 在固定的存贮器地址进行变量参数传递是C51的一个标准特征,在SMALL模式下参数传递是在内部数据存贮区中完成的。LARGE和COMPACT模式允许参数在外部存贮器中传递。C51同时也支持混合模式,例如
5、在LARGE模式下生成的程序可将一些函数分页放入SMALL模式中从而加快执行速度。,例如设C语言源程序为PROR.C,若使程序中的变量类型和参数传递区限定 在外部数据存贮区 ,有两种方法: 方法1:用C51对PROR.C进行编译时,使用命令C51 PROR.C COMPACT。 方法2:在程序的第一句加预处理命令 #pragma compact,存贮器模式表,4.2.3 C51的数据类型,无论哪种数据都是存放在存贮单元中的,每一个数据究竟要占用几个单元(即数据的长度)都要提供给编译系统,正如汇编语言中存放数据的单元要用DB或DW伪指令进行定义一样,编译系统以此为根据预留存贮单元,这就是定义数据
6、类型的意义。C51编译器支持数据类型见下表。,C51的数据类型,对上表作如下说明: 1.字符型(char)、整型(int)和长整型(long)均有符号型(signed)和无符号型(unsigned)两种,如果不是必须,尽可能选择unsigned型,这将会使编译器省却符号位的检测,使生成的程序代码比signed类型短得多。 2. 程序编译时,C51编译器会自动进行类型转换,例如将一个位变量赋值给一个整型变量时,位型值自动转换为整型值;当运算符两边为不同类型的数据时,编译器先将低级的数据类型转换为较高级的数据类型,运算后,运算结果为高级数据类型。 3. 51单片机内部数据存贮器的可寻址位(20H2
7、FH)定义为bit型,而特殊功能寄存器的可寻址位(即地址为X0H和X8H的SFR的各位)只能定义为sbit类型。,4.2.4 C51的指针,(1)关于指针型变量 在汇编语言程序中,要取存贮单元m的内容可用直接寻址方式,也可用寄存器间接寻址方式 ,如果用R1寄存器指示m的地址,用R1取m单元的内容。相对应的在C语言中用变量名表示取变量的值(相当于直接寻址),也可用另一个变量(如P)存放m的地址,P就相当于R1寄存器 。用*P取得m单元的内容(相当于汇编的间接寻址方式)这里P即为指针型变量。下面表格表示两种语言将m单元的内容送n单元的对照语句。,注: 上表省略了汇编语言程序中对符号地址n和m用EQ
8、U伪指令进行具体地址定义的 语句以及C语言对变量n、m和指针变量P进行类型定义的语句,实际程序设计中,此步是不可 缺少的。表中 =(相等);!= (不相等) 优先级:前四个高,后二个“=”和“!=”级别低。,4C51的逻辑运算符有三种: 逻辑表达式和关系表达式的值相同,以0代表假,以1代表真。 以上三种运算的优先级见右图所示。 5C51的按位操作的运算符有六种: 说明函数是一个可重入函数。 函数定义格式为: 返回值类型 函数名(参数) 存储模式 reentrant interrupt n using n 1.格式中 中的内容为可省略的选项。如果函数没有返回值,返回值类型应该声明为void,省略
9、时默认返回值类型为int。 2.存储模式:说明函数的存储模式,可以为small、compact或 lagre,省略时使用程序设定的存储模式。 3.reentrant:说明函数为可重入函数。 4.interrupt n:说明函数是中断类型号n的中断服务子程序。 5.using n:指定函数使用第n个寄存器组,n可以为0、1、2或3。函数声明中不能包括using n选项。,4.3.2 C51函数参数传递及返回值传递,1函数参数传递 为了避免函数调用占用过多的堆栈空间,C51编译器在调用函数时,只将函数的返回地址压入堆栈,而通过寄存器或固定地址的存储单元来传递参数。默认情况下,编译器最多可以通过寄存
10、器传递3个参数,寄存器传递参数的具体情况如下表所示。 寄存器传递参数表,可以用指令REGPARMS和NOREGPARMS说明是否要通过寄存器传递参数。不用寄存器传递参数或传递3个以上参数时,C51编译器会通过固定地址的存储单元进行参数传递。此外,由于bit类型的参数不能用寄存器传递,函数中bit型参数之后的参数都不会用寄存器传递,因此bit型参数应该在参数列表的最后声明。,2函数返回值的传递 C51编译器始终通过寄存器传递函数的返回值,传递返回值的寄存器如下表所示。 传递函数返回值所用的寄存器,例1:定义函数sum,实现两个参数求和功能。 unsigned int sum(unsigned i
11、nt var1, var2); void main( ) unsigned int rlt; bgn: rlt=sum(100,200); goto bgn; unsigned int sum(unsigned int var1, var2) return(var1+var2); ,在程序开始处添加代码 #pragma REGPARMS,通过寄存器传递参数,则指令编译后的汇编程序如下: 代码地址 机器码 汇编指令 C:0 x0003 7DC8 MOV R5,#0 xC8 C:0 x0005 7C00 MOV R4,#0 x00 C:0 x0007 7F64 MOV R7,#0 x64 C:0
12、x0009 7E00 MOV R6,#0 x00 C:0 x000B 120020 LCALL sum(C:0020) C:0 x000E 8E0A MOV 0 x0A,R6 C:0 x0010 8F0B MOV 0 x0B,R7,在程序开始处添加代码 #pragma NOREGPARMS,通过存储单元传递参数,则指令编译后的汇编程序如下: 代码地址 机器码 汇编指令 C:0 x0003 750A00 MOV 0 x0A,#0 x00 C:0 x0006 750B64 MOV 0 x0B,#0 x64 C:0 x0009 750C00 MOV 0 x0C,#0 x00 C:0 x000C 75
13、0DC8 MOV 0 x0D,#0 xC8 C:0 x000F 120024 LCALL sum(C:0024) C:0 x0012 8E08 MOV 0 x08,R6 C:0 x0014 8F09 MOV 0 x09,R7,参数传递情况分析,例2:定义中断函数。 unsigned int intercnt; unsigned char second; void timer0(void) interrupt 1 using 3 if(+intercnt=4000) second+; intercnt=0; 程序编译链接后,汇编程序如下: 代码地址 机器码 汇编指令 C:0 x000B 0200
14、0E LJMP timer0(C:000E) /中断向量 /中断程序timer0, 压栈保护函数中使用了的ACC、PSW寄存器 C:0 x000E C0E0 PUSH ACC(0 xE0) C:0 x0010 C0D0 PUSH PSW(0 xD0) C:0 x0012 75D018 MOV PSW(0 xD0),#0 x18 /修改PSW, 使用寄存器组3 /省略实现函数功能的代码 C:0 x002E D0D0 POP PSW(0 xD0) C:0 x0030 D0E0 POP ACC(0 xE0) C:0 x0032 32 RETI,4.3.3 C51函数的调用,对被调函数的说明 :返回值
15、类型 被调函数名(形参表列); 如果被调函数出现在主调函数之后,在主调函数前应对被调函数作以说明。如果被调函数出现在主调函数之前,可以不对被调函数说明。函数调用的形式为:函数名(实际参数表列); 实参和形参的数目相等类型一致,对于无参函数当然不存在实际参数表列。 函数的调用方式有三种: 函数调用语句:即把被调函数名作为调用函数的一个语句;如fun1()。 被调函数作为表达式的运算对象,如 result=2*get(a,b) 此时get函数中的a,b应为实参,其以返回值参予式中的运算。 被调函数作为另一个数的实际参数 如 m=max(a,get(a,b);函数get(a,b)作为函数max()的
16、一个实际参数。,4.4 C51 程序设计,进行程序设计时,为使程序简明清晰,易于阅读、测试、交流、移植以及与其他程序连接和共享,通常需采用模块化程序设计方法。 设计一个实际的应用系统时,通常会创建一个项目,将整个应用程序划分为多个功能模块,每个模块完成一个方面的功能,如输入模块、输出模块、通讯模块等。每个功能模块细分为多个具体的子功能,例如串行通讯模块可以细分为初始化、接收一个字节、发送一个字节、接收多个字节和发送多个字节等多个具体的子功能模块,每个具体的子功能定义一个函数实现。 利用模块化设计方法简化了编程和调试的难度,提高了程序的复用性和灵活性。常用的功能模块可以在其他应用程序中直接使用,
17、避免重复开发。,小结,本章介绍了C51的基本数据类型、存贮类型及对C51对单片机内部部件的定义等,这些都是利用C51编单片机程序的基础,都应该掌握并灵活应用,只有多编程,多上机才能不断提高编程的能力。如何编写高效的C51程序,通常应注意以下问题: 1. 定位变量 经常访问的数据对象放入在片内数据RAM中,这可在任一种模式(COMPACT/LARGE)下用输入存贮器类型的方法实现。访问片内RAM要比访问片外RAM快得多。在片内RAM由寄存器组、位 数据区、栈和其它由用户用“data”类型定义的变量共享。由于片内RAM容量的限制(128 256字节,由使用的处理器决定),必须权衡利弊以解决访问效率和这些对象的数量之间的矛盾。,2. 尽可能使用最小数据类型 MCS-51系列单片机是8位机,因此对具有“char”类型的对象的操作比“int”或“long”类型的对象方便得多。建议尽量使用最小数据类型。 C51编译器直接支持所有的字节操作,因而如果不是运算符要求,就不作“int”类型的转换,这可用一个乘积运算来说明,两“char”类
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- GB/T 47155-2026人工鱼礁建设技术规范
- 山东省临沂市2025-2026学年初三下学期第三次阶段检测试题英语试题含解析
- 云南省曲靖市沾益区播乐乡罗木中学2026届初三3月月考(语文试题文)含解析
- 重庆市北碚区重点达标名校2025-2026学年初三全真模拟考试(一)英语试题试卷含解析
- 四川省宜宾市翠屏区二片区达标名校2025-2026学年中考数学试题目标测试卷(3)含解析
- 山东省宁阳十一中2025-2026学年初三3月联考(英语试题文)试题含解析
- 重庆市荣昌清流镇民族中学2026届初三下学期四校联考试题(5月)语文试题试卷含解析
- 2026年从仿真看生产线设计的关键因素
- 2026年如何优化自动化仓储的企业文化
- 神经科中风康复治疗方案培训
- 涉法涉诉信访培训课件
- 2024云南省委党校研究生招生考试真题(附答案)
- 2025年四川省成都市初中学业水平考试中考(会考)地理试卷(真题+答案)
- 2025年焊工(技师)考试练习题库(附答案)
- 冷库节能措施方案(3篇)
- GB/T 2820.5-2025往复式内燃机驱动的交流发电机组第5部分:发电机组
- 学术自由与责任共担:导师制度与研究生培养制的深度探讨
- 高中数学三年教学规划
- 保卫科部门绩效考核标准
- 2025年上海市各区高三二模语文试题汇编《现代文一》含答案
- 公司履约保函管理制度
评论
0/150
提交评论