此处需要定时器0提供5ms精准定时, 则每个定时周期都需要(5*10^-3)/(1*10^-6)=5000次加1计数, 所以这里定时器0的初始值设为65536 - 5000 = 60536 = EA84H.
这里先实现两个倒计时器同时工作, 下一步该考虑怎么实现两个倒计时器不同步工作.
#include <STC89C5xRC.H>
void delay()//用定时器0实现5ms精准定时
{
TMOD = 0x01;
TH0 = 0xEA;
TL0 = 0x84;//65536 - 5000 = 60036
TF0 = 0;//置溢出标志位为0
TR0 = 1;//开启定时器0
while(TF0 == 0);
TR0 = 0;//暂停定时器0
}
void disp_digit(int d, int r)
{
unsigned char code DIG_CODE[10] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f};
//第一个倒计时
//显示个位数
P2 = 0;// P2 = 0 -> (P24, P23, P22) = (0, 0, 0) -> 右数第一个数字点亮
P0 = DIG_CODE[d % 10];
delay();//5ms精准定时
//显示十位数
P2 = 1 << 2;//P2 = 0000 0100 -> (P24, P23, P22) = (0, 0, 1) -> 右数第二个数字点亮
P0 = DIG_CODE[d / 10];
delay();//5ms精准定时
//第二个倒计时
//显示个位数
P2 = 6 << 2;//P2 = 0001 1000 -> (P24, P23, P22) = (1, 1, 0) -> 右数第七个数字点亮
P0 = DIG_CODE[r % 10];
delay();//5ms精准定时
//显示十位数
P2 = 7 << 2;//P2 = 0001 1100 -> (P24, P23, P22) = (1, 1, 1) -> 右数第八个数字点亮
P0 = DIG_CODE[r / 10];
delay();//5ms精准定时
}
int main()
{
int i;
int sec1, sec2;
while(1)
{
sec1 = 15;
sec2 = 15;
while(sec1 >= 0)
{
for(i = 0; i < 50; i++)
{
disp_digit(sec1, sec2);//花费大约20ms
}//20ms*50=1000ms=1s
sec1 --;
sec2 --;
}
}
return 0;
}
上一篇:单片机学习路程(四)蜂鸣器唱歌
下一篇:8051单片机(STC89C52)定时器实现10ms精准定时
推荐阅读最新更新时间:2024-11-11 21:00
设计资源 培训 开发板 精华推荐
- BU4845 4.5V低压检测器典型应用电路
- LM2904ADMR2G 函数发生器运算放大器的典型应用
- LTC3406ES5-1.8 单节锂离子 1.8V/600mA 稳压器的典型应用电路,用于低输出纹波和小尺寸
- 使用 Broadcom Inc 的 HCPL-4506 的参考设计
- 工业用 4.2V、1 节锂离子电池充电器
- LT3088HDD 宽安全工作区电源的典型应用
- pi型衰减网络
- DC1871A,用于 LTC2995 温度传感器和具有警报输出的双电压监视器的演示板
- DER-395 - 14.35 W 高效率 (>86%) 高功率因数 (>0.95) TRIAC 可调光非隔离 LED 驱动器
- DI-116 - 28 W 多输出电源,空载功耗低于 50 mW