📄 appli.lst
字号:
237 3 }
238 2 }
239 1 }
240
241 /* 清除指定定时器 */
C51 COMPILER V7.09 APPLI 10/09/2005 20:45:34 PAGE 5
242 void clear_timer(u_char id)
243 {
244 1 u_char loop;
245 1
246 1 for (loop=0; loop<MAX_TNUM; loop++)
247 1 {
248 2 if ( (timer_sign[loop] == 1) && (timer_id[loop] == id) )
249 2 {
250 3 timer_sign[loop] = 0;
251 3 timer_count[loop] = 0; /*定时计数*/
252 3 }
253 2 }
254 1 count_timer_map();
255 1 }
256
257 /* 命令解码子程序 */
258 void command_decoder(void)
259 {
260 1 u_char i = 0;
261 1
262 1 if (prec_buf[4] == 0x31) /* 设置报警阈值 */
263 1 {
264 2 alarm_limit.temp_uthreshold = prec_buf[5]; /* 超低温度 */
265 2 alarm_limit.temp_othreshold = prec_buf[6]; /* 超高温度 */
266 2 alarm_limit.lumin_uthreshold = prec_buf[7]; /* 超低光强 */
267 2 alarm_limit.lumin_othreshold = prec_buf[8]; /* 超高光强 */
268 2 return;
269 2 }
270 1 else if (prec_buf[4] == 0x32) /* 请求报警阈值 */
271 1 {
272 2 msg_last_push(MSG_GET_LIMIT,0);
273 2 return;
274 2 }
275 1 else if (prec_buf[4] == 0x33) /* 修改当前时间 */
276 1 {
277 2 for (i=0; i<7; i++)
278 2 {
279 3 date[i] = prec_buf[i+5];
280 3 }
281 2 sd2300_write_date(); /* 写入时间数据 */
282 2 return;
283 2 }
284 1 else if (prec_buf[4] == 0x34) /* 请求当前时间 */
285 1 {
286 2 sd2300_read_date();
287 2 msg_last_push(MSG_READ_DATE,0);
288 2 return;
289 2 }
290 1 else if (prec_buf[4] == 0x35) /* 请求当前数据 */
291 1 {
292 2 msg_last_push(MSG_CUR_DATA,0);
293 2 return;
294 2 }
295 1 else if (prec_buf[4] == 0x36) /* 请求看门狗信息*/
296 1 {
297 2 msg_last_push(MSG_WATCHDOG,0);
298 2 return;
299 2 }
300 1 else if (prec_buf[4] == 0x37) /* 请求报警情况 */
301 1 {
302 2 msg_last_push(MSG_ALARM_STATE,0);
303 2 return;
C51 COMPILER V7.09 APPLI 10/09/2005 20:45:34 PAGE 6
304 2 }
305 1 else if (prec_buf[4] == 0x38) /* 配置设备地址 */
306 1 {
307 2 ADDRESS[0] = prec_buf[5]; /* 通讯组地址 */
308 2 ADDRESS[1] = prec_buf[6]; /* 开发板地址 */
309 2
310 2 write_iic_data(ADDRESS, 0, 2);/* 将地址信息写入EEPROM */
311 2 return;
312 2 }
313 1 else if (prec_buf[4] == 0x39) /* 请求设备地址 */
314 1 {
315 2 msg_last_push(MSG_GET_ADDRESS,0);
316 2 return;
317 2 }
318 1 else if (prec_buf[4] == 0x3a) /* 控制模拟量输出 */
319 1 {
320 2 analog_out_data |= prec_buf[6];
321 2 analog_out_data <<= 8;
322 2 analog_out_data |= prec_buf[5];
323 2 dac_5615(analog_out_data); /* 输出模拟量 */
324 2 return;
325 2 }
326 1 else if (prec_buf[4] == 0x3b) /* 控制开关量输出 */
327 1 {
328 2 if (prec_buf[5] == 0)
329 2 CTRL_RELAY = 0; /* 继电器关 */
330 2 else
331 2 CTRL_RELAY = 1; /* 继电器开 */
332 2
333 2 return;
334 2 }
335 1 }
336
337 /* 该子程序可根据需要修改 搜索系统消息 */
338 void message_loop(void)
339 {
340 1 u_char i = 0;
341 1 u_char j = 0;
342 1 u_char k = 0;
343 1
344 1 /* 搜索定时消息 */
345 1 if (timer_int == 1)
346 1 {
347 2 timer_int = 0;
348 2 if (timer_number > 0)
349 2 {
350 3 for (i=0; i<timer_number; i++)
351 3 {
352 4 j = timer_map[i];
353 4 timer_count[j]++;
354 4 if (timer_count[j] >= timer_len[j])
355 4 {
356 5 msg_first_push(MSG_TIMER, timer_id[j]);
357 5 timer_sign[j] = 0;
358 5 timer_count[j] = 0; /* 定时计数 */
359 5 k = 1;
360 5 }
361 4 }
362 3 if (k != 0)
363 3 {
364 4 count_timer_map();
365 4 }
C51 COMPILER V7.09 APPLI 10/09/2005 20:45:34 PAGE 7
366 3 }
367 2 }
368 1 /* 键盘扫描 */
369 1 key_setmenu_lcd();
370 1 if (key_code != 0xFF) /* 如果有按键则停止采样定时 */
371 1 {
372 2 clear_timer(T_SAMPLE);
373 2 tsample_flag = 0;
374 2 }
375 1 else if (!tsample_flag)/* 无按键并且采样定时器处于停止状态,则启动采样定时器 */
376 1 {
377 2 set_timer(QUERY_TIMER_LEN,0,T_SAMPLE);
378 2 tsample_flag = 1;
379 2 }
380 1
381 1 com_command_receive(); /* 接收命令 */
382 1 }
383
384 /*计算CRC校验和使用MTT(0X1021)
385 参数:
386 pBuff 为需计算CRC的缓冲区的头指针
387 BufferLen 缓冲区长度(以字节计)
388 */
389 u_short CalCRC16_1021(u_char x[], u_short BufferLen)
390 {
391 1 u_short i;
392 1 u_char j;
393 1 u_short crc16 = 0;
394 1 u_short mask = 0x1021;
395 1 u_char *pByteBuffer;
396 1 u_char tmpbyte;
397 1 u_short calval;
398 1
399 1 pByteBuffer = &x[0];
400 1
401 1 for (i = 0; i < BufferLen; i++)
402 1 {
403 2 tmpbyte = *pByteBuffer;
404 2 calval = tmpbyte << 8;
405 2 for (j = 0; j < 8; j++)
406 2 {
407 3 if ((crc16 ^ calval) & 0x8000)
408 3 crc16 = (crc16 << 1) ^ mask;
409 3 else
410 3 crc16 <<= 1;
411 3
412 3 calval <<= 1;
413 3 }
414 2 pByteBuffer++;
415 2 }
416 1 return crc16;
417 1 }
418
419 /* 串行接收处理 */
420 void com_command_receive(void)
421 {
422 1 u_char var1,var4;
423 1 u_int crc_data = 0;
424 1 var4 = pint_read;
425 1
426 1 if (var4 != pint_write)
427 1 {
C51 COMPILER V7.09 APPLI 10/09/2005 20:45:34 PAGE 8
428 2 var1 = pint_buf[var4];
429 2 var4 = var4+1;
430 2 if (var4 >= MAX_RINTL)
431 2 var4=0;
432 2
433 2 pint_read = var4;
434 2
435 2 switch(serial_flag)
436 2 {
437 3 case 0: /*收到起始位*/
438 3 if (var1 == SYN)
439 3 {
440 4 serial_flag = 1;
441 4 }
442 3 else
443 3 {
444 4 serial_flag = 0;
445 4 }
446 3 break;
447 3
448 3 case 1:/*收到起始位*/
449 3 if (var1 == SYN)
450 3 {
451 4 serial_flag = 2;
452 4 }
453 3 else
454 3 {
455 4 serial_flag = 0;
456 4 }
457 3 break;
458 3
459 3 case 2:/*收到同步位*/
460 3 if (var1 == STX)
461 3 {
462 4 serial_flag = 3;
463 4 }
464 3 else
465 3 {
466 4 serial_flag = 0;
467 4 }
468 3 break;
469 3
470 3 case 3: /*收到组地址*/
471 3 if (var1 == ADDRESS[0])
472 3 {
473 4 serial_flag = 4;
474 4 prec_num = 1;
475 4 prec_buf[0] = var1;
476 4 }
477 3 else
478 3 {
479 4 serial_flag = 0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -