欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

单片机定时器精准定时_8051单片机(STC89C52)定时器实现10ms精准定时

发布时间:2025/10/17 编程问答 96 豆豆
生活随笔 收集整理的这篇文章主要介绍了 单片机定时器精准定时_8051单片机(STC89C52)定时器实现10ms精准定时 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

8051内部集成了2个16bits的计数器, 可以根据需要将其作为定时器使用. 这时, 定时器的计数频率为系统CLK/12. 如果CPU的晶振频率为12MHz, 那么定时器信号源的频率固定为12MHz/12 = 1MHz. 如果定时器的定时周期设定为50ms, 则需要50000个脉冲. 由于单片机定时器为加1计数器, 所以, 计数器初始值应设为65536 - 50000 = 15536 = 3CB0H. 另外, 还需要设置定时器工作模式寄存器TMOD, 如果使用定时器0, 16bits定时器方式, 则TMOD = 0x01.

定时器初始值计算解析:

若系统晶振频率为12MHz, 那么定时器信号源的频率固定为1MHz, 即每隔1 * 10^-6 s, 定时器内的值加1. 若定时器定时周期为50ms(=5*10^-2s), 那么这50ms就需要(5*10^-2)/(1*10^-6)=50000次加1计数.

#include

void delay()//用定时器0实现10ms精准定时

{

TMOD = 0x01;

TH0 = 0xd8;

TL0 = 0xf0;//65536 - 10000 = 55536

TF0 = 0;//置溢出标志位为0

TR0 = 1;//开启定时器0

while(TF0 == 0);

TR0 = 0;//暂停定时器0

}

void disp_digit()

{

int d = 60;//要显示的数字

unsigned char code DIG_CODE[10] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f};

while(1)

{

//显示个位数

P2 = 0;// P2 = 0 -> (P24, P23, P22) = (0, 0, 0) -> 右数第一个数字点亮

P0 = DIG_CODE[d % 10];

delay();//10ms精准定时

//显示十位数

P2 = 1 << 2;//P2 = 0000 0100 -> (P24, P23, P22) = (0, 0, 1) -> 右数第二个数字点亮

P0 = DIG_CODE[d / 10];

delay();//10ms精准定时

}

}

int main()

{

disp_digit();

return 0;

}

总结

以上是生活随笔为你收集整理的单片机定时器精准定时_8051单片机(STC89C52)定时器实现10ms精准定时的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。