第3章单片机C语言程序设计2_第1页
第3章单片机C语言程序设计2_第2页
第3章单片机C语言程序设计2_第3页
第3章单片机C语言程序设计2_第4页
第3章单片机C语言程序设计2_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

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

文档简介

1、单片机原理与应用单片机原理与应用及及C51C51程序设计程序设计一指针变量的定义一指针变量的定义数据类型说明符数据类型说明符 存储器类型存储器类型 * *指针变量名;指针变量名;例:例:int int * *p1; /p1; /* *定义一个指向整型变量的指针变量定义一个指向整型变量的指针变量p1p1* */ /char char * *p2; /p2; /* *定义一个指向字符变量的指针变量定义一个指向字符变量的指针变量p2p2* */ /char data char data * *p3; /p3; /* *定义一个指向字符变量的指针变量定义一个指向字符变量的指针变量p3p3,该,该指针访

2、问的数据在指针访问的数据在片内数据存储器片内数据存储器中,该指针在内存中中,该指针在内存中占一个字占一个字节节* */ /char xdata char xdata * *p4; /p4; /* *定义一个指向字符变量的指针变量定义一个指向字符变量的指针变量p4p4,该指针访问的数据在,该指针访问的数据在片外数据存储器片外数据存储器中,该指针在内存中中,该指针在内存中占占两个字节两个字节* */ /单片机原理与应用单片机原理与应用及及C51C51程序设计程序设计二指针变量的引用二指针变量的引用 指针变量是存放另一变量地址的特殊变量,指针变量只能存放地址。指针变量使用时注意两个运算符:&

3、和*。 “&”是取变量的地址,“*”是取变量的内容指针变量经过定义之后可以象其他基本类型变量一样引用。指针变量经过定义之后可以象其他基本类型变量一样引用。例如例如:int xint x,* * pxpx,* * pypy; / /* *变量及指针变量定义变量及指针变量定义* */ /px=&xpx=&x; / /* *x x的地址赋给指针变量的地址赋给指针变量pxpx,使,使pxpx指向变量指向变量x x* */ /* * px=5 px=5; / /* *等价于等价于x=5x=5* */ /py=pxpy=px; / /* *指针变量指针变量pypy也指向也指向x x

4、* */ /单片机原理与应用单片机原理与应用及及C51C51程序设计程序设计例:定义一个指向外部例:定义一个指向外部RAM(2000H)的指针变量的指针变量a,一个指向内部一个指向内部RAM(40H)的指针变量的指针变量b,并把,并把2000H单元的内容存放到单元的内容存放到40H单元。单元。uchar xdata *a;uchar data *b;a=0X2000;b=0X40;*b=*a;单片机原理与应用单片机原理与应用及及C51C51程序设计程序设计例例:将地址为将地址为2010H的的1字节二进制数(字节二进制数(256),),转换成转换成BCD码,保存在地址为码,保存在地址为2000H

5、开始的存储开始的存储单元中(高位在低地址)。单元中(高位在低地址)。单片机原理与应用单片机原理与应用及及C51C51程序设计程序设计【例例】 通过指针实现绝对地址的访问。通过指针实现绝对地址的访问。#define uchar unsigned char /*定义符号定义符号uchar为数据类为数据类 型符型符unsigned char*/#define uint unsigned int /*定义符号定义符号uint为数据类型为数据类型 符符unsigned int*/void main(void)uchar data var1;uchar pdata *dp1; /*定义一个指向定义一个指向

6、pdata区的指针区的指针dp1*/uint xdata *dp2; /*定义一个指向定义一个指向xdata区的指针区的指针dp2*/uchar data *dp3; /*定义一个指向定义一个指向data区的指针区的指针dp3*/dp1=0 x30; /*dp1指针赋值,指向指针赋值,指向pdata区的区的30H单元单元*/dp2=0 x1000; /*dp2指针赋值,指向指针赋值,指向xdata区的区的1000H单元单元*/*dp1=0 xff; *dp2=0 x1234; dp3=&var1; *dp3=0 x20; 三通过指针访问三通过指针访问 采用指针的方法,可以实现在采用指针

7、的方法,可以实现在C51程序中对任意指定的程序中对任意指定的存储器单元进行访问。存储器单元进行访问。单片机原理与应用单片机原理与应用及及C51C51程序设计程序设计【例例】通过通过_at_实现绝对地址的访问。实现绝对地址的访问。#define uchar unsigned char /*定义符号定义符号uchar为数据类为数据类 型符型符unsigned char*/#define uint unsigned int /*定义符号定义符号uint为数据类型为数据类型 符符unsigned int*/void main(void)data uchar x1 _at_ 0 x40; /*在在dat

8、a区中定义字节变量区中定义字节变量 x1,它的地址为它的地址为40H*/xdata uint x2 _at_ 0 x2000; /*在在xdata区中定义字变量区中定义字变量 x2,它的地址为它的地址为2000H*/x1=0 xff;x2=0 x1234;.while(1);单片机原理与应用单片机原理与应用及及C51C51程序设计程序设计1、简单、简单C语言举例语言举例main的函数体:main函数中的所有操作(或:语句)都在这一对之间。也就是说main函数的所有操作都在main函数体中。 语句:执行某种功能的指令。C语言的每条语句都用“;”作为结束标志。一个函数中可以有多条语句。例1.1vo

9、id main() printf(“This is a C program.n”) ;主函数:每个C语言程序都必须有一个main函数,它是每一个C语言程序的执行起始点(入口点)。 C语言的程序结构语言的程序结构单片机原理与应用单片机原理与应用及及C51C51程序设计程序设计赋值语句:将整数123赋给整型变量a,将整数456赋给整型变量b。a,b两个变量分别为123,456。每条语句均用“;”结束。 例1.2:void main() int a, b, sum; a = 123; b = 456; sum = a + b; printf(“sum = %dn”, sum); 变量声明:声明了三个

10、具有整数类型的变量a,b,sum。C语言的变量必须先声明再使用。 将a,b两变量内容相加,然后将结果赋值给整型变量sum。此时sum的内容为579。调用库函数输出sum的结果。%d为格式控制表示sum的值以十进制整数形式输出。 单片机原理与应用单片机原理与应用及及C51C51程序设计程序设计D.5 C51函数 1.函数:是一段可以函数:是一段可以重复调用重复调用,功能相对独立完整功能相对独立完整的程序段。的程序段。2.C语言是语言是函数型函数型语言,函数是程序的语言,函数是程序的基本组成单位基本组成单位,其中包括,其中包括1个主函数个主函数和和多个子函数多个子函数。3.C语言函数从定义角度看,

11、可以分为语言函数从定义角度看,可以分为标准库函数标准库函数和和用户函数两类用户函数两类。(1)标准库函数是)标准库函数是C语言系统语言系统提供的,用户提供的,用户无需定义无需定义,只需在程,只需在程序前包含该函数原型的序前包含该函数原型的头文件头文件,在程序中便可,在程序中便可直接调用直接调用,如:,如:printf、gets等。等。(2)用户自定义函数是用户)用户自定义函数是用户按需要编写按需要编写的函数,一般情况下标准的函数,一般情况下标准函数库不可能包含用户所需的所有功能,用户需要编写自定义函数库不可能包含用户所需的所有功能,用户需要编写自定义函数实现部分特殊功能。函数实现部分特殊功能。

