电子工程师自学宝典:嵌入设计篇
上QQ阅读APP看书,第一时间看更新

4.2 单片机点亮单个LED的电路与程序详解

4.2.1 单片机点亮单个LED的电路

图4-5是单片机(STC89C51)点亮单个LED的电路,当单片机P1.7端口为低电平时,LED(发光二极管)VD8导通,有电流流过LED,LED点亮,此时LED的工作电流为IF=(U-UF/R=(5-1.5)V/510Ω≈0.007A=7mA。

图4-5 单片机点亮单个LED的电路

4.2.2 采用位操作方式编程点亮单个LED的程序与说明

要点亮P1.7端口外接的LED,只需让P1.7端口为低电平即可。点亮单个LED可采用位操作方式或字节操作方式,如果选择位操作方式,在编程时直接让P1.7=0,即让P1.7端口为低电平,如果选择字节操作方式,在编程时让P1=7FH=01111111B,也可以让P1.7端口为低电平。

图4-6是用Keil C51软件编写的采用位操作方式点亮单个LED的程序。

程序说明如下:

1)“/* */”为多行注释符号(也可单行注释),“/*”为多行注释的开始符号,“*/”为多行注释的结束符号,注释内容写在开始和结束符号之间,注释内容可以是单行,也可以是多行。

图4-6 采用位操作方式点亮单个LED的程序

2)“//”为单行注释开始符号,注释内容写在该符号之后,换行自动结束注释。注释部分有助于阅读和理解程序,不会写入单片机,图4-7是去掉注释部分的程序,其功能与图4-6程序一样,只是阅读理解不方便。

图4-7 去掉注释部分的程序

3)#include<reg51.h>中的“#include”是一个文件包含预处理命令,它是软件在编译前要做的工作,不会写入单片机,C语言的预处理命令相当于汇编语言中的伪指令,预处理命令之前要加一个“#”。

4)“reg51.h”是8051单片机的头文件,在程序的reg51.h上单击鼠标右键,将弹出图4-8所示的右键菜单,选择打开reg51.h文件,即可将reg51.h文件打开,reg51.h文件的内容如图4-9所示。它主要是定义8051单片机特殊功能寄存器的字节地址或位地址,如定义P0端口(P0锁存器)的字节地址为0x80(即80H),PSW寄存器的CY位的位地址为0xD7(即D7H)。reg51.h文件位于“C:\Keil\C51\INC”中。在程序中也可不写“#include<reg51.h>”,但需要将reg51.h文件中所有内容复制到程序中。

图4-8 在程序的reg51.h上单击鼠标右键用菜单打开该文件

4.2.3 采用字节操作方式编程点亮单个LED的程序与说明

图4-10是采用字节操作方式编写点亮单个LED的程序。

图4-9 reg51.h文件的内容

图4-10 采用字节操作方式点亮单个LED的程序

该程序采用一次8位赋值(以字节为单位),先让P1=0xFF=FFH=11111111B,即让P1锁存器8位全部为高电平,P1的8个端口全部输出高电平,然后让P1=0x7F=FFH=01111111B,即让P1锁存器的第7位为低电平,P1.7端口输出低电平,P1.7端口外接LED导通发光。

4.2.4 单个LED以固定频率闪烁发光的程序与说明

图4-11是控制单个LED以固定频率闪烁发光的程序。

LED闪烁是指LED亮、灭交替进行。在编写程序时,可以先让连接LED负极的单片机引脚为低电平,点亮LED,该引脚低电平维持一定的时间,然后让该引脚输出高电平,熄灭LED,再该引脚高电平维持一定的时间,这个过程反复进行,LED就会闪烁发光。

为了让单片机某引脚高、低电平能持续一定的时间,可使用Delay(延时)函数。函数可以看作是具有一定功能的程序段,函数有标准库函数和用户自定义函数。标准库函数是Keil软件自带的函数,用户自定义函数是由用户根据需要自己编写的。不管标准库函数还是用户自定义函数,都可以在main函数中调用执行,在调用函数时,可以赋给函数输入值(输入参数),函数执行后可能会输出结果(返回值)。图4-11程序用到了Delay函数,它是一个自定义函数,只有输入参数t,无返回值,执行Delay函数需要一定时间,故起延时作用。

图4-11 控制单个LED闪烁发光的程序

主函数main是程序执行的起点,如果将被调用的函数写在主函数main后面,该函数必须要在main函数之前声明,若将被调用函数写在main主函数之前,可以省略函数声明,但在执行函数多重调用时,编写顺序是有先后的。比如在主函数中调用函数A,而函数A又去调用函数B,如果函数B编写在函数A的前面,就不会出错,相反就会出错。也就是说,在使用函数之前,必须告诉程序有这个函数,否则程序就会报错,故建议所有的函数都写在主函数后面,再在主函数前面加上函数声明,这样可以避免出错且方便调试,也更直观,很容易看出程序使用了哪些函数。图4-11中的Delay函数内容写在main函数后面,故在main函数之前对Delay函数进行了声明。

4.2.5 单个LED以不同频率闪烁发光的程序与说明

图4-12是控制单个LED以不同频率闪烁发光的程序。接通电源后,单片机P1.7端口的LED先以高频率快速闪烁10次,再发光以低频率慢速闪烁10次,该过程不断重复进行。

图4-12 控制单个LED以不同频率闪烁发光的程序

该程序第一个for循环语句使LED以高频率快速闪烁10次,第二个for循环语句使LED以低频率慢速闪烁10次,while循环语句使其首尾大括号内的两个for语句不断重复执行,即让LED快闪10次和慢闪10次不断重复进行。