?? text2.lst
字號:
C51 COMPILER V6.12 TEXT2 08/25/2006 17:25:49 PAGE 1
C51 COMPILER V6.12, COMPILATION OF MODULE TEXT2
OBJECT MODULE PLACED IN .\Text2.OBJ
COMPILER INVOKED BY: D:\Program Files\Keil7.0\C51\BIN\C51.EXE .\Text2.c DEBUG OBJECTEXTEND
stmt level source
1 /*-------------------------------------
2 超聲波測距單片C程序
3 MCU AT89S52 XAL 12M
4 2006.8.21 by maozhen
5 增加EEPROM存儲功能,測量過程中鍵1存,鍵2讀
6 --------------------------------------*/
7 #include<AT89X52.h>
8 #include <intrins.h>
9 #define uchar unsigned char
10 #define uint unsigned int
11 #define ulong unsigned long
12 #define Sda P1_2 /*串行數據*/
13 #define Scl P1_1 /*串行時鐘*/
14 #define WriteRom P1_5
15 #define ReadRom P1_4
16 data uchar ramnum=0;
17 extern void transmit(void);
18 extern void display(void);
19
20 //sfr WDTRST = 0xA6;
21 //sfr AUXR = 0X8E;
22 data uchar testok;
23 data ulong time;
24 data uchar dispram[3]={1,1,1};
25 const unsigned char LED7Code[]={
26 0x14, // 0
27 0x77, // 1
28 0x4C, // 2
29 0x45, // 3
30 0x27, // 4
31 0x85, // 5
32 0x84, // 6
33 0x57, // 7
34 0x04, // 8
35 0x05, // 9
36 0x8e, // F
37 0x8C, // E
38 0x12, // n
39 0x64, // D
40 };
41 const uchar dispbit[]={
42 0xfe, //bit1
43 0xfb, //bit2
44 0xef, //bit3
45 };
46
47 extern void delay(uint t)
48 {
49 1 uint n,j;
50 1 for (n=0;n<t;n++)
51 1 for (j=0; j<10;j++);
52 1 }
53
54 /*void supplydog(void)
55 {
C51 COMPILER V6.12 TEXT2 08/25/2006 17:25:49 PAGE 2
56 EA=0;
57 WDTRST=0x1E;
58 WDTRST=0xE1;
59 EA=1;
60 }
61 */
62 extern void mDelay(uint Delay)
63 { uint i;
64 1 for(;Delay>0;Delay--)
65 1 { for(i=0;i<124;i++)
66 2 {;}
67 2 //supplydog();
68 2 }
69 1 }
70
71 /*發送起始條件*/
72 void Start(void) /*起始條件*/
73 {
74 1 Sda=1;
75 1 Scl=1;
76 1 _nop_();
77 1 _nop_();
78 1 _nop_();
79 1 _nop_();
80 1 Sda=0;
81 1 _nop_();
82 1 _nop_();
83 1 _nop_();
84 1 _nop_();
85 1 }
86
87 void Stop(void) /*停止條件*/
88 {
89 1 Sda=0;
90 1 Scl=1;
91 1 _nop_();
92 1 _nop_();
93 1 _nop_();
94 1 _nop_();
95 1 Sda=1;
96 1 _nop_();
97 1 _nop_();
98 1 _nop_();
99 1 _nop_();
100 1 }
101
102 void Ack(void) /*應答位*/
103 {
104 1 Sda=0;
105 1 _nop_();
106 1 _nop_();
107 1 _nop_();
108 1 _nop_();
109 1 Scl=1;
110 1 _nop_();
111 1 _nop_();
112 1 _nop_();
113 1 _nop_();
114 1 Scl=0;
115 1 }
116
117 void NoAck(void) /*反向應答位*/
C51 COMPILER V6.12 TEXT2 08/25/2006 17:25:49 PAGE 3
118 {
119 1 Sda=1;
120 1 _nop_ ();
121 1 _nop_ ();
122 1 _nop_ ();
123 1 _nop_ ();
124 1 Scl=1;
125 1 _nop_ ();
126 1 _nop_ ();
127 1 _nop_ ();
128 1 _nop_ ();
129 1 Scl=0;
130 1 }
131
132 void Send(uchar Data) /*發送數據子程序,Data為要求發送的數據*/
133 {
134 1 uchar BitCounter=8; /*位數控制*/
135 1 uchar temp; /*中間變量控制*/
136 1 //supplydog();
137 1 do
138 1 {
139 2 temp=Data;
140 2 Scl=0;
141 2 _nop_ ();
142 2 _nop_ ();
143 2 _nop_ ();
144 2 _nop_ ();
145 2 if((temp&0x80)==0x80)/* 如果最高位是1*/
146 2 Sda=1;
147 2 else
148 2 Sda=0;
149 2 Scl=1;
150 2 temp=Data<<1; /*RLC*/
151 2 Data=temp;
152 2 BitCounter--;
153 2 }while(BitCounter);
154 1 Scl=0;
155 1 }
156
157 uchar Read(void) /*讀一個字節的數據,并返回該字節值*/
158 {
159 1 uchar temp=0;
160 1 uchar temp1=0;
161 1 uchar BitCounter=8;
162 1 Sda=1;
163 1 //supplydog();
164 1 do{
165 2 Scl=0;
166 2 _nop_();
167 2 _nop_();
168 2 _nop_();
169 2 _nop_();
170 2 Scl=1;
171 2 _nop_();
172 2 _nop_();
173 2 _nop_();
174 2 _nop_();
175 2 if(Sda)
176 2 temp=temp|0x01; /*temp的最低位置1*/
177 2 else
178 2 temp=temp&0xfe; /*否則temp的最低位清0*/
179 2 if(BitCounter-1)
C51 COMPILER V6.12 TEXT2 08/25/2006 17:25:49 PAGE 4
180 2 { temp1=temp<<1;
181 3 temp=temp1;
182 3 }
183 2 BitCounter--;
184 2 }while(BitCounter);
185 1 return(temp);
186 1 }
187
188 void WrToROM(uchar Data[],uchar Address,uchar Num)
189 {
190 1 uchar i;
191 1 uchar *PData;
192 1 PData=Data;
193 1 for(i=0;i<Num;i++)
194 1 {
195 2 Start(); /*發送啟動信號*/
196 2 Send(0xa0); /*發送SLA+W*/
197 2 Ack();
198 2 Send(Address+i); /*發送地址*/
199 2 Ack();
200 2 Send(*(PData+i));
201 2 Ack();
202 2 Stop();
203 2 mDelay(20);
204 2 }
205 1 }
206
207 void RdFromROM(uchar Data[],uchar Address,uchar Num)
208 {
209 1 uchar i;
210 1 uchar *PData;
211 1 PData=Data;
212 1 for(i=0;i<Num;i++)
213 1 {
214 2 Start();
215 2 Send(0xa0);
216 2 Ack();
217 2 Send(Address+i);
218 2 Ack();
219 2 Start();
220 2 Send(0xa1);
221 2 Ack();
222 2 *(PData+i)=Read();
223 2 Scl=0;
224 2 NoAck();
225 2 Stop();
226 2 }
227 1 }
228
229 void testkey(void)
230 {
231 1 uchar j,k,temp1[1],temp[30];
232 1 uint i1=0,i;
233 1 //supplydog();
234 1 if((!WriteRom)|(!ReadRom))
235 1 {
236 2 if (WriteRom==0)
237 2 {mDelay(50);
238 3 if (WriteRom==0)
239 3 {
240 4 WrToROM(dispram,ramnum,3); //一次寫入三個數據
241 4 ramnum=ramnum+3;
C51 COMPILER V6.12 TEXT2 08/25/2006 17:25:49 PAGE 5
242 4 }
243 3 }
244 2 else if (ReadRom==0)
245 2 {mDelay(50);
246 3 if (ReadRom==0)
247 3 {
248 4
249 4 for(i=0;i<ramnum;i++)
250 4 {
251 5 RdFromROM(temp1,i,1);
252 5 temp[i]=temp1[0];
253 5 }
254 4 for(k=0;k<ramnum/3;k++) //逐個顯示記錄的數據
255 4 {
256 5 for(j=0;j<3;j++)
257 5 {dispram[j]=temp[i1++];}
258 5 for(i=0;i<5000;i++)
259 5 {display();}
260 5 }
261 4 }
262 3 dispram[0]=11; //記錄顯示結束,“END
263 3 dispram[1]=12;
264 3 dispram[2]=13;
265 3 for(i=0;i<1000;i++)
266 3 {display();}
267 3 }
268 2 }
269 1 }
270
271 /* main */
272 void main(void)
273 {
274 1 data uint k;
275 1 ramnum=0;
276 1 //supplydog();
277 1 // AUXR = 0x08;
278 1 P0 = 0xFF;
279 1 P1 = 0xFD;
280 1 P3 = 0xFF;
281 1 P2 = 0x8e;
282 1 TMOD=0x21; //timer1 mode2,timer0 mode1
283 1 RCAP2H=0xff; //65536-75
284 1 RCAP2L=0xb5;
285 1 TH2 =0xff;
286 1 TL2 =0xB5;
287 1 TH0=0x0;
288 1 TL0=0x0;
289 1 T2MOD=0x02; //T2作為CLK輸出40k
290 1 T2CON=0x00; //no打開TIMER2
291 1 P1_3 =1;
292 1
293 1 while(1)
294 1 {
295 2 //supplydog();
296 2 EA=0;
297 2 RCAP2H=0xff; //65536-75
298 2 RCAP2L=0xb5;
299 2 TH2 =0xff;
300 2 TL2 =0xB5;
301 2 TH0=0x0;
302 2 TL0=0x0;
303 2 T2MOD=0x02; //T2作為CLK輸出40k
C51 COMPILER V6.12 TEXT2 08/25/2006 17:25:49 PAGE 6
304 2 T2CON=0x00; //no打開TIMER2
305 2 TMOD=0x21;
306 2 P1_3 =1;
307 2 EA=1;
308 2 transmit();
309 2 testok=0;
310 2 while (!testok) display();
311 2 if(1==testok)
312 2 {
313 3 time=TH0;
314 3 time=(time<<8)|TL0;
315 3 //supplydog();
316 3 TH0=0;
317 3 TL0=0;
318 3 time*=172;
319 3 time/=10000;
320 3 time+=6;
321 3 dispram[2]=(uchar)(time%10); //個位
322 3
323 3 dispram[1]=(uchar)((time/10)%10);//十位
324 3
325 3 dispram[0]=(uchar)(time/100); //百位
326 3 //supplydog();
327 3 } else
328 2 {
329 3 dispram[0]=10;
330 3 dispram[1]=10;
331 3 dispram[2]=10;
332 3 }
333 2 EA=0;
334 2 for (k=0;k<150;k++)
335 2 display(); //500
336 2 testkey();
337 2 EA=1;
338 2 }
339 1 }
340
341
342 /*超聲波接蕆eceive*int)*/
343 void receive(void) interrupt 0
344 {
345 1 TR2=0;
346 1 TR0=0;
347 1 ET0=0;
348 1 EX0=0;
349 1 testok=1;
350 1 //supplydog();
351 1 }
352
353 /*超時清除程序(內中斷T0 YICHU)*/
354 void overtime(void) interrupt 1
355 {
356 1
357 1 testok=0;
358 1 TR2=0;
359 1 EX0=0;
360 1 TR0=0;
361 1 ET0=0;
362 1 testok=2;
363 1 //supplydog();
364 1 }
365
C51 COMPILER V6.12 TEXT2 08/25/2006 17:25:49 PAGE 7
366 void transmit(void)
367 {
368 1 EX0=0;
369 1 IE0=0;
370 1 //supplydog();
371 1 testok=0;
372 1 TH0=0;
373 1 TL0=0;
374 1 //P1_3 =0; ////and輸入端,抑制發送?
375 1 TR2 =1; //start timer2
376 1 TR0=1; //T0開始記述
377 1 delay(1);
378 1 TR2=0;
379 1
380 1 testok=0;
381 1 P1_0=0; //接電容的發射腳為0,發射器上兩邊0
382 1 delay(5); //delay(1)
383 1 //P1_3 =1; //
384 1 IE0=0;
385 1 EX0=1; //開外中斷
386 1 ET0=1; //T0 INT ON
387 1 testok=0;
388 1 //supplydog();
389 1 }
390
391
392 void display(void)
393 { int i;
394 1 for( i=0;i<3;i++)
395 1 {
396 2 P2=LED7Code[dispram[i]];
397 2 P0=dispbit[i];
398 2 delay(3);
399 2 //supplydog();
400 2 };
401 1
402 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 1011 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 26 57
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 + -