第6章 Cx51函数
- 格式:ppt
- 大小:126.00 KB
- 文档页数:32
《单片机原理及应用(二)》模块一C51程序设计基础任务1:实例导航第二章C与80512.1 8051的编程语言1、8051的编程语言(四种):(1)BASIC语言(2)PL/M√(3)汇编语言√(4)C语言目前,汇编语言和C语言是广泛使用的两种单片机编程语言。
在未来的一段时间内,汇编语言和C语言还将同时存在,但从发展趋势看,C语言有逐渐取代汇编语言的可能。
最好的单片机编程者应是具有汇编语言基础,又精通C语言的。
2、C语言的优点(与汇编语言相比):(P41)(1)对单片机的指令系统不要求了解,仅要求对8051的存储器结构有所了解(2)寄存器的分配、不同存储器的寻址及数据类型等细节由编译器管理(3)程序有规范的结构,由不同的函数组成,这种方式可使程序结构化(4)编程及程序调试时间显著缩短,从而提高效率(5)提供库函数,具有较强的数据处理能力3、8051单片机C语言(单片机C51语言)了解一下单片机的种类:(查资料)2.2 Cx51编译器编译:C语言源程序转换成机器语言目标程序的过程,叫做编译。
编译器:能自动完成编译过程的一种计算机软件。
(1)C语言编译器(标准C)(2)C51编译器(经典8051单片机)(3)C x51编译器(经典8051单片机及派生产品)Cx51编译器完全遵照ANSI C语言标准,支持C语言的所有标准特征。
另外,还增加了可以直接支持8051结构的特征。
典型产品:KILE套装工具软件----------uVision2 集成开发环境的使用(P 302)例2-1:用uVision2软件编译调试一个C51程序(HELLO.C)基本步骤:(1)创建一个新项目(建在一个新文件夹下)并为项目选择一个CPU(此时会自动加入启动文件)(2)创建新程序文件(或打开旧程序文件)此例中,打开c:\kile\c51\examples\hello(3)将源文件添加到项目中此时还可修改工具选项(4)编译和链接项目(Build Target命令):翻译和链接源文件,并生成一个可以载入到uvision2调试器进行调试的绝对目标模块。
C51编译器-语言扩展(3)-指针Pointers指针Cx51支持使用字符*来声时一个指针类型的变量。
Cx51的指针可以完成标准C的所有功能。
然而,由于8051及其变种的特殊构架,Cx51使用两种类的指针: memory-specific pointers and generic pointers(特定存储器类型指针和通用指针),Generic Pointers通用指针的定义方法与标准C指针的定义方法相同。
通用指针总是使用三个字节来存储。
第一个字节是存储器类型。
第二字节是偏移量的高位,第三字节是偏移量的低位。
通用指针可以访问所用的变量,而不论变量位于8051的哪一个存储区内。
因为这个原因,许多8051的运行时库都使用这个种指针。
通过使用通用指针,函数可以访问所有的内存区域注意:使用通用指针产生的代码比用特定存储器类型指针生成的代码执效率要低得多。
这是因为在运行前变量的内存区域是不知道的。
编译器不能优化存储器的访问,而是要生成适合所有存域的代码。
如果要获得高的运行速度,最好使用特定存储器类型指针。
为运行速度考虑,也可以设定指针的存储区,在声明指针时前面加上储存区类型标识就可以把指针放在特定的存储器区域。
char * xdata strptr; /* generic ptr stored in xdata */int * data numptr; /* generic ptr stored in data */long * idata varptr; /* generic ptr stored in idata */在上面的例子中,指针指向的内容可以放在任何一个空间内,但指针必须放在xdata, data, and idata中。
Memory-specific Pointers特定存储器类型指针在声明时总是包含了内存类型的声明,并且只能指向特定的内存区域。
如:char data *str; /* ptr to string in data */int xdata *numtab; /* ptr to int(s) in xdata */long code *powtab; /* ptr to long(s) in code */因为在编译的时候内存的类型就已经确定了,通用指针的存储器类型就不再需要了。
51单片机调用函数的方法摘要:1.引言2.51单片机简介3.调用函数的原理4.调用函数的方法5.实例演示6.总结正文:1.引言在51单片机编程中,调用函数是非常重要的环节。
本文将详细介绍51单片机调用函数的方法,帮助读者更好地理解和应用这一技术。
2.51单片机简介51单片机是一种基于冯·诺依曼结构的微控制器,内置了CPU、RAM、ROM、I/O口等硬件资源。
它具有体积小、成本低、功耗低等特点,广泛应用于嵌入式系统领域。
3.调用函数的原理在51单片机中,调用函数实际上是通过传递参数,执行子程序的方式实现的。
调用函数的语句一般形式为:`void 函数名(参数1, 参数2,...);`4.调用函数的方法调用函数的方法主要包括以下几点:(1)声明函数在程序开头,需要对要调用的函数进行声明。
声明语句一般形式为:`void 函数名(参数类型参数名1, 参数类型参数名2,...);`(2)定义函数在程序中,需要对声明的函数进行定义。
定义语句一般形式为:`void 函数名(参数类型参数名1, 参数类型参数名2,...) {// 函数体}`(3)调用函数在主程序中,通过调用声明过的函数,传入相应的参数,实现函数的调用。
调用语句一般形式为:`函数名(参数1, 参数2,...);`5.实例演示以下是一个简单的实例,演示如何调用函数:```c#include <reg52.h>// 声明函数void delay(unsigned int ms);void main() {unsigned int i;// 调用函数,延时1000msdelay(1000);for (i = 0; i < 10; i++) {P1 = i; // 输出P1口的值delay(100); // 延时100ms}while (1); // 循环等待}// 定义函数:延时函数void delay(unsigned int ms) {unsigned int i, j;for (i = ms; i > 0; i--) {for (j = 114; j > 0; j--) {_nop_();}}}```6.总结本文从51单片机简介、调用函数的原理、调用方法等方面进行了详细的介绍,并通过一个实例演示了如何调用函数。
51单片机堆栈深入剖析用C语言进行MCS51系列单片机程序设计是单片机开发和应用的必然趋势。
Keil公司的C51编译器支持经典8051和8051派生产品的版本,通称为Cx51。
应该说,Cx51是C语言在MCS51单片机上的扩展,既有C语言的共性,又有它自己的特点。
本文介绍的是Cx51程序设计时堆栈的计算方法。
1.堆栈的溢出问题。
MCS51系列单片机将堆栈设置在片内RAM中,由于片内RAM资源有限,堆栈区的范围也是有限的。
堆栈区留得太大,会减少其他数据的存放空间,留得太少则很容易溢出。
所谓堆栈溢出,是指在堆栈区已经满了的时候还要进行新的压栈操作,这时只好将压栈的内容存放到非堆栈区的特殊功能寄存器(SFR)中或者堆栈外的数据区中。
特殊功能寄存器的内容影响系统的状态,数据区的内容又很容易被程序修改,这样一来,之后进行出栈操作(如子程序返回)时内容已变样,程序也就乱套了。
因此,堆栈区必须留够,宁可大一些。
要在Cx51程序设计中防止堆栈的溢出,要解决两个问题:第一,精确计算系统分配给用户的堆栈大小,假设是M;第二,精确计算用户需要堆栈的大小,假设是N。
要求M≥N,下面分别分析这两个问题。
2.计算系统分配给用户的堆栈大小Cx51程序设计中,因为动态局部变量是长驻内存中的,实际上相当于局部静态变量,即使在函数调用结束时也不释放空间(这一点不同于标准C语言)。
Cx51编译器按照用户的设置,将所有的变量存放在片内和片外的RAM中。
片内变量分配好空间后,将剩下的空间全部作为堆栈空间,这个空间是最大可能的堆栈空间。
当然,因为Cx51是一种可以访问寄存器的C语言(特殊功能寄存器),因此可在程序中访问SP,将堆栈空间设置得小一点。
不过,一般没有人这么做。
本文只是讨论放在片内RAM的变量。
我们把变量分为两种情况:①用作函数的参数和函数返回值的局部变量。
这种变量尽量在寄存器组中存放。
为了讨论方便,假设统一用寄存器组0,具体的地址为0x00~0x07。