📄 mainc.lst
字号:
C51 COMPILER V7.06 MAINC 09/06/2007 21:49:07 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE MAINC
OBJECT MODULE PLACED IN mainc.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE mainc.c LARGE OPTIMIZE(0,SPEED) BROWSE DEBUG OBJECTEXTEND
stmt level source
1 // 包含文件
2
3 #define MAINC_GLOBALS
4 #include "includes.h"
5 #include "charbank.h"
6 #include "math.h"
7
8
9 #define MAXIMUM(x,y) (x>y)?x:y
10
11
12 //sbit bb=P0^6;
13 //外部中断6(键盘用)
14 void ExtentInt6 (void) interrupt 18 {
15 1 _nop_();
16 1 P3IF &= 0XBF;//清中断标志
17 1 key_flag = 1;
18 1
19 1 }
20
21 //定时器3中断
22 void Timer3Int(void) interrupt 14 {
23 1 TMR3CN &= 0X7F; //清中断标志
24 1 Timer3Counter1++;
25 1 }
26
27
28
29 //ADC初始化程序
30 ADCInit(void){
31 1 AMX0CF = 0; //各通道单独输入
32 1 AMX0SL = 0; //通道选择
33 1 ADC0CF = 0x48; //系统时钟24M,SAR时钟2M,AD0SC=11,PGA=1
34 1 ADC0CN = 0x80; //ADC0使能,一直处于跟踪,向AD0BUSY写1启动转换,数据右对齐
35 1 REF0CN = 0x07; //ADC0基准取VREF0,内部温度传感器、内部偏压发生器、缓冲器工作
36 1 }
37 ///////fft////////////////////
38 void kkfft(pr,pi,n,k,fr,fi,l,il)
39 int n,k,l,il;
40 float pr[],fr[];//修改
41 float pi[],fi[];
42
43 { int it,m,is,i,j,nv,l0;
44 1 float p,q,s,vr,vi,poddr,poddi;
45 1 for (it=0; it<=n-1; it++)
46 1 { m=it; is=0;
47 2 for (i=0; i<=k-1; i++)
48 2 { j=m/2; is=2*is+(m-2*j); m=j;}
49 2 fr[it]=pr[is]; fi[it]=pi[is];
50 2 }
51 1 pr[0]=1.0; pi[0]=0.0;
52 1 p=6.283185306/(1.0*n);
53 1 pr[1]=cos(p); pi[1]=-sin(p);
54 1 if (l!=0) pi[1]=-pi[1];
55 1 for (i=2; i<=n-1; i++)
C51 COMPILER V7.06 MAINC 09/06/2007 21:49:07 PAGE 2
56 1 { p=pr[i-1]*pr[1]; q=pi[i-1]*pi[1];
57 2 s=(pr[i-1]+pi[i-1])*(pr[1]+pi[1]);
58 2 pr[i]=p-q; pi[i]=s-p-q;
59 2 }
60 1 for (it=0; it<=n-2; it=it+2)
61 1 { vr=fr[it]; vi=fi[it];
62 2 fr[it]=vr+fr[it+1]; fi[it]=vi+fi[it+1];
63 2 fr[it+1]=vr-fr[it+1]; fi[it+1]=vi-fi[it+1];
64 2 }
65 1 m=n/2; nv=2;
66 1 for (l0=k-2; l0>=0; l0--)
67 1 { m=m/2; nv=2*nv;
68 2 for (it=0; it<=(m-1)*nv; it=it+nv)
69 2 for (j=0; j<=(nv/2)-1; j++)
70 2 { p=pr[m*j]*fr[it+j+nv/2];
71 3 q=pi[m*j]*fi[it+j+nv/2];
72 3 s=pr[m*j]+pi[m*j];
73 3 s=s*(fr[it+j+nv/2]+fi[it+j+nv/2]);
74 3 poddr=p-q; poddi=s-p-q;
75 3 fr[it+j+nv/2]=fr[it+j]-poddr;
76 3 fi[it+j+nv/2]=fi[it+j]-poddi;
77 3 fr[it+j]=fr[it+j]+poddr;
78 3 fi[it+j]=fi[it+j]+poddi;
79 3 }
80 2 }
81 1 if (l!=0)
82 1 for (i=0; i<=n-1; i++)
83 1 { fr[i]=fr[i]/(1.0*n);
84 2 fi[i]=fi[i]/(1.0*n);
85 2 }
86 1 if (il!=0)
87 1 for (i=0; i<=n-1; i++)
88 1 { pr[i]=sqrt(fr[i]*fr[i]+fi[i]*fi[i]);
89 2 if (fabs(fr[i])<0.000001*fabs(fi[i]))
90 2 { if ((fi[i]*fr[i])>0) pi[i]=90.0;
91 3 else pi[i]=-90.0;
92 3 }
93 2 else
94 2 pi[i]=atan(fi[i]/fr[i])*360.0/6.283185306;
95 2 }
96 1 return;
97 1 }
98
99 ///////zqxpd////////////////////
100 float zqpd(si)
101 float si[];
102 {
103 1 float xdata dataR[512],dataI[512],fr_v[512],fi_v[512],Pyy1[512],Pyy2[512],data_Maxf[50],data_MaxPow[50
-],index_Maxf[50];
104 1 int i,k,Number,index_Number,hh;
105 1 float data_sum,data_temp,MM;
106 1 float Time=0;
107 1
108 1 Number=1024;index_Number=10;
109 1 for (i=0; i<Number/2; i++)
110 1 {
111 2 dataR[i] = si[i];
112 2 dataI[i] = 0;
113 2 }
114 1
115 1 kkfft(dataR,dataI,Number/2,index_Number-1,fr_v,fi_v,0,1);
116 1
C51 COMPILER V7.06 MAINC 09/06/2007 21:49:07 PAGE 3
117 1 for (i=0; i<Number/2; i++)
118 1 Pyy1[i]=sqrt(pow(fr_v[i],2)+pow(fi_v[i],2));
119 1
120 1 /////////////////////////////////////////////
121 1 for (i=Number/2; i<Number; i++)
122 1 dataR[i-Number/2]= si[i];
123 1
124 1 for (i=0; i<Number/2; i++)
125 1 dataI[i]=0;
126 1
127 1 kkfft(dataR,dataI,Number/2,index_Number-1,fr_v,fi_v,0,1);
128 1
129 1 for (i=0; i<Number/4; i++)
130 1 Pyy2[i]=sqrt(pow(fr_v[i],2)+pow(fi_v[i],2));
131 1
132 1 data_sum=0;
133 1 for(k=0;k<Number/4;k++)
134 1 {
135 2 data_temp=pow(Pyy1[k],2)-pow(Pyy2[k],2);
136 2 data_temp=pow(data_temp,2);
137 2 data_temp=sqrt(data_temp);
138 2 data_sum=data_sum+data_temp;
139 2 }
140 1 if(data_sum>15000)
141 1 Time=0; //非周期信号
142 1 else
143 1 { //周期信号
144 2 hh=0;
145 2 for(i=0;i<20;i++) data_Maxf[i]=0;//清零
146 2 for(i=0;i<Number/4;i++)
147 2 {
148 3 if(Pyy1[i+1]>Pyy1[i]&&Pyy1[i+1]>Pyy1[i+2])//
149 3 {
150 4 if(Pyy1[i+1]>30)
151 4 {
152 5 data_MaxPow[hh]=Pyy1[i+1];//存储频点功率值
153 5 index_Maxf[hh]=i+1; //存储频点索引值
154 5 //data_Maxf[hh]=(float)(i+1)*20.07/Number/2*1000;//存储频点值
155 5 hh=hh+1;
156 5 }
157 4 }
158 3 }
159 2 for(i=0;i<hh;i++)
160 2 data_Maxf[i]=(float)index_Maxf[i]*20.07/512*1000;
161 2 MM=0;
162 2 for(i=0;i<hh;i++)
163 2 MM=MAXIMUM(MM,data_MaxPow[i]);
164 2 for(i=0;i<hh;i++)
165 2 if(data_MaxPow[i]==MM)
166 2 Time=1/data_Maxf[i]*1000;
167 2
168 2 }
169 1 return Time;
170 1 }
171
172
173
174 void chuxian(void){
175 1 unsigned char i;
176 1 Write_7281(0x14);Write_7281(0x70); //hex译码,显示0
177 1
178 1 lcd_initial(); //液晶初始化
C51 COMPILER V7.06 MAINC 09/06/2007 21:49:07 PAGE 4
179 1 lcd_clear_ram();
180 1
181 1 lcd_disp3232(0,16,0); //显示欢迎使用
182 1 lcd_disp3232(4,16,1);
183 1 lcd_disp3232(8,16,2);
184 1 lcd_disp3232(12,16,3);
185 1
186 1 for(i=0;i<5;i++){
187 2 Timer3Counter1 = 0;
188 2 while(Timer3Counter1 < 200);
189 2 }
190 1 }
191
192
193 void screen(void){ //主屏显示
194 1
195 1 lcd_initial(); //液晶初始化
196 1 lcd_clear_ram();
197 1
198 1 lcd_disp1616(0,0,0);lcd_disp1616(2,0,1);lcd_disp1616(4,0,2);lcd_disp1608(6,0,9);//总功率
199 1
200 1 lcd_disp_string(0,2,"f1:",3); //二个频率分量
201 1 lcd_disp_string(8,2,";",1);
202 1
203 1 lcd_disp_string(0,3,"f2:",3);
204 1 lcd_disp_string(8,3,";",1);
205 1
206 1
207 1
208 1 lcd_disp1616(0,48,3);lcd_disp1616(2,48,4);lcd_disp1608(4,48,9); //单位:Hz,mW
209 1 lcd_disp1608(6,48,11);lcd_disp1608(7,48,6);
210 1 lcd_disp_string(8,7,";",1);lcd_disp1608(9,48,8);lcd_disp1608(10,48,7);
211 1
212 1 }
213
214
215 void dealdata(float qq,unsigned char pp,unsigned char z){//q是数据,p是行数, z是种类区分频率和功率
216 1 unsigned char wei[5];
217 1 unsigned char woo[8];
218 1 unsigned char poo[5];
219 1 unsigned char goo[8];
220 1
221 1 if(z==0){
222 2 wei[0]= qq/10000;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -