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 <STC89C5xRC.H>
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)两个倒计时器同步计数
下一篇:8051单片机(STC89C52)两个倒计时器异步计数
推荐阅读最新更新时间:2024-11-02 06:39
设计资源 培训 开发板 精华推荐
- jidianqi
- NCP508MT18TBGEVB:1.8 V WDFN 评估板
- MIKROE-2728,EERAM 3.3V CLICK 板,基于 47L16 EERAM 和 16 Kbit SRAM,带 EEPROM 备份
- 具有高调光比和 LED 开路报告的 LT3756IMSE-1 降压模式 1A LED 驱动器的典型应用电路
- LT6654BHLS8-5 具有升压输出电流和电流限制的电压基准的典型应用
- 灵动者 ESP32 S3
- AM6TW-2409SZ 9V 6 瓦单输出 DC/DC 转换器的典型应用
- 适用于STM32 Nucleo-64和-144的MANTIS Wi-Fi扩展板
- 【立创开发板】雨与的智能小车
- LTC2862AMPS8-1 PROFIBUS 兼容线路接口的典型应用