📄 traffic.lst
字号:
159 1 &in_time.hour,
160 1 &in_time.min,
161 1 &in_time.sec);
162 1
163 1 if (in_time.hour > 23 || in_time.min > 59 || //检查输入时间值是否有效
164 1 in_time.sec > 59 || args < 2 || args == EOF)
165 1 {
166 2 printf ("\n错误的时间格式!\n"); //输出错误信息
167 2 return (0);
168 2 }
169 1 return (1);
170 1 }
171
172
173
174 void clock () _task_ CLK_TASK //任务2
175 {
176 1 while (1)
177 1 {
178 2 if (++now_time.sec == 60) //计算秒值
179 2 {
C51 COMPILER V8.08 TRAFFIC 09/04/2008 10:42:40 PAGE 4
180 3 now_time.sec = 0;
181 3 if (++now_time.min == 60) //计算分钟值
182 3 {
183 4 now_time.min = 0;
184 4 if (++now_time.hour == 24) //计算小时值
185 4 {
186 5 now_time.hour = 0;
187 5 }
188 4 }
189 3 }
190 2 if (display_time) //显示时间
191 2 {
192 3 os_send_signal (COMMAND_TASK); //向任务1发送信号
193 3 }
194 2 os_wait (K_IVL, 100, 0); //等待1秒
195 2 }
196 1 }
197
198 void blinking () _task_ BLINKING_TASK //任务3
199 {
200 1 bit sl;
201 1 red = 0; //熄灭红灯
202 1 yellow = 0; //熄灭黄灯
203 1 green = 0; //熄灭绿灯
204 1 stop = 0; //熄灭行人红灯
205 1 walk = 0; //熄灭行人绿灯
206 1
207 1 while (1) //闪烁循环
208 1 {
209 2 yellow = 1; //点亮黄灯
210 2 os_wait (K_TMO, 30, 0); //等待超时
211 2 yellow = 0; //熄灭黄灯
212 2 os_wait (K_TMO, 30, 0); //等待超时
213 2 sl= timeon ();
214 2 if (sl) //如果闪烁时间段结束
215 2 {
216 3 os_create_task (LIGHTS_TASK); //启动任务4
217 3 os_delete_task (BLINKING_TASK); //停止任务3
218 3 }
219 2 }
220 1 }
221
222
223 bit timeon () //检查系统时钟是否处在开始时间和结束时间之间
224 {
225 1 if (memcmp (&start_time, &end_time, sizeof (struct time)) < 0)
226 1 {
227 2 if (memcmp (&start_time, &now_time, sizeof (struct time)) < 0 &&
228 2 memcmp (&now_time, &end_time, sizeof (struct time)) < 0)
229 2 return (1); //红绿灯处于活跃状态
230 2 }
231 1 else
232 1 {
233 2 if (memcmp (&end_time, &now_time, sizeof (start_time)) > 0 &&
234 2 memcmp (&now_time, &start_time, sizeof (start_time)) > 0)
235 2 return (1);
236 2 }
237 1 return (0); //信号结束,开始闪烁黄灯
238 1 }
239
240 void lights () _task_ LIGHTS_TASK //任务4
241 {
C51 COMPILER V8.08 TRAFFIC 09/04/2008 10:42:40 PAGE 5
242 1 red = 1; //点亮红灯
243 1 yellow = 0; //熄灭黄灯
244 1 green = 0; //熄灭绿灯
245 1 stop = 1; //点亮行人红灯
246 1 walk = 0; //熄灭行人绿灯
247 1
248 1 while (1) //主循环
249 1 {
250 2 os_wait (K_TMO, 30, 0); //等待超时
251 2 if (!timeon ()) //如果系统时间处在活跃时间之外
252 2 {
253 3 os_create_task (BLINKING_TASK); //启动任务3
254 3 os_delete_task (LIGHTS_TASK); //停止任务4
255 3 }
256 2 yellow = 1;
257 2 os_wait (K_TMO, 30, 0); //等待超时
258 2
259 2 red = 0;
260 2 yellow = 0; //为主干道点亮绿灯
261 2 green = 1;
262 2
263 2 os_clear_signal (LIGHTS_TASK);
264 2 os_wait (K_TMO, 30, 0); //等待超时
265 2 os_wait (K_TMO + K_SIG, 300, 0); //等待超时和信号
266 2
267 2 yellow = 1;
268 2 green = 0;
269 2 os_wait (K_TMO, 30, 0); //等待超时
270 2 red = 1; //为主干道点亮红灯
271 2 yellow = 0;
272 2
273 2 os_wait (K_TMO, 30, 0); //等待超时
274 2 stop = 0; //为行人点亮绿灯,放行
275 2 walk = 1;
276 2
277 2 os_wait (K_TMO, 100, 0); //等待超时
278 2 stop = 1; //为行人点亮红灯
279 2 walk = 0;
280 2 }
281 1 }
282
283 void buttonread () _task_ buttonREAD_Task //任务5
284 {
285 1 while (1)
286 1 {
287 2 if (button) //若行人按钮按下
288 2 {
289 3 os_send_signal (LIGHTS_TASK); //向任务4发送信号
290 3 }
291 2 os_wait (K_TMO, 3, 0); //等待超时
292 2 }
293 1 }
294
295 void get_escape () _task_ ESCEXIT_TASK //任务6
296 {
297 1 while (1)
298 1 {
299 2 if (_getkey () == ESC) //如果ESC 键输入,置ESCExit标志
300 2 ESCExit = 1;
301 2 if (ESCExit) //如果有ESCExit标志,向任务1发送信号
302 2 {
303 3 os_send_signal (COMMAND_TASK);
C51 COMPILER V8.08 TRAFFIC 09/04/2008 10:42:40 PAGE 6
304 3 }
305 2 }
306 1 }
307
308
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 809 ----
CONSTANT SIZE = 616 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 12 1
IDATA SIZE = 16 ----
BIT SIZE = 3 1
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -