此程序经89C51仿真验证没有问题
- //此示例仅限于10~65535us范围使用,外部中断下降沿有效。
- #include <STC8.H>
- #define uint unsigned int
- #define uchar unsigned char
- #define Ulimit 21277 //21.3ms(周期=1s/47.000Hz=0.02127659574468085106382978723404)
- #define Llimit 24548 //24.5ms(周期=1s/40.736Hz=0.02454831107619795758051846032993)
- sbit out=P1^4;
- uchar code table[]={//共阴数码管段码"0~f-."
- 0x3f,0x06,0x5b,0x4f,
- 0x66,0x6d,0x7d,0x07,
- 0x7f,0x6f,0x77,0x7c,
- 0x39,0x5e,0x79,0x71,0x40,0x80};
- uint time = 0; //脉冲周期
- uint time1 = 0;
- uchar buf[6];//显示缓存
- bit flag = 0;
- void t0_init() //65536微秒@12.000MHz
- {
- // AUXR &= 0x7F; //定时器时钟12T模式
- TMOD &= 0xF0; //设置定时器模式
- TMOD |= 0x01; //设置定时器模式
- TL0 = 0x00; //设置定时初值
- TH0 = 0x00; //设置定时初值
- TF0 = 0; //清除TF0标志
- TR0 = 1; //定时器0开始计时
- }
- void main()
- {
- uchar i,j;
- t0_init();
- IT0=1; //为 1 是下降沿; 为 0 是低电平
- EX0=1; //为 1 允许中断; 为 0 是禁止中断
- EA =1; //开总中断
- out=0;
- while(1)
- {
- if(flag==1)
- {
- flag=0;
- if(time>Llimit)
- out=0;
- if(time<Ulimit)
- out=1;
- time1=time;
- for(i=0;i<5;i++)
- {
- buf[4-i]=table[time1%10];
- time1/=10;
- }
- }
- P0=0x00;
- P2=~(0x01<<j);
- P0=buf[j];
- j++;
- j%=5;
- }
- }
- void int0() interrupt 0
- {
- TR0=0;//关定时器
- time=TH0<<8|TL0;//读取定时器数据
- TL0 = 0x00; //清0
- TH0 = 0x00;
- TR0=1;//开定时器
- flag=1;
- }
复制代码
|