第一节主要是针对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 1110while(1){}
}
这一段代码,就是直接控制P2,一次控制8位。1111 1110,让P2_0输出低电平,剩余输出高电平,我们就实现了D1小灯的亮。
三、LED闪烁
基于上一个电灯控制,现在加一些些难度,我们实现一个小灯的闪烁功能。
思路就是小灯亮一下,暗一下。但是此时我们去直接
void main()
{while(1){P2=0xFE; //1111 1110P2=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 1110Delay500ms();P2=0xFF; //1111 1111Delay500ms();}
}
看着很多东西,其实我们自己书写的只有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 1110Delay500ms();P2=0xFD;//1111 1101Delay500ms();P2=0xFB;//1111 1011Delay500ms();P2=0xF7;//1111 0111Delay500ms();P2=0xEF;//1110 1111Delay500ms();P2=0xDF;//1101 1111Delay500ms();P2=0xBF;//1011 1111Delay500ms();P2=0x7F;//0111 1111Delay500ms();}
}
至此我们学会了如何直接控制输出端口操作LED小灯了。