新人求助,因為近幾天完全沒有進展,所以發帖求助,另一方面,雖然是半成品,但測低頻還是蠻準的(小數點后一位),可以當個參考。出現問題如下:低頻時比較準,高頻時顯示頻率就會不停改變而且誤差較大。
仿真圖如下:
1.png (38.51 KB, 下載次數: 58)
下載附件
2022-4-10 15:43 上傳
程序如下:
#include<reg52.h>
#include<string.h>
#define u8 unsigned char
sbit Gate_ctl=P1^7;sbit Gate=P3^2;
sbit RW=P2^5;sbit RS=P2^6;sbit EN=P2^7;
u8 ledbuf[8],frequency[9],hand[10]="frequency:";
unsigned long count1,count0,overflow1,overflow0;
double fx,f0;
int i,f;
unsigned long fc,Nx,N0,a;
//*****************************************//
void delay(u8 time);
void lcd_init();
void interrupt_init();
void lcd_write_com(u8 com);
void lcd_write_data(u8 date);
void lcd_send(u8 i,u8 j,u8 date[],u8 all);
void lcd_math();
//*****************************************//
void interrupt_init()
{
TMOD=0xD9;
T2CON=0x00;
PT2=1;
RCAP2H=0x4c;RCAP2L=0x00;
TH2=RCAP2H;TL2=RCAP2L;
TH1=0;TL1=0;
TH0=0;TL0=0;
ET1=1;ET0=1;ET2=1;
TR1=1;TR0=1;TR2=1;
EA=1;
}
void main()
{
f0=921600;
lcd_init();
lcd_send(1,0,hand,10);
interrupt_init();
while(1)
{
while(Gate==1);//Gate=0時跳出
TR2=0;
TR0=0;TR1=0;
Nx=(overflow1*65536+TL1+TH1*256);
N0=overflow0*65536+TL0+TH0*256;
fx=(double)((Nx*f0)/N0);
fc=(unsigned long)(fx*100+0.5);
lcd_math();
lcd_send(2,3,frequency,9);
overflow1=0;overflow0=0;
TH1=0;TL1=0;TH0=0;TL0=0;
TR2=1;
TR1=1;TR0=1;
while(Gate!=1);//Gate=1時跳出
}
}
void time0() interrupt 1 //T0
{ overflow0++;}
void time1() interrupt 3 //T1
{ overflow1++;}
void time2() interrupt 5 //T2
{ TF2=0;
i++;
if(i==20)
{ i=0;
Gate_ctl=!Gate_ctl;
TH2=RCAP2H;TL2=RCAP2L;
}
}
void lcd_write_data(u8 date)//LCD寫數據初始化
{
RW=0;
RS=1;
P0=date;
delay(100);
EN=1;
delay(100);
EN=0;
}
void lcd_write_com(u8 com)//LCD寫命令初始化
{
RW=0;
RS=0;
P0=com;
delay(100);
EN=1;
delay(100);
EN=0;
}
void lcd_init()
{
EN=0;
lcd_write_com(0x38);//8線,2行,5*7;
lcd_write_com(0x0c);//屏幕顯示,光標不顯示,光標不閃爍
lcd_write_com(0x06);//光標右移,屏幕不動
lcd_write_com(0x01);//清屏
}
void lcd_math()//整數轉換為字符;
{
u8 n=8;
strcpy(frequency,"0000000.0");
do{
if(n==7)
{
n--;
fc=fc*10;
}
else
{
frequency[n]=fc%10+'0';
n--;
}
}while(fc/=10);
}
void lcd_send(u8 i,u8 j,u8 date[],u8 all)//(行,列,數組,數組內字符個數)數組送入12864
{
u8 m;
if(i==1)
{
lcd_write_com(0x80+j);
}
else
{
lcd_write_com(0x80+0x40+j);
}
for(m=0;m<all;m++)
{
lcd_write_data(date[m]);
delay(1);
}
}
void delay(u8 time)
{
while(time--);
}
Keil代碼與Proteus仿真下載:
測試3.rar
(103.81 KB, 下載次數: 13)
2022-4-10 14:31 上傳
點擊文件名下載附件
|