单片机原理及应用:第3章 80C51的C51语言程序设计

上传人:努力****83 文档编号:121502372 上传时间:2022-07-19 格式:PPT 页数:54 大小:733KB
收藏 版权申诉 举报 下载
单片机原理及应用:第3章 80C51的C51语言程序设计_第1页
第1页 / 共54页
单片机原理及应用:第3章 80C51的C51语言程序设计_第2页
第2页 / 共54页
单片机原理及应用:第3章 80C51的C51语言程序设计_第3页
第3页 / 共54页
资源描述:

《单片机原理及应用:第3章 80C51的C51语言程序设计》由会员分享,可在线阅读,更多相关《单片机原理及应用:第3章 80C51的C51语言程序设计(54页珍藏版)》请在装配图网上搜索。

1、3.1 C51对标准对标准C的扩展的扩展本章内容:本章内容:3.2 C51的指针的指针 3.3 C51的函数的函数第第3 3章章 80C5180C51的的C51C51语言程序设计语言程序设计 3.1 C513.1 C51对标准对标准C C的扩展的扩展扩展主要针对单片机存储器性质和分区特征、特殊的位寻址方式等 3.1.1 C51 3.1.1 C51的数据类型的数据类型 数据数据:常量和变量:常量和变量数据类型是数据的格式,决定数据的1.值域范围2.占用存储单元个数3.能参与哪种运算 C51 C51常用数据类型常用数据类型数据类型数据类型长度(位)长度(位)取值范围取值范围字符型字符型signed

2、 charsigned char8 8-128-128127127unsigned charunsigned char8 80 0255255整形整形singed intsinged int1616-32768-327683276732767unsigned intunsigned int16160 06553565535长整型长整型signed longsigned long3232unsigned longunsigned long3232浮点型浮点型floatfloat3232SFRSFR型型sfrsfr8 80 0255255sfr16sfr1616160 06553565535位型位

3、型bitbit1 10,10,1sbitsbit1 10,10,11.整型默认有符号,以补码进行存储2.浮点型只有十进制3.字符型默认有符号,可用进行常量的赋值,字符串用“”。;某些字符有特殊含义。#include#includevoid main()void main()long x,y;(long x,y;(有符号的长整型有符号的长整型)int a,b,c,d;(int a,b,c,d;(有符号的整型有符号的整型)x=5;x=5;y=6;y=6;a=7;a=7;b=8;b=8;c=x+a;c=x+a;d=y+b;d=y+b;printf(“c=x+a=%d,d=y+b=%dn”,c,d);

4、printf(“c=x+a=%d,d=y+b=%dn”,c,d);注:不同进制之间可以注:不同进制之间可以进行混合计算,但要注进行混合计算,但要注意兼容性!意兼容性!字符型默认有符号,可用进行常量的赋值,字符串用“”。;某些字符有特殊含义。注:也可作为注:也可作为8位整型位整型来使用!来使用!字符以字符以ASCIIASCII码方式表示,长度为码方式表示,长度为1 1个字节个字节但操作时按整型数进行处理。但操作时按整型数进行处理。对于处理大于对于处理大于0 x800 x80的的的的ASCIIASCII码字符,要定义码字符,要定义成成unsigned charunsigned char 否则直接转

5、为整型变量否则直接转为整型变量#include#includevoid main()void main()char a,b;char a,b;a=x;a=x;b=y;b=y;a=a-32;a=a-32;b=b-32;b=b-32;printf(“%c,%cn”,%d,%dn”a,b,a,b);printf(“%c,%cn”,%d,%dn”a,b,a,b);3.1.2 C51 3.1.2 C51数据的存储分区数据的存储分区 对单片机来说,访问片内对单片机来说,访问片内RAMRAM比访问片外比访问片外RAMRAM速度快得多,速度快得多,常使用的变量应置于片内常使用的变量应置于片内RAMRAM,用,

6、用bdatabdata、datadata、idataidata来定来定义;义;片外片外RAMRAM,用,用 pdatapdata、xdataxdata定义定义 默认编译模式下可省略分区定义。默认编译模式下可省略分区定义。存储分区存储分区对应的存储器及寻址方式对应的存储器及寻址方式bdatabdata片内片内RAMRAM位寻址区,共位寻址区,共128128位(也可按字节寻址)位(也可按字节寻址)datadata直接寻址,共直接寻址,共128B128Bidataidata间接寻址,共间接寻址,共256B256Bpdatapdata片外片外RAMRAM分页间址,共分页间址,共256B256Bxdat

