产品选型

51单片机语言 单片机C语言之函数

小编 2024-11-25 产品选型 23 0

单片机C语言之函数

函数定义

函数是一个自我包含的完成一定相关功能的执行代码段。通常C语言的编译器会自带标准的函数库,这些都是一些常用的函数。标准函数已由编译器软件商编写定义,使用者直接调用就能了,而无需定义。但是标准的函数不足以满足使用者的特殊要求,因此C语言允许使用者根据需要编写特定功能的函数,要调用它必须要先对其进行定义。

定义的模式如下:

函数类型 函数名称(形式参数表)

函数类型是说明所定义函数返回值的类型。返回值其实就是一个变量,只要按变量类型来定义函数类型就行了。如函数不需要返回值函数类型能写作“void”表示该函数没有返回值。注意的是函数体返回值的类型一定要和函数类型一致,不然会造成错误。

函数名称的定义在遵循C语言变量命名规则的同时,不能在同一程序中定义同名的函数,这将会造成编译错误(同一程序中是允许有同名变量的,因为变量有全局和局部变量之分)。

形式参数是指调用函数时要传入到函数体内参与运算的变量,它可以是一个、几个或没有。当函数不需要形式参数时(即无参函数),括号内为空或写入“void”表示,但括号不能少。

函数体中能包含有局部变量的定义和程序语句,如函数要返回运算值则要使用return语句进行返回。若在函数的{}号中也能什么也不写,这就成了空函数。在一个程序项目中可以写一些空函数,在以后的修改和升级中能方便的在这些空函数中进行功能扩充。

函数的调用

(一)函数调用的一般说明

函数定义好以后,要被其它函数调用了才能被执行。C语言的函数是能相互调用的,但在调用函数前,必须对函数的类型进行说明,就算是标准库函数也不例外。

标准库函数的说明会被按功能分别写在不一样的头文件中,使用时只要在文件最前面用#include预处理语句引入相应的头文件。如前面使用的printf函数的说明是放在文件名为stdio.h的头文件中。

调用就是指一个函数体中引用另一个已定义的函数来实现所需要的功能,这个时候函数体称为主调用函数,函数体中所引用的函数称为被调用函数。主函数只是相对于被调用函数而言。

一个函数体中能调用数个其它的函数,这些被调用的函数同样也能调用其它函数,也能嵌套调用。但是在c51语言中有一个函数是不能被其它函数所调用的,它就是main主函数。

标准库函数只要用#include引入已写好说明的头文件,在程序就能直接调用函数了。如调用的是自定义的函数则要用如下形式编写函数类型说明:

类型标识符 函数的名称(形式参数表);

这样的说明方式是用在被调函数定义和主调函数是在同一文件中。也能把这些写到文件名.h的文件中用#include“文件名.h”引入。

如果被调函数的定义和主调函数不是在同一文件中的,则要用如下的方式进行说明,说明被调函数的定义在同一项目的不一样文件之上,这样说明的函数也能称为外部函数,定义如下:

extern类型标识符 函数的名称(形式参数表);

函数的定义和说明是完全不一样的,在编译的角度上看函数的定义是把函数编译存放在ROM的某一段地址上,而函数说明是告诉编译器要在程序中使用那些函数并确定函数的地址。如果在同一文件中被调函数的定义在主调函数之前,这个时候能不用说明函数类型。也就是说在main函数之前定义的函数,在程序中就能不用写函数类型说明了。能在一个函数体调用另一个函数(嵌套调用),但不允许在一个函数定义中定义另一个函数。还要注意的是函数定义和说明中的“类型、形参表、名称”等都要相一致。

(二)函数调用的一般形式

调用函数的一般形式如下:

函数名 (实际参数表)

“函数名”就是指被调用的函数。

实际参数表能为零或多个参数,多个参数时要用逗号隔开,每个参数的类型、位置应与函数定义时所的形式参数一一对应,它的作用就是把参数传到被调用函数中的形式参数,如果类型不对应就会产生一些错误。调用的函数是无参函数时不写参数,但不能省后面的括号。

下面我们看一下在实际应用中函数不同的调用方式:

1. 函数语句

例如printf(“Hello World!\n”);

它以“Hello World!\n”为参数调用printf这个库函数,在这里函数调用被看作了一条语句。

2. 函数参数

“函数参数”这种方式是指被调用函数的返回值当作另一个被调用函数的实际参数,如temp=StrToInt(CharB(16));CharB的返回值作为StrToInt函数的实际参数传递。

