📄 频率计.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 + -