7、axdata间接寻址,共间接寻址,共64KB64KBcodecodeROMROM间接寻址,共间接寻址,共64KB64KBbit data flags;/bit data flags;/位变量位变量flagsflags定位在片内定位在片内RAMRAM位存储区位存储区char data var;/char data var;/字符变量字符变量varvar定位在片内定位在片内RAMRAM区区float idata x,y;/float idata x,y;/字型变量字型变量x,yx,y定位在片内间址定位在片内间址RAMRAM区区unsigned char pdata z;unsigned char

8、pdata z;/无符号字符变量无符号字符变量z定位在片外分页间址定位在片外分页间址RAM区区变量与常量变量与常量变量的3要素:数据类型 对象名 内存存放地址 自动分配或给定绝对地址int int(datadata)lower,upper,step;/lower,upper,step;/整型数据整型数据char c,name16;/char c,name16;/字符型数据,数组字符型数据,数组常量 算数常量:整型、浮点型 字符常量 枚举常量变量的作用域变量的作用域块结构块结构 以以“”括起来的符合语句属于块结构。括起来的符合语句属于块结构。块内定义的变量作用域仅限于块内。块内定义的变量作用域仅

9、限于块内。块内定义与块外或外部定义具有相同的变量名,则它们块内定义与块外或外部定义具有相同的变量名,则它们没有关系没有关系int a=3;int a=3;main()main()int a=5;int a=5;printf(“a=n”,a);printf(“a=n”,a);自动型变量自动型变量 在函数内部定义的变量称为自动型变量(以在函数内部定义的变量称为自动型变量(以autoauto标识,标识,常省略),作用域定义在函数内部。不同函数里出现相同常省略),作用域定义在函数内部。不同函数里出现相同名字的变量,毫不相干。名字的变量,毫不相干。编译程序将自动为自动型变量分配存储空间,退出则编译程序将

10、自动为自动型变量分配存储空间,退出则消失消失。注:注:自动型变量与外部变量具有相同名字,函数(块)内自动型变量与外部变量具有相同名字,函数(块)内自动变量起作用;退出该函数(块)后,外部变量起作用自动变量起作用;退出该函数(块)后,外部变量起作用。外部型变量外部型变量 在函数外部定义的变量,可被程序中所有函数所引用。在函数外部定义的变量,可被程序中所有函数所引用。即全局变量作用域是整个程序。即全局变量作用域是整个程序。如有同名变量,则只有内如有同名变量,则只有内部变量起作用部变量起作用#include#includeint x=4,y=5;int x=4,y=5;void main()void

11、 main()int x=1;int x=1;int x=2;int x=2;int x=3;/int x=3;/:%u无符号十进制整数无符号十进制整数 printf(“x=%d,&x=%un”,x,&x);printf(“x=%d,&x=%un”,x,&x);printf(“y=%d,&y=%un”,y,&y);printf(“y=%d,&y=%un”,y,&y);printf(“x=%d,&x=%un”,x,&x);printf(“x=%d,&x=%un”,x,&x);printf(“y=%d,&y=%un”,y,&y);printf(“y=%d,&y=%un”,y,&y);printf(

12、“x=%d,&x=%un”,x,&x);printf(“x=%d,&x=%un”,x,&x);printf(“y=%d,&y=%un”,y,&y);printf(“y=%d,&y=%un”,y,&y);printf(“x=%d,&x=%un”,x,&x);printf(“x=%d,&x=%un”,x,&x);printf(“y=%d,&y=%un”,y,&y);printf(“y=%d,&y=%un”,y,&y);x=3,&x=1245044 x=3,&x=1245044 y=5,&y=4338028y=5,&y=4338028x=2,&x=1245048 x=2,&x=1245048 y=5

13、,&y=4338028y=5,&y=4338028x=1,&x=1245052 x=1,&x=1245052 y=5,&y=4338028y=5,&y=4338028x=4,&x=4338024 x=4,&x=4338024 y=5,&y=4338028y=5,&y=4338028C51C51的分隔符的分隔符“”;对数组说明对数组说明 如:如:char mm=“ok”;char mm=“ok”;“()”“()”隔离函数名与形参隔离函数名与形参s=area(r);s=area(r);“,”“,”隔离变量或表达式隔离变量或表达式 int x,y,z;int x,y,z;“”“”隔离复合语句隔离复合

