📄 cheku.lst
字号:
C51 COMPILER V8.02 CHEKU 08/08/2007 16:37:50 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE CHEKU
OBJECT MODULE PLACED IN cheku.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE cheku.c BROWSE DEBUG OBJECTEXTEND
line level source
1 // 写命令子程序 //
2 // 写数据子程序 //
3 // 建立自定义字符库 //
4 #include <reg51.h>
5 #include<intrins.h>
6 #include<lcd1602.h>
7
8 #define uchar unsigned char
9 #define uint unsigned int
10
11
12 sbit IRON=P2^1;
13 sbit beep=P1^7;
14 sbit lgt=P1^6;
15
16 sbit XJL=P2^4;
17 sbit XJM=P2^3;
18 sbit XJR=P2^2;
19
20 sbit moto_en2 =P1^0;
21 sbit moto_2 =P1^1; //=1 move; =0 back
22 sbit moto_pwm2=P1^2;
23 sbit moto_en1 =P1^3;
24 sbit moto_1 =P1^4; //=1 move; =0 back
25 sbit moto_pwm1=P1^5;
26
27 sbit DI=P3^5;
28 sbit DO=P3^4;
29 sbit CS=P3^1;
30 sbit CLK=P3^0;
31
32 uint adout[2];
33 uint g,h;
34 uchar ironcounter=1;
35 uchar distance[3]={0,0,0};
36 uint juli=0;
37 uchar state=0,cstop=0;
38
39
40 uchar code run[]={"RUN:"};
41 uchar code limit[]={"LIMIT:"};
42 uchar code irondisplay1[]={"IRON:"};
43 uchar code irondisplay2[]={"JL:"};
44 uchar code table[10]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39} ;
45
46
47 uint lim=0,jj=0,min=0;
48 uchar dis=0;
49
50 timer0() interrupt 1
51 {
52 1
53 1 uchar ss, m=0,n=0,pp,qq;
54 1 TH0=(65536-50000)/256;
55 1 TL0=(65536-50000)%256;
C51 COMPILER V8.02 CHEKU 08/08/2007 16:37:50 PAGE 2
56 1 // cc=min;
57 1 lim++;
58 1 ss=lim%20;
59 1 if(ss==0)
60 1 { dis++;
61 2 m=dis/10;
62 2 n=dis%10;
63 2 lcd_wrcmd(0x86);
64 2 lcd_wrdata(table[m]);
65 2 lcd_wrdata(table[n]);
66 2 if(moto_en1==1 && moto_en2==1)
67 2 {
68 3 pp=m;
69 3 qq=n;
70 3 lcd_wrcmd(0x8e);
71 3 lcd_wrdata(table[m]);
72 3 lcd_wrdata(table[n]);
73 3 }
74 2 else if(moto_en1==0 && moto_en2==0 && cstop==1)
75 2 {
76 3
77 3 lcd_wrcmd(0x8e);
78 3 lcd_wrdata(table[pp]);
79 3 lcd_wrdata(table[qq]);
80 3 }
81 2
82 2 }
83 1
84 1
85 1 if(lim==1800)
86 1 {
87 2 moto_en1=0;
88 2 moto_en2=0; //check stop()
89 2 lim=0;
90 2 TR0=0;
91 2 }
92 1
93 1 }
94
95 void ext0(void) interrupt 0
96 {
97 1 juli++;
98 1 }
99
100 measure()
101 {
102 1
103 1 uint mout;
104 1 uchar i;
105 1 mout=juli;
106 1 mout=mout*19/72;
107 1 distance[0]=mout/100;
108 1 mout=mout%100;
109 1 distance[1]=mout/10;
110 1 distance[2]=mout%10;
111 1
112 1 lcd_wrcmd(0xcb);
113 1 for(i=0;i<3;i++) lcd_wrdata(0x30+distance[i]);
114 1 }
115
116
117 ironcnt()
C51 COMPILER V8.02 CHEKU 08/08/2007 16:37:50 PAGE 3
118 { uchar a,b,c,j;
119 1 uint i;
120 1 // uint cc;
121 1
122 1 if(IRON==0)
123 1 {
124 2 measure();
125 2 beep=1;
126 2 lgt=1;
127 2 delay(65000);
128 2 beep=0;
129 2 lgt=0;
130 2
131 2 b=ironcounter/10;
132 2 c=ironcounter%10;
133 2
134 2 lcd_wrcmd(0xc5);
135 2 lcd_wrdata(table[b]);
136 2 lcd_wrdata(table[c]);
137 2
138 2 while(1)
139 2 {
140 3 a=IRON;
141 3 if((a & 0xff)==0x01) break;
142 3 }
143 2
144 2 ironcounter++;
145 2
146 2 if( XJL==0 && XJR==0 && XJM==0) //检测到c点铁片
147 2 {
148 3
149 3 moto_en1=0;
150 3 moto_en2=0;
151 3 for(i=0;i<10;i++)
152 3 { beep=1;lgt=1;
153 4 for(j=0;j<10;j++)
154 4 delay(5000);
155 4 beep=0;lgt=0;
156 4 for(j=0;j<10;j++)
157 4 delay(5000);
158 4 }
159 3
160 3 moto_en1=1;
161 3 moto_en2=1;
162 3 state=1;
163 3 }
164 2 }
165 1 }
166
167 moveforward()
168 { moto_1=1;
169 1 moto_2=1;
170 1
171 1
172 1 moto_en1=1;
173 1 moto_pwm1=0;
174 1
175 1 moto_en2=1;
176 1 moto_pwm2=0;
177 1
178 1 }
179
C51 COMPILER V8.02 CHEKU 08/08/2007 16:37:50 PAGE 4
180
181
182 turn(uchar x,uchar y)
183 { moto_1=1;
184 1 moto_2=1;
185 1
186 1 if(x==0) {moto_en1=0; delay(y);moto_en1=1;}
187 1 if(y==0) {moto_en2=0; delay(x);moto_en2=1;}
188 1
189 1 }
190
191 unsigned char adc_0838convert(uchar channel)
192 {
193 1 uchar i;
194 1 uchar T1,T2=1;
195 1 CS=1;
196 1 _nop_();_nop_();_nop_();_nop_();
197 1
198 1 CLK=0;
199 1 CS=0; //使AD通道打开
200 1 DI = 1; //Start bit=1
201 1 CLK = 1;
202 1
203 1 CLK=0;
204 1 CS=0;
205 1 DI = 1;
206 1 CLK = 1;
207 1
208 1 for(i=0;i<3;i++)
209 1 {
210 2 CLK = 0;
211 2 if(channel&1)DI=1;
212 2 else DI=0;
213 2 channel=channel>>1;
214 2 CLK = 1;
215 2 }
216 1 CLK=0;
217 1 CLK=1;
218 1 for(i=0;i<=6;i++)
219 1 {
220 2 CLK = 0; //时钟为低电平
221 2 DO=1;
222 2 if(DO)
223 2 { //如果采集到的位为1
224 3 T1=T1+1; //给临时存储Temp1加1
225 3 T1=T1<<1;
226 3 } //临时存储器左移一位
227 2 else
228 2 T1=T1<<1; //如果采集到的数位为0,临时存储器左移一位
229 2 _nop_();
230 2 _nop_();
231 2 _nop_();
232 2 _nop_();
233 2 CLK = 1;
234 2 } //时钟为高电平,完成一个时钟周期数据采集
235 1 CLK = 0;
236 1 if(DO) T1=T1+1;
237 1 if(DO) T2=0x80;
238 1
239 1 CLK = 1;
240 1 //采集数据校验
241 1
C51 COMPILER V8.02 CHEKU 08/08/2007 16:37:50 PAGE 5
242 1 for(i=0;i<=6;i++)
243 1 {
244 2 CLK=0;
245 2 if(DO){
246 3 T2=T2>>1;
247 3 T2=T2+0x80; }
248 2 else
249 2 T2=T2>>1;
250 2 CLK = 1;
251 2 }
252 1 CS = 1;
253 1 return T2;
254 1 }
255
256
257 garage(void)
258 {
259 1 signed char ii,jj;
260 1 adout[0]=adc_0838convert(0);
261 1 g=adout[0];
262 1 delay(5);
263 1 adout[1]=adc_0838convert(1);
264 1 h=adout[1];
265 1 ii=g-h;
266 1 jj=h-g;
267 1 if(ii>5 )
268 1 { moto_en1=0;
269 2 moto_en2=1;
270 2
271 2 }
272 1 if(jj>5)
273 1 { moto_en2=0;
274 2 moto_en1=1;
275 2
276 2 }
277 1 if(ii<5 && jj<5)
278 1 moveforward();
279 1
280 1 XJL=1;
281 1 XJM=1;
282 1 XJR=1;
283 1 if(XJL==1 && XJM==1 && XJR==1) {moto_en1=0;moto_en2=0;cstop=1;}
284 1
285 1
286 1 }
287
288 move()
289 {
290 1
291 1 XJL=1;
292 1 XJM=1;
293 1 XJR=1;
294 1
295 1 if(XJL==0 && XJM==1 && XJR==0 ) moveforward();
296 1 if(XJL==0 && XJM==1 && XJR==1 ) turn(0,500); //right
297 1 if(XJL==1 && XJM==0 && XJR==0 ) turn(65000,0);
298 1 if(XJL==0 && XJM==0 && XJR==1 ) turn(0,65000);
299 1 if(XJL==1 && XJM==1 && XJR==0 ) turn(500,0); //left
300 1 if(XJL==0 && XJM==0 && XJR==0 ) {moto_1=0;moto_2=0;delay(20000);}
301 1
302 1 ironcnt();
303 1 }
C51 COMPILER V8.02 CHEKU 08/08/2007 16:37:50 PAGE 6
304
305 main()
306 {
307 1 uchar k;
308 1 moto_en1=1;
309 1 moto_en2=1;
310 1 moto_1=1;
311 1 moto_2=1; // check
312 1 moto_pwm1=0;
313 1 moto_pwm2=0;
314 1 lgt=0;
315 1 beep=0;
316 1 IRON=1;
317 1
318 1 TMOD=0x01;
319 1 TH0=(65536-50000)/256;
320 1 TL0=(65536-50000)%256;
321 1
322 1 EA=1;
323 1 ET0=1;
324 1 TR0=1;
325 1 EX0=1;
326 1 IT0=1;
327 1
328 1 //display menu
329 1 lcd_ini();
330 1 lcd_wrcmd(1);
331 1 lcd_wrcmd(0x80);
332 1 for(k=0;k<6;k++) lcd_wrdata(limit[k]);
333 1 lcd_wrcmd(0x8a);
334 1 for(k=0;k<4;k++) lcd_wrdata(run[k]);
335 1
336 1 lcd_wrcmd(0xc0);
337 1 for(k=0;k<5;k++) lcd_wrdata(irondisplay1[k]);
338 1 lcd_wrcmd(0xc8);
339 1 for(k=0;k<3;k++) lcd_wrdata(irondisplay2[k]);
340 1 //cm
341 1 lcd_wrcmd(0xce);
342 1 lcd_wrdata('c');
343 1 lcd_wrdata('m');
344 1
345 1 lcd_wrcmd(0xc5);
346 1 lcd_wrdata(0x30);
347 1 lcd_wrdata(0x30);
348 1
349 1 lcd_wrcmd(0xcb);
350 1 for(k=0;k<3;k++) lcd_wrdata(0x30);
351 1
352 1
353 1 while(1)
354 1 {
355 2 // look for cute and iron
356 2 if(state==0) move();
357 2
358 2
359 2 // 找光源
360 2 if(state==1) garage();
361 2
362 2 }
363 1
364 1
365 1
C51 COMPILER V8.02 CHEKU 08/08/2007 16:37:50 PAGE 7
366 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 1113 ----
CONSTANT SIZE = 64 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 23 2
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 + -