12、 D.5.1 函数概述 单片机原理与应用单片机原理与应用及及C51C51程序设计程序设计D.5.2 函数的定义和调用一、函数定义一、函数定义 指编写指编写函数功能的程序块函数功能的程序块。由。由函数头函数头和和函数体函数体组成。组成。 1.函数头是函数定义的第一行,它指定函数名、函数的返回函数头是函数定义的第一行,它指定函数名、函数的返回值数据类型和形式参数表。值数据类型和形式参数表。 2.函数体用函数体用花括号花括号括起来,类似于复合语句。括起来,类似于复合语句。 函数定义的格式如下:函数定义的格式如下: 返回值类型返回值类型 函数名函数名 (类型符(类型符1 形参形参1,类型符,类型符n

13、形参形参n) 说明语句;说明语句; 执行语句;执行语句; 单片机原理与应用单片机原理与应用及及C51C51程序设计程序设计 函数的返回值类型:函数的返回值类型:可以是各种基本数据类型和复杂数据可以是各种基本数据类型和复杂数据类型,返回值类型缺省时,编译系统类型,返回值类型缺省时,编译系统默认为默认为int,对于无返,对于无返回值函数,其返回类型用回值函数,其返回类型用void说明。说明。 函数名:函数名:与变量名一样是与变量名一样是一种标识符一种标识符,定义规则也与变量,定义规则也与变量名一样,一般情况下通过函数名能理解函数的功能。名一样,一般情况下通过函数名能理解函数的功能。 形式参数表:形

14、式参数表:是指函数定义时在圆括号中列出的各个是指函数定义时在圆括号中列出的各个形式形式参数名参数名及其及其数据类型数据类型,形参用于函数被调用时接收主调函数,形参用于函数被调用时接收主调函数实参输入的数据。可以实参输入的数据。可以0个、个、1个或者多个。若函数是无参数个或者多个。若函数是无参数函数,函数,没有形参,但圆括号不能省略没有形参,但圆括号不能省略,并且可用,并且可用void说明。说明。单片机原理与应用单片机原理与应用及及C51C51程序设计程序设计(4)函数体:函数体:由由说明语句说明语句和和执行语句执行语句组成,说明语句可定义组成,说明语句可定义函数所使用的变量;执行语句描述函数的

15、具体操作,也函数所使用的变量;执行语句描述函数的具体操作,也可以调用函数实现函数嵌套。可以调用函数实现函数嵌套。 (5)若函数体内没有语句,则该函数是空函数,不执行任何若函数体内没有语句,则该函数是空函数,不执行任何操作,但是操作,但是花括号不能省略花括号不能省略。(6) 对于有返回值函数,在函数体的执行语句中应用对于有返回值函数,在函数体的执行语句中应用return语句返回函数执行结果,且保证返回结果的数据类型与语句返回函数执行结果,且保证返回结果的数据类型与函数头定义的返回值数据类型一致。函数头定义的返回值数据类型一致。 单片机原理与应用单片机原理与应用及及C51C51程序设计程序设计二、

16、函数的调用二、函数的调用 函数调用函数调用:主调函数主调函数使用使用被调函数被调函数的过程。有三种形式的过程。有三种形式 1.函数调用语句:函数调用语句: 函数名(实参表);函数名(实参表); 主要用于无返回值函数。主要用于无返回值函数。 2.函数表达式:函数表达式: y = 3 + sum(x1,x2); 主要用于有返回值函数。主要用于有返回值函数。 3.函数参数:函数参数: printf(“%d”,sum(x1,x2); 注意:注意:主调函数只能调用已存在的被调函数。主调函数只能调用已存在的被调函数。(1)若被调函数为库函数,则在源程序的开始处应用)若被调函数为库函数,则在源程序的开始处应

17、用#include命令命令包含含有被调函数原型的头文件;包含含有被调函数原型的头文件;(2)若被调函数为自定义函数,则被调函数应在主调函数前定义,)若被调函数为自定义函数,则被调函数应在主调函数前定义,或在调用被调函数前或在调用被调函数前先声明先声明被调函数。被调函数。单片机原理与应用单片机原理与应用及及C51C51程序设计程序设计三、函数的声明三、函数的声明1.声明被调函数的原型,包括被调函数名、返回值类型、形参表。声明被调函数的原型,包括被调函数名、返回值类型、形参表。2.声明函数原型可以照写函数定义时的函数头,再加分号即可声明函数原型可以照写函数定义时的函数头,再加分号即可, 如:如:i

18、nt sum(int x1,int x2);3.若被调函数声明在源程序的所有函数定义之前,该被调函数可以若被调函数声明在源程序的所有函数定义之前,该被调函数可以被任何函数调用;若被调函数声明在某个函数中,则该被调函数被任何函数调用;若被调函数声明在某个函数中,则该被调函数只能被这个函数调用。只能被这个函数调用。单片机原理与应用单片机原理与应用及及C51C51程序设计程序设计例例 输入两个整数,输出其中较大的值。输入两个整数,输出其中较大的值。#include#includeint max(int a,int b)int max(int a,int b) if(ab)if(ab) return

19、a; return a; else else return b; return b; void main()void main() int x,y,z; int x,y,z; printf(input two numbers:n); printf(input two numbers:n); scanf(%d%d,&x,&y); scanf(%d%d,&x,&y); z=max(x,y); z=max(x,y); printf(maxmum=%d,z); printf(maxmum=%d,z); 单片机原理与应用单片机原理与应用及及C51C51程序设计程序设计#i

20、nclude /包含I/O函数库int max(int a,int b); /对max函数进行声明void main( ) /主函数int x,y,z;printf(input two numbers:n);scanf(%d%d,&x,&y);z=max(x,y);printf(maxmum=%d,z);int max(int a,int b)if(ab)return a;elsereturn b;单片机原理与应用单片机原理与应用及及C51C51程序设计程序设计D.5.3 全局变量和局部变量一、不同一、不同1.定义位置不同定义位置不同(1)全局:定义在)全局:定义在源程序定义部

