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