《迷人的8051单片机》----3.4 程序

3.4 程序

3.4.1 程序的构成

C程序的构成是由一个main函数和若干个其他函数构成的,以下我们用一个实际的例子来说明C程序的构成。

#include<reg52.h>        //8051单片机的头文件
void main()        //定义主函数,返回值为空
{
    unsigned char num;    //定义变量num
    P0=0xFE;        //让P0.0口输出低电平,P0.1~P0.7保持高电平
    while(1)        //让程序在此循环
    {
    num++;            //变量num的值自加
    }
}

在上面的程序中,第一行“#”是预处理命令行起始符号,“include”是预处理命令,表示程序在这里引用了来自另外一个地点的文件,“include”用于将该文件中的程序行放到本程序中使用。“reg52.h”是C51编译器提供的增强型8051单片机的头文件,用于对8051单片机的寄存器进行规范化定义。

程序的第二行是一个函数。我们知道,C语言是一个模块化的语言,它的主要部分就是由多个具有特定功能的函数构成的。“main”函数和C语言中其他函数在结构上是一致的,但它的名称是固定的“main”,即“主函数”的意思。在一个C源程序中,有且仅有一个主函数,无论主函数位于源程序的什么位置,程序执行时都从主函数开始。

主函数的返回值为“空”,而且没有输入参数。在“main”函数的函数体中,首
先定义了一个变量num,之后是一个赋值语句,意思是给寄存器P0赋值为十六进制的“FEH”,函数中的每一个程序行都以分号“;”结束。接下来的程序行是一个while 语句,它是一个循环语句,用来控制程序段(即循环体)的重复执行,这里程序的目的是让变量num的值不断自加。单片机的程序都是一个趋于无限的死循环,程序中使用while(1)这样的写法的目的是使程序在此进入持续的循环状态。

分析程序的运行过程,主函数是程序运行的开始。程序从主函数的函数体第一行开始执行,直至while循环之前,这一部分在每次系统复位后会顺序执行一次,程序中变量的声明、系统的初始化等可以放在这一部分运行。之后,程序进入由while语句构成的主循环中。这部分语句在程序运行时会无限地循环执行,适用于软件查询标志位、扫描按键和数码管等需要不间断访问的部分。主函数的运行过程如图3-5所示。

3.4.2 程序的注释

为了便于理解程序,可以在程序行的适当位置加入注释。注释有两种,一种是单行注释,即在需要注释的文字前面加入两个斜杠,其格式为:
// 注释的文字
另一种是多行注释,即在要注释的段落开始位置加入一个斜杠和一个星号,在段落的结束位置再加入一个星号和斜杠,具体格式为:

/* 注释的文字  注释的文字  注释的文字  注释的文字  注释的文字  注释的文字
   注释的文字  注释的文字  注释的文字  注释的文字  注释的文字  注释的文字  */

被注释的文字在编辑器中是以绿色显示的,在对程序进行编译时,被注释的文字不参加编译,也不会干扰程序的运行。经常对程序代码进行注释是一个好习惯,它不但可以帮助别人理解你的代码,也给日后自己的阅读带来方便。

3.4.3 局部变量和全局变量

变量的有效性范围称为变量的作用域,C语言中所有的量都有自己的作用域,变量说明的方式不同,决定了其作用域也不同。按作用域范围不同,C语言中的变量可分为两种,即局部变量和全局变量。

1. 局部变量

局部变量也称为内部变量。局部变量是在函数内部进行定义和说明的,其作用域仅限于函数内部,离开该函数后再使用该变量是非法的。例如:

void delay(unsigned int t)
{
    unsigned int x,y;
    for(x=t;x>0;x--)
    {
        for(y=2650;y>0;y--)
        {
        }
    }
}

在面的delay函数内部,定义了两个变量x和y,这两个变量在delay函数内部使用是合法的,或者说变量x和y的作用域仅限于delay函数内部。C程序中允许在不同的函数中使用相同的局部变量名,但它们代表不同的对象,调用时会分配不同的内存单元,互不干扰。另外,在主函数中定义的变量也是局部变量,只能在主函数中使用,主函数中也不能使用其他函数中定义的变量。

2. 全局变量

全局变量也称为外部变量,它是在函数的外部定义的变量。全局变量不属于某一个函数,而是属于某一个源程序文件。全局变量的作用域是整个源程序,在函数中使用全局变量,同样需要先定义后使用。例如:

#include<reg52.h>                    //8051单片机的头文件
unsigned int  NUM;                //定义全局变量NUM用于显示
void  display(unsigned int K);            //数码管显示函数声明
…
int main(void)
{
     …
    while(1)
    {
        …
        display(NUM);                //扫描数码管
    }
}
void  display(unsigned int K)
{
    unsigned char NUM4,NUM3,NUM2,NUM1;        //定义四个局部变量
    …
}

在以上的代码中,变量NUM是一个全局变量,它的定义位置是在函数的外面,因此它的作用域是整个程序,NUM这个变量在程序的任何地方调用都是合法的。全局变量经常用来作为函数间数据的传递。在display函数的内部定义的变量NUM1~NUM4则是局部变量,它在display函数内部,也只能在该函数内部使用。

时间: 2024-09-17 11:24:37

《迷人的8051单片机》----3.4 程序的相关文章

《迷人的8051单片机》----3.6 构造类型数据

3.6 构造类型数据 我们前面介绍的数据类型有字符型.整型.实型等,它们都属于基本的数据类型.C语言中还支持构造类型的数据,它是由基本数据类型按照一定的规则组合而成的,构造类型数据主要包括数组.结构体和共用体等. 3.6.1 数组 简单地说,数组就是同一类变量的有序集合.数组同普通变量一样,要先定义后使用,定义数组的方法如下:数据类型 数组名 [常量表达式] ;定义数组时,"数据类型"是指数组中各个单元的类型,数组只能是同一类型的数据单元的集合:"数组名"是整个数组

