?? plj.lst
字號:
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 + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -