設計的目的
頻率計作為測量儀器的一種,它的基本功能是測量信號的頻率和周期頻率計的應用范圍很廣,但是目前,市場上有各種多功能、高精度、高頻率的數字頻率計,但價格不菲。為適應工作的需要,可以用一種較小規模和單片機(AT89C51)相結合的頻率計的設計方案,不但切實可行,而且體積小、設計簡單、成本低、精度高、可測頻帶寬,大大降低了設計成本和實現復雜度。
設計的內容及要求
本設計以AT89C51單片機為控制核心,將外部的頻率脈沖信號通過單片機計數端輸入,由定時器/計數器T0負責定時,定時器/計數器T1負責對被測信號計數,該頻率計的測量范圍為1Hz~65534Hz,被測脈沖信號的頻率可以隨時進行調整,通過LCD液晶顯示模塊對被測信號的頻率進行實時顯示。該系統包括被測頻率脈沖信號、單片機晶振電路、以AT89C51單片機為核心的頻率測量模塊、LCD液晶顯示模塊。
電路原理圖:
proteus仿真圖:
51單片機部分程序源代碼:
- #include<reg51.h>
- #include<intrins.h>
- #define uchar unsignedchar
- #define uint unsignedint
- void init_lcd(void);
- void disp_str(ucharx,uchar y,uchar *p);
- sbit FS=P3^5; //被測信號FS輸入端
- bit RDY=0; //測量完成標志
- uint msn; //定時中斷計數
- uint count(void) //測量FS的頻率
- {RDY=0;
- TMOD=0x52; //T0:定時方式2,T1:計數方式1
- TH0=TL0=6;//T0定時時間為250us
- msn=4000; //4000次中斷正好1s
- TH1=TL1=0x00; //T1工作于計數方式,初值為0
- ET0=1; //允許T0中斷
- EA=1; //開中斷
- while(FS==1); //等待被測信號變低
- while(FS==0); //等待被測信號變高
- TR0=1; //T0開始定時
- TR1=1; //T1開始計數
- while(RDY==0); //等待1s
- TR1=0; //關閉T1、T0
- TR0=0;
- return(TH1*256+TL1); //返回計數值
- }
-
- void timer0(void)interrupt 1 using 1
- {msn--;
- if(msn==0) //如果1s已到
- RDY=1; //設置測量完成標志位
- }
- void main()
- {uint f;
- ucharstr[9]="f= Hz";
- uchar i;
- init_lcd(); //液晶屏初始化
- while(1)
- {f=count(); //測量頻率
- _nop_();
- for(i=6;i>=2;i--) //測量結果轉換為5位ASCII碼
- {str=f%10+0x30;
- f=f/10;
- }
- disp_str(0,3,str);//顯示測量結果
- }
- }
復制代碼
|