📄 main.lst
字号:
255 2 }setup_t4(40, timeout_t4);delay_tx = 1;
256 1 }
257 /*=============================================================================*/
258 /* 数据发送到PC */
259 /*=============================================================================*/
260
261 void amr_send_frame(uchar ibuf[])
262 {
263 1 // idata uchar o_frame[26];
264 1 uchar i;
265 1 uchar En;
266 1
267 1 En = ibuf[AMR_OS_L] + 11; //串口返回
268 1
269 1 clr_wdt();
270 1 // preamble
271 1 for (i = 0; i < 5; i++) amr_frame[i] = mcu_pc[i]; //放入0xFE 68
272 1 clr_wdt();
273 1 for (i = 0; i < ibuf[AMR_OS_L]+6; i++)amr_frame[5+i] = ibuf[i]; //从C开始存放
274 1
275 1 amr_frame[En] = 0x16; //多补16h
276 1 uart_sendblock(amr_frame, En+1); //串口送至PC
277 1 clr_wdt();
278 1 }
279 /*=============================================================================* /
280 信息返回
281 /*=============================================================================*/
282
283 void return_inf(uchar frame,uchar inf_buf[],uchar dat)
284 {
285 1 uchar con;
286 1 uchar buf[18];
287 1 clr_wdt();
288 1 buf[0] = frame;
289 1 buf[1] = ADDR[0];
290 1 buf[2] = ADDR[1];
291 1 buf[3] = ADDR[2];
292 1 buf[4] = ADDR[3];
293 1 buf[AMR_OS_L] = dat;
294 1 for(con = 0;con < buf[AMR_OS_L];con ++)
295 1 buf[6+con] = inf_buf[con]; //放入状态信息
296 1
297 1 amr_send_frame(buf);//串口返回PC
298 1
299 1 }
C51 COMPILER V7.09 MAIN 01/12/2007 09:29:48 PAGE 6
300 /*=============================================================================* /
301 串口发到2200C
302 /*=============================================================================*/
303
304 void uart_tx_mode(uchar i_buf[])
305 {
306 1 uchar i,tom;
307 1 uchar no_all = 0;
308 1 uchar o_buf[18];
309 1 tom = i_buf[AMR_OS_L] + 6;
310 1 for (i = 0; i < tom; i++) //C, A,A,A,A,L, DATA
311 1 o_buf[i] = i_buf[i];//放入DATA数据
312 1
313 1 if(tom < 18){ //不够18个数据后补0
314 2 no_all = 18 - tom;
315 2 for (i = 0; i < no_all; i++)
316 2 o_buf[tom+i] = 0x00;
317 2 }
318 1
319 1 if(i_buf[AMR_OS_L] > 18)i_buf[AMR_OS_L] = 18;//超过18个数只认18个数
320 1
321 1
322 1 write_txbuffer(o_buf); //写入2200c
323 1 sync_sendchar(0x7e);
324 1 }
325 /*=============================================================================* /
326 接收数据重组
327 /*=============================================================================*/
328
329 void rx_return(bit y,uchar R_data[])
330 {
331 1 uchar i;
332 1 uchar o_buf[26];
333 1
334 1 for (i = 0; i < 18; i++)
335 1 o_buf[i] = R_data[i];
336 1 if(y)
337 1 o_buf[0] = 0x40 + 0x04; //本地上传收到的CRC正确数据 B7B6 =bit-01,B5~B0 = 0x04h
338 1 else
339 1 o_buf[0] = 0x40 + 0x05; //本地上传收到的CRC错误数据 B7B6 =bit-01,B5~B0 = 0x05h
340 1
341 1 amr_send_frame(o_buf);
342 1 }
343
344 /*=============================================================================*/
345 void adss_crc(uchar buf[])
346 {
347 1 //0x99 为公共广播地址
348 1 if((buf[1] == ADDR[0])&&(buf[2] == ADDR[1])&&(buf[3] == ADDR[2])&&(buf[4] == ADDR[3]))
349 1 adss_ok = 1; //本地址
350 1 else adss_ok = 0;
351 1
352 1 if( (buf[1] == 0x99)&&(buf[2] == 0x99)&&(buf[3] == 0x99)&&(buf[4] == 0x99))
353 1 public_addr = 1; //公用地址
354 1 else public_addr = 0;
355 1
356 1 }
357 /*=============================================================================*/
358 /*=============================================================================*/
359
360 void write_addr (bit y,uchar frame[])
361 {
C51 COMPILER V7.09 MAIN 01/12/2007 09:29:48 PAGE 7
362 1 //frame[] = C(B7B6 01,B5~B0 0x3f), x,x,x,x,L(1), (x+x+x+x)地址校验和,
363 1
364 1 uchar add_buf[4];
365 1 uchar ame;
366 1
367 1 if(frame[AMR_OS_L] == 0x01)
368 1 if((frame[1] + frame[2] + frame[3] + frame[4]) == frame[6]){
369 2 for(ame = 0;ame < 4; ame ++)
370 2 add_buf[ame] = frame[1+ame];
371 2 Rxok = 0; //完成任务亮!
372 2 while(~switd){
373 3 if(~switd){ //开关触动才可写入FLASH
374 4 EA = 0;
375 4 FLASH_WriteNByte((int code *)ADDR, add_buf, 6);
376 4 EA = 1;
377 4
378 4 } }
379 2 add_buf[0] = frame[6];
380 2 if(y)
381 2 Remote_Replies(frame);//回复
382 2 else return_inf(0x3f,add_buf,1);
383 2 }
384 1 }
385
386
387 /*=============================================================================* /
388 数据接收处理
389 /*=============================================================================*/
390 void processing_unit(uchar frame[])
391 {
392 1 uchar top;
393 1
394 1 uchar pro_buf[7];
395 1 if(((frame[AMR_OS_C] & 0xc0)>>6)== 0x02) //B7B6 控制字
396 1 switch(frame[AMR_OS_C] & 0x3f){//B5~B0 命令字
397 2
398 2 case 0x01:{reply = 1;}break;
399 2
400 2 case 0x02:{reply = 0;}break;
401 2
402 2 case 0x3f:{ // 远程改地址命令
403 3 if(public_addr){ //公共地址正确
404 4 if(frame[11] == 0x16){//结束语
405 5 for(top = 1;top < 5; top ++) //地址数据导入
406 5 pro_buf[top] = frame[5+top];
407 5 pro_buf[0] = frame[0];
408 5 pro_buf[AMR_OS_L] = 0x01;//
409 5 pro_buf[6] = frame[10]; //地址校验和
410 5 write_addr (1,pro_buf);
411 5 }//pro_buf[] = C, x,x,x,x,L(1), (x+x+x+x)地址校验和,0x16
412 4 }}break;
413 2 }
414 1 }
415
416 /*=============================================================================*/
417 /*=============================================================================* /
418
419
420
421 /*=============================================================================*/
422 /*=============================================================================* /
423
C51 COMPILER V7.09 MAIN 01/12/2007 09:29:48 PAGE 8
424 /*=============================================================================*/
425 /*$$$$$$$$$$$$$$$$$$$$$$$$$$$$$<<<<<软件说明>>>>>$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$*/
426 /*=============================================================================* /
427 家电智能控制统一程序(根据UPLM2200 API协议设定)
428 软件说明:
429
430 1.更新的版本,支持电力线和PC通讯协议,
431 2.可读写FLASH作为地址掉电保存,写时通过串口发地址数据,掉电后地址在片内保存.
432 3.当写FLASH时,RXOK会闪动,之后返回一帧数据.表示已写入FLASH,
433 4.该程序设有看门狗,添加新组件时注意时间差.
434 5.如无接表时,可返回一帧仿真数据< *\ /* >
435 6.该串口的波特率为9600,偶校验, -
436 7.可通过PC或电力线上改变速率寄存器的值,并写入 FLASH ~
437
438 更新项目表:
439 ------------------------------------------------------------------------------------------
440 |更新人 | 模块组件 | 更新时间 | 更新内容
441 --------------------------------------------------------------------------------------
442 | liangfq | 全部 | 2006-02-17 | 程序设计第一版
443 | | | |
444 --------------------------------------------------------------------------------------
445 | liangfq | | |
446 | | | |
447 --------------------------------------------------------------------------------------
448 | liangfq | | |
449 | | | |
450 --------------------------------------------------------------------------------------
451 | liangfq | | |
452 | | | |
453 --------------------------------------------------------------------------------------
454 | liangfq | | |
455 | | | |
456 --------------------------------------------------------------------------------------
457 | liangfq | | |
458 | | | |
459 --------------------------------------------------------------------------------------
460 | liangfq | | |
461 | | | |
462 --------------------------------------------------------------------------------------
463 | liangfq | | |
464 | | | |
465 --------------------------------------------------------------------------------------
466 | liangfq | | |
467 | | | |
468 --------------------------------------------------------------------------------------
469
470 !!!!!!重复特别注意:写模块的地址必须从串口写入才有效!!!!!
471
472 !!!!!!重复特别注意:写模块的地址必须从串口写入才有效!!!!!
473 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
474 !!!!!!重复特别注意:写模块的地址必须从串口写入才有效!!!!!
475 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
476 !!!!!!重复特别注意:写模块的地址必须从串口写入才有效!!!!!
477 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
478 !!!!!!重复特别注意:写模块的地址必须从串口写入才有效!!!!!
479 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
480
481 /*$$$$$$$$$$$$$$$$$$$$$$$$$$$$<<<<<软件说明>>>>>$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$*/
482
483
484
485
C51 COMPILER V7.09 MAIN 01/12/2007 09:29:48 PAGE 9
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 1358 ----
CONSTANT SIZE = 28 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 19 100
IDATA SIZE = ---- ----
BIT SIZE = 8 2
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -