上篇文章介绍了流水灯的三种代码架构,这次来分享一下LED剩下的几种点亮模式。
灯组延时闪烁
闪烁主要考察的就是延时函数的应用,书中一共有三种延时函数的设置方式,分别应用于不同的场景,这里介绍的是第一种,用两个for循环嵌套组成,数量级为万。
#include <reg52.H>
//sbit LED=P1^0; //定义LED是P1.0位对应的变量,这是只有一个灯的情况,注意P要大写
//如果是一组led,直接用P1表示
void Delay() //延时函数1
{
unsigned char i, j;
for (i=0;i<255;i++) //两个for循环间是嵌套关系,没有分号
for (j=0;j<255;j++);
}
void main()
{
while(1)
{
//LED = 0; //如果是共阳极接法,点亮LED需要单片机引脚输出低电位,共阴极则相反
P1 = 0; //51单片机一共有四组引脚,每组引脚都可以控制8个LED
Delay(); //调用延时函数
//LED = 1; //熄灭led灯
P1 = 0xff; //八个灯分别对应两个16进制数的二进制数位,84218421
//P1 = ~0x00; //为了更直观的表示灯点亮的控制码,可以采用取反操作赋值1
Delay();
}
}
无论是要实现哪种功能的C51代码,都要具备三条语句,分别是头文件,主函数和永真循环。
而电路里必需的电路有两个,分别是电源电路和晶振电路,在仿真软件中常默认具备以上电路不用另行设置。
LED及灯组闪烁演示
效果如视频所示,接线有些粗糙,后面会介绍网络标号法,用来处理复杂电路的接线问题。
高低位、奇偶位、内外位
这三种模式都取决于引脚赋值,其中奇偶位还可以调用移位符达到类似流水灯的效果。
#include <reg52.H>
void Delay() //这几类灯的延时函数均相同
{
unsigned char i, j;
for (i=0;i<255;i++)
for (j=0;j<255;j++);
}
void main()
{
while(1)
{
P1 = 0xf0; //高低位模式点亮低位
//P1 = 0x55; //奇偶位模式点亮奇位
//P1 = 0x3c; //内外位模式点亮内位
Delay();
P1 = 0x0f; //高低位模式点亮高位
//P1 = 0xaa; //奇偶位模式点亮偶位
//P1 = 0xc3; //内外位模式点亮外位
Delay();
}
}
LED高低位、奇偶位、内外位演示
使用移位符可以有效减少赋值的次数,LED点亮效果同上述代码。
#include <reg52.H>
#include <intrins.h> //库函数会将舍弃的高位补到低位,保证值不丢失
void Delay()
{
unsigned char i, j;
for (i=0;i<255;i++)
for (j=0;j<255;j++);
}
void main()
{ P1 = 0x55; //赋初值点亮奇位
while(1)
{
P1 = _crol_(P1,1); //移位符点亮点亮偶位,之后再转为奇位
Delay();
}
}
除了库函数方式外,数组法可以控制奇偶位点亮,移位符由于低位补零的原因不予考虑。
关于LED的点亮方式已经全部介绍完了,之后我们会学习新的外设——数码管,谢谢大家。