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

简介:

本节书摘来自华章出版社《迷人的8051单片机》一书中的第3章,第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所示。

QQ_20170524100849

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函数内部,也只能在该函数内部使用。

相关文章
|
1月前
|
存储 算法 编译器
如何优化单片机程序里面的C代码方法
如何优化单片机程序里面的C代码方法
19 0
|
7月前
|
数据处理 C语言
侃侃单片机的裸奔程序的框架
侃侃单片机的裸奔程序的框架
80 0
|
3月前
|
缓存 编译器 程序员
嵌入式开发环境Vscode开发STM32单片机程序
嵌入式开发环境Vscode开发STM32单片机程序
55 0
|
8月前
【单片机期中测试】9.定时器实现简单的秒表程序
【单片机期中测试】9.定时器实现简单的秒表程序
123 0
|
8月前
【单片机期中测试】1.简单的流水灯程序
【单片机期中测试】1.简单的流水灯程序
62 0
|
10月前
|
消息中间件 Windows
单片机程序构架
单片机程序构架
|
11月前
|
芯片
【STC15单片机】初始化程序原理
【STC15单片机】初始化程序原理
187 0
|
传感器 数据采集 监控
资料转发分享【毕业设计】单片机和stm32设计选题,proteues仿真、程序完整资料
资料转发分享【毕业设计】单片机和stm32设计选题,proteues仿真、程序完整资料 基于单片机寻迹巡线避障智能小车系统设计 基于单片机体温心率脉搏检测仪系统设计 基于单片机温湿度光照自动窗帘系统设计 基于单片机环境监测温湿度PM2.5系统设计 基于51单片机的波形发生器(四种波形) 基于单片机SO2 NO2 PM温湿度空气质量检测仪 基于51单片机冰箱温度控制器设计
1197 1
资料转发分享【毕业设计】单片机和stm32设计选题,proteues仿真、程序完整资料
蓝桥杯之单片机学习(二十三)——对于官方驱动的函数调用,包装程序
蓝桥杯之单片机学习(二十三)——对于官方驱动的函数调用,包装程序
蓝桥杯之单片机学习(二十三)——对于官方驱动的函数调用,包装程序
|
存储 编译器
『单片机原理』程序存储器的结构
相信学习单片机的小伙伴们一定听说过一门课程,那就是单片机原理。如果你也是玩单片机的却不怎么懂单片机原理的。那么这单片机原理还是非常有必要学习一下的。如果你问我学了有什么好处,那么应该就是你可能会对单片机(内部)的理解更"深"吧&同时也对你学习单片机编程也是有极大的很多好处的👋
501 0
『单片机原理』程序存储器的结构