本篇我们先介绍最基础的几个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口相关的实验。