?? 頻率計.lst
字號:
C51 COMPILER V8.05a 頻率計 02/14/2007 22:59:12 PAGE 1
C51 COMPILER V8.05a, COMPILATION OF MODULE 頻率計
OBJECT MODULE PLACED IN 頻率計.OBJ
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE 頻率計.c BROWSE DEBUG OBJECTEXTEND
line level source
1 #include<reg52.h>
2 unsigned char t=0,yichu=0,fenpin;
3 sbit B153=P2^0;
4 sbit A153=P2^1;
5 sbit GATE=P2^6;
6 sbit CLR=P2^7;
7 sbit P33=P3^3;
8
9
10 void t0(void)interrupt 1
11 {t++;
12 1 yichu=2; //定時器0溢出,yichu=2
13 1 }
14
15 void t1(void)interrupt 3 //計數器1溢出,yichu=1
16 {TCON=0;
17 1 yichu=1;
18 1 TH1=0xff;
19 1 TL1=0xff;
20 1 }
21
22 void delay(void) //1s軟件延時
23 {unsigned int i=500,j;
24 1 while(i)
25 1 {i--;
26 2 j=250;
27 2 while(j)
28 2 {j--;}
29 2 }
30 1 }
31 unsigned char table(unsigned char x) //軟件查表輸出
32 {unsigned char code n[10]={0xee,0x82,0xdc,0xd6,0xb2,0x76,0x7e,0xc2,0xfe,0xf6};
33 1 return(n[x]);
34 1 }
35
36 display(float f) //以測出的頻率串行輸出
37 {unsigned long x;
38 1 unsigned char a[5]={0,0,0,0,0},i=0,j;
39 1 if(f!=0){
40 2 if((f<10000)&&(f>1)) //正常顯示
41 2 {if(f>1000)f=f-1; //軟件修正頻率偏差
42 3 while(f<1000)
43 3 {f=f*10;
44 4 i++;
45 4 }
46 3 x=f*10;
47 3 a[4]=x%10;
48 3 if(a[4]>=5)f=f+1;;
49 3 x=f;
50 3 a[1]=x%10;
51 3 a[2]=(x/10)%10;
52 3 a[3]=(x/100)%10;
53 3 a[4]=(x/1000)%10;
54 3 for(j=0;j<5;j++)
55 3 {a[j]=table(a[j]);}
C51 COMPILER V8.05a 頻率計 02/14/2007 22:59:12 PAGE 2
56 3 a[i+1]++;
57 3 a[0]=0;
58 3 }
59 2 else if(f>=10000) //以科學計數法顯示
60 2 {while(f>=1000)
61 3 {f=f/10;
62 4 i++;
63 4 }
64 3 x=f;
65 3 a[4]=(unsigned char)((float)((f-x))*10);
66 3 if(a[4]>=5)x++; //四舍五入
67 3 a[2]=x%10;
68 3 a[3]=(x/10)%10;
69 3 a[4]=(x/100)%10;
70 3 a[0]=i+2;
71 3 for(j=0;j<5;j++)
72 3 {a[j]=table(a[j]);}
73 3 a[4]++;
74 3 a[1]=0x7c;
75 3 }
76 2 else
77 2 {x=f*10000; //頻率值小于1
78 3 if((x%10)>=5)x=x+10; //四舍五入
79 3 x=x/10;
80 3 a[1]=x%10;
81 3 a[2]=(x/10)%10;
82 3 a[3]=(x/100)%10;
83 3 a[4]=(x/1000)%10;
84 3 for(j=0;j<5;j++)
85 3 {a[j]=table(a[j]);}
86 3 a[4]++;
87 3 a[0]=0;
88 3 }
89 2
90 2 }
91 1 for(j=0;j<5;j++) //串行
92 1 {SBUF=a[j];
93 2 while(TI==0);}
94 1
95 1 }
96
97 cepin()
98 {unsigned char i;
99 1 float sj;
100 1 unsigned long js;//時間、計數的拼音首字母
101 1 float f; //f為頻率
102 1 TMOD=0xd9;
103 1 t=0;
104 1 TH0=0;
105 1 TL0=0;
106 1 TH1=0;
107 1 TL1=0;
108 1 GATE=0;
109 1 TCON=0x50;
110 1 GATE=1;
111 1 delay();
112 1 GATE=0;
113 1 for(i=0;i<250;i++){} //延時1ms
114 1 sj=((float)(TH0*256+t*65536+TL0))/1000000.0;
115 1 js=(long)TH1*256+TL1+1;
116 1 f=(js/sj)*fenpin;
117 1 display(f);
C51 COMPILER V8.05a 頻率計 02/14/2007 22:59:12 PAGE 3
118 1 }
119
120
121
122 panduan()
123 {float zhouqi;
124 1 B153=1;
125 1 A153=1;
126 1 TMOD=0x51;
127 1 TH0=0xce; //定時器0=12.8ms
128 1 TL0=0;
129 1 TH1=0xff; //計數器1=100個脈沖
130 1 TL1=0x9c;
131 1 TCON=0x50;
132 1 while(yichu==0);
133 1 TCON=0;
134 1 if(yichu==1) //計數器先溢出:在12.8ms內測得的脈沖過多,說明頻率較高
135 1 {fenpin=128;//轉為測128分頻后的頻率
136 2 cepin();}
137 1 else //計時器先溢出:100個脈沖的時間比較短,即頻率較低,可以減少分頻數
138 1 {yichu=0;
139 2 B153=1;
140 2 A153=0;
141 2 TH0=0xc1; //定時器0=16ms
142 2 TL0=0x80;
143 2 TH1=0xff; //計數器1=100個脈沖
144 2 TL1=0x9c;
145 2 TCON=0x50;
146 2 while(yichu==0);
147 2 TCON=0;
148 2 if(yichu==1) //計數器先溢出:在16ms內測得的脈沖過多,說明頻率較高
149 2 {fenpin=16;//轉為測16分頻后的頻率
150 3 cepin();}
151 2 else //計時器先溢出:100個脈沖的時間比較短,即頻率較低,用2分頻測周期
152 2 {B153=0; //以下是測周期部分
153 3 A153=0;
154 3 TH0=0;
155 3 TL0=0;
156 3 t=0;
157 3 TMOD=0x09;
158 3 TR0=1;
159 3 GATE=1;
160 3 while(P33==0);
161 3 GATE=0;
162 3 while(P33==1);
163 3 TR0=0;
164 3 zhouqi=(TH0*256+t*65536+TL0)/1000000.0;
165 3 if(zhouqi<0.001) //若周期太小,則轉為測原頻率
166 3 {fenpin=1;
167 4 B153=0;
168 4 A153=0;
169 4 cepin();}
170 3 else{display((1.0/zhouqi));}
171 3 }
172 2 }
173 1 }
174
175
176
177 main()
178 {
179 1 IE=0x8a;
C51 COMPILER V8.05a 頻率計 02/14/2007 22:59:12 PAGE 4
180 1 while(1)
181 1 {
182 2 panduan(); //判斷原頻率屬于哪個范圍,并調用相應函數測其頻率
183 2 delay();
184 2 }
185 1
186 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 1478 ----
CONSTANT SIZE = 15 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 3 23
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -