公众号文章同步阅读网址: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:代码实现
有了上面的思路,那么代码就比较简单了,代码如下:
#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 证书,写小白也能看得懂的文章,感谢关注!!!