3. 函数表达式

例如temp=Count();

这个函数的调用作为一个运算对象出现在表达式中,称为函数表达式。例子中Count()返回一个int类型的返回值直接赋值给temp。注意的是这种调用方式要求被调用的函数能返回一个同类型的值,不然会出现不可预料的错误。

C51常用头文件

下面介绍一些常用的C51头文件:

absacc.h——包含允许直接访问8051不同存储区的宏定义;

assert.h——文件定义assert 宏,可以用来建立程序的测试条件;

ctype——字符转换和分类程序;

intrins.h——文件包含指示编译器产生嵌入式固有代码的程序的原型;

math.h——数学程序;

reg51.h——51的特殊寄存器;

reg52.h——52的特殊寄存器;

setjmp.h——定义jmp_buf类型和setjmp和longjmp程序的原型;

stdarg.h——可变长度参数列表程序;

stdlib.h——存储区分配程序;

stdio.h——标准输入和输出程序;

string.h——字符串操作程序、缓冲区操作程序。

对于常用的MCS-51单片机,必须包含reg51.h的头文件,因为该文件对51单片机的相关寄存器及位进行了定义,这样在程序中才可以使用这些资源。

reg51.h文件的具体内容如下:

#ifndef __REG51_H__

#define __REG51_H__

/* BYTE Register */ //单元定义

sfr P0 = 0x80;

sfr P1 = 0x90;

sfr P2 = 0xA 0 ;

sfr P3 = 0xB0;

sfr PSW = 0xD0;

sfr ACC = 0xE0;

sfr B = 0xF0;

sfr SP = 0x81;

sfr DPL = 0x82;

sfr DPH = 0x83;

sfr PCON = 0x87;

sfr TCON = 0x88;

sfr TMOD = 0x89;

sfr TL0 = 0x8A;

sfr TL1 = 0x8B;

sfr TH0 = 0x8C;

sfr TH1 = 0x8D;

sfr IE = 0xA8;

sfr IP = 0xB8;

sfr SCON = 0x98;

sfr SBUF = 0x99;

/* BIT Register */

/* PSW */ //位定义

sbit CY = 0xD7;

sbit AC = 0xD6;

sbit F0 = 0xD5;

sbit RS1 = 0xD4;

sbit RS0 = 0xD3;

sbit OV = 0xD2;

sbit P = 0xD0;

/* TCON */

sbit TF1 = 0x8F;

sbit TR1 = 0x8E;

sbit TF0 = 0x8D;

sbit TR0 = 0x8C;

sbit IE1 = 0x8B;

sbit IT1 = 0x8A;

sbit IE0 = 0x89;

sbit IT0 = 0x88;

/* IE */

sbit EA = 0xAF;

sbit ES = 0xAC;

sbit ET1 = 0xAB;

sbit EX1 = 0xAA;

sbit ET0 = 0xA9;

sbit EX0 = 0xA8;

/* IP */

sbit PS = 0xBC;

sbit PT1 = 0xBB;

sbit PX1 = 0xBA;

sbit PT0 = 0xB9;

sbit PX0 = 0xB8;

/* P3 */

sbit RD = 0xB7;

sbit WR = 0xB6;

sbit T1 = 0xB5;

sbit T0 = 0xB4;

sbit INT1 = 0xB3;

sbit INT0 = 0xB2;

sbit TXD = 0xB1;

sbit RXD = 0xB0;

/* SCON */

sbit SM0 = 0x9F;

sbit SM1 = 0x9E;

sbit SM2 = 0x9D;

sbit REN = 0x9C;

sbit TB8 = 0x9B;

sbit RB8 = 0x9A;

sbit TI = 0x99;

sbit RI = 0x98;

#endif

而absacc.h为对8051单片机的不同存储区的宏定义,具体如下:

#define CBYTE ((unsigned char volatile code *) 0) //定义程序存储器;

#define DBYTE ((unsigned char volatile data *) 0) //定义片内数据存储区;

#define PBYTE ((unsigned char volatile pdata *) 0) //定义页寻址空间;

#define XBYTE ((unsigned char volatile xdata *) 0) //定义片外数据存储区。

而intrins.h文件对指示编译器产生嵌入式代码,如空操作执行、位指令、栈操作指令等,该文件的具体内容如下:

extern void _nop_ (void); //空操作8051 NOP指令

extern bit _testbit_ (bit); //测试并清零位8051 JBC指令

extern unsigned char _cror_ (unsigned char,unsigned char); //字符循环左移

extern unsigned int _iror_ (unsigned int,unsigned char); //字符循环右移

extern unsigned long _lror_ (unsigned long,unsigned char); //整数循环右移

extern unsigned char _crol_ (unsigned char,unsigned char); //整数循环右移

extern unsigned int _irol_ (unsigned int,unsigned char); //整数循环左移

extern unsigned long _lrol_ (unsigned long,unsigned char); //长整数循环左移

extern unsigned char _chkfloat_(float); //测试并返回源点数状态

extern void _push_ (unsigned char _sfr); //压入堆栈

extern void _pop_ (unsigned char _sfr); //弹出堆栈

51单片机C语言教程大全(PDF资料可在线学习)

c语言是一种非常容易使用的结构化语言。20世纪80年代以后,C语言也可以在单片机上使用。很多编程语言都是扩展和C语言,所以如果你能先学好C语言,然后再学习其他语言,入门会更容易。单片机c语言具有移植性好、易于理解、使用方便的特点。国内有大量的C语言程序员,重新学习单片机会非常容易。所以,虽然汇编语言更精炼,使用C语言也是大势所趋!---资 料 看文末

51单片机C语言教程大全都有哪些资料?

C语言设计.pdf

C语言设计.pdf 2.3M

C语言书写规范.pdf

C语言书写规范.pdf 254KB

51使用技巧及实战.pdf

51使用技巧及实战.pdf1M

单片机C语言教程.pdf

单片机C语言教程.pdf1.6M

C语言设计陷阱.pdf

C语言设计陷阱.pdf4.8M

单片机C语言编程与实例.pdf

单片机C语言编程与实例.pdf25.7M

单片机基础知识C51版.pdf

单片机基础知识C51版.pdf 529KB

下 载 资 料 需 戳 这 ↓↓↓

【下载】51单片机C语言教程大全PDF资料

相关问答

51单片机 的汇编 语言 有啥用?

51单片机的汇编语言在我们对程序的执行效率有较高要求的时候就特别有用。计算机编程需要有机器语言,汇编语言和高级语言。机器语言和汇编需要是用不方便,高级...

51单片机 ,stm32,arduino都是用什么 语言 进行编程的?

51单片机,STM32单片机用汇编或者C语言,现在基本都用C语言编程,Arduino有自己的编程环境,用户也是用C语言编程。51单片机的编程51单片机进入中国比较早,在...51...

51单片机 不能用汇编 语言 写吗?

51单片机能用汇编语言写程序,只是现在很少有人用,最重要的原因是汇编语言需要深入掌握单片机的指令集。汇编语言的优势很明显,程序的执行效率比其它高级语言...

51单片机 c 语言 常用指令?

单片机C语言常用指令包括数据类型定义、变量声明、赋值运算、条件判断、循环控制、函数定义和调用等。数据类型定义有int、float、char等,变量声明使用关键字...

51单片机 中的基本数据类型?

在标准C语言中,存在着如下六种基本数据类型:1、char:字符型;2、short=shortint:短整型3、int:整型4、long=longint:长整型5、float:单精...

51 系列 单片机 新手用什么 语言 编程?

51系列单片机初学者可以使用汇编语言或C语言进行编程。汇编语言通常需要对硬件有深入的了解,代码量较多,但可以实现更高效的控制。C语言则更加易学易用,代码量...

51单片机 C 语言 需要学习哪些知识?

答主从事嵌入式、单片机开发工作有几年了,负责硬件电路的设计和程序的编写调试等,所以结合自身的情况给与回答。1.单片机编程与PC编程不同单片机C语言和PC编...

能不能用arduino 语言 51单片机 程序?

不行,arduino是经过封装的,其他单片机用不了。底层也不兼容,肯定是不行的不行,arduino是经过封装的,其他单片机用不了。底层也不兼容,肯定是不行的

易语言 串口通讯和 51单片机 -ZOL问答

3条回答:【推荐答案】_端口1_数据到达这个事件子程序就是接收数据的子程序你的端口组件是自动启动的,所以把端口1.启动()'去掉然后发送数据的时候,你就马上停止的...

c 语言 编程中,如何在 51单片机 8位数码管上滚动显示-HELLO--字符。比如?

P0=smgduan[i];delay(100);这两句是显示字母的语句,把它们加入对应的case语句里,就可以指定哪一段数码管显示啥字母,比如:case(2):LSA=0;LSB=1;LSC.....

猜你喜欢