- 51单片机应用基础(C51版)
- 胡进德 丁如春 刘爱荣
- 2508字
- 2020-06-25 23:06:11
学习单元三 单片机如何控制外部器件
通过前面的学习,我们了解到空调系统的功能、相应的功能部件和单片机I/O引脚三者之间有内在联系,这种关系如表1-1所示。
表1-1 空调系统与单片机的I/O口控制
上表说明,单片机的I/O引脚的确是双向的,单片机的每一个引脚都可以感受外部器件、控制外部器件。那么,单片机是如何控制外部器件的呢?或者说,单片机控制外部器件的工作原理是怎样的呢?
我们先看看现实生活中如何用一个开关控制LED指示灯(即发光二极管)。如图1-8所示的电路图中,当开关K闭合时,无电流流过LED指示灯,指示灯熄灭;当开关K断开时,只要选择合适的限流电阻R,就会有电流流过指示灯,指示灯就会发光。所以,开关K能够控制指示灯的亮和灭。
图1-8 开关K控制LED指示灯电路图
图1-8所示的开关K控制LED指示灯电路原理与单片机控制外部器件的工作原理有什么联系呢?
其实,单片机控制LED指示灯和其他外部器件与图1-8用开关K控制LED指示灯类似,原因是单片机内部已经集成了电源Vcc、电阻R和“开关K”,如图1-9所示。
图1-9 单片机控制LED指示灯的电路模型及电路图
(a)电子模型(b)P1.0引脚控制LED指示灯电路图
图1-9(a)中,LED指示灯的正极与单片机的某一输入/输出引脚I/O(英文为Input/Output,简称I/O)相连,另一端连接地。集成在单片机内部的电阻R一端与单片机正电源脚Vcc相连,另一端与单片机的I/O脚相连,也就是与指示灯的正极相连。在单片机内部有个“开关K”,它连接单片机的I/O脚和负电源脚GND。需要注意的是,这个“开关K”并不是真正意义上的机械式开关,而是存在于单片机内部的一个“电子开关”,这个电子开关主要由场效应管等构成(见学习情景三中的学习单元一),它也能被随意地控制其通和断,于是,指示灯的亮和灭受单片机内部的电子开关K所控制:当电子开关K闭合接负电源脚GND时,指示灯熄灭;反之,当电子开关K断开时,指示灯亮。关于电子开关K的详细情况我们将在解剖单片机内部结构时作介绍,刚开始不需要过多地了解,只需要知道这个电子开关的状态决定了I/O脚的电平状态是GND(0V)还是Vcc(+5V)。可能有人会问,电子开关由谁来控制呢?由单片机指令。指令是单片机根据人的意图来执行某种操作的命令。那么指令是什么样子的呢?
如果我们要在单片机的某一个I/O引脚例如P1.0引脚输出高电平Vcc驱动LED指示灯[电路见图1-9(b)],可以采用如下指令:
SETB P1.0;
反之,如果要在P1.0引脚输出低电平GND,可以采用如下指令:
CLR P1.0;
“SETB”是“set bit”的英文缩写,意思是置位、置“1”、置高电平,“SETB P1.0”中文含义是把P1.0脚置成高电平;“CLR”是“clear bit”的英文缩写,意思是清除位、置“0”、置低电平,“CLR P1.0”中文含义是把P1.0脚置成低电平。在单片机学习中,可以先粗略地把高电平理解成Vcc,而把低电平理解成GND。当我们将“SETB P1.0”这条指令事先“装入”单片机中以后,只要给单片机通上电,单片机会自动找到这条指令,单片机执行这条指令后电子开关K断开,+5V的电压通过正电源脚Vcc和内部电阻R从P1.0脚送出,于是从P1.0输出高电平,指示灯正向导通,指示灯有电流流过从而被点亮。同样的道理,将指令“CLR P1.0”事先“装到”单片机中,单片机执行这条指令后电子开关K闭合,0V的电压通过负电源脚GND和电子开关K与P1.0脚相连,于是从P1.0输出低电平,指示灯无电流流过而不发光。
以上就是单片机执行指令实现对外部器件控制的最简单过程。单片机要实现对外部器件的控制,常常需要执行多条指令。由多条指令构成的、用以实现某种特定功能的指令集合通常称为程序。例如,在图1-9(b)中,用P1.0引脚控制LED闪亮,程序是怎样的呢?
要让接在P1.0引脚上的LED闪亮,实际上就是要LED亮一段时间,再灭一段时间,然后再亮,再灭,如此交替进行。换个说法,就是让单片机P1.0脚周而复始地输出高电平和低电平。但如果直接使用下面的两条指令:
SETB P1.0
CLR P1.0
是否可行呢?
不行!这里有两个问题:
●单片机执行指令的时间很短,一般只有几个微秒。当执行完指令“SETB P1.0”后,LED是亮了,但在极短时间(微秒级)后,单片机又执行了“CLR P1.0”指令,LED又灭了,在这么短的时间内根本分辨不出LED曾经亮过。
●在执行完“CLR P1.0”指令后,单片机不会再自动回去执行“SETB P1.0”指令,所以不能正常工作。
为了解决这两个问题,可以设想如下:
●在执行完“SETB P1.0”指令后,延时一段时间(几秒或零点几秒)再执行第二条指令“CLR P1.0”,即可分辨出LED曾经亮过。
●在执行完第二条指令后,同样延时一段时间(几秒或零点几秒),然后再让单片机回去执行第一条指令“SETB P1.0”,然后再执行第二条……如此不断循环,LED将亮~延时~灭~延时~亮~延时~灭……,即可实现LED灯的闪烁功能。
由以上设想,编写的程序如下:
MAIN:SETB P1.0 ;(1)P1.0脚置高电平 ACALL DELAY ;(2)延时一段时间 CLR P1.0 ;(3)P1.0脚置低电平 ACALL DELAY ;(4)延时一段时间 SJMP MAIN ;(5)跳转至MAIN处再循环
以上指令中,分号后面的文字是为了便于理解指令功能而写的注释,不是程序的有效执行部分,不影响程序的执行。
第(1)条指令的作用是让LED亮。按以上分析,第(2)条指令的作用是延时;第(3)条指令的作用是让LED熄灭;第(4)条指令同第二条指令相同,也是延时;第(5)条指令转去执行第(1)条指令。第(5)条指令SJMP的意思是跳转,在SJMP后面有一个参数是MAIN,而在第(1)条指令的前面有一个MAIN,所以很直观地可以认识到,它要跳转到第(1)条指令处。第(1)条指令前面的MAIN被称之为标号,标号的用途是标识该行程序,便于使用。这里并不一定要给它起名叫MAIN,起什么名字,完全由编程者决定,只要符合一定的规定就行,比如可以称它为ABC、XYZ等等。当然,这时第(5)条指令SJMP后面的名字也得相应改动。
第(2)条和第(4)条指令的用途是延时。指令的符号是ACALL,称为子程序调用指令。该条指令后面跟的参数是DELAY。DELAY是一个标号,用于标识一段程序。这条指令的作用是这样的:当执行ACALL指令时,就调用DELAY所指示的程序段,当DELAY所指示的程序段执行完以后就返回继续执行后面的指令。如第(2)条指令调用DELAY所指示的程序段后延时一段时间,然后继续执行第(3)条指令;第(4)条指令调用DELAY所指示的程序段后同样延时一段时间,然后继续执行第(5)条指令。
通过单片机的P1.0引脚对LED指示灯的控制实例,我们初步认识了单片机控制外部器件的机制和指令/程序在单片机中的作用。