280 likes | 439 Views
C51 语句. C51 语句分类. C51 语句可以分为以下5类: (1)、控制语句,完成一定的控制功能 (2)、函数调用语句 (3)、表达式语句,由一个表达式构成一个语句 (4)、 空语句 (5)、复合语句,用{}把一些语句括起来。. if 语句. if 语句是用来判定所给定的条件是否满足,根据判定的结果(真或假)决定执行给出的两种操作之一。 if 语句的三种形式. 假0. 表达式. 真1. 语句. if 语句的三种形式 -1. if ( 表达式) 语句. 真. 假. 表达式. 语句1. 语句2. if 语句的三种形式 -2.
E N D
C51语句分类 C51语句可以分为以下5类: (1)、控制语句,完成一定的控制功能 (2)、函数调用语句 (3)、表达式语句,由一个表达式构成一个语句 (4)、空语句 (5)、复合语句,用{}把一些语句括起来。
if语句 if语句是用来判定所给定的条件是否满足,根据判定的结果(真或假)决定执行给出的两种操作之一。 if语句的三种形式
假0 表达式 真1 语句 if语句的三种形式 -1 if (表达式) 语句
真 假 表达式 语句1 语句2 if语句的三种形式 -2 if (表达式) 语句1 else 语句2
IF ELSE 例子 #include <stdio.h> void main( ) { int a,b,x; a=3; b=5; if(a>b)x=a; else x=b; printf("x=%d\n",x); }
if语句的三种形式 -3 if (表达式1) 语句1 else if (表达式2) 语句2 else if (表达式3) 语句3 . . . else if (表达式m) 语句m else 语句n
表达式1 表达式2 表达式3 表达式4 语句1 语句2 语句3 语句4 语句5 if语句的三种形式 -3 假 假 真 假 真 假 真 真
If语句说明 (1)、三种形式的if语句中在if后面都有表达式,一般为关系表达式或逻辑表达式。在执行if语句时先对表达式求解,若表达式的值为0,按假处理,若表达式的值为非0,按真处理,执行指定的语句。 (2)、在if和else后面可以只含有一个内嵌的操作语句,也可以有多个操作语句,此时用花括号{}将几个语句括起来成为一个符合语句。
Switch语句 Switch是多分支选择语句,形式如下: Switch (表达式) { Case 常量表达式1:语句1 Case 常量表达式2:语句2 … Case 常量表达式n:语句n Default: 语句n+1 }
根据表达式的 值进行选择 P=P1 P=P4 P=P2 P=P3 A B 。。。 M N Switch语句
Switch语句说明 (1)、switch 后面的表达式,可以是数值也可以是字符 (2)、当表达式的值与某一个CASE后面的常量表达式值相等时,就执行此CASE后面的语句,若所有的CASE 中的常量表达式的值都没有与表达式的值匹配的,就执行default后面的语句 (3)、每一个case后的常量表达式的值必须互不相同,否则就会出现矛盾的情况 (4)、各个case和default的出现次序不影响执行的结果。 (5)、执行完一个case语句后面的语句后,流程控制转移到下一个case继续执行。Case常量表达式只是起到语句标号的作用,并不是在该处进行条件判断。在执行switch语句时,找到匹配的入口标号后,就从此标号开始执行下去,不在进行判断。因此可使用break终止一个case结构。 (6)、多个case可以共用一组执行语句
SWITCH例子 #include<stdio.h> main() { char c; while(c!=27) /*循环直到按Esc键结束*/ { c=getchar(); /*从键盘不回显接收一个字符*/ switch(c) { case 'A': /*接收的字符为'A'*/ putchar(c); break; /*退出开关语句*/ case 'B': putchar(c); break; default: /*接收的字符非'A'和'B'*/ puts("Error"); break; } } }
0 表达式 非0 语句 While语句 While语句用来实现“当型”循环结构,形式如下 While(表达式) 语句 当表达式为非0,执行while语句中的内嵌语句。特点是先判断后执行 (1)、循环体如果包含一条以上的 语句,应该以复合语句形式出现 (2)、在循环体中应有使循环体趋 向于结束的语句
WHILE 例子 #include <stdio.h> main() { int i=0; char c; while(1) { c='\0'; while(c!=13&&c!=27) { c=getchar(); printf("%c\n",c); } if(c==27) break; i++; printf("The No. is %d\n",i); printf("The end"); } }
循环体语句 非0 表达式 0 Do while 语句 Do while 语句的特点是先执行循环体,然后判断循环条件是否成立。形式为: Do 循环体语句 While (表达式);
DO WHILE 例子 #include <stdio.h> void main( ) { int i=10; do{ printf ( "%d ", i-- ); }while ( i>0 ); printf ("\nwe're out of the loop.\n" ); }
For 语句 C语言中for的使用最为灵活,不仅可以用于循环次数确定的情况,而且可以用于循环次数不确定而只给出循环结束条件的情况。形式如下: For(表达式1;表达式2;表达式3) 语句 执行过程如下: (1)、先求解表达式1 (2)、求解表达式2,若值为真,则执行for语句中的内嵌语句,然后执行第3步。若值为假,则循环结束,转到第5步 (3)、求解表达式3 (4)、转回第2步继续执行 (5)、循环结束,执行for语句
求解表达式1 表达式2 假 真 语句 求解表达式3 For语句的 下一语句 For 语句
FOR 例子 #include<stdio.h> main() { int i,j,k; printf("i j k\n"); for (i=0;i<2;i++) for(j=0;j<2;j++) for(k=0;k<2;k++) printf("%d %d %d\n",i,j,k); }
子程序调用与转移类指令 共有14条指令。子程序调用类有绝对调用和长调用两种;转移类分为无条件转移和条件转移两组。无条件转移包括绝对转移、长转移、短转移和间接转移;条件转移包括结果为零、结果为 非零、减一后结果为非零以及两数不相等的转移条件,它们全部采用相对转移的方式。
绝对调用 ACALL addrll ;addrll一PC0-10,PC11-16不变说明:①调用范围 本指令在2K地址范围内的子程序调用。本指令实现的操作将不改变原PC的高5位(PC1l-15),仅把11位地址addrll送入PC的低11位(PC0-10),以此确定子程序的入口地址。由于整个64K程序存储器空间被分成32个基本2K地址范围(见表2.1),编程时,必须保证紧接AC从L指令后面的那一条指令的第一字节与被调用于程序的入口地址在同一2K范围内,否则将不能使用ACALL指令实现这种调用。
长调用 LCALL addrl6 ;addrl6一PCo-l5说明:本指令为64K程序存储器空间中的全范围子程序调用指令,子程序入口地址可在64K地址空间中的任一处。本指令为3字节指令。
无条件转移指令 绝对转移AJMP addrll ;addrll一PC0-10说明:①转移范围 本指令为2K地址范围内的转移指令。对转移目的地址的要求与ACALL指令中对于程序入口地址的要求相同。 长转移LJMP addrl6 ;addrl6一PC0-15说明:本指令为64K程序存储器空间的全范围转移指令。转移地址可为16位地址值中的 任一值。本指令为3字节指令。 短转移SJMP rel ;PC十2十rel-PC说明:本指令为一页地址范围内的相对转移指令。且SJMP rel 指令为2字节指令,所以转移范围为一126D一十129D。 间接转移JMP @A十DPTR ;A十DPTR-PC
条件转移指令 累加器为零(非零)转移JZ rel ;A=0则转移(PC十2十rel一PC);A≠0程序顺序执行JNZ rel ;A≠0 则转移(PC+2+rel-PC);A=0程序顺序执行 减一非零转移DJNZ Rn,rel; ;Rn一1-Rn,Rn≠ o,则转移(PC十2十re- PC);Rn=0,程序顺序执行DJNZ dir,rel;(dir)一l-dir,(dir)≠0则转移(PC十3十rel-PC);(dir)=o,程序顺序执行说明:UNZ Rn,rel是2字节指令,而DJNz dir,rel是3字节指令,所以在满足转移的条件后,前者是PC十2十rel一PC,而后者是PC十3十rel一PC。
例题1 题目:输入三个整数x,y,z,请把这三个数由小到大输出。1.程序分析:我们想办法把最小的数放到x上,先将x与y进行比较,如果x>y则将x与y的值进行交换, 然后再用x与z进行比较,如果x>z则将x与z的值进行交换,这样能使x最小。2.程序源代码:#include "stdio.h"#include "conio.h"main(){ int x,y,z,t; scanf("%d%d%d",&x,&y,&z); if (x>y) {t=x;x=y;y=t;} /*交换x,y的值*/if(x>z) {t=z;z=x;x=t;} /*交换x,z的值*/if(y>z) {t=y;y=z;z=t;} /*交换z,y的值*/printf("small to big: %d %d %d\n",x,y,z); getch(); }
案例 双CPU电子智能飞镖机 OBDII汽车故障诊断卡 汽车故障诊断仪器