給你提供一個思路,理論上能達10M以上,電路能夠仿真成功,未經實物驗證。
無標題.jpg (139.02 KB, 下載次數: 56)
下載附件
2021-12-22 20:48 上傳
- //適用于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;
- }
復制代碼
|