14、语句 forfor()();“;”“;”语句间隔离语句间隔离“:”分隔标识符或特殊语句中使用分隔标识符或特殊语句中使用“*”指针指向数据指针指向数据 “&”数据所存地址数据所存地址“#”预处理伪指令预处理伪指令“”标识特殊寄存器的位标识特殊寄存器的位 sbit P10=P10sbit P10=P10“”“”说明函数的参数表中可能出现参数说明函数的参数表中可能出现参数 int int AB(int,char)AB(int,char)操作符操作符作用作用操作符操作符 作用作用+加,一目取正%取模-减,一目取负-减1*乘+加1/除操作符操作符作用作用操作符操作符 作用作用&逻辑与!逻辑非|逻辑或算术

15、运算符算术运算符逻辑运算符逻辑运算符操作符操作符作用作用操作符操作符 作用作用大于=大于等于=等于算术右移按位逻辑异或算术左移关系运算符关系运算符按位运算符按位运算符逻辑运算符与关系运算符是逻辑运算符与关系运算符是 真(真(truetrue)假(假(falsefalse)的概念。)的概念。true true 可以是非可以是非0 0的任何值,的任何值,falsefalse为为0.0.#include#includeunsigned moveright(unsigned value,int n);unsigned moveright(unsigned value,int n);unsigned m

16、overight(unsigned value,int n);unsigned moveright(unsigned value,int n);void main()void main()unsigned a;unsigned a;int n;int n;printf(“printf(“请输入一个八进制请输入一个八进制:”);:”);scanf(“%o”,&a);scanf(“%o”,&a);printf(“printf(“请输入要移位的位数请输入要移位的位数:”);:”);scanf(“%d”,&n);scanf(“%d”,&n);if(n0)if(n0)printf(“printf(“循环

17、右移的结果为循环右移的结果为:%on”,moveright(a,n);:%on”,moveright(a,n);else else n=-n;n=-n;printf(“printf(“循环左移的结果为循环左移的结果为:%on”,moveleft(a,n);:%on”,moveleft(a,n);循环移位程序循环移位程序 给出待移位给出待移位1616位整型数据位整型数据a a,移位数,移位数n n unsigned moveright(unsigned value,int n)unsigned moveright(unsigned value,int n)unsigned z;unsigned

18、z;z=(valuen)|(valuen)|(value(16-n);return z;return z;unsigned moveleft(unsigned value,int n)unsigned moveleft(unsigned value,int n)unsigned z;unsigned z;z=(value(16-n);z=(value(16-n);return z;return z;C51C51的特殊运算符的特殊运算符(1 1)“?”运算符运算符 1?:;3;#include#include main()main()int x,y;int x,y;x=50;x=50;y=x70

19、?100:0;y=x70?100:0;(2 2)“&”,”,”*”运算符运算符“&”“&”返回操作数地址返回操作数地址“*”返回位于这个地址的变量值返回位于这个地址的变量值#include#include main()main()int i,j,int i,j,*m;m;i=10;i=10;m=&i;m=&i;j=j=*m;m;(3 3)”,”,”运算符运算符“,”将多个表达式串在一起,将多个表达式串在一起,“,”左边不返回,右边才左边不返回,右边才是整个表达式的值是整个表达式的值#include#include main()main()int x,y;int x,y;x=50;x=50;y=

20、(x=x-5,x/5);y=(x=x-5,x/5);(4 4)size of size of 运算符运算符返回变量或类型的字节长度返回变量或类型的字节长度sizeof(double)sizeof(double)为为8 8sizeof(int)sizeof(int)为为2 2float f;float f;int i;int i;i=sizeof(f);i=sizeof(f);(5 5)联合操作)联合操作=相当于相当于=a=a+b a=a+b 可写成可写成 a+=ba+=ba=a/(b-c)a=a/(b-c)可写成可写成 a/=b-ca/=b-c3.1.3 C513.1.3 C51的编译模式的编

21、译模式编译模式与变量默认存储分区 例例 char var;/在在SMALL模式,模式,var定位于定位于data存储区存储区 /在在COMPACT模式,模式,var定位于定位于pdata存储区存储区 /在在LARGE模式,模式,var定位于定位于xdata存储区存储区 编译模式编译模式默认存储分区默认存储分区特点特点SMALLSMALLdatadata变量在片内变量在片内RAMRAM,空间小,速度快,空间小,速度快COMPACTCOMPACTpdatapdata变量在片外变量在片外RAMRAM的一页的一页LARGELARGExdataxdata变量在片外变量在片外RAMRAM的的64KB64K

22、B范围范围uVision中,存储模式在Option for Target 1 Target Memory Model中设定3.1.4 3.1.4 用用_at_at_定义变量绝对地定义变量绝对地址址为全局变量存放首地址进行定位idata int y_at_0 x30;/idataidata int y_at_0 x30;/idata中全局变量中全局变量y y首地址首地址0 x300 x30y=0 xaa;/y=0 xaa;/整型变量整型变量y y赋值赋值0 xaa0 xaaxdata char string20_at_0 x3000;xdata char string20_at_0 x3000;

23、/xdata /xdata中字符型数组中字符型数组stringstring的首地址的首地址0 x30000 x3000 对外设接口地址的定义要用对外设接口地址的定义要用volatile volatile 进行说明,以每次进行说明,以每次重读原始内存地址内容,而不适用保存在寄存器里的备份。重读原始内存地址内容,而不适用保存在寄存器里的备份。目的是避免编译器优化出现不正确结果。目的是避免编译器优化出现不正确结果。3.2 C51的指针的指针对于对于变量变量a,可用可用&a表示表示a的地址。的地址。p=&a;/pp=&a;/p为指针变量,其值为变量为指针变量,其值为变量a a的地址,即的地址,即p p

24、指向指向a a利用指针运算符利用指针运算符“*”,可获得指针所指,可获得指针所指变量的内容。变量的内容。char char*p;/p;/指针指针p p指向字符型数据指向字符型数据p=0 x30;/p=0 x30;/指针赋值地址指针赋值地址0 x300 x30指针也是一种变量,同样要存储在某一指针也是一种变量,同样要存储在某一存储器中,定义时可显式进行声明。存储器中,定义时可显式进行声明。char char*data p;/data p;/指针指针p p指向字符型数据,指针本身存储在指向字符型数据,指针本身存储在datadata区区char char*p;p;int data pint data

25、 p已定义称为数据存储分区的指针称为已定义称为数据存储分区的指针称为基于基于存储器的指针存储器的指针,在定义时就已制定了所指向,在定义时就已制定了所指向的数据的存储分区。的数据的存储分区。3.2.1 3.2.1 已定义数据存储分区的指针已定义数据存储分区的指针char idata char idata*data p;/data p;/指针指针p p指向指向idataidata区的字符型数据,指针本身区的字符型数据,指针本身 /存储在存储在datadata区区char data char data*data str;/data str;/单字节指针指向单字节指针指向datadata空间的空间的c

26、harchar型数据型数据int xdata int xdata*data num;/data num;/双字节指针指向双字节指针指向xdataxdata空间的空间的intint型数据型数据 基于存储器的指针长度为单字节或双字节,可以节省存储基于存储器的指针长度为单字节或双字节,可以节省存储器资源。器资源。定义指针变量时,未定义它所指向的数据定义指针变量时,未定义它所指向的数据存储分区的指针称为存储分区的指针称为通用指针(或一般指通用指针(或一般指针)针),存放通用指针要占用,存放通用指针要占用3个字节。个字节。3.2.2 3.2.2 未定义数据存储分区的指针未定义数据存储分区的指针第一字节为

27、指针所指向的数据存储分区编码第一字节为指针所指向的数据存储分区编码第二字节为指针所指向的数据的高字节地址第二字节为指针所指向的数据的高字节地址第三字节为指针所指向的数据的低字节地址第三字节为指针所指向的数据的低字节地址存储器分区存储器分区bdata/data/idataxdatapdatacode编码0 x000 x010 xfe0 xff通用指针用于存取变量而不必考虑变量在单片机内存储空间通用指针用于存取变量而不必考虑变量在单片机内存储空间3.2.3 3.2.3 利用指针实现绝对地址访问利用指针实现绝对地址访问unsigned char data unsigned char data*p;/

28、p;/单字节指针单字节指针p p指向内部指向内部RAMRAM数据数据p=0 x40 ;/p=0 x40 ;/指针指针p p赋值,指向内部赋值,指向内部RAMRAM的的0 x400 x40单元单元*p=0 x55 ;/p=0 x55 ;/数据数据0 x550 x55送入内部送入内部RAMRAM的的0 x400 x40单元单元C51提供一组宏指令定义以实现对提供一组宏指令定义以实现对80C51单片机绝对地址访问单片机绝对地址访问宏定义原型放在宏定义原型放在absacc.h文件中文件中#define CBYTE(unsigned char volatile code#define CBYTE(uns

29、igned char volatile code*)0);)0);#define DBYTE(unsigned char volatile data#define DBYTE(unsigned char volatile data*)0);)0);(unsigned char volatile code*)对地址进行强制类型转换,形成指针,指向后面给出地址。例:将30H至3FH共16个RAM单元初始化为55H#include#include#include#includevoid main(void)void main(void)unsigned char i;unsigned char i;

30、for(i=0;i=15;i+)for(i=0;i=15;i+)DBYTE0 x30+i=0 x55;DBYTE0 x30+i=0 x55;while(1);while(1);3.2.4 C513.2.4 C51程序编写示例程序编写示例C:0 x0000 020011 LJMP C:0011C:0 x0000 020011 LJMP C:0011C:0 x0003 E4 CLR AC:0 x0003 E4 CLR AC:0 x0004 FF MOV R7,AC:0 x0004 FF MOV R7,AC:0 x0005 7430 MOV A,#0 x30C:0 x0005 7430 MOV A,

31、#0 x30C:0 x0007 2F ADD A,R7C:0 x0007 2F ADD A,R7C:0 x0008 F8 MOV R0,AC:0 x0008 F8 MOV R0,AC:0 x0009 7655 MOV R0,#0 x55C:0 x0009 7655 MOV R0,#0 x55C:0 x000B 0F INC R7C:0 x000B 0F INC R7C:0 x000C BF10F6 CJNE R7,#0 x10,C:0005C:0 x000C BF10F6 CJNE R7,#0 x10,C:0005C:0 x000F 80FE SJMP C:000FC:0 x000F 80FE

32、 SJMP C:000FC:0 x0011 787F MOV R0,#0 x7FC:0 x0011 787F MOV R0,#0 x7FC:0 x0013 E4 CLR AC:0 x0013 E4 CLR AC:0 x0014 F6 MOV R0,AC:0 x0014 F6 MOV R0,AC:0 x0015 D8FD DJNZ R0,C:0014C:0 x0015 D8FD DJNZ R0,C:0014C:0 x0017 758107 MOV SP,#0 x07C:0 x0017 758107 MOV SP,#0 x07C:0 x001A 020003 LJMP C:0003C:0 x001

33、A 020003 LJMP C:0003复合语句复合语句用将一些说明和语句组合在一起,使他们在语法上等价于一个简单语句,称其位复合语句。条件语句条件语句 if(if(表达式表达式1)1)语句语句1 1 else(else(表达式表达式2)2)语句语句2 2#include#includevoid main()void main()int a,b,x;int a,b,x;a=3;a=3;b=5;b=5;if(ab)x=a;if(ab)x=a;else x=b;else x=b;printf(“x=%dn”,x);printf(“x=%dn”,x);注意:1.1.条件执行语句中条件执行语句中“el

34、se else 语句语句 2 2;”部分是选择项,可以缺省部分是选择项,可以缺省 if(if(表达式表达式)语句语句1 1;2.2.如果语句如果语句1 1或语句或语句2 2有多于一条语句要执行时,必须使用有多于一条语句要执行时,必须使用“”把这把这些括在其中些括在其中 if(if(表达式表达式)语句体语句体1 1;elseelse 语句体语句体2 2;if(x20|x20|x-10)if(yx)if(yx)printf(“good”);printf(“good”);elseelseprintf(“bad”)printf(“bad”)3.3.条件语句可以嵌套,但注意条件语句可以嵌套,但注意ifi

35、f对应哪个对应哪个elseelse,需要注意,需要注意elseelse与最近一个与最近一个ifif匹配匹配if(x20|x20|x-10)if(yx)if(yx)printf(“good”);printf(“good”);elseelseprintf(“bad”)printf(“bad”)if(if(表达式表达式1)1)语句语句1 1;else if(else if(表达式表达式2)2)语句语句2 2;else if(else if(表达式表达式3)3)语句语句3 3;.elseelse 语句语句n n#include#includevoid main()void main()int scor

36、e;int score;char grade;char grade;scanf(“%d”,&score);scanf(“%d”,&score);if(score94)grade=5;if(score94)grade=5;else if(score79)grade=4;else if(score79)grade=4;else if(score59)grade=3;else if(score59)grade=3;else grade=2;else grade=2;printf(“%dn”,grade);printf(“%dn”,grade);开关语句开关语句switch(switch(变量变量)c

37、ase case 常量常量 1 1:语句语句1 1或空;或空;case case 常量常量 2 2:语句语句2 2或空;或空;.case case 常量常量 n n:语句语句n n或空或空;default:default:语句语句n+1n+1或空;或空;注意:注意:判断判断case后面的表后面的表达式和达式和switch后面的表后面的表达式是否相匹配,一达式是否相匹配,一旦旦case匹配匹配,就会顺序就会顺序执行后面的程序代码执行后面的程序代码,而不管后面的而不管后面的case是否是否匹配匹配,直到遇见直到遇见break。#include#include#include#includevoid

38、 main(void)void main(void)int month;int month;int day;int day;printf(“please input the month number:”);printf(“please input the month number:”);scanf(“%d”,&month);scanf(“%d”,&month);switch(month)switch(month)case 1 case 1:case 3 case 3:case 5:case 5:case 7:case 7:case 8:case 8:case 10:case 10:case 1

39、2:day=31;case 12:day=31;break;break;case 4:case 4:case 6:case 6:case 9:case 9:case 11:day=30;case 11:day=30;break;break;case 2:day=28;case 2:day=28;break;break;default:day=-1;default:day=-1;if(day=-1)if(day=-1)printf(“Invalid month input!n”);printf(“Invalid month input!n”);elseelseprintf(“2015.%d ha

40、s%d days n”,month,day);printf(“2015.%d has%d days n”,month,day);while(1)while(1)跳转语句跳转语句1.break1.break语句语句u 常用在循环语句和开关语句中。当用在常用在循环语句和开关语句中。当用在switchswitch中,可使程序中,可使程序跳出跳出switchswitch而执行而执行switchswitch以后的语句,否则将成为死循环而无法以后的语句,否则将成为死循环而无法退出。退出。u 当用于当用于do-whiledo-while、forfor、while while 循环语句中,可使程序终止循环语句

41、中,可使程序终止循环而执行循环后的语句。常与循环而执行循环后的语句。常与ifif语句连在一起,即满足条件则语句连在一起,即满足条件则跳出循环。跳出循环。#include#includevoid main(void)void main(void)int i=0;int i=0;char c;char c;while(1)while(1)c=0;c=0;while(c!=13&c!=27)while(c!=13&c!=27)c=getchar();c=getchar();printf(“%cn”,c);printf(“%cn”,c);if(c=27)if(c=27)break;break;i+;i

42、+;printf(“The No.is%dn”,i);printf(“The No.is%dn”,i);printf(“The end”);printf(“The end”);输入一字符并显示,回车后显示出输入的字符数;当按输入一字符并显示,回车后显示出输入的字符数;当按ESC时结束字符输入同时输出时结束字符输入同时输出The endgetchar()getchar时,程序时,程序就等着用户按键就等着用户按键.用户输入的字符用户输入的字符被存放在键盘缓被存放在键盘缓冲区中冲区中.直到用户直到用户按回车为止按回车为止(回回车字符也放在缓车字符也放在缓冲区中冲区中).当用户当用户键入回车之后键入回

43、车之后,getchar才开始才开始从键盘缓冲区中从键盘缓冲区中每次读入一个字每次读入一个字符符.getchar函数函数的返回值是用户的返回值是用户输入的字符的输入的字符的ASCII码码2.continue2.continue语句语句u continue continue语句的作用是跳过循环体中剩余的语句而强行执行语句的作用是跳过循环体中剩余的语句而强行执行下一次循环下一次循环u continue continue语句只用在语句只用在forfor、whilewhile、do-whiledo-while等循环体中,常等循环体中,常与与ifif条件语句一起使用加速循环条件语句一起使用加速循环void

44、 main(void)void main(void)char c;char c;while(c!=0X0D)while(c!=0X0D)c=getchar();c=getchar();if(c=0X1B)if(c=0X1B)continue;continue;printf(“%cn”,c);printf(“%cn”,c);输入一字符并输出该输入一字符并输出该字符,按字符,按Enter则结束则结束输入,如按输入,如按ESC则重新则重新输入不显示。输入不显示。3.goto3.goto语句语句u goto goto语句是一种无条件转移语句语句是一种无条件转移语句u 用法:用法:goto goto 标

45、号标号;u 常与常与ifif条件语句连用,当满足某一条件,程序调到标号处运条件语句连用,当满足某一条件,程序调到标号处运行。行。u 标号必须与标号必须与gotogoto同处于一个函数中,但可不在一个循环层中。同处于一个函数中,但可不在一个循环层中。#include#includevoid main(void)void main(void)int i=0;int i=0;char c;char c;while(1)while(1)c=0;c=0;while(c!=13)while(c!=13)c=getchar();c=getchar();if(c=27)if(c=27)goto quit;go

46、to quit;printf(“%cn”,c);printf(“%cn”,c);i+;i+;printf(“The No.is%dn”,i);printf(“The No.is%dn”,i);quit:quit:printf(“The end”)printf(“The end”)循环语句循环语句for(for(;)1.for1.for语句语句2.while2.while语句语句while(while(条件条件)语句;语句;3.do-while3.do-while语句语句dodo 语句;语句;while(while(条件条件)#include#includevoid main(void)void

47、 main(void)int i,j,k;int i,j,k;printf(“i j kn”);printf(“i j kn”);for(i=0;i2;i+)for(i=0;i2;i+)for(j=0;j2;j+)for(j=0;j2;j+)for(k=0;k2;k+)for(k=0;k2;k+)printf(“%d%d%dn”,i,j,k);printf(“%d%d%dn”,i,j,k);i j ki j k0 0 00 0 00 0 10 0 10 1 00 1 00 1 10 1 11 0 01 0 01 0 11 0 11 1 01 1 01 1 1 1 1 1 C51程序由主函数程序

48、由主函数(唯一和程序的开始唯一和程序的开始)和和若干子函数构成。若干子函数构成。3.3 C513.3 C51的函数的函数C51函数函数函数的说明函数的说明库函数库函数自定义函数自定义函数系统提供若干头文件系统提供若干头文件分类实现分类实现系统提供的库函数系统提供的库函数用户自定义的函数用户自定义的函数主函数中声明被调用主函数中声明被调用子函数子函数子函数开头声明子函数开头声明注:中断处理子程序在主程序中无需声明注:中断处理子程序在主程序中无需声明 C51语言中,函数的定义形式为:语言中,函数的定义形式为:3.3.1 C513.3.1 C51函数定义函数定义 当函数没有返回值时,要用关键字当函数

49、没有返回值时,要用关键字void明确说明。明确说明。形式参数的类型要明确说明,对无形参的函数,括号也形式参数的类型要明确说明,对无形参的函数,括号也要保留要保留返回值类型返回值类型 函数名(形参列表)函数名(形参列表)编译模式编译模式reentrantinterrupt nusing nreentrantinterrupt nusing n 函数体函数体 例:延时毫秒函数示例(晶振11.0592MHz)void DelayMs(unsigned int n)/void DelayMs(unsigned int n)/延时函数延时函数 unsigned char j;unsigned char

50、j;while(n-)while(n-)for(j=0;j113;j+);for(j=0;j113;j+);编译模式:指定函数中局部变量和参数的存储空间编译模式:指定函数中局部变量和参数的存储空间 3.3.2 C513.3.2 C51函数定义的选项函数定义的选项 reentrant(定义重入函数定义重入函数)SMALL模式:默认变量在片内模式:默认变量在片内RAMCOMPACT模式:默认变量在片外模式:默认变量在片外RAM的页内的页内LARGE模式:默认变量在片外模式:默认变量在片外RAM的的64KB范围范围如果函数是可重入的,当该函数正在被执行时,如果函数是可重入的,当该函数正在被执行时,可

51、以再次被调用(递归使用)可以再次被调用(递归使用)C51函数默认是不可重入的函数默认是不可重入的 interrupt n(定义中断函数定义中断函数)中断函数使用中要注意中断函数使用中要注意:中断函数不能带有参数,也没有返回值中断函数不能带有参数,也没有返回值被中断函数调用的函数的工作寄存器组应与中被中断函数调用的函数的工作寄存器组应与中断函数工作寄存器组相同断函数工作寄存器组相同中断源中断源外中断外中断0定时器定时器0外中断外中断1定时器定时器1串行口串行口定时器定时器2中断号012345 using n(确定中断服务函数所使用的工作确定中断服务函数所使用的工作寄存器组寄存器组)n为工作寄存器

52、组号,取值为为工作寄存器组号,取值为03.指定后所有被中断调用的函数都必须使用同一寄存器指定后所有被中断调用的函数都必须使用同一寄存器组。组。不设定时,编译系统会将当前工作寄存器组不设定时,编译系统会将当前工作寄存器组8个寄存器个寄存器入栈入栈例:中断函数定义示例#include#includesbit P10=P10sbit P10=P10void main(void)void main(void)P10=0;P10=0;EX0=1 EX0=1 EA=1;EA=1;void Ex0_Isr(void)interrupt 0 /void Ex0_Isr(void)interrupt 0 /延时

53、函数延时函数 P10=!P10;/P10=!P10;/对对P10P10位取反位取反 3.3.3 C513.3.3 C51的库函数的库函数 数学运算库函数的参数和返回值类型为数学运算库函数的参数和返回值类型为float字符属性判断类库函数返回值类型由int调整为bit一些函数的参数和返回值类型由有符号定点数调整为无符号定点数 见附录C.2 main main 函数函数 主函数是一个特殊函数,每个主函数是一个特殊函数,每个C51程序都必须有程序都必须有main函函数,程序从这里开始执行。数,程序从这里开始执行。两种正式原型+非正式形式int main(void)int main(void)int

54、main(int argc,char int main(int argc,char*argv)/argc argv)/argc 表示被调用程序表示被调用程序所带命令行参数的数目,所带命令行参数的数目,argvargv指针数组,元素指向包含命令指针数组,元素指向包含命令行参数的字符串行参数的字符串 返回值作用是向系统返回一状态码返回值作用是向系统返回一状态码 对于单一程序采用非标准形式void main(void)void main(void)int main(int argc,char int main(int argc,char*argv)argv)函数的调用和返回函数的调用和返回 函数的简

55、单调用。函数的简单调用。C51C51调用函数时直接使用函数名和实参的方法。调用函数时直接使用函数名和实参的方法。#include#includeint maxmum(int x,int y,int z);int maxmum(int x,int y,int z);int main()int main()int i,j,k;int i,j,k;printf(“i,j,k=?n”);printf(“i,j,k=?n”);scanf(“%4d%4d%4d”,&i,&j,&k);scanf(“%4d%4d%4d”,&i,&j,&k);max=maxmum(i,j,k);max=maxmum(i,j,k

56、);printf(“The maxmum value of the 3 data is%dn”,max);printf(“The maxmum value of the 3 data is%dn”,max);getchar();getchar();return 0 return 0 int maxmum(int x,int y,int z);int maxmum(int x,int y,int z);int max;int max;max=xy?x:y;max=xy?x:y;max=maxz?max:z;max=maxz?max:z;return max return maxC51C51用全程

57、变量实现参数互传用全程变量实现参数互传#include#includevoid disp(void);void disp(void);int m10;int m10;int main()int main()int i;int i;printf(“In main before callingn”);printf(“In main before callingn”);for(i=0;i10;i+)for(i=0;i10;i+)mi=i;mi=i;printf(“%3d”,mi);printf(“%3d”,mi);disp();disp();printf(“In main after calling

58、n”);printf(“In main after callingn”);for(i=0;i10;i+)for(i=0;i10;i+)printf(“%3d,mi”);printf(“%3d,mi”);getchar()getchar()return 0 return 0 void disp(void);void disp(void);int j;int j;printf(in subfunc after callingn)printf(in subfunc after callingn)for(j=0;j10;j+)for(j=0;j10;j+)mj=mj mj=mj*10;10;printf(“%3d”,mj);printf(“%3d”,mj);

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

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!