📄 main.lst
字号:
C51 COMPILER V7.00 MAIN 08/21/2006 21:45:37 PAGE 1
C51 COMPILER V7.00, COMPILATION OF MODULE MAIN
OBJECT MODULE PLACED IN main.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE main.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1 /*可在Keil C51 6.0 以上版本中编译晶振采用11.0592Mc 工作在每个机器周期6 时钟的快速状态*/
2
3
4 #include <REG768.H> /*Philips 87LPC768 寄存器定义头文件*/
5
6
7 #include "version.h"
8 #include "misc.h"
9 #include "ir.h"
10 #include "func.h"
11
12 unsigned char data Timer;
13 unsigned int tick=0;
14
15 unsigned char control_status;
16 enum {
17 CTRL_IDLE=0,
18
19 CTRL_A0,
20 CTRL_A1,
21 CTRL_A2,
22 CTRL_A3,
23 CTRL_A4,
24
25 CTRL_B0,
26 CTRL_B1,
27 CTRL_B2,
28 CTRL_B3,
29 CTRL_B4,
30 CTRL_B5
31 };
32
33 void Count0(void) interrupt 1 using 3
34 { /*定时器T00 中断,最大定时37ms*/
35 1 if(Timer!=0)
36 1 { /*检测定时器T00 的扩展高位*/
37 2 Timer--;
38 2 return;
39 2 }
40 1 tick++;
41 1 Timer=(int)18.432;
42 1 }
43
44 unsigned int get_tick()
45 {
46 1 return tick;
47 1 }
48
49 unsigned int timer_diff(unsigned int t1, unsigned int t2)
50 {
51 1 unsigned long diff;
52 1 if(t1>=t2) diff=t1-t2;
53 1 else diff=t1+65536-t2;
54 1
55 1 return (unsigned int)diff;
C51 COMPILER V7.00 MAIN 08/21/2006 21:45:37 PAGE 2
56 1 }
57
58 unsigned char control()
59 {
60 1 static unsigned int tick0;
61 1 switch(control_status)
62 1 {
63 2 case CTRL_IDLE:
64 2 //处于空闲状态,如果有人靠近, 进入控制阶段
65 2 if(SOMEBODY_COMMING==ir_read())
66 2 {
67 3 control_status = CTRL_A0;
68 3 }
69 2 break;
70 2 case CTRL_A0:
71 2 //启动15w电机,启动18v电压
72 2 start_15w_motor();
73 2 start_18v_vol();
74 2 tick0=get_tick();
75 2 control_status = CTRL_A1;
76 2 break;
77 2 case CTRL_A1:
78 2 //1秒后,启动36v电压
79 2 if(timer_diff(get_tick(), tick0)>100)
80 2 {
81 3 start_36v_vol();
82 3 tick0=get_tick();
83 3 control_status = CTRL_A2;
84 3 }
85 2 break;
86 2 case CTRL_A2:
87 2 //再过1秒后,关闭15w电机
88 2 if(timer_diff(get_tick(), tick0)>100)
89 2 {
90 3 stop_15w_motor();
91 3 tick0=get_tick();
92 3 control_status = CTRL_A3;
93 3 }
94 2 break;
95 2 case CTRL_A3:
96 2 /*开始使用,在此过程中,如果人离开,则关闭36v和18v电压
97 2 否则再过59秒,关闭36v电机 */
98 2 if(SOMEBODY_LEAVING==ir_read())
99 2 {
100 3 stop_36v_vol();
101 3 stop_18v_vol();
102 3 control_status = CTRL_B0;
103 3 }
104 2 else if(timer_diff(get_tick(), tick0)>5900)
105 2 {
106 3 stop_36v_vol();
107 3 control_status = CTRL_A4;
108 3 }
109 2 break;
110 2 case CTRL_A4:
111 2 /*继续使用,在此过程中,如果人离开,则关闭18v电压 */
112 2 if(SOMEBODY_LEAVING==ir_read())
113 2 {
114 3 stop_18v_vol();
115 3 control_status = CTRL_B0;
116 3 }
117 2 break;
C51 COMPILER V7.00 MAIN 08/21/2006 21:45:37 PAGE 3
118 2 case CTRL_B0:
119 2 /*人离开,启动电磁力, 启动15w电机, 启动7。5 A电机
120 2 */
121 2 start_em_power();
122 2 start_15v_vol();
123 2 start_75A_motor();
124 2 tick0=get_tick();
125 2 control_status = CTRL_B1;
126 2 break;
127 2 case CTRL_B1:
128 2 //1秒后,关闭电磁力
129 2 if(timer_diff(get_tick(), tick0)>100)
130 2 {
131 3 stop_em_power();
132 3 tick0 = get_tick();
133 3 control_status = CTRL_B2;
134 3 }
135 2 break;
136 2 case CTRL_B2:
137 2 //再过1秒后,关闭15w电机
138 2 if(timer_diff(get_tick(), tick0)>100)
139 2 {
140 3 stop_15v_vol();
141 3 tick0 = get_tick();
142 3 control_status = CTRL_B3;
143 3 }
144 2 break;
145 2 case CTRL_B3:
146 2 //启动10w负荷,
147 2 if(SOMEBODY_COMMING==ir_read())
148 2 {
149 3 stop_75A_motor();
150 3 control_status = CTRL_A0;
151 3 }
152 2 else
153 2 {
154 3 start_10w_load();
155 3 control_status = CTRL_B4;
156 3 tick0 = get_tick();
157 3 }
158 2 break;
159 2 case CTRL_B4:
160 2 // 关闭7。5A电机
161 2 if(SOMEBODY_COMMING==ir_read())
162 2 {
163 3 stop_10w_load();
164 3 stop_75A_motor();
165 3 control_status = CTRL_A0;
166 3 }
167 2 else if(timer_diff(get_tick(), tick0)>2800)
168 2 {
169 3 stop_75A_motor();
170 3 control_status = CTRL_B5;
171 3 }
172 2 break;
173 2 case CTRL_B5:
174 2 //关闭10w负荷。
175 2 if(SOMEBODY_COMMING==ir_read())
176 2 {
177 3 stop_10w_load();
178 3 control_status = CTRL_A0;
179 3 }
C51 COMPILER V7.00 MAIN 08/21/2006 21:45:37 PAGE 4
180 2 else if(timer_diff(get_tick(), tick0)>57000)
181 2 {
182 3 stop_10w_load();
183 3 control_status = CTRL_IDLE;
184 3 }
185 2 break;
186 2 }
187 1 return control_status;
188 1 }
189 void main()
190 {
191 1 IEN0=0x14; /*只打开INT1 中断*/
192 1
193 1 WDRST=0x1E; /*看门狗清0*/
194 1 WDRST=0xE1;
195 1 WDCON=0x12; /*40-90ms 看门狗(>最大延时37ms)*/
196 1
197 1 TCON=0x40; /*定时器1 开始工作, INT1 低电平触发*/
198 1 TMOD=0x23; /*定时器0 扩展成两个8 位定时器T00 和T01 用于同步控制*/
199 1
200 1 if((WDCON&0x30)!=0x30)
201 1 {
202 2 ir_init();
203 2 init_port();
204 2 init_serial();
205 2 control_status=0;
206 2 }
207 1
208 1 while(1)
209 1 { /*消息循环*/
210 2 WDRST=0x1E; /*看门狗清0*/
211 2 WDRST=0xE1;
212 2
213 2 control();
214 2 }
215 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 560 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 6 6
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 + -