单片机入门教程第三章-C51语言程序设计
单片机入门教程:第三章 C51语言程序设计
C51语言既具有汇编语言对操作硬件的功能,又兼有高级编程语言的许多优点。在现代单片机程序设计中,C51语言得到了广泛的应用。本章主要介绍C51程序的基本结构以及C51程序设计的基础知识,包括标
识符
、
关键字
、
数据类型
、
表达式
和
运算
符等。
每个C51源程序中包含一个名为"main()“的主函数,C51程序的执行总是从
main()
函数开始的。
C51的变量类型
C51的基本数据类型有
整型(int)
、
浮点型(float)
、
字符型(char)
、
无值型(void)
。在基本数据类型中,除void类型外,其前面均可以有各种修饰符。修饰符用来改变基本类型的意义,以便更准确地适应各种情况的需求。
数组将多个相同类型的数据放在内存中连续的空间内存储,以便于程序同时调用一批相关数据进行使用。数组与普通变量一样,要先定义才能使用。在定义数组时,除了要注意数组本身的类型说明外,还要注意数组中的各变量的表示,即数组元素的表示。
在C51语言中,使用数组前必须先进行定义,即数组的类型说明。数组定义的一般形式如下。
类型说明符数组名[常量表达式],......;
数组声明的示例如下:
int sum[10];//声明整型数组sum,共10个元素
float ax[10],by[20];//声明浮点型数组ax,共10个元素,浮点型数组by,共20个元素
char c1[22];//声明字符数组c1,共22个元素
数组的赋值和遍历:
#include<stdio.h>//头文件
void main()//主函数
{
int i,a[10];//定义整型变量i和整型数组a
for(i=0;i<10;i++)//循环赋值
a[i]=5*i+1;
for(i=0;i<10;i++)//循环输出结果
printf("%d",a[i]);
}
变量作用域
变量作用域是程序中变量起作用的范围。由于C51中可以包含多个函数和程序文件,因此使用变量时,除要首先定义该变量外,还要注意变量的有效作用范围,即该变量的作用域。变量作用域即变量的作用范围,可以是作用于一个函数或一个程序文件,甚至整个工程里的所有文件都可用。
C51的运算符
运算符是表示特定的算术或逻辑操作的符号,也称为操作符。例如,“*”号表示了一个乘法运算符;“&&”号表示了一个逻辑与的运算符。在C51语言中,需要进行运算的各个量(常量或变量)通过运算符连接起来便构成了一个表达式。
其中
“?”运算符
也较为常见,通常的格式如下:
EXP1?EXE2:EXP3;
C51的表达式
表达式是需要进行运算的各个量由运算符连接起来而构成的一个整体。表达式是由操作数和运算符组成的,其中操作数一般包括常量和变量,甚至也可以包括函数和表达式等。表达式也是C51语言中的基本组成部分。C51中主要有
算术表达式
、
赋值表达式
、
逗号表达式
、
关系表达式
和
逻辑表达式
5种表达式。
C51的流程控制结构
- 顺序结构
顺序结构是指程序按照自上而下的顺序执行各个代码及程序模块,
没有语句的跳转
。顺序结构最常用,也比较简单,常用于实现不是很复杂的任务。
- 选择结构
选择结构的程序用于有选择地运行程序,其通过判断表达式的值来决定执行哪一段程序。选择结构的程序一般由if条件语句、
switch
开关语句等来构成。这种结构常用于处理判断、决策等任务。例如常用的
if-else-if
多分支
if条件结构
就是一种选择结构,其流程结构示意图如图所示。
- 循环结构
循环结构的程序是指循环重复执行同一代码段的程序。这种结构常被用于需要多次执行某项任务的情况,可以简化代码。一般由
while语句
、
do-while语句
、
for语句
等构成。
while语句
、
do-while语句
、
for语句
构成的循环结构示意图。
以上介绍的3种程序结构,实际上是前面介绍过的各个C51流程控制语句及其嵌套的使用。在实际的单片机程序设计中,需要根据设计任务的特点,合理选择使用这些程序结构,来简化程序设计并解决问题。下面举一个比较复杂的算法处理的例子,其中综合运用了
顺序
、
选择
以及
循环程序结构
。要计算的数学表达式如下所示。
其中x和y均为整型数据,当自
变量x取值大于0
时,因变量
y等于x的阶乘
;当自变量x小于或等于0时,因变量y等于表达式
x3-2x+2
的值。完整的程序代码示例如下。
#include<stdio.h>//头文件
int Fun(int x)
{
int i,y;
if(x>0)//判断x的值
{
y=1;
for(i=1;i<=x;i++)//阶乘运算
{
y=y*i;
}
}
else
{
y=x*x*x-2*x+2;//计算数学表达式
}
return y;//返回语句
}
void main()//主函数
{
int x,y;
x=4;
y=Fun(x);//函数调用
printf("Fun(%d)=%d\n",x,y);//打印输出结果
x=-3;
y=Fun(x);//函数调用
printf("Fun(%d)=%d\n",x,y);//打印输出结果
}
C51的函数
实际中求解复杂问题时,常将一个大问题划分成若干子问题,即采用
模块化程序设计
方法,将整个程序划分为若干个程序模块,每个模块解决一个特定的子问题,各模块间相互独立,最后再把所有的程序模块组合起来解决所有的问题。
C51语言中引入了函数的概念。模块化程序设计一般采用函数来实现,一个
函数
对应一个
功能模块
,在程序中要实现相应的功能,直接调用该功能对应的函数即可。使用函数不仅可以实现程序的模块化设计,而且可以减少实现相同的
功能重复编码
的工作量,因为各程序模块之间是相互独立的,这样还提高了程序的
可读性
和
维护性
。
函数定义的一般形式如下。
类型说明符函数名(形参列表)
形参类型说明
{
语句
return语句
}
函数定义的程序示例如下。
#include<stdio.h>//头文件
int max(x1,x2)//自定义函数,用于求两个整数中的最大值
{
if(x1>x2)//if判断语句
return x1;//如果x1大于x2,则函数返回x1
else
return x2;//如果x1小于x2,则函数返回x2
}
void main()//主函数
{
int x1=17,x2=9;//定义并初始化变量
printf("x1=%d,x2=%d",x1,x2);//输出x1、x2的值
printf("max(x1,x2)=%d\n",max(x1,x2));//调用函数并输出结果
}
在本例中,首先定义max函数是一个整型函数,形参
x1
和
x2
的类型均为整型量。函数返回值是整型数。在函数体中是
max
函数语句部分,使用if语句将两形参值作比较,将较大值作为函数的返回值,返回给主调函数。在主函数
main
中调用
max
函数,将主函数中的实参变量的值
x1=17
,
x2=9
传递给形参变量
x1
和
x2
,比较并输出结果。