📄 fm.lst
字号:
C51 COMPILER V7.02a FM 03/07/2008 11:52:23 PAGE 1
C51 COMPILER V7.02a, COMPILATION OF MODULE FM
OBJECT MODULE PLACED IN fm.OBJ
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE fm.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1 #include "reg51.h"
2 #include "stdio.h"
3 #include " absacc.h "
4 #include <intrins.h>
5 #include <math.h>
6
7
8 /********************************************************************/
9 void delay_nms(unsigned int n);//delay function
10
11 sbit F_in=P3^6; //测量频率管脚
12 sbit F_out=P3^7; //发生频率管脚
13
14 bit int_flag;
15 unsigned int frequency;
16
17 void Display(void);
18 void Mcu_init(void);
19 void Measure_F(void);
20 void Measure_T(void);
21 void Frequency_Measure(void);
22
23
24 /***********************************************************************/
25
26 /********************/
27 sbit RCLK = P2^5;
28 sbit SCLK = P2^6;
29 sbit SDAT = P2^7;
30
31 sbit A_SEL = P2^2;
32 sbit B_SEL = P2^3;
33 sbit C_SEL = P2^4;
34
35 #define SM0 A_SEL = 0; B_SEL = 0; C_SEL = 0
36 #define SM1 A_SEL = 1; B_SEL = 0; C_SEL = 0
37 #define SM2 A_SEL = 0; B_SEL = 1; C_SEL = 0
38 #define SM3 A_SEL = 1; B_SEL = 1; C_SEL = 0
39 #define SM4 A_SEL = 0; B_SEL = 0; C_SEL = 1
40 #define SM5 A_SEL = 1; B_SEL = 0; C_SEL = 1
41 #define SM6 A_SEL = 0; B_SEL = 1; C_SEL = 1
42 #define SM7 A_SEL = 1; B_SEL = 1; C_SEL = 1
43
44 unsigned char leddata[]={
45
46 0x3F, //"0"
47 0x06, //"1"
48 0x5B, //"2"
49 0x4F, //"3"
50 0x66, //"4"
51 0x6D, //"5"
52 0x7D, //"6"
53 0x07, //"7"
54 0x7F, //"8"
55 0x6F, //"9"
C51 COMPILER V7.02a FM 03/07/2008 11:52:23 PAGE 2
56 0x77, //"A"
57 0x7C, //"B"
58 0x39, //"C"
59 0x5E, //"D"
60 0x79, //"E"
61 0x71, //"F"
62 0x76, //"H"
63 0x38, //"L"
64 0x37, //"n"
65 0x3E, //"u"
66 0x73, //"P"
67 0x5C, //"o"
68 0x40, //"-"
69 0x00, //熄灭
70 0x00 //自定义
71
72 };
73
74 void send(unsigned char data_out)
75 {
76 1 unsigned char i;
77 1 RCLK = 0;
78 1
79 1 for(i=0;i<8;i++)
80 1 {
81 2 if( data_out & 0x80)
82 2 SDAT = 1;
83 2 else
84 2 SDAT = 0;
85 2 SCLK = 0;
86 2
87 2 SCLK = 1;
88 2
89 2 data_out = data_out<<1;
90 2 }
91 1 RCLK = 1;
92 1 }
93
94 #define delay 450
95
96
97
98 /***********************************************************************/
99 void dis_delay(void);
100 void display(unsigned int temp);
101 /***********************************************************************/
102
103 void display(unsigned int temp)
104 {
105 1 unsigned int i;
106 1
107 1 //send(0x00);
108 1
109 1 SM6;
110 1 send(0x40);
111 1 for(i = 0; i < delay; i++);
112 1 send(0x00);
113 1
114 1 SM7;
115 1 if(frequency<2000)
116 1 send(0x39);
117 1 else
C51 COMPILER V7.02a FM 03/07/2008 11:52:23 PAGE 3
118 1 send(0x71);
119 1 for(i = 0; i < delay; i++);
120 1 send(0x00);
121 1
122 1 SM0;
123 1 send(leddata[temp/1000%10]);
124 1 for(i = 0; i < delay; i++);
125 1 send(0x00);
126 1
127 1 SM1;
128 1 send(leddata[temp/100%10]);
129 1 for(i = 0; i < delay; i++);
130 1 send(0x00);
131 1
132 1 SM2;
133 1 send(leddata[temp/10%10]);
134 1 for(i = 0; i < delay; i++);
135 1 send(0x00);
136 1
137 1 SM3;
138 1 send(leddata[temp%10]);
139 1 for(i = 0; i < delay; i++);
140 1 send(0x00);
141 1
142 1
143 1 }
144
145 void main()
146 {
147 1 Mcu_init(); //初始化
148 1
149 1 while(1)
150 1 {
151 2 unsigned int i;
152 2 Frequency_Measure();
153 2
154 2
155 2 for(i=100;i>0;i--)
156 2 display(frequency);
157 2 }
158 1 }
159
160 void time0(void) interrupt 1
161 {
162 1 int_flag=1; //计数溢出标志
163 1 }
164
165 void time1(void) interrupt 3
166 {
167 1 TH1=0xfe; //重新附值
168 1 TL1=0x33;
169 1 F_out=!F_out; //取反 产生频率
170 1 }
171
172 void Frequency_Measure(void)
173 {
174 1 if(frequency<2000) //小于 2k 测周
175 1 Measure_T();
176 1 else if(frequency>=2000) //大于2k 测频
177 1 Measure_F();
178 1 }
179
C51 COMPILER V7.02a FM 03/07/2008 11:52:23 PAGE 4
180 //测频原理:
181 //开一个标准的50ms计数闸门,对被测信号计数
182 void Measure_F(void) //测频子函数
183 {
184 1 bit state_old=0,state_new=0; //定义状态
185 1 unsigned int f_count=0; //计数临时值
186 1 int_flag=0;
187 1 TH0=0x4c; //定时器初值 50ms
188 1 TL0=0x00;
189 1 TR0=1; //启动计数器
190 1 while(1) //死循环 测频
191 1 {
192 2 state_new=F_in; //取得现在的 频率发生引脚状态
193 2 if(state_old!=state_new) //与前一个时刻 旧值 比较,如果不同
194 2 f_count++; //则 计数加1
195 2 state_old=state_new; //将新值 付给 旧值
196 2 if(int_flag) //如果到了定时时间
197 2 {
198 3 TR0=0; //关闭定时器0
199 3 frequency=f_count*10; //计算频率
200 3 //定时 50ms计数 每个周期 计2次 所以 1s内计数= f_count*10
201 3 return; //返回 跳出循环
202 3 }
203 2 }
204 1 }
205
206 //原理:以被测信号的一个周期为闸门
207 //对单片机及其周期进行计数 读取定时器的值为计数值
208 void Measure_T(void) //测周子函数
209 {
210 1 bit state_old=0,state_new=0; //定义状态
211 1 unsigned char temp_flag=0;
212 1 unsigned int t_count; //计数临时值
213 1
214 1 TH0=0;
215 1 TL0=0;
216 1 while(1) //死循环 测周
217 1 {
218 2 state_new=F_in; //取得现在的 频率发生引脚状态
219 2 if(state_old&&!state_new) // 下降沿开始启动闸门
220 2 {
221 3 temp_flag++;
222 3 TR0=1; //启动定时器 计数
223 3 }
224 2 if(temp_flag==2)
225 2 {
226 3 TR0=0; //计数停止
227 3 t_count=TH0*256+TL0; //取得当前的计数值
228 3 frequency=1000000/t_count; //计算频率
229 3 return; //返回
230 3 }
231 2 state_old=state_new;
232 2 }
233 1 }
234
235
236 void Mcu_init(void) //初始化函数
237 {
238 1 EA=1; //开总中断
239 1 ET0=1; //定时器0 开
240 1 TR0=1; //启动定时器 0
241 1 ET1=1; //定时器 1 开
C51 COMPILER V7.02a FM 03/07/2008 11:52:23 PAGE 5
242 1 TR1=1; //启动定时器1
243 1 TMOD=0x11; //工作状态
244 1 TH0=0x4c; //定时器初值
245 1 TL0=0x00;
246 1 TH1=0xfe;
247 1 TL1=0x33;
248 1
249 1 }
250
251
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 487 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 27 3
IDATA SIZE = ---- ----
BIT SIZE = 1 4
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -