C51 单片机开发 LED 灯 1 秒切换一次状态

2024-05-29 18:32:48 浏览数 (2)

公众号文章同步阅读网址:www.netor0x86.com

闲话:达梦作为一款国产数据库要上市了…!据说大部分国产数据库都很难盈利,或者在盈利与亏损的边缘挣扎。达梦之所以盈利,据说是0几年在达梦最难的情况下,冯老板不采用开源技术,而是坚持技术原创!不知道是不是真的。

关于定时器/计数器的很多概念都都介绍完了,今天来写一段简单的代码吧!

0x01:1 秒钟切换一次的 LED 的状态

1 秒切换一次 LED 灯的状态,意思就是 1 秒钟让 LED 灯亮一次,一次就让它亮 1 秒。我们就完成这样一个功能吧。

完成这样的功能在之前的代码中好像搞过,用 STC-ISP 生成一段延时的代码,让 CPU 进行空转。

而这次,我们使用借助定时器/计数器来完成。

0x02:实现思路

要实现上面的功能,主要的工作就是配置定时器/计时器的寄存器,其实前面梳理了那么多关于定时器/计时器的寄存器的内容,不就是要用它么!因为我们要 1 秒改变一次 LED 的状态,那么我们的 TL0 和 TH0 都无法直接满足,但是配合溢出的次数其实就可以实现了,溢出标志位是 TF0,记录它置为 1 的次数就行了。

在前面的内容中,我们知道了让 TL0 和 TH0 计数 10 毫秒需要初始化为 TL0 = 0x00 TH0 = 0xDC,那么 1 秒就是 100 个 10 毫秒,那我们就知道 TF0 溢出 100 次就经过了 1 秒了。(该不会忘记了吧?)

0x03:代码实现

有了上面的思路,那么代码就比较简单了,代码如下:

代码语言:javascript复制
#include <intrins.h>
#include "reg52.h"

sbit LED2 = P3 ^ 6;

void main()
{   
    int cnt = 0;
    LED2 = 0;
    
    TMOD = 0x1;
    
    TL0 = 0;
    TH0 = 0xDC;
    
    TR0 = 1;
    
    while (1)
    {
        if (TF0 == 1)
        {
            TF0 = 0;

            cnt   ;
            
            TL0 = 0;
            TH0 = 0xDC;
            
            if (cnt == 100)
            {
                cnt = 0;
                LED2 = !LED2;
            }
        }
    }
}

好了,整个代码也不复杂,在循环外初始化了定时器/计数器的相关寄存器,然后在 while 内不断地查询 TF0 是否溢出,溢出了就统计它溢出了多少次,然后再次重新初始化定时器/计数器相关的寄存器,当溢出到达 100 次,那么就让 LED 的状态取反即可。

最后看下演示效果!!

我是一个程序员,了解 C、PHP、Java、ASM、Python,有 信安、CISP 证书,写小白也能看得懂的文章,感谢关注!!!

我的网站:https://www.netor0x86.com

0 人点赞