前言
大家好,这里是诡异森林。我使用的是普中科技的A2的51开发板,适合新手入门。用到的应用是Keil5和Stc-isp,第一个软件主要用来写代码的,第二个是将代码程序输送到单片机上,当然上面还提供一些经常使用的函数模块。
LED模块的原理
上图是LED模块的原理图,LED是基于数字信号控制LED灯的亮灭。在这里,是一行由8个LED灯组成的模块。电流会向LED发送高电平信号,使LED处于熄灭状态,我们可以通过改变信号的状态来决定它的亮灭。
首先电路从正极(VCC)出发,然后通过一个1k欧的电阻(限流作用),然后流入发光二极管的正极,负极流出,最后到电路中的P2口。
这个P2口是与芯片链接的。
如上图,P2是寄存器,CPU可通过程序来直接控制寄存器;寄存器通过驱动器控制电压,当驱动器为1时,为高电平(5V),为0时低电平(0V),所以程序可以通过二进制1/0来控制电路的高低电平,进而控制LED的亮灭。
点亮一个LED灯
在电路中,能识别的信号就是正负极,我们用1/0的二进制数字信号来进行表示,在写程序中,习惯用16进制来进行表示。
当电路接通后,电路中的LED默认为高电平(1),我们需要把它改为低电平(0),LED灯才会被点亮,所以我们可以这么写:
#include <REGX52.H> //这是一个51单片机的头文件 int main() { P2=0xFE;//P2已被包含在文件中,表示寄存器,可控制LED //二进制为 1111 1110 }
效果:
LED灯的闪烁
我们可以通过程序让它不断形成高低电平,那么LED灯将会闪烁。所以可以用while循环,但这里要注意的是,由于led引脚的电平持续在0、1之间变化,变化频率非常快,在MHz量级,导致的结果就是百直接看不到灯闪烁。所以我们还需要一个延迟函数减缓它的闪烁频率。
#include <REGX52.H> #include <INTRINS.H>//包括nop函数 void Delay500ms() //@11.0592MHz { unsigned char i, j, k; _nop_();//单周期指令,可由晶振频率来延迟时间 i = 4; j = 129; k = 119; do { do { while (--k); } while (--j); } while (--i); } int main() { while(1) { P2=0xFE; //亮 1111 1110 Delay500ms(); //延迟500毫秒 P2=0xFF; //灭 1111 1111 Delay500ms(); } }
LED流水灯
当我们明白这些原理之后,就可以通过控制每一个LED灯来跑流水灯了。
代码:
#include <REGX52.H> void Delay1ms(unsigned int x) //@11.0592MHz { unsigned char i, j; while(x--)//可通过循环来延迟时间频率 { i = 2; j = 199; do { while (--j); } while (--i); } } int main() { int i; char hex[8]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F}; //写一个数组表示不同灯亮起 while(1) { for( i=0;i<8;i++) { P2=hex[i]; Delay1ms(500-50*i); //时间频率越来越快 } } }