【51单片机】LED灯的进阶操作(闪烁、流水)
2024-01-10 06:05:42
上篇文章我们讲到了Keil5
与STC
的使用方式点亮第一个LED灯
这篇将继续进行一些LED灯的进阶操作
LED灯闪烁:
上文我们说只要通过P2这个寄存器就可以控制LED亮灭,现在我们要将其变为闪烁状态,故:
void main()
{
while(1)
{
P2 = 0xFE;
P2 = 0xFF;
}
}
但由于寄存器的速度是非常快的,达到MHz(每秒100次)的等级,就导致这两句代码执行的特别快,最后的结果就是整体变暗一点
故我们需要进行一定的延时
这里说一下我们的STC软件中有一个下图的软件延时计算器
我们可以通过设置系统频率(与你的开发板有关,我们使用的是STC89C52,用的是12MHz的频率)与定时长度,得到一段延时你目标秒数的代码,我们复制粘贴就可以使用
---------------------生成的代码-------------------
void Delay500ms() //@12.000MHz
{
unsigned char i, j, k;
_nop_();
i = 4;
j = 205;
k = 187;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
这段代码中_nop_的含义是
出自丿Zero
---------------------生成的代码-------------------
我们将其引用在C程序中
#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;
Delay500ms();
P2 = 0xFF;
Delay500ms();
}
}
这样就可以得到一个闪烁的LED灯了
LED流水灯
普通LED流水灯
流水灯的话,让每个灯按次序亮灭就可以得到,再嵌套一个循环。
我们说到,写程序时不能写P2 = 1111 1111
这样的命令,要使用16进制,那么
我们就可以
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流水灯PLUS
我们每次进行软件延时时都去调节比较麻烦,我们可以利用C语言的基础,用传参去解决每次都要调节的问题
我们先生成一个延时1ms的子函数,对这个子函数进行传参
void Delay1ms(unsigned int xms) //@12.000MHz
{
while(xms--)
{
unsigned char i, j;
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
}
}
运用到程序函数中就可以得到一个可以自由控制秒数的LED等啦
#include <intrins.h>
void Delay1ms(unsigned int xms) //@12.000MHz
{
while(xms--)
{
unsigned char i, j;
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
}
}
void main()
{
while(1)
{
P2 = 0xFE;//1111 1110
Delay1ms(100);
P2 = 0xFD;//1111 1101
Delay1ms(100);
P2 = 0xFB;//1111 1011
Delay1ms(100);
P2 = 0xF7;//1111 0111
Delay1ms(100);
P2 = 0xEF;//1110 1111
Delay1ms(100);
P2 = 0xDF;//1101 1111
Delay1ms(100);
P2 = 0xBF;//1011 1111
Delay1ms(100);
P2 = 0x7F;//0111 1111
Delay1ms(100);
}
}
欢迎讨论
文章来源:https://blog.csdn.net/2301_78636079/article/details/135400415
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!