《迷人的8051单片机》——导读

前 言 在单片机的"江湖"中,8051单片机历来都是兵家必争之地.这是因为8051单片机有着悠久的历史和最为庞大的用户群,很多时候它已经成为8位单片机领域的一种行业标准,众多器件都会以8051单片机为例给出驱动代码.作为单片机的初学者,选择从8051单片机起步绝对是一个非常正确的选择. 本书将采用一个全新的方式,带领你从零基础开始学习单片机和C语言编程,不仅让你在学习的过程中认识常用的电子元器件及其识别方式,而且使你快速地掌握8051单片机原理以及如何使用C语言来为其编写程序.当阅读完

《迷人的8051单片机》----3.5 预处理命令

3.5 预处理命令 在编写程序时,经常会使用以"#"开头的预处理命令.在对程序进行编译时,会有专门的预处理程序来对这些命令进行处理.预处理命令不属于C语句,因此在行末不必加分号,而且预处理命令通常要放在程序的最前面.在C程序中加入预处理命令可以改善程序结构,提高编译效率.C语言提供的预处理命令主要有宏定义.文件包含和条件编译3种,以下我们要重点介绍前面两种. 3.5.1 宏定义 宏定义的作用是用一个标识符(宏名)来表示一个字符串,其格式为:#define 标识符(宏名) 字符串在宏定义

《迷人的8051单片机》----第一篇 一切从“芯”开始

第一篇 一切从"芯"开始 当你阅读本书时,你已经选择了一个既激动人心又回报颇丰的爱好.它不需要高昂的经济成本,也不需要高深莫测的睿智.试想有一天,你动手制作的智能咖啡机在清晨你醒来时自动为你冲泡一杯香浓无比的咖啡:或者你设计的物联网概念洗碗机已经在超市出售,并且开始改变着无数个家庭的生活方式时,你的爱好不仅成就了自己,也造福了他人,世界因为你的参与而变得精彩. 对我们来说,能投入到这样一个具有改变世界的潜力且生机勃勃的领域是多么令人振奋的事情,你完全可以在这一领域大有作为,因为这里有发

《迷人的8051单片机》----第3章 入门C语言 3.1数据和运算

第3章 入门C语言 单片机是一种可编程的器件,我们需要将程序预先编写好,并保存到单片机的存储器中,单片机才能按照预先的设定执行程序.在给单片机开发应用程序时,使用C语言编写代码已经是一种趋势,C语言博大精深,学精不易,但入门却十分简单,本章将带领你用最便捷的方式快速学习C语言,并且在短时间内学会编写C应用程序. 3.1 数据和运算 3.1.1 C语言的由来 语言是编写程序时人与单片机之间的交流方式,最初人们使用机器码(0与1组合)来给单片机编写程序,后来开始使用汇编语言来编写程序,汇编语言和单片

《迷人的8051单片机》---3.2 语句

3.2 语句 C语言用语句来向计算机发出操作指令.一个C语句经编译后,可以生成若干条机器指令,它是构成函数的基础.C语言的语句可以分为控制语句.函数调用语句.复合语句.表达式语句以及空语句等多种.以下我们主要介绍的是C语言的控制语句,这种语句具有相对固定的格式,用来实现某种特定的功能. 3.2.1 控制语句 C语言有9种控制语句,可分成以下3类: 1)循环执行语句: while语句.do-while语句.for语句. 2)条件判断语句:if语句.switch语句. 3)转向语句:break语句.

《迷人的8051单片机》----2.5模拟与数字

2.5 模拟与数字 世界是物质的,来自物质世界的量大多具有模拟性的特点,比如物体的温度.音量的大小.大气的压力以及光照的强度等.我们要对外部世界的模拟量进行感知和处理,就需要对其进行量化,将模拟量转化为数字量,以下重点讨论的是模拟与数字信号的不同特点. 2.5.1 模拟信号 模拟信号是一种连续可变的信号,它不仅在时间上连续,而且在数值上也是连续的.模拟信号具有无穷多的瞬时值,其数学表达式也比较复杂,比如正弦函数.指数函数等,常见模拟信号的波形如图2-22所示. 在电子技术中,通常采用传感器将模拟

《迷人的8051单片机》----3.3 函数

3.3 函数 将解决某一问题的算法汇集起来,组成一个相对独立的函数,在需要时就可以调用这个函数来处理相应的问题,可以说,C程序的全部工作都是由多个不同的函数来完成的.函数可以根据需要自行定义,这一类函数我们称其为自定义函数.另外,为了简化代码编写的难度,通常C编译器还会将一些相对固定的功能事先编写成函数,以库的形式存储起来,这一类函数称为库函数. 3.3.1 自定义函数 这一类函数是用户根据需要自行定义的函数,须先定义后使用.自定义函数的形式如下: 类型标识符 函数名(形式参数列表) { 声明部

《迷人的8051单片机》----2.3场效应晶体管

2.3 场效应晶体管 晶体管是依靠输入电流变化来控制输出电流的器件,但理想的放大器是不应该损耗信号源的输出电流的,所以在一个由晶体管构成的放大电路中,因为有基极电流的存在,不可避免地会对输入信号带来损耗.与晶体管不同的是,场效应晶体管(FET)是一种用电压来控制电流的器件,具有很高的输入阻抗,且温度稳定性好.噪声低.按照结构的不同,场效应晶体管可以分为以下两类: 1. 结型场效应晶体管(JFET) N型沟道结型场效应晶体管 P型沟道结型场效应晶体管 2. 绝缘栅型场效应晶体管(MOSFET) 增