给你提供一个思路,理论上能达10M以上,电路能够仿真成功,未经实物验证。
- //适用于STC15W408AS-20PIN系列
- #include <STC15F2K60S2.H>
- unsigned char code dispcode[]={//共阳数码管段码"0~f"
- 0xc0,0xf9,0xa4,0xb0,
- 0x99,0x92,0x82,0xf8,
- 0x80,0x90,0x88,0x83,
- 0xc6,0xa1,0x86,0x8e};
- unsigned char data temp[6]; //显示缓存
- unsigned char T0count; //T0的计数器值
- bit flag,sign; //标志位
- unsigned long num; //频率值
- //初始化定时器0
- void Timer0Init() //@24.000MHz
- {
- TMOD= 0x05; //设置外部计数模式
- TL0 = 0x00; //设置定时初始值
- TH0 = 0x00; //设置定时初始值
- TF0 = 0; //清除TF0标志
- TR0 = 1; //定时器0开始计时
- EA = 1; //开总中断
- ET0 = 1; //开T0中断
- }
- //初始化定时器2,没有定时器1
- void Timer2Init() //2毫秒@24.000MHz
- {
- AUXR |= 0x04; //定时器时钟1T模式
- T2L = 0x80; //设置定时初始值
- T2H = 0x44; //设置定时初始值
- AUXR |= 0x10; //定时器2开始计时
- IE2 |=0x04; //开T2中断
- }
- //主函数
- void main(void)
- {
- unsigned char i;
- P1M1 = 0x00; //设置P1准双向
- P1M0 = 0x00; //设置P1准双向
- P3M1 = 0x00; //设置P3.4准双向 其余IO口推挽
- P3M0 = 0x10; //设置P3.4准双向 其余IO口推挽
- P5M1 = 0x00; //设置P5准双向
- P5M0 = 0x00; //设置P5准双向
- Timer0Init();
- Timer2Init();
- sign=1;
- while(1)
- {
- if(flag==1)
- {
- flag=0;
- num=((unsigned long)T0count<<16)|(TH0<<8|TL0);
- for(i=6;i>0;i--)
- {
- temp[i-1]=num%10;//由低位到高位保存
- num/=10;
- }
- TH0=0x00;
- TL0=0x00;
- T0count=0;
- TR0=1; //定时器0开始计数
- sign=1; //定时器2开始计时
- }
- }
- }
- //定时器T0中断服务子函数
- void t0(void) interrupt 1
- {
- T0count++;
- }
- //定时器T2中断服务子函数
- void t2(void) interrupt 12
- {
- static unsigned char i; //显示计数器值
- static unsigned int count; //计时计数器值
- TL1 = 0x60; //设置定时初始值
- TH1 = 0xF0; //设置定时初始值
- if(sign)
- {
- if(++count>=500) //秒定时
- {
- TR0=0;
- count=0;
- sign=0;
- flag=1;
- }
- }
- P3&=0x10; //消隐
- if(i==2)P1=dispcode[temp[i]]&0x7f;//加小数点表示KHz
- else P1=P1=dispcode[temp[i]]; //段码
- switch(i) //位码
- {
- case 0: P3|=0x01; break;
- case 1: P3|=0x02; break;
- case 2: P3|=0x04; break;
- case 3: P3|=0x08; break;
- case 4: P3|=0x20; break;
- case 5: P3|=0x40; break;
- }
- i=++i%6;
- }
复制代码
|