2.2.4、表达式及复合语句
2.2.4.1、表达式语句
可以一行放一个表达式形成表达式语句,也可以一行放多个表达式形成表达式语句,这时每个表达式后面都必须带 ; 号,另外,还可以仅由—个分号 ;占一行形成一个表达式语句,这种语句称为空语句。
2.2.4.2、复合语句
复合语句是由若干条语句组合而成的一种语句,在C51 中,用一个大括号{ }将若干条语句括在一起就形成了一个复合语句,复合语句最后不需要以分号“;”结束,但它内部的各条语句仍需以分号;结束。
复合语句在执行时,其中的各条单语句按顺序依次执行,整个复合语句在语法上等价于一条单语句,因此在C51 中可以将复合语句视为一条单语句。
通常复合语句出现在函数中,实际上,函数的执行部分(即函数体)就是一个复合语句;复合语句中的单语句一般是可执行语句,此外还可以是变量的定义语句(说明变量的数据类型)。在复合语句内部语句所定义的变量,称为该复合语句中的局部变量,它仅在当前这个复合语句中有效。利用复合语句将多条单语句组合在—起,以及在复合语句中进行局部变量定义是C51 的一个重要特征。
2.2.5、基本结构和相关语句
2.2.5.1、顺序结构
顺序结构是最基本、最简单的结构,在这种结构中,程序由低地址到高地址依次执行
2.2.5.2、选择结构
选择结构可使程序根据不同的情况,选择执行不同的分支,在选择结构中,程序先都对一个条件进行判断。当条件成立,即条件语句为“真”时,执行一个分支,当条件不成立时,即条件语句为“假”时,执行另一个分支。
在C51 中,实现选择结构的语句为 if - else , if - else if 语句。另外在C51中还支持多分支结构,多分支结构既可以通过if 和 else if 语句嵌套实现,可用swith/case 语句实现。
2.2.5.3、循环结构
在程序处理过程中,有时需要某一段程序重复执行多次,这时就需要循环结 构来实现,循环结构就是能够使程序段重复执行的结构。循环结构又分为两种:
当(while)型循环结构和直到(do…while)型循环结构。
①当型循环结构
当型循环结构如图:当条件P 成立(为“真”)时,重复执行语句A,当条件不成立(为“假”)时才停止重复,执行后面的程序。
②直到型循环结构
直到型循环结构,先执行语句A,再判断条件P,当条件成立(为“真”)时,再重复执行语句A,直到条件不成立(为“假”)时才停止重复,执行后面的程序。
构成循环结构的语句主要有:while、do - while、for、goto。
2.2.5.4、break 和 continue 以及 return 语句
(1)、使用break 语句还可以从循环体中跳出循环,提前结束循环而接着执行循环结构下面的语句。它不能用在除了循环语句和switch 语句之外的任何其它语句中。
(2)、continue 语句用在循环结构中,用于结束本次循环,跳过循环体中continue下面尚未执行的语句,直接进行下一次是否执行循环的判定
(3)、return 语句一般放在函数的最后位置,用于终止函数的执行,并控制程序返回调用该函数时所处的位置。返回时还可以通过return语句带回返回值。return 语句格式有两种: ① return; ② return (表达式);
如果return语句后面带有表达式,则要计算表达式的值,并将表达式的值作为函数的返回值。若不带表达式,则函数返回时将返回一个不确定的值。通常我们用return语句把调用函数取得的值返回给主调用函数。
2.2.6、函数
2.2.6.1、函数的定义
格式说明:
1.函数类型
函数类型说明了函数返回值的类型。
2.函数名
函数名是用户为自定义函数取的名字以便调用函数时使用。
3.形式参数表
形式参数表用于列录在主调函数与被调用函数之间进行数据传递的形式参数。
区别在这儿:
4.reentrant 修饰符
这个修饰符用于把函数定义为可重入函数。所谓可重入函数就是允许被递归调用的函数。函数的递归调用是指当一个函数正被调用尚未返回时,又直接或间接调用函数本身。一般的函数不能做到这样,只有重入函数才允许递归调用。——(感觉不如c和cpp方便,一般也应该用不到,递归效率低,开发时候用不划算,权当了解吧)
关于重入函数,注意以下几点:
(1)用reentrant 修饰的重入函数被调用时,实参表内不允许使用bit 类型的参数。函数体内也不允许存在任何关于位变量的操作,更不能返回bit 类型的值。
(2)编译时,系统为重入函数在内部或外部存储器中建立一个模拟堆栈区, 称为重入栈。重入函数的局部变量及参数被放在重入栈中,使重入函数可以实现递归调用。
(3)在参数的传递上,实际参数可以传递给间接调用的重入函数。无重入属性的间接调用函数不能包含调用参数,但是可以使用定义的全局变量来进行参 数传递。
5、interrupt m 修饰符
interrupt m 是C51 函数中非常重要的一个修饰符,这是因为中断函数必须 通过它进行修饰。在C51 程序设计中,当函数定义时用了interrupt m修饰符, 系统编译时把对应函数转化为中断函数,自动加上程序头段和尾段,并按51 系 统中断的处理方式自动把它安排在程序存储器中的相应位置。
在该修饰符中,m 的取值为0~31,对应的中断情况如下:
0——外部中断0
1——定时/计数器T0
2——外部中断1
3——定时/计数器T1
4——串行口中断
5——定时/计数器T2
其它值预留。
2.2.6.2、自定义函数的声明
在C51 中,函数原型一般形式如下:
[extern] 函数类型函数名(形式参数表);
函数的声明是把函数的名字、函数类型以及形参的类型、个数和顺序通知编译系统,以便调用函数时系统进行对照检查。
函数的声明后面要加分号。如果声明的函数在文件内部,则声明时不用extern,如果声明的函数不在文件内部,而在另一个文件中,声明时须带extern,指明使用的函数在另一个文 件中。
2.2.7、构造数据类型
2.2.7.1、数组
① 常规数组
需要注意的是,C51 语言中数组的下标是从0 开始的,因此上面:> 第一句定义 的5个元素分别是:x[0]、x[1]、x[2]、x[3]、x[4]。
第二句定义的3个元素分别是:y[0]、y[1]、y[2]。赋值情况为:y[0]=1;y[1]=2;y[2]=3。
C51 规定在引用数组时,只能逐个引用数组中的各个元素,而不能一次引用 整个数组。但如果是字符数组则可以一次引用整个数组
②字符数组
字符数组的定义与一般数组相同,只是在定义时把数据类型定义为char 型。 在C51中,字符数组用于存放一组字符或字符串,字符串以“\0”作为 结束符,只存放一般字符的字符数组的赋值与使用和一般的数组完全相同。对于存放字符串的字符数组。既可以对字符数组的元素逐个进行访问,也可以对整个 数组按字符串的方式进行处理。
总结
一、电平特性知道什么是高低电平,什么是TTL,什么是CMOS即可
二、C51大致和C语言大多数是差不多的,我总结的内容可以也当做系统的复习和知识清单。
C51和C语言不同的地方我也用显眼的颜色备注出来了。直接拿捏就好,注意typedef叭,我看到很多项目源代码中的变量类型都是被重命名过的。