21、分源程序定义部分的变量称全局变量;的变量称全局变量;(2)局部:定义在)局部:定义在函数说明部分函数说明部分的变量称局部变量,函数形参属于局部变量。的变量称局部变量,函数形参属于局部变量。2.作用域不同作用域不同(1)全局变量对所有的函数是可见的,)全局变量对所有的函数是可见的,所有函数所有函数可以使用它;可以使用它;(2)局部变量只对定义它的函数可见,只能在)局部变量只对定义它的函数可见,只能在定义它的函数定义它的函数中使用,其它函中使用,其它函数不能使用它。数不能使用它。二、注意二、注意1.一个源程序中的各个一个源程序中的各个全局变量不能同名全局变量不能同名,各个函数中的局部变量各个函数中

22、的局部变量可以同名。可以同名。2.在一个函数中,当全局变量与局部变量同名时,在一个函数中,当全局变量与局部变量同名时,全局全局变量变量不起作用不起作用,局部局部变量变量起作用起作用。3.全局变量定义时未初始化,系统自动全局变量定义时未初始化,系统自动默认初值为默认初值为0;局部变量定义时未初始;局部变量定义时未初始化,其化,其初值不确定初值不确定。 单片机原理与应用单片机原理与应用及及C51C51程序设计程序设计D.5.4 中断服务程序中断服务程序类似于子函数,子函数由主调函数调用触发执中断服务程序类似于子函数,子函数由主调函数调用触发执行;中断服务程序由外设向行;中断服务程序由外设向CPU申

23、请中断触发执行。申请中断触发执行。中断服务程序的定义也类似于函数定义,如下所示:中断服务程序的定义也类似于函数定义,如下所示: 返回值类型返回值类型 函数名()函数名() interrupt n using m 说明语句;说明语句; 执行语句;执行语句; 关键字关键字interrupt后面的后面的n是中断类型号,取值范围是中断类型号,取值范围031,根,根据中断服务程序对应的中断源填写。据中断服务程序对应的中断源填写。 单片机原理与应用单片机原理与应用及及C51C51程序设计程序设计3.5.4 中断服务程序MCS-51单片机主要中断源的中断类型号和中断向量如单片机主要中断源的中断类型号和中断向量如表表3-9所示。所示。 n中断源中断源中断向量中断向量0外中断外中断00003H1定时计数器定时计数器0000BH2外中断外中断10013H3定时计数器定时计数器1001BH4串行口串行口0023H保留保留保留保留8*n+3单片机原理与应用单片机原理与应用及及C51C51程序设计程序设计3.5.4 中断服务程序关键字关键字using后面的后面的m是中断服务程序使用的工作寄存器组是中断服务程序使用的工作寄存器组别,取值别,取值0

温馨提示

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

评论

0/150

提交评论