內置4個檔位,做2、8、16、256分頻,自動找檔功能,LCD1602顯示,有開機loading顯示。
在高頻段誤差小于千分之一,低頻段誤差較大,例如49HZ,測得48或者50HZ,是因為做了2分頻,可略作修改,或多做一檔不進行分頻。
兩塊數字芯片都是非常基礎的,分別是74LS161(16進制計數器)和CD4051(單刀八擲數字開關)
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
1.png (54.68 KB)
下載附件
2021-6-22 01:29 上傳
單片機源程序如下:
- #include "reg51.h"
- #include "stdio.h"
- #include "string.h"
- //sprintf(strHex, "%0x", num); 十進制
- //sprintf(strHex, "%d", num); 十六進制
- #include "1602.h"
- #include "type.h"
- #define uint unsigned int
- #define uchar unsigned char
- sbit LSA=P1^3;
- sbit LSB=P1^4;
- sbit LSC=P1^5;
- void Timer_Init();
- void delayms(uint yanshi);
- uint number_date=0;
- float fre_date=0;
- uchar str[16];
- uchar str2[16];
- uchar str3[16];
- uint flag_4051=3;
- uchar count=0;
- uchar t=1;
- void main()
- {
- lcd1602init();
- Timer_Init();
- display_string(1,"START FRE Meter!");
- delayms(200);
- display_string(2,"Loading......");
- delayms(1000);
- display_string(1," ");
- display_string(2," ");
- // LSA=0;LSB=1;LSC=0;
- while(1)
- {
- switch(flag_4051)
- {
- case 1:
- LSA=LSB=LSC=0;
- delayms(1000);
- fre_date=number_date;
- fre_date=fre_date*2;
- if(fre_date>60000)
- {
- flag_4051=2;
- P2=0x00;
- }
- if(number_date<5000)
- {
- sprintf(str2,"%0.1f",fre_date);
- strcat(str2,"HZ ");
- }
- else
- {
- sprintf(str2,"%0.3f",fre_date/1000);
- strcat(str2,"KHZ");
- }
- strcpy(str,"START MODE ONE!!");
- break;
- case 2: LSA=0;LSB=1;LSC=0;
- delayms(1000);
- fre_date=number_date;
- fre_date=fre_date*8;
- if(fre_date<60000) flag_4051=1;
- if(fre_date>200000) flag_4051=3;
-
- sprintf(str2,"%0.3f",fre_date/1000);
- strcat(str2,"KHZ ");
- strcpy(str,"START MODE TWO!!");
- break;
- case 3: LSA=1;LSB=1;LSC=0;
- delayms(1000);
- fre_date=number_date;
- fre_date=fre_date*16;
- if(fre_date<200000) flag_4051=2;
- if(fre_date>750000) flag_4051=4;
- sprintf(str2,"%0.3f",fre_date/1000);
- strcat(str2,"KHZ ");
- strcpy(str,"START MODE THREE");
- break;
- case 4: LSA=1;LSB=1;LSC=1;
- delayms(1000);
- fre_date=number_date;
- fre_date=fre_date*256;
- if(fre_date<750000) flag_4051=3;
- sprintf(str2,"%0.3f",fre_date/1000000);
- strcat(str2,"MHZ ");
- strcpy(str,"START MODE FOUR!");
- break;
- }
- display_string(1, str);
- strcpy(str3,"Fre=");
- strcat(str3,str2);
- display_string(2, str3);
- }
- }
- void Timer_Init()
- {
- TMOD=0X15;
- TR0=1;
- TR1=1;
- EA = 1;
- ET1 = 1; //允許T1定時中斷
- ET0 = 1; //允許T0計數中斷
- }
- void Timer1() interrupt 3 //測量時間
- {
- uchar i;
- TL1=0XF0;
- TH1=0XD8; //給定時器賦初值,定時10ms
- i++;
- if(i>99)
- {
- number_date=(TH0*256+TL0);//+t*65535;
- TL0=0;
- TH0=0;
- t=0;
- i=0;
- }
- }
- void Timer0() interrupt 1
- {
- t++;
- TL0=0;
- TH0=0;
- }
- void delayms(uint yanshi)
- {
- uint i,j;
- for(i=yanshi;i>0;i--)
- for(j=125;j>0;j--);
- }
復制代碼 提供一種頻率計的設計思路,電路和程序的優化空間很大,大家可以自行發揮,僅供參考,切勿照搬
完整單片機c源碼和proteus仿真文件:
20M Frequency meter.zip
(106.4 KB, 售價: 5 E幣)
2021-6-22 01:30 上傳
點擊文件名下載附件
售價: 5 E幣 [記錄]
[ 購買]
【必讀】版權免責聲明
1、本主題所有言論和內容純屬會員個人意見,與本論壇立場無關。2、本站對所發內容真實性、客觀性、可用性不做任何保證也不負任何責任,網友之間僅出于學習目的進行交流。3、對提供的數字內容不擁有任何權利,其版權歸原著者擁有。請勿將該數字內容進行商業交易、轉載等行為,該內容只為學習所提供,使用后發生的一切問題與本站無關。 4、本網站不保證本站提供的下載資源的準確性、安全性和完整性;同時本網站也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的損失或傷害。 5、本網站所有軟件和資料均為網友推薦收集整理而來,僅供學習用途使用,請務必下載后兩小時內刪除,禁止商用。6、如有侵犯你版權的,請及時聯系我們(電子郵箱1370723259@qq.com)指出,本站將立即改正。
|