3.2 第一个C语言程序:单片机点亮一个发光二极管
在上一节我们编写和编译的C语言程序功能,其实就是“单片机点亮一个发光二极管”,只是没有解释程序的每一句的作用而已。本节我们就来详细地讲一下如何用C语言设计一个单片机应用程序。首先,还是列出已经编好的程序,并编上号,一边讲解:
有的读者担心没有系统地学过C语言编程,这是不对的。随着课程的深入,你会发现自己已经学会了C语言编程,并没有感到什么困难。C语言是一种高级语言,很接近人类的语言或算术公式,所以,应该很容易理解和接受。有些语法和规则只要套用就可以了,没有必要深入研究和探讨。我们的目的只有一个,就是用C语言告诉单片机按照我们的要求工作。
先来看一下程序的基本框架,一般单片机应用的C语言程序的框架是:
上述1~3项是每个程序都有的,你可以一开始就把它写好,然后再添加所需的内容。工作内容视具体的要求不同而异。
单片机头文件是引用一个定义了单片机应用所用到的变量、函数的文件。你要编写哪种单片机应用程序,就要引用那种单片机的头文件。我们现在要用51系列的单片机,就引用reg51.h或reg52.h文件,用#include命令引用。
其次是主程序,每一个C语言程序都有一个主程序main(),void是没有返回值的意思。主程序下边有一对大括号{},所有的程序内容写在里面。括号是成对出现的,编写的时候最好上下对齐,以便检查发现错误。
在主程序中,一般会有一个无限循环while(1),1是条件永远为真的意思。这是因为单片机程序是裸机跑的程序,没有操作系统,就这一个程序在不停地运行,所以只能让它无限循环了。它的下面也是一个大括号,包含循环内容,即单片机的工作内容。
剩下的就是工作内容,需要根据实际需要编写。这个程序只有一条语句,让发光二极管点亮。这就涉及硬件问题,单片机C语言编程与一般的C语言编程不同之处就是针对硬件设置来编写程序。单片机通过它的端口即它的引脚输出高、低电平,来控制外部设备工作的。
现在,它要控制发光二极管工作,它的一个引脚接在发光二极管的负极,发光二极管的正极通过电阻接电源正极,因此,当单片机引脚为低电平时,发光二极管就会导通点亮。反之,当单片机引脚为高电平时,发光二极管就不会导通而不亮。所以,只要控制单片机引脚的高低电平就能控制发光二极管的开启和关闭。
在程序中,我们首先定义连接发光二极管的引脚P0口的第一个引脚,用P0^0表示,这是在单片机头文件中定义的。89C52单片机共有4个输入输出端口,分别是P0、P1、P2和P3。每个端口有8各引脚,用0~7编号,所以P0口就有P0^0~P0^7共8个引脚,其他端口也是一样。可以为每个引脚定义一个变量名,以便于使用。因为一个引脚就是一位,所以该变量的类型是“sbit”,定义如下:
sbit LED=P0^0;//定义LED为端口P0^0
在程序语句中用“;”结束,“//”后面是程序的注释内容,解析程序语句的作用。有了定义,我们只要给变量赋值,该端口就会按照赋值输出高低电平。赋值1输出高电平,赋值0输出低电平。
LED=0;//P0^0输出低电平,发光二极管点亮
由于该语句在无限循环while(1)中,发光二极管就会一直亮着。如果再加上一句:
LED=1;//P0^0输出高电平,发光二极管关闭
它就会一亮一灭,即不断地闪烁,当然,在中间还要插入延时,适当延长间隔才能使眼睛能看出来。