单片机小白学步(21) IO口:基本的LED和按键操作

本篇我们先介绍最基础的几个IO口操作。学完本篇,大家要能自己独立完成下面几个实验。

1、点亮LED

2、一个按键控制LED,按下灯亮,释放灯灭

3、两个按键控制一个LED,一个键开灯,一个键关灯

实验一

点亮LED的例子前面入门篇已经讲过了,程序写起来很简单,Keil编写程序并编译生成HEX文件,烧写进单片机的过程,也做了完整详细的介绍。

点亮LED利用了IO口输出操作。简单复习一下,最核心的两句代码是:

sbit LED = P1^0;

LED = 0;

第一句定义LED为sbit型变量,对应了P1.0口的高低电平,具体应该写哪个IO口,和实际电路有关。第二句设置LED对应的P1.0管脚输出低电平,从而点亮LED。

实验二:按键开关

讲第二个实验前,先简单介绍下常用的按键开关。下图就是最常见的按键开关,有四个引脚,图中的1、2连在一起,3、4连接在一起。按下按键时,四个引脚就全部导通了。

实验二:搭建电路

根据前面讲的IO口原理,我把按键开关一端接在P2.0端口了,另一端接到GND。因为P2.0有内部上拉电阻,我就不用自己外接了。最小系统和LED还是之前的电路不变,如下图所示。

实验二:程序实现

程序首先定义了LED和KEY,分别表示发光二极管和按键开关。如果你用的是成品开发板,或者电路和我的不一样,就定义你的电路中对应的管脚。开发板可以从电路图查看独立按键所在的管脚。

主函数刚开始时,设置KEY输出高电平,因为后面要读取KEY所在端口的电平。在程序的主循环中,读取KEY的值,这里我们直接把KEY当做一个一位变量去判断就可以了,它有值0和1。如果KEY为1,即KEY==1,说明按键没有按下,设置LED=1即熄灭。注意这里使用两个等号表示比较而不能用一个等号,那样就成赋值了。在else中,设置LED=0即点亮。于是就能实现我们需要的效果了。

#include <reg52.h>

sbit LED = P1^0;

sbit KEY = P2^0;

void main()

{

KEY = 1;

while(1) {

if(KEY == 1) {

LED = 1;

} else {

LED = 0;

}

}

}

这是我按下按键,灯亮时的情形。

实验二:程序分析

注意这里我们读取按键和开关LED的代码应该放在主循环里面,也就是不断的读取按键状态并开关灯。如果放在主循环前面,主函数写成下面这样,是不能工作的。因为单片机执行速度很快,放在循环前面只会读取按键执行一次,执行完了进入while(1)主循环,单片机就不会再读取按键的状态,这时无论如何按键,它都不会帮你开关LED了。

void main()

{

KEY = 1;

if(KEY == 1) {

LED = 1;

} else {

LED = 0;

}

}

程序简化

还要说的是,这个程序还能进一步简化。因为KEY是一个变量,在C语言中变量有真假值,非零为真,零为假。所以主循环中可以这样写(其他部分相同):

if(KEY) {

LED = 1;

} else {

LED = 0;

}

但是还可以继续简化。因为LED和KEY都是变量,可以考虑直接用KEY给LED赋值,写成下面这样就行了。

LED = KEY;

取反操作的应用

如果要实现按下按键灯灭,释放按键灯亮这样恰好相反的效果,做个很小的修改就可以了,如下所示。感叹号是逻辑取反的意思,如果是0就会变成1,如果是非0就变成0。

LED = !KEY;

实验三

实验三我只提供主要代码片段,具体的分析理解,实际电路搭建和实验,交给大家自己完成。

sbit KEY_ON = P2^0;

sbit KEY_OFF = P2^1;

while(1) {

if(KEY_ON == 0)

LED = 0;

if(KEY_OFF == 0)

LED = 1;

}

再次强调,如果想学好单片机,大家一定要自己独立做完这三个实验,切身体验单片机的工作过程,提高动手能力。如果做实验的过程中感觉很神奇,感受到动手的乐趣,就更容易学好单片机。如果你觉得这只是不想做的任务,或许你对单片机并没有什么兴趣,那样的话想学好单片机就有些困难了。因为学习从来都应该是主动的事情。

下一篇会继续讲IO口相关的实验。