课件:单片机第五章:C语言程序设计分解.ppt_第1页
课件:单片机第五章:C语言程序设计分解.ppt_第2页
课件:单片机第五章:C语言程序设计分解.ppt_第3页
课件:单片机第五章:C语言程序设计分解.ppt_第4页
课件:单片机第五章:C语言程序设计分解.ppt_第5页
已阅读5页,还剩38页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第5章 MCS-51 C语言程序设计,5.1 C语言与MCS-51单片机,C语言是一种通用的计算机程序设计语言,代码效率高,数据类型和运算符丰富,有良好的程序结构,适用于各种应用系统的程序设计,是目前使用较广的单片机编程语言。 本章重点介绍在单片机上使用MCS-51 C语言的特殊数据类型、存储模式、程序的结构、混合编程。,5.1.1 C语言程序开发过程,一般的C语言开发套件中,包括编译器、连接器和符号转换程序。 编译器将源程序翻译为可重定位的目标代码文件(也可产生等价的汇编语言程序);连接器将目标代码文件连接为绝对目标文件;符号转换程序可将绝对目标文件转换为Intel HEX格式文件,编程到程序存储器中运行。 若使用提供了集成开发环境(Integrated Development Environment,IDE)的套件,则编辑、编译、连接、符号转换、甚至调试可在一个窗口中完成。如American Automation、Auocet、BSO/TASKING、DUNFIELD SHAREWARE、KEIL/Franklin等。,5.1.2 C语言的特点,C语言是一种模块化、结构化程序设计语言,符合ANSI C标准,可以产生紧凑的目标码,具体优点: (1) 不必详细了解单片机的指令系统 (2) 仅要求对MCS-51存储器结构有初步了解 (3) 寄存器分配、不同存储器区域的寻址及数据类型等细节由编译程序管理 (4) 程序具有规范的结构和固有的模块化思想 (5) 运算符和关键字用接近于自然语言的方式表示 (6) 提供包含大量标准子程序的函数库,具有较强的数据处理能力 (7) 在对执行效率要求较高的场合,可以嵌入汇编,也可以与汇编语言协同开发,5.1.3 单片机C语言的移植,C语言在单片机中的应用移植面临的具体问题: (1) MCS-51存储器的哈佛结构,加上内部有位寻址空间,对存储器变量的使用提出了挑战。 (2) 内部的数据存储器和程序存储器空间相对太小,而外部还可扩展存储容量,编译程序如何根据实际情况合理使用这些空间 (3) 内部各功能单元采用特殊功能寄存器集中管理,在C语言中如何实现寄存器访问 (4) MCS-51单片机派生种类繁多,硬件配置不统一,但是要求必须能够使用C语言操控所有硬件资源 (5) MCS-51内部只有一个堆栈,且存储空间有限,传统的利用堆栈传递参数的方法难以奏效,5.2 单片机C语言的扩充,MCS-51单片机有着与通用CPU截然不同的体系结构、硬件资源和运算特性 针对单片机独有的一些功能特点,绝大多数的MCS-51的C语言编译程序对标准C语言进行了一些扩充,5.2.1 C语言运算符,算术运算符: +, -, *, /, % 关系运算符: , =, =、&=、=、= 、+、- (位移动、异或、位或) 强制运算符,5.2.1 C语言运算符,5.2.2 数据类型,5.2.2 数据类型,例: unsigned char in_data; 8位 unsigned long log_time;32位 bit ok_flag; 1位,5.2.3 存储器类型,5.2.3 存储器类型,例 指出以下变量的存储位置 char data var1; char code text = “ENTER PARAMETER“; unsigned long xdata array100; float idata x, y, z; unsigned int pdata dimension; unsigned char xdata vector1044; char bdata flags;,5.2.4 存储模式,1.SMALL模式: 所有的变量默认存放于内部RAM中,相当于定义时使用了data类型 所有对象(包括堆栈)必须能够存入内部RAM的128字节,5.2.4 存储模式,2.COMPACT模式: 所有变量默认存放于外部RAM的一页中,相当于定义时使用了pdata类型 这种存储模式可以满足最多256字节的变量 对变量的访问必须使用间接寻址方式 编译程序产生的机器码使用R0和R1作为变量的指令操作数,5.2.4 存储模式,3.LARGE模式: 所有变量默认存放于外部RAM中,最多可以有64KB,相当于定义时使用了xdata类型 数据指针DPTR用来寻址变量 这种访问方式效率不高,特别是当变量长度超过一个字节时,5.2.4 存储模式,现在常用的C编译程序通常允许使用混合模式 不管存储模式如何,把经常使用的变量强制存放于内部RAM。大块数据则存放于外部RAM,而将其指针存放于内部RAM中,可以使用存储器类型说明符指定,5.2.5 硬件资源访问,1.特殊功能寄存器: 使用sfr、sfr16和sbit数据类型访问特殊功能寄存器 特殊功能寄存器中的位 使用sbit类型可以定义可位寻址SFR中的位 sfr P0 = 0x80; 地址 sfr ACC = 0xE0; 实际地址 sbit CY = 0xD7; 位地址,5.2.5 硬件资源访问,2.内部RAM中的位寻址资源 定义一个变量时若指定了bdata存储器类型,C编译程序会在内部RAM的位寻址区为其分配存储空间 这个变量中的位也可以单独访问,但必须先行定义 unsigned char bdata data8;位寻址区变量 sbit lsb = data80 ;data8的最低位,5.2.5 硬件资源访问,3.指定绝对地址的变量 使用_at_满足这一要求,其格式如下。 存储器类型 变量类型 变量名 _at_ 地址常数; xdata unsigned char buff _at_ 0x2000;,5.2.5 硬件资源访问,4.存储器绝对地址的访问 absacc.h中包含了一些宏定义,使用这些宏可以显示使用存储器绝对地址,如 #define CBYTE (unsigned char volatile code *) 0) CBYTE代表程序存储器地址0000H的字节单元 把每个存储区定义成一个字节或字数组,对指定地址的访问使用数组元素引用的形式,5.2.6 指针,1.基于存储器的指针 与源程序中存储器类型有关,编译时即可确定其长度。这种指针的长度可以为1个字节(data *、idata *、pdata *)或2个字节(code *、xdata *) char data *str; 指向data字符的指针 int xdata *num; 指向整形数据 long code *pow; 指向长整形代码,2019/8/5,22,可编辑,5.2.6 指针,char data *str; 指向data字符的指针 int xdata *num; 指向整形数据 long code *pow; 指向长整形代码 上述三个指针变量长度分别为1、2、2字节。指针变量自身所占用的存储位置还能定义 char data *xdata str; int xdata *data num; long code *idata pow;,5.2.6 指针,2.通用指针 与标准C语言指针的定义相同 使用3个字节存储指针内容(地址值)。第一个字节存放存储器类型,第二和第三节分别存放该指针所指对象地址的高字节和低字节,5.2.6 指针,2.通用指针 一般指针包括3个字节:1个字节存储类型和2个字节偏移地址,即,其中,第一字节代表了指针的存储器类型,存储器类型编码如下:,5.2.6 指针,char *str; 指向字符的指针 int *num; 指向整形数据的指针 第1字节放存储器类型,2、3字节放该指针所指对象地址的高、低字节。 xdata int x ;x位于外部RAM中 int *data px, *data py; px = 单元内容赋值FFFFH,5.3 C语言程序结构,单片机C语言程序与标准C程序一样,具有固有的模块化思想 各种功能由函数实现 整体上就是一个函数逐级调用的树状结构 程序的入口为main函数,在每个函数内部可以使用结构化程序设计技术的三种结构,5.3.1 函数,1.函数定义 返回值类型 函数名称(参数表) small | compact | large reentrant interrupt n using n 若省略返回值类型部分,默认为整型(int) 可以指定该函数的存储模式,以取代默认值 若使用了using,编译程序将产生切换工作寄存器组的代码 对于有返回值的函数,不能使用using,因为返回值是通过寄存器传递的,5.3.1 函数,2.参数传递 参数用于向函数传递数据,作为函数的输入。 传统C语言中参数是通过堆栈传递的,单片机中是通过存储器或寄存器传递的。 传递参数的寄存器分配,5.3.1 函数,3.返回值 总是通过寄存器送回的,5.3.1 函数,4.内部函数和外部函数 如果一个函数只能在其定义的文件中被调用,称之为内部函数 定义内部函数时,需用static存储类说明符。 内部函数也称作静态函数 定义内部函数可以使它只局限于所在的文件,当在不同文件中有同名的函数时互不干扰 允许在其他文件中调用的函数为外部函数,可以使用extern存储类说明符指明。函数定义时,默认为外部函数。,5.3.1 函数,5.可重入函数 C编译程序通常将函数的局部变量分配在存储器的固定位置 如果正在执行该函数时发生了中断,而中断服务程序中也调用该函数,先前的局部变量值便会被破坏。 类似的情况在实现函数递归调用时也会发生 定义为可重入函数后,编译程序产生能够保护局部变量的代码 reentrant,5.3.1 函数,6.中断处理函数 中断服务程序,是CPU响应中断后要执行的一段程序,在C语言中组织成一个函数的形式 编写中断处理函数时,程序员仅需关心中断类型号和寄存器组的选择,编译程序会自动产生中断向量和返回地址的入栈及出栈代码 interrupt using,5.3.1 函数,7.intrinsic函数 一些常用的只进行简单处理的函数,LCALL或ACALL的执行代价太高 intrinsic函数是一类用汇编语言代码实现的短小函数,若有对intrinsic函数的调用,编译程序将会直接用被调用函数代码替换函数调用语句,5.3.2 流程控制,1.分支 if语句 switch-case结构 2.循环 goto语句 while结构 dowhile结构 for结构 break和continue语句,5.3.3 输入与输出,一些C开发环境提供了流式输入/输出函数,可以实现通过串行口或用户自定义I/O接口的输入/输出操作,例如getchar、gets、scanf、putchar、puts、printf等 输入/输出功能需要调用_getkey和putchar两个函数,这两个函数的默认实现是通过串行口实现的 如果使用输入/输出函数,还需要在程序中加入一些代码,以便调用时已经对串行口进行了适当的初始化工作,5.3.4 程序的入口,在main函数执行之前,已经做了一些初始化 若有在main函数执行之前就应当初始化的资源,或者需要将存储区初始化为特定的值,可以在STARTUP.A51中修改或添加代码 单片机程序的入口其实还是0000H,在STARTUP.A51中初始化代码的最后一条指令才转向main函数执行,5.4 C语言与汇编语言的混合编程,5.4 C语言与汇编语言的混合编程,C语言调用汇编语言程序时,被调用函数(汇编语言函数)要在调用函数(C语言函数)所在文件中说明。对于汇编语言程序有以下要求 (1) 要使用SEGMENT伪指令定义可重定位的CODE段 (2) 要根据不同情况对函数名进行转换 (3) 须使用PUBLIC伪指令将被调用函数说明为外部可用函数 (4) 若有参数传递,按规则使用参数 (5) 若有返回值,按照规则存入寄存器,5.4 C语言与汇编语言的混合编程,混合编程,例:编写汇编语言函数max,参数为两个8位无符号数,功能是求出其中的大数返回。 在C语言中可按以下的方式声明和调用 extern unsigned char max(unsigned, unsigned); void main(void) unsigned char x,y; x = 130; y = 131; x = max(x,y);

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论