📄 logic.lst
字号:
C51 COMPILER V7.50 LOGIC 05/15/2008 15:59:15 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE LOGIC
OBJECT MODULE PLACED IN logic.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE logic.c BROWSE DEBUG OBJECTEXTEND
line level source
1 #include <reg52.h>
2 #include "PIN.H" // 修改该文件以适应硬件环境/单片机型号等
3 #include "CH452CMD.H" // CH452常量定义
4 #include "definition.h"
5 #define uchar unsigned char
6 #define uint unsigned int
7 #define step_motor_frequence 65536-1000
8 #define timer_10ms 65536-10000
9 #define up 1
10 #define down 0
11 extern void CH452_Write (unsigned short cmd);
12 extern uchar CH452_Read( void );
13 extern void keyboard_detact(uchar value);
14 uchar up_list[5];
15 uchar down_list[5];
16 bit read_flag;
17 bit direction_display_flag;
18 bit highest_floor_flag;
19 bit lowest_floor_flag;
20 uchar storey;
21 uint counter_5s;
22 uchar over_load_flag;
23 uchar up_list_flag=0;
24 uchar down_list_flag=0;
25 uchar inside_request=0;
26 uchar outside_request=0;
27 bit current_direction;
28 sbit L297_clock=P1^0;
29 sbit L297_reset=P1^1;
30 sbit L297_mode=P1^2;
31 sbit L297_direction=P1^3;
32 sbit L297_on=P1^4;
33 void interrupt_logic(void);
34 void input_up_list(uchar request);
35 void input_down_list(uchar request);
36 /************************初始化程序******************/
37 void init_port(void)
38 {
39 1 P0=0x00;
40 1 P2=P2&0x07;
41 1 }
42
43 void init_serialport(void)
44 {
45 1 SCON=0x98;
46 1 PCON=0x80;
47 1 ES=1;
48 1 IP=0x10;
49 1 }
50
51 void init_stepper_motor(void)
52 {
53 1 L297_on=1;
54 1 L297_reset=1;
55 1 L297_mode=1;
C51 COMPILER V7.50 LOGIC 05/15/2008 15:59:15 PAGE 2
56 1 L297_direction=up;
57 1 current_direction=up;
58 1 }
59
60 void init_timer(void)
61 {
62 1 TMOD=0x11;
63 1 TH0=step_motor_frequence/256;
64 1 TL0=step_motor_frequence%256;
65 1 ET0=1;
66 1 TH1=timer_10ms/256;
67 1 TL1=timer_10ms%256;
68 1 ET1=1;
69 1 TR0=1;
70 1 }
71
72 void init_exint0(void)
73 {
74 1 EA=1;
75 1 EX0=1;
76 1 IT0=1;
77 1 }
78
79 void init_CH451L(void)
80 {
81 1 CH452_Write(CH452_RESET);
82 1 CH452_Write(CH452_BCD | 0x20); // 选择BCD译码方式,扫描极限为2个数码管
83 1 CH452_Write(CH452_SYSON2); // 开启显示
84 1 CH452_Write(CH452_DIG0 | 0);
85 1 }
86
87 void delay_ms(uint t)//延时子程序,延时 1MS*t S
88 {
89 1 uchar a;
90 1 while(--t != 0)
91 1 {
92 2 for(a = 0; a < 125; a++);
93 2 }
94 1 }
95
96 void delay_s(uchar x)
97 {
98 1 uchar i;
99 1 for(i=0;i<x;i++)
100 1 delay_ms(1000);
101 1 }
102 /*****************************超重判断程序************************/
103 void over_load_judge(void)
104 {
105 1 if(1==over_load_flag)
106 1 {
107 2 TR0 = 0;
108 2 delay_s(3);
109 2 }
110 1 else if(2==over_load_flag)
111 1 {
112 2 TR0=1;
113 2 over_load_flag=0;
114 2 }
115 1 }
116 /*****************************电梯逻辑程序************************/
117 void transmit_run(void)
C51 COMPILER V7.50 LOGIC 05/15/2008 15:59:15 PAGE 3
118 {
119 1 SBUF=0x0f;
120 1 while(0==TI);
121 1 TI=0;
122 1 }
123
124 void transmit_stop(void)
125 {
126 1 SBUF=0xf0;
127 1 while(0==TI);
128 1 TI=0;
129 1 }
130
131 void start_lift(void)
132 {
133 1 uchar temp;
134 1 do
135 1 {
136 2 if(1==read_flag)
137 2 {
138 3 temp=CH452_Read();
139 3 keyboard_detact(temp);
140 3 read_flag=0;
141 3 }
142 2 }
143 1 while(storey!=1);
144 1 TR0=0; //电梯停转
145 1 CH452_Write(CH452_DIG0 | storey);
146 1 CH452_Write(CH452_DIG1 | 0x10);
147 1 delay_s(2);
148 1 direction_display_flag=0;
149 1 }
150
151 void keyboard_program(void)
152 {
153 1 uchar keyboard_value;
154 1 if(1==read_flag)
155 1 {
156 2 keyboard_value=CH452_Read();
157 2 keyboard_detact(keyboard_value);
158 2 interrupt_logic();
159 2 read_flag=0;
160 2 }
161 1 }
162
163 void direction_display(void)
164 {
165 1 if(up==current_direction)
166 1 CH452_Write(CH452_DIG1 | 0x07);
167 1 else
168 1 CH452_Write(CH452_DIG1 | CH452_BCD_CH_L);
169 1 CH452_Write(CH452_DIG0 | storey);
170 1 }
171
172 void turn_off_lights(uchar level)
173 {
174 1 switch(level)
175 1 {
176 2 case 1:
177 2 {
178 3 inside_led1=0;
179 3 outside_up_led1=0;
C51 COMPILER V7.50 LOGIC 05/15/2008 15:59:15 PAGE 4
180 3 break;
181 3 }
182 2 case 2:
183 2 {
184 3 inside_led2=0;
185 3 if(up==current_direction)
186 3 {
187 4 outside_up_led2=0;
188 4 if(2>=up_list[0])
189 4 outside_down_led2=0;
190 4 }
191 3 else
192 3 {
193 4 outside_down_led2=0;
194 4 if(2<=down_list[0])
195 4 outside_up_led2=0;
196 4 }
197 3 break;
198 3 }
199 2 case 3:
200 2 {
201 3 inside_led3=0;
202 3 if(up==current_direction)
203 3 {
204 4 outside_up_led3=0;
205 4 if(3>=up_list[0])
206 4 outside_down_led3=0;
207 4 }
208 3 else
209 3 {
210 4 outside_down_led3=0;
211 4 if(3<=down_list[0])
212 4 outside_up_led3=0;
213 4 }
214 3 break;
215 3 }
216 2 case 4:
217 2 {
218 3 inside_led4=0;
219 3 if(up==current_direction)
220 3 {
221 4 outside_up_led4=0;
222 4 if(4>=up_list[0])
223 4 outside_down_led4=0;
224 4 }
225 3 else
226 3 {
227 4 outside_down_led4=0;
228 4 if(4<=down_list[0])
229 4 outside_up_led4=0;
230 4 }
231 3 break;
232 3 }
233 2 case 5:
234 2 {
235 3 inside_led5=0;
236 3 outside_down_led5=0;
237 3 break;
238 3 }
239 2 default:break;
240 2 }
241 1 }
C51 COMPILER V7.50 LOGIC 05/15/2008 15:59:15 PAGE 5
242
243 void lift_run(void)
244 {
245 1 uchar i;
246 1 if((0==down_list_flag)&&(0==up_list_flag))
247 1 {
248 2 TR0=0;
249 2 CH452_Write(CH452_DIG1 | 0x10);
250 2 }
251 1 else if(up==current_direction)
252 1 {
253 2 if(0!=up_list_flag)
254 2 {
255 3 L297_direction=up;
256 3 if(storey==up_list[0]) //到达楼层后电梯停转
257 3 {
258 4 TR0=0;//电梯停转
259 4 transmit_stop();
260 4 for(i=0;i<4;i++)
261 4 {
262 5 up_list[i]=up_list[i+1];//在队列中去除应最先响应的楼层
263 5 }
264 4 up_list[4]=0;
265 4 turn_off_lights(storey);
266 4 up_list_flag--;
267 4 CH452_Write(CH452_DIG1 | 0x10);
268 4 TR1=1;
269 4 counter_5s=500;
270 4 while(counter_5s)
271 4 {
272 5 keyboard_program();
273 5 }
274 4 TR1=0;
275 4 }
276 3 else//若没有到达楼层,则判断是否电梯停转,若停转则启动,没有停转就跳过
277 3 {
278 4 if(0==TR0)
279 4 {
280 5 TR0=1;
281 5 transmit_run();
282 5 direction_display();
283 5 }
284 4 }
285 3 }
286 2 else if((0==up_list_flag)&&(0!=down_list_flag))//若上升队列为空而下降队列不为空,则判断下降队列,
287 2 {
288 3 current_direction=down;
289 3 }
290 2 }
291 1 else if(down==current_direction)
292 1 {
293 2 if(0!=down_list_flag)
294 2 {
295 3 L297_direction=down;
296 3 if(storey==down_list[0])
297 3 {
298 4 TR0=0;
299 4 transmit_stop();
300 4 for(i=0;i<4;i++)
301 4 {
302 5 down_list[i]=down_list[i+1];
303 5 }
C51 COMPILER V7.50 LOGIC 05/15/2008 15:59:15 PAGE 6
304 4 down_list[4]=0;
305 4 turn_off_lights(storey);
306 4 down_list_flag--;
307 4 CH452_Write(CH452_DIG1 | 0x10);
308 4 TR1=1;
309 4 counter_5s=500;
310 4 while(counter_5s)
311 4 {
312 5 keyboard_program();
313 5 }
314 4 TR1=0;
315 4 }
316 3 else
317 3 {
318 4 if(0==TR0)
319 4 {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -