第一节主要是针对LED的控制学习。这个过程中我们需要掌握的:1、控制的实现方法,控制实现的方法在后续的学习中是通用的。2、如何知道谁控制谁,通过查找开发板原理图获取,原理图的阅读的能力,在日后也是非常常用的。
一、原理图阅读
以我买的板子为例,打开我的板子的原理图(我们学的是方法,不妨先按我的学习,然后去对照自己的板子进行修改理解),原理图如下
从这个图纸中,我们很容易看出,我们的LED通过VCC、和P2_X(X代表数字)控制。一端是高电平,所以很显然当P2_X是低电平的时候我们可以点亮某一路小灯。
那么我们要关注,P2_X如何控制,我们继续查询开发板原理图
不难看出P2_X对应接在C51芯片的P2_0~7端口。
所以我们只需要对应的控制端口P2_X即可。
二、点亮一个灯
#include <REGX52.H>
void main()
{
P2=0xFE; //1111 1110
while(1)
{
}
}
这一段代码,就是直接控制P2,一次控制8位。1111 1110,让P2_0输出低电平,剩余输出高电平,我们就实现了D1小灯的亮。
三、LED闪烁
基于上一个电灯控制,现在加一些些难度,我们实现一个小灯的闪烁功能。
思路就是小灯亮一下,暗一下。但是此时我们去直接
void main()
{
while(1)
{
P2=0xFE; //1111 1110
P2=0xFF; //1111 1111
}
}
我们会发现小灯一直是亮的,这是为什么?因为单片机的处理速度非常快,小灯在我们人眼可以查觉之外的时候已经完成了亮暗变化,我们就一直以为是亮的。
为了解决这个问题,我们需要引入延时函数,可以借助stc-isp软件帮忙生成:
我们可以写出下面的代码:
#include <REGX52.H>
#include <INTRINS.H>
void Delay500ms() //@12.000MHz
{
unsigned char i, j, k;
_nop_();
i = 4;
j = 205;
k = 187;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void main()
{
while(1)
{
P2=0xFE; //1111 1110
Delay500ms();
P2=0xFF; //1111 1111
Delay500ms();
}
}
看着很多东西,其实我们自己书写的只有main函数的while部分。
四、流水灯
难度再次升级,我们能够控制一个灯的闪烁,我们是不是就可以控制一排灯按照顺序点亮的操作,视觉上我们看到的就是,一个灯像流水一样流动。
思路其实很简单,第一个量完,第二个亮,。。。以此类推。
#include <REGX52.H>
#include <INTRINS.H>
void Delay500ms() //@12.000MHz
{
unsigned char i, j, k;
_nop_();
i = 4;
j = 205;
k = 187;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void main()
{
while(1)
{
P2=0xFE;//1111 1110
Delay500ms();
P2=0xFD;//1111 1101
Delay500ms();
P2=0xFB;//1111 1011
Delay500ms();
P2=0xF7;//1111 0111
Delay500ms();
P2=0xEF;//1110 1111
Delay500ms();
P2=0xDF;//1101 1111
Delay500ms();
P2=0xBF;//1011 1111
Delay500ms();
P2=0x7F;//0111 1111
Delay500ms();
}
}
至此我们学会了如何直接控制输出端口操作LED小灯了。