本人從51hei論壇找了很久,沒有找到有合適正確的測頻率和周期的程序,特此編寫一份,以供大家學習,也希望大家有搞懂的程序,不論難易,都發出來一起學習。
所有資料51hei提供下載:
頻率計.zip
(58.53 KB, 下載次數: 125)
2017-10-18 20:56 上傳
點擊文件名下載附件
程序 下載積分: 黑幣 -5
單片機源程序如下:
- /***********************************************
- **注意:頻率測出的單位為Hz,周期單位為us
- **初始狀態為頻率,按下K2進入周期,按下K1進入頻率
- **********************************************/
- #include <STC15F2K60S2.H>
- #include <intrins.h>
- #include "anjian.h"
- sbit a=P2^5;
- sbit b=P2^6;
- sbit c=P2^7;
- sbit beep=P0^6;
- sbit K1=P3^0;
- sbit K2=P3^1;
- unsigned char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x90,0xbf,0xff};
- unsigned int disp[8]={10,10,10,10,10,10,10,10};
- unsigned char key_scan();
- extern unsigned char key_value;
- unsigned int zhuoqi=0;
- unsigned int pl1=0;
- unsigned char over_flag=0;
- unsigned int f,t;
- void Timer0init();
- void Timer1init();
- void Delay300us();
- void Delay100ms();
- void zhouqidisplay();
- void Pldisplay();
- void Display();
- void zongdisp();
-
- void Bee()
- {
- a=1;b=0;c=1;
- beep=0;
- }
- void main()
- {
- Bee();
- Delay300us();
- Timer0init();
- Timer1init();
- EA=1;
- TR0=1;
- TR1=1;
- while(1)
- {
- if(over_flag)
- {
- ET0=1;
- TR0=1;
- TR1=1;
- over_flag=0;
- f=pl1*10;//每1us,f加10
- pl1=0;
- }
- Pldisplay();
- Display();
- P2=(P2&0x1f)|0xe0;
- P0=0xff;
- P2=(P2&0x1f)|0xc0;
- P0=0xff;
- if(K2==0)
- Delay100ms();
- if(K2==0)
- {
- while(1)
- {
- t=1000000/f;
- zhouqidisplay();
- Display();
- P2=(P2&0x1f)|0xe0;
- P0=0xff;
- P2=(P2&0x1f)|0xc0;
- P0=0xff;
- if(K1==0)
- Delay100ms();
- if(K1==0)
- break;
- }
- }
- }
- }
- void Timer0init()//計數器(16位自動重裝初始值)
- {
- AUXR = 0x80;
- TMOD=0x04;
- TL0=0xff;
- TH0=0xff;//1us
- ET0=1;
- TR0=1;
- }
- void Timer1init()//50ms
- {
- AUXR &= 0xBF; //定時器時鐘12T模式
- TMOD &= 0x0F; //設置定時器模式
- TL1 = 0x00; //設置定時初值
- TH1 = 0x4C; //設置定時初值
- TF1 = 0; //清除TF1標志
- TR1 = 0; //定時器1開始計時
- ET1 = 1; //打開定時器1中斷
- }
- void Timer0_init() interrupt 1
- {
- pl1++;
- }
- bit t1=0;
- void Timer1_init() interrupt 3
- {
- if(t1==0)
- t1=1;
- else
- {
- t1=0;
- ET0=0;
- TR0=0;
- TR1=0;
- //每100ms重新關閉開啟定時器0更新數據
- over_flag=1;
- }
- }
- void Display()
- {
- unsigned char i;
- for(i=0;i<8;i++)
- {
- P2=(P2&0x1f)|0xe0;
- P0=0xff;
- P2&=0x1f;
- _nop_();
- P2=(P2&0x1f)|0xc0;
- P0=0x01<<i;
- P2&=0x1f;
- _nop_();
- P2=(P2&0x1f)|0xe0;
- P0=disp[i];
- P2&=0x1f;
- P0=0Xff;
- Delay300us();
- }
- }
- void Delay300us()
- {
- unsigned char i,j;
- _nop_();
- _nop_();
- i=4;
- j=54;
- do
- {
- while(--j);
- } while(--i);
- }
- void Delay100ms() //@11.0592MHz
- {
- unsigned char i, j, k;
- _nop_();
- _nop_();
- i = 5;
- j = 52;
- k = 195;
- do
- {
- do
- {
- while (--k);
- } while (--j);
- } while (--i);
- }
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
|