plj.lst
来自「用2051制作的测试1HZ到1M的频率测试C程序」· LST 代码 · 共 262 行
LST
262 行
C51 COMPILER V8.08 PLJ 07/11/2008 00:03:34 PAGE 1
C51 COMPILER V8.08, COMPILATION OF MODULE PLJ
OBJECT MODULE PLACED IN plj.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE plj.c BROWSE DEBUG OBJECTEXTEND
line level source
1 #include <reg52.h> // SFR声明
2 #include <intrins.h>
3 #include <math.h>
4 #define ulong unsigned long
5 #define uchar unsigned char
6 #define uint unsigned int
7 #define udouble unsigned double
8
9 #define SYSCLK 24000 // 系统时钟频率kHz
10 #define STACK_START 0x60//堆栈底部
11 #define STACK_END 0xAF//堆栈顶部
12 #define disp_bit_hide 0x60 //显示位消隐
13
14 #define ts_2ms (0xffff-7962/2)//2ms 24MHz*2 0xf073
15 #define ts_025s 124//0.25S=2mS*124
16 #define ts_05s 249//0.5S=2mS*249
17 #define ts_1s 501//1S=2mS*500
18 uint code JN[5]={10000,1000,100,10,1};
19
20 uint time_ref;
21 uint time_refs=ts_025s;
22 uchar xn=2,xnb=2; //xnb=计数时间的倒数
23 uchar led;
24 uchar led_bit;
25
26 uint freq_alu_word=0; //频率计数值
27 uint freq_alu_hb;
28 uint freq_alu_lb;
29
30 idata uchar freqh_word=0; // 频率值
31 idata ulong flowc_word=0; // 中间比较值
32 idata uchar dispbuf_bcd[5]; //显示缓冲区放5个值
33 idata uchar disp_bcd[5]; //显示缓冲地址
34
35 sbit cs245=P3^7; //位选74HC245,“0”有效
36 bit start=0; //频率计数开始标志
37 bit busy=0; //在一个时基内,频率计数完,频率计算开始标志
38 uchar code tabchar[64]={
39
40 0xb7,0x12,0x67,0x76,0xd2,0xf4,0xf5,0x16, //0~7,+00H
41 0xf7,0xf6,0xd7,0xf1,0xa5,0x73,0xe5,0xc5, //8~F,+08H
42 //数码显示:CHR 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F
43 0xbf,0x1a,0x6f,0x7e,0xda,0xfc,0xfd,0x1e, //0.~7. +10h
44 0xff,0xfe,0xdf,0xf9,0xad,0x7b,0xed,0xcd, //8.~f. +18h
45 //数码显示带点:CHR 0.,1.,2.,3.,4.,5.,6.,7.,8.,9.,A.,B.,C.,D.,E.,F.
46 0x00,0x50,0x12,0x85,0x41,0x71,0xc7,0x97, // 灭 ,'-',-1 ,'R','r' ,'o','P','N','L'+20h
47 0xa1,0x51,0xd3,0x00,0x00,0x00,0x00,0x00, //L,n,H +28h
48 //字符显示: 灭 ,'-',-1 ,'R','r' ,'o','P','N','L','n','H'
49 0x08,0x58,0x1a,0x8d,0x49,0x79,0xcf,0x9f, // 灭. ,'-.',-1. ,'R.','r.' ,'o.','P.','N.'+30h
50 0xa9,0x59,0xdb,0x00,0x00,0x00,0x00,0x00 //L.,n.H.+38h
51 };//字符带点: 灭. ,'-.',-1. ,'R.','r.' ,'o.','P.','N.','L.','n.','H.
52 void disp_scan()
53 { idata uchar buf;
54 1 static uint k=0;
55 1 k++;
C51 COMPILER V8.08 PLJ 07/11/2008 00:03:34 PAGE 2
56 1 if(k==500)
57 1 {k=0; P2=~P2;}
58 1 //led=4; //5个数码管
59 1 //led_bit=1; //LED位控制位,最低位选中,
60 1 cs245=0;
61 1 P3=disp_bit_hide; //显示位消隐
62 1 _nop_();
63 1 P3=0x7f&led_bit; //开第一个数码管
64 1 _nop_();
65 1 P1=0x00;
66 1 buf=dispbuf_bcd[led];
67 1 P1=tabchar[buf];
68 1 led--; //扫描位计数,更新下一个数码管缓冲区里显示数值
69 1 led_bit=led_bit<<1; //数码管位控移位,16进制数为,0x01,0x02,0x04,0x08,0x10,再回到0x01
70 1 //if((led_bit==0x10)|(led==0))
71 1 //{led_bit=1;led=4;} ////一次五位显示循环完毕,重新赋扫描初值
72 1 if(led>4|led_bit>0x10 |led_bit==0x00)
73 1 {led=4;led_bit=1;} //一次五位显示循环完毕,重新赋扫描初值
74 1 }
75 void disp_start() //显示(0.--9.)
76 { uchar i;
77 1 for(i=0;i<5;i++)
78 1 { dispbuf_bcd[i]=i+16;}//显示缓冲数据区里的值从0---4
79 1 //delay(500);
80 1 //for(j=5;j<10;j++)
81 1 //{dispbuf_bcd[j-5]=j+16;}
82 1
83 1 }
84 void freq_alu() //频率计算
85 { ulong freq_reg; // 最终频率计算值 32位数
86 1 freq_reg=freq_alu_hb; //存高16位
87 1 freq_reg=freq_reg<<16; //移动16次 到32位的高16值
88 1 freq_reg=freq_reg+freq_alu_lb; //高16+低16位
89 1 freq_reg=freq_reg<<xnb;//计数值freq_reg/计数时间 (xnb=计数时间的倒数)
90 1 flowc_word=freq_reg; //计算出来的频率值
91 1 if(xn!=xnb){xnb=xn;}
92 1 }
93 void freq_bcd_n(ulong N)
94 { ulong M;
95 1 uchar i,j,dot;
96 1 //N=flowc_word;
97 1 dot=3; //小数点默认在第3位(0000.0)K
98 1 if(N<100000)
99 1 { dot=1; //小数点第一位
100 2 time_refs=ts_1s; //频率低于10,时基改变为1S
101 2 xnb=0;}
102 1 else if (N<1000000)
103 1 { dot=2; //小数点定位在位2(000.00kHz)
104 2 time_refs=ts_05s; //默认时基
105 2 xn=1;
106 2 M=N%10;
107 2 N=N/10;
108 2 if(M>4){N++;} //末位四舍五入
109 2
110 2
111 2 }
112 1 else //if(N<10000000)
113 1 { dot=3; //小数点定位在位3(0000.0kHz)
114 2 time_refs=ts_025s; //默认时基
115 2 xn=2;
116 2 M=N%100;
117 2 N=N/100;
C51 COMPILER V8.08 PLJ 07/11/2008 00:03:34 PAGE 3
118 2 if(M>49){N++;} //末位四舍五入
119 2 }
120 1 //BCD码转化成5位十进制数,最高位从disp_bcd[0]开始
121 1 for(i=0;i<=4;i++)
122 1 {disp_bcd[i]=N/JN[i];
123 2 N=N%JN[i];
124 2 }
125 1 disp_bcd[dot]=disp_bcd[dot]+0x10;//小数点位置 加16
126 1
127 1 if(dot=1&(disp_bcd[0]==0)) //如果小数点在第一位并且第一个数码管的值为0
128 1 {disp_bcd[0]=0x20;} //消隐
129 1
130 1 for(j=0;j<5;j++)
131 1 {dispbuf_bcd[j]=disp_bcd[j];}
132 1
133 1 }
134 void delay(uint n)
135 { uint i;
136 1 uchar j;
137 1 for(i=0;i<n;i++)
138 1 for(j=0;j<255;j++)
139 1 {;;}
140 1 }
141 void freq_start()
142 { //cs245=0;
143 1 EX0=0;//外中断0禁止
144 1 ET0=1;
145 1 ET1=1;
146 1 TR1=0;//停止计数
147 1 TF1=0;//清溢出标志
148 1 TH1=0;//清计数初值
149 1 TL1=0;
150 1 TH0=0xf0; //2毫秒定时初值
151 1 TL0=0x60;
152 1 freq_alu_word=0;
153 1 time_ref=time_refs;
154 1 TR0=1;
155 1 TR1=1;
156 1 PT0=1;
157 1 start=1;
158 1
159 1 }
160
161 void Timer0() interrupt 1 using 1
162 {
163 1 TF0=0; //中断溢出标志清0
164 1 TH0=0xf0; //2毫秒定时初值
165 1 TL0=0x60;
166 1 if(start) //如果频率计数开始
167 1 {if(time_ref--==0)
168 2 {freq_alu_lb=TH1*256+TL1;
169 3 freq_alu_hb=freq_alu_word;}
170 2 busy=1;
171 2 time_ref=time_refs;
172 2 freq_start();
173 2 }
174 1 disp_scan();
175 1
176 1 }
177
178
179
C51 COMPILER V8.08 PLJ 07/11/2008 00:03:34 PAGE 4
180 void Timer1()interrupt 3 using 1
181 {freq_alu_word++;}
182
183 void timer0_count1_init()
184 { TMOD=0x51; //T0用来定时 T1用来计数
185 1 TH0=0xf0; //2毫秒定时初值
186 1 TL0=0x60;
187 1 TH1=0; //计数器1初值
188 1 TL1=0;
189 1 TR0=1;
190 1 TF0=0;
191 1 IT0=0; //下降沿有效
192 1 PT0=1; //中断0优先
193 1 EA=0;
194 1 }
195
196
197 void main()
198 { led=4;
199 1 led_bit=1;
200 1 TMOD=0x51; //T0用来定时 T1用来计数
201 1 TH0=0xf0; //2毫秒定时初值
202 1 TL0=0x60;
203 1 TH1=0; //计数器1初值
204 1 TL1=0;
205 1 TR0=1;
206 1 ET0=1;
207 1 PT0=1;
208 1 timer0_count1_init(); //定时/计数初始化
209 1 EA=1;
210 1 disp_start(); //开始显示(0.-9.)
211 1 delay(1000); //延迟1S
212 1 freq_start(); //频率计数开始
213 1 for(;;)
214 1 {if(busy)
215 2 {freq_alu(); //频率计算
216 3 freq_bcd_n(flowc_word);//计算的频率值转化成10进制数 }
217 3 busy=0;
218 3 }
219 2 freq_start();
220 2 }
221 1
222 1
223 1
224 1
225 1
226 1
227 1
228 1
229 1
230 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 906 ----
CONSTANT SIZE = 74 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 16 14
IDATA SIZE = 15 1
BIT SIZE = 2 ----
END OF MODULE INFORMATION.
C51 COMPILER V8.08 PLJ 07/11/2008 00:03:34 PAGE 5
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?