国产免费AV|泡泡玛特欧洲总部将设在伦敦|中文天堂网www新版资源在线|一本久道综合在线中文|国精产品一二三产区的使用方法|香蕉鱼在线观看|www.27eee
ELEOK
標題:
51單片機做頻率計Proteus仿真程序
[打印本頁]
作者:
eng
時間:
2021-6-22 01:33
標題:
51單片機做頻率計Proteus仿真程序
內置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幣
[記錄]
[
購買
]
歡迎光臨 ELEOK (http://m.afoofa.cn/)
Powered by Discuz! X5.0