?? 數(shù)字示波器.c
字號(hào):
{
write_cmd1(Page_Add+k);
write_cmd1(Col_Add); //列地址0
for(j=0;j<64;j++) //列地址自動(dòng)加一
write_data1(0x00);
}
}
//****************顯示小數(shù)字*******************************
//***************************初始化LCD屏*******************
void init()
{
delay1(100);
CS2=1; CS1=0;
delay1(100);
write_cmd1(Disp_Off);
write_cmd1(Page_Add);
write_cmd1(Start_Line);
write_cmd1(Col_Add);
write_cmd1(Disp_On);
CS2=0; CS1=1;
delay1(100);
write_cmd1(Disp_Off);
write_cmd1(Page_Add);
write_cmd1(Start_Line);
write_cmd1(Col_Add);
write_cmd1(Disp_On);
}
void line_h(uchar x,uchar y,uchar l)
{
uchar i;
for(i=0;i<l;i++) point(x+i,y);
}
void line_v(uchar x,uchar y,uchar l)
{
uchar i;
for(i=0;i<l;i++) point(x,y+i);
}
wave()
{
uchar data i,j,t=64;
uint te;
uchar xdata s[120];
uchar tt=1;
/* line_h(8,0,120);
line_h(8,63,120);
line_v(8,0,64);
line_v(127,0,64);
for(i=1;i<4;i++)
for(j=4;j<64;j++)point(j*2,16*i);
for(i=0;i<10;i++)
for(j=0;j<32;j++)point(12*i+8,j*2);
*/
while(1)
{
cls();
line_h(8,0,120);
line_h(8,63,120);
line_v(8,0,64);
line_v(127,0,64);
for(i=1;i<4;i++)
for(j=4;j<64;j++)point(j*2,16*i);
for(i=0;i<10;i++)
for(j=0;j<32;j++)point(12*i+8,j*2);
display_num(0,55,str_num,0);
for(i=0;i<5;i++) display_num(0,3+11*i,str_num,5-i);
for(i=0;i<6;i++)
{
point(6,5+11*i);point(7,5+11*i);
}
for(i=0;i<120;i++)
{
s[i]=adconvert();
}
for(i=1;i<120;i++)
{
te=s[i]*53;
te=te/255;
point(i+8,60-te);
point(i+8,59-te);
}
for(i=0;i<5;i++)display8_16(60+7*i,55,str_vp,i);
vp_p(s);
for(i=0;i<3;i++)
display_num(92+7*i,55,str_num,d[2-i]);
point(100,61);point(100,62);
/*screen1();
te=fi_int&0x7ff;
dd[0]=te/1000;
dd[1]=te/100-dd[0]*10;
dd[2]=te/10-dd[1]*10-dd[0]*100;
dd[3]=te%10;
for(i=0;i<4;i++)display_num(10+6*i,55,str_num,dd[i]);
display_num(10+24,55,str_num,10);
display_num(10+24+5,55,str_num,11);*/
for(i=0;i<100;i++)delay1(500);
if(key()!=0)
{
state=1;
cls();
break;
}
}
}
/************************測(cè)頻率*******************************/
void timer2(void) interrupt 5 using 3
{ TF2=0;
time2_count--;
}
/**************************采樣******************************/
void time1(void) interrupt 3 using 2
{
EA=0;
TR1=0;
TH1=(65536-1365)/256;
TL1=(65536-1365)%256;
s[ii].real=adconvert();
s[ii].image=0;
ii++;
TR1=1;
EA=1;
if(ii>=64)
{
ET1=0;
TR1=0;
EA=0;
ii=0;
over=1;
}
}
/**************************對(duì)外部計(jì)數(shù)***************************/
void time0(void) interrupt 1 using 1
{
if(T0_counter<=Time_NO)
{T0_counter++;
TR2=1;//啟動(dòng)T2
}
if(T0_counter>Time_NO)//夠4個(gè),停止T2,T0
{
TR2=0;TR0=0;EA=0;ET0=0;ET2=0;T0_counter=0;//停止T0,T2
T2NOW=0;T2NOW=((T2NOW|TH2)<<8)|TL2;
fi_int=(((Time_NO/2)*5461167)/((65535-time2_count)*65536+T2NOW+1+(65535-time2_count)*13));//計(jì)算頻率
time2_count=65535;
TH2=0;
TL2=0;
TH0=0;
TL0=0;
/*if(fi_int>=625)
{
fs=42655/625;
}
else {fs=42665/fi_int;}//3276800/12/fi_int
*/
TH1=(65536-1365)/256;
TL1=(65536-1365)%256;
ET1=1;
TR1=1;//啟動(dòng)T1進(jìn)行采樣
EA=1;
}
}
/************************測(cè)頻率并顯示波形**********************/
void screen1(void)
{
TMOD=0x16;//T0對(duì)外部計(jì)數(shù),T1對(duì)內(nèi)部定時(shí)
TH0=255;
TL0=255;//計(jì)1次數(shù)
T2CON=0x00;//16位重裝
//CKCON=0x28;//T0,T2 在4 clock 下工作
TH2=0;
TL2=0;
RCAP2L=0;
RCAP2H=0;//初值清零
PT0=1;//設(shè)置T0的優(yōu)先級(jí)別高,T0繼續(xù)判斷是否到了4個(gè)周期
ET0=1;//開T/C0中斷
ET1=1;//開T/C1中斷
ET2=1;//開T/C2中斷
EA=1;
TR1=0;
TR2=0;
TR0=1;//啟動(dòng)T0
over=0;
while(over==0);
over=0;
}
unsigned char key()
{ unsigned char k,tem,keytem;
// uchar idata d[150];
keytem=0;
s0=1;s1=1;s2=1;s3=1;
tem=P2 & 0x0f;
if(tem!=0x0f)
{ beep=0;
for(k=0;k<40;k++)
tem=P2 & 0x0f;
if(tem!=0x0f)
{ if(tem==0x07) keytem=1;
else if(tem==0x0b) keytem=2;
else if(tem==0x0d) keytem=3;
else if(tem==0x0e) keytem=4;
}
}
while(tem!=0x0f)
tem=P2 & 0x0f;
beep=1;
return(keytem);
}
void amp()
{
uchar i,ii;
for(i=2;i<33;i++)
{
for(ii=0;ii<s[i-2].real;ii++)
{
point(i*2,55-ii);
point(i*2-1,55-ii);
}
}
}
hextobcd(uint x)
{
uint i,t=1000;
uint temp;
temp=x;
for(i=0;i<4;i++)
{
d[3-i]=x/t;
x=x%t;
t=t/10;
}
if(temp>1000)
{
for(i=0;i<4;i++)display_num(90+6*i,20,str_num,d[3-i]);//頻率
}
else if(temp>100)
{
d[3]=14;
for(i=0;i<4;i++)display_num(90+6*i,20,str_num,d[3-i]);//頻率
}
else if(temp>10)
{
d[3]=d[2]=14;
for(i=0;i<4;i++)display_num(90+6*i,20,str_num,d[3-i]);//頻率
}
}
void cursor(uchar x)
{
uchar i;
CS1=0;CS2=1;
write_cmd1(Page_Add+7);
write_cmd1(Col_Add);
for(i=0;i<64;i++)write_data1(0);
write_cmd1(Page_Add+7);
write_cmd1(Col_Add+x-2);
write_data1(0x8);
write_data1(0x4);
write_data1(0xfe);
write_data1(0x4);
write_data1(0x8);
}
static_fft()
{
uchar i,j,iii;
uchar ii=1;
cls();
line_h(0,0,68);
line_h(0,55,68);
hextobcd(0);
for(i=0;i<8;i++)display_e(0,70+7*i,str_fft,i);
for(i=0;i<2;i++)display_h(2,70+12*i,str_f,i);
for(i=0;i<2;i++)display_num(10+105+5*i,19,str_num,i+10);//HZ
for(j=1;j<7;j++)
for(i=1;i<68;i=i+2) point(i,8*j);
for(j=1;j<6;j++)
for(i=2;i<56;i=i+2) point(11*j,i);
line_v(0,0,56);
line_v(68,0,56);
amp();
while(1)
{
iii=key();
if(iii==1)
{
ii++;if(ii==32)ii=1;
}
else if(iii==2)
{
if(ii==1)ii=32;
ii--;
}
else if (iii==3)
{
cls();
state=1;
break;
}
cursor(2*ii);
hextobcd(95*(ii-1));
}
}
fft_screen()
{
uchar i,j,iii;
uchar ii=1;
while(1)
{
cls();
line_h(0,0,68);
line_h(0,55,68);
hextobcd(0);
for(i=0;i<8;i++)display_e(0,70+7*i,str_fft,i);
//for(i=0;i<4;i++)display_num(2,95+5*i,str_num,i+1);//頻率
for(i=0;i<2;i++)display_h(2,70+12*i,str_f,i);
for(i=0;i<2;i++)display_num(10+105+5*i,19,str_num,i+10);//HZ
for(j=1;j<7;j++)
for(i=1;i<68;i=i+2) point(i,8*j);
for(j=1;j<6;j++)
for(i=2;i<56;i=i+2) point(11*j,i);
line_v(0,0,56);
line_v(68,0,56);
for(i=0;i<64;i++)
{
s[i].real=adconvert();
s[i].image=0;
}
FFT(s);
amp();
iii=key();
if(iii==1)
{
ii++;if(ii==32)ii=1;
}
else if(iii==2)
{
if(ii==1)ii=32;
ii--;
}
else if(iii==3)
{
cls();
state=2;
break;
}
else if(iii==4)
{
cls();
state=0;
break;
}
cursor(2*ii);
hextobcd(95*(ii-1));
for(i=0;i<100;i++)delay1(500);
}
}
main()
{
init();
cls();
while(1)
{
if(state==0) wave();
else if (state==1)fft_screen();
else if (state==2)static_fft();
}
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -