📄 traffic.lst
字号:
C51 COMPILER V8.08 TRAFFIC 09/04/2008 10:42:40 PAGE 1
C51 COMPILER V8.08, COMPILATION OF MODULE TRAFFIC
OBJECT MODULE PLACED IN TRAFFIC.OBJ
COMPILER INVOKED BY: C:\Program Files\keil\C51\BIN\C51.EXE TRAFFIC.C BROWSE DEBUG OBJECTEXTEND
line level source
1 #include <reg52.h> //头文件
2 #include <stdio.h>
3 #include <ctype.h>
4 #include <math.h>
5 #include <string.h>
6 #include <rtx51tny.h>
7
8 code char MenuOption[] = //系统命令菜单
9 "\n"
10 "+*** C51 道路交通灯多任务控制系统 ***+\n"
11 "+ -----命令 -------+ ------格式 ----+ ----------------功能 --------------------+\n"
12 "| Display | D | 显示时间 |\n"
13 "| Time | T hh:mm:ss | 设置时钟时间 |\n"
14 "| start_time | S hh:mm:ss | 设置起始时间 |\n"
15 "| end_time | E hh:mm:ss | 设置结束时间 |\n"
16 "+--------------------+-------------------+--------------------------------------------+\n";
17
18 idata char inline[16]; //存储输入命令行
19
20 #define uchar unsigned char //宏定义
21
22 extern getline (char idata *, char); //外部函数声明:,用于行输入
23 extern init_serial (); //外部函数:声明,用于初始化串行口
24 bit readtime (char idata *buffer) ; //读取时间函数
25 bit timeon (); //检查系统时钟是否处在开始时间和结束时间之间
26
27 #define INIT_TASK 0 //任务0: 初始化系统
28 #define COMMAND_TASK 1 //任务1: 命令处理
29 #define CLK_TASK 2 //任务2: 时钟控制
30 #define BLINKING_TASK 3 //任务3: 黄色灯闪烁
31 #define LIGHTS_TASK 4 //任务4: 交通灯工作
32 #define buttonREAD_Task 5 //任务5: 读取行人按钮
33 #define ESCEXIT_TASK 6 //任务6: 退出
34
35 #define ESC 0x1B //定义ESC 键代码
36
37 struct time //定义时间结构
38 {
39 uchar hour; //小时
40 uchar min; //分
41 uchar sec; //秒
42 };
43
44 struct time now_time = { 0, 0, 0 }; //存储时钟的时间值
45 struct time start_time = { 6, 30, 0 }; //开始时间
46 struct time end_time = { 20, 30, 0 }; //结束时间
47
48 struct time in_time; //输入时间暂存
49
50 bit ESCExit; //ESC 键输入标志
51 bit rt; //读取时间标志
52 bit display_time = 0; //信号命令状态显示时间标志
53
54 sbit green = P2^1; //绿灯
55 sbit yellow = P2^2; //黄灯
C51 COMPILER V8.08 TRAFFIC 09/04/2008 10:42:40 PAGE 2
56 sbit red = P2^3; //红灯
57 sbit stop = P1^0; //行人停止灯
58 sbit walk = P1^1; //行人通过灯
59 sbit button = P1^2; //行人按钮
60
61
62 init () _task_ INIT_TASK //任务0,程序起始处
63 {
64 1 init_serial (); //初始化单片机串行口
65 1 os_create_task (CLK_TASK); //启动任务2
66 1 os_create_task (COMMAND_TASK); //启动任务1
67 1 os_create_task (LIGHTS_TASK); //启动任务4
68 1 os_create_task (buttonREAD_Task); //启动任务5
69 1 os_delete_task (INIT_TASK); //停止任务0
70 1 }
71
72 void command () _task_ COMMAND_TASK //任务1
73 {
74 1 uchar i;
75 1
76 1 printf (MenuOption); //系统命令菜单
77 1 while (1)
78 1 {
79 2 printf ("\nCommand: "); //显示命令提示符
80 2 getline (&inline, sizeof (inline)); //获得命令行输入
81 2
82 2 for (i = 0; inline[i] != 0; i++) //将命令字符串转换为大写
83 2 {
84 3 inline[i] = toupper(inline[i]);
85 3 }
86 2
87 2 for (i = 0; inline[i] == ' '; i++); //跳过字符串中的空格符
88 2
89 2 switch (inline[i]) //命令处理
90 2 {
91 3 case 'D': //显示时间命令
92 3 printf ("start_time=: %02bd:%02bd:%02bd "
93 3 "end_time=: %02bd:%02bd:%02bd\n",
94 3 start_time.hour, start_time.min, start_time.sec,
95 3 end_time.hour, end_time.min, end_time.sec);
96 3 printf ("输入ESC键退出!\r");
97 3
98 3 os_create_task (ESCEXIT_TASK); //在显示任务中检查ESC 键
99 3 display_time = 1; //显示时间标志置1
100 3 ESCExit = 0; //清除 ESC 标志
101 3 os_clear_signal (COMMAND_TASK);
102 3
103 3 while (!ESCExit) //如果没有输入ESC
104 3 {
105 4 printf ("Time: %02bd:%02bd:%02bd\r",
106 4 now_time.hour, now_time.min, now_time.sec);
107 4 os_wait (K_SIG, 0, 0); //等待
108 4 }
109 3
110 3 os_delete_task (ESCEXIT_TASK); //删除任务
111 3 display_time = 0; //显示时间标志置0
112 3 printf ("\n\n"); //输出换行符
113 3 break;
114 3
115 3 case 'T': //设置时间命令
116 3 rt= readtime (&inline[i+1]); //获取输入时间
117 3 if (rt)
C51 COMPILER V8.08 TRAFFIC 09/04/2008 10:42:40 PAGE 3
118 3 {
119 4 now_time.hour = in_time.hour;
120 4 now_time.min = in_time.min;
121 4 now_time.sec = in_time.sec;
122 4 }
123 3 break;
124 3
125 3 case 'S': //设置开始时间命令
126 3 rt= readtime (&inline[i+1]); //获取输入时间
127 3 if (rt)
128 3 {
129 4 start_time.hour = in_time.hour;
130 4 start_time.min = in_time.min;
131 4 start_time.sec = in_time.sec;
132 4 }
133 3 break;
134 3
135 3 case 'E': //设置结束时间命令
136 3 rt= readtime (&inline[i+1]); //获取输入时间
137 3 if (rt)
138 3 {
139 4 end_time.hour = in_time.hour;
140 4 end_time.min = in_time.min;
141 4 end_time.sec = in_time.sec;
142 4 }
143 3 break;
144 3
145 3 default: //无效指令
146 3 printf("Error!\n");
147 3 printf (MenuOption); //显示系统命令菜单
148 3 break;
149 3 }
150 2 }
151 1 }
152
153 bit readtime (char idata *buffer) //读取时间函数
154 {
155 1 uchar args;
156 1
157 1 in_time.sec = 0; //初始化
158 1 args = sscanf (buffer, "%bd:%bd:%bd", //扫描输入,并保存至变量
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -