📄 main_sub.src
字号:
MOV R3,us?543
MOV R6,#00H
MOV A,us?543+02H
ADD A,i?544
MOV R1,A
MOV A,R6
ADDC A,us?543+01H
MOV R2,A
MOV A,R1
ADD A,#03H
MOV R1,A
CLR A
ADDC A,R2
MOV R2,A
MOV A,R1
ADD A,k?545
MOV R1,A
MOV A,R6
ADDC A,R2
MOV R2,A
LCALL ?C?CLDPTR
MOV R7,A
MOV A,#LOW (data_tmp?546)
ADD A,k?545
MOV R0,A
MOV @R0,AR7
; crc_result =OWCrc(data_tmp[k]);
; SOURCE LINE # 216
MOV A,#LOW (data_tmp?546)
ADD A,k?545
MOV R0,A
MOV A,@R0
MOV R7,A
LCALL _OWCrc
MOV crc_result?547,R7
; }
; SOURCE LINE # 217
INC k?545
MOV A,k?545
CLR C
SUBB A,#08H
JC ?C0023
?C0024:
; if(crc_result) //CRC校验正确,往下判断是否呼叫本仓库
; SOURCE LINE # 218
MOV A,crc_result?547
JZ ?_receive_cmd?next
; goto error;
; SOURCE LINE # 219
SJMP ?_receive_cmd?error
; else
; goto next;
; SOURCE LINE # 221
; }
; SOURCE LINE # 222
?C0022:
; i++;
; SOURCE LINE # 223
INC i?544
; }
; SOURCE LINE # 224
MOV A,i?544
CLR C
SUBB A,#010H
JC ?C0020
;
; next: if( (data_tmp[0]==identity)&(data_tmp[1]==columne) ) //判断是否为对本2051系统
; SOURCE LINE # 226
?_receive_cmd?next:
MOV A,data_tmp?546+01H
CJNE A,#01H,?C0031
MOV R7,#01H
SJMP ?C0032
?C0031:
MOV R7,#00H
?C0032:
MOV A,data_tmp?546
CJNE A,#01H,?C0033
MOV R6,#01H
SJMP ?C0034
?C0033:
MOV R6,#00H
?C0034:
MOV A,R6
ANL A,R7
JZ ?_receive_cmd?error
; {
; SOURCE LINE # 227
; for(k=0;k<4;k++)
; SOURCE LINE # 228
CLR A
MOV k?545,A
?C0035:
; pc_cmd_data[k] =data_tmp[k+3]; // 提取命令帧中的数据字节
; SOURCE LINE # 229
MOV A,#LOW (data_tmp?546+03H)
ADD A,k?545
MOV R0,A
MOV A,@R0
MOV R7,A
MOV A,#LOW (pc_cmd_data)
ADD A,k?545
MOV R0,A
MOV @R0,AR7
INC k?545
MOV A,k?545
CJNE A,#04H,?C0035
?C0036:
; send_ack(); //发送确认信号帧
; SOURCE LINE # 230
LCALL send_ack
; return (data_tmp[2]); //返回控制指令
; SOURCE LINE # 231
MOV R7,data_tmp?546+02H
RET
; }
; SOURCE LINE # 232
; else
; error:return (0x00);
; SOURCE LINE # 234
?_receive_cmd?error:
MOV R7,#00H
; }
; SOURCE LINE # 235
?C0038:
RET
; END OF _receive_cmd
;
; ////////////////////////////////////////////
; //名称:温度数据传输程序
; //功能:将温度数据打包传送给PC,加入CRC校验和前向纠错
; //////////////////////////////////////////
; //unsigned char code index_rom[2] ={0x01,0x01}; //仓库号,列号
;
; void send_tmp_pc(void)
RSEG ?PR?send_tmp_pc?MAIN_SUB
send_tmp_pc:
USING 0
; SOURCE LINE # 243
; {
; SOURCE LINE # 244
; unsigned char data i,k;
; unsigned char data crc_result;
; unsigned char data id_count=0;
; SOURCE LINE # 247
CLR A
MOV id_count?651,A
; unsigned char sla_adr;
; unsigned char init_adr;
; unsigned char data tmp_data[8];
;
; i =0;
; SOURCE LINE # 252
MOV i?648,A
; sla_adr =0xA4; //24C08硬件地址
; SOURCE LINE # 253
MOV sla_adr?652,#0A4H
; init_adr =0x00; //温度数据在EEPROM存放首地址
; SOURCE LINE # 254
MOV init_adr?653,A
;
; ES =0; //串行口采用查询方式发送数据
; SOURCE LINE # 256
CLR ES
;
; for(k=0;k<2;k++) //计算仓库号,列号 CRC码
; SOURCE LINE # 258
MOV k?649,A
?C0040:
; OWCrc(index_rom[k]);
; SOURCE LINE # 259
MOV A,k?649
MOV DPTR,#index_rom
MOVC A,@A+DPTR
MOV R7,A
LCALL _OWCrc
INC k?649
MOV A,k?649
CLR C
SUBB A,#02H
JC ?C0040
?C0045:
; do
; {
; SOURCE LINE # 261
; if(i==0)
; SOURCE LINE # 262
MOV A,i?648
JNZ ?C0046
; {
; SOURCE LINE # 263
; rdadr(&tmp_data[0],sla_adr,init_adr,8); //从EEPROM读出8个字节
; SOURCE LINE # 264
MOV R3,A
MOV R2,#HIGH (tmp_data?654)
MOV R1,#LOW (tmp_data?654)
MOV ?_rdadr?BYTE+04H,init_adr?653
MOV ?_rdadr?BYTE+05H,#08H
MOV R5,sla_adr?652
LCALL _rdadr
; send_syn_pc();
; SOURCE LINE # 265
LCALL send_syn_pc
; send_byte_pc(68); //发送标识符D<ASCII>
; SOURCE LINE # 266
MOV R7,#044H
LCALL _send_byte_pc
; send_pbyt_pc(&index_rom[0]); //发送仓库号,列号
; SOURCE LINE # 267
MOV R6,#HIGH (index_rom)
MOV R7,#LOW (index_rom)
LCALL _send_pbyt_pc
; send_nbyt_pc(&tmp_data[0]); //发送8个字节->>PC
; SOURCE LINE # 268
MOV R3,#00H
MOV R2,#HIGH (tmp_data?654)
MOV R1,#LOW (tmp_data?654)
LCALL _send_nbyt_pc
; for(k=0;k<8;k++) //测试计算CRC码时间
; SOURCE LINE # 269
CLR A
MOV k?649,A
?C0047:
; OWCrc(tmp_data[k]);
; SOURCE LINE # 270
MOV A,#LOW (tmp_data?654)
ADD A,k?649
MOV R0,A
MOV A,@R0
MOV R7,A
LCALL _OWCrc
INC k?649
MOV A,k?649
CLR C
SUBB A,#08H
JC ?C0047
SJMP ?C0050
; }
; SOURCE LINE # 271
?C0046:
; else
; {
; SOURCE LINE # 273
; rdnbyt(&tmp_data[0],sla_adr,8);
; SOURCE LINE # 274
MOV R3,#00H
MOV R2,#HIGH (tmp_data?654)
MOV R1,#LOW (tmp_data?654)
MOV ?_rdnbyt?BYTE+04H,#08H
MOV R5,sla_adr?652
LCALL _rdnbyt
; send_nbyt_pc(&tmp_data[0]);
; SOURCE LINE # 275
MOV R3,#00H
MOV R2,#HIGH (tmp_data?654)
MOV R1,#LOW (tmp_data?654)
LCALL _send_nbyt_pc
; for(k=0;k<8;k++)
; SOURCE LINE # 276
CLR A
MOV k?649,A
?C0051:
; crc_result =OWCrc(tmp_data[k]);
; SOURCE LINE # 277
MOV A,#LOW (tmp_data?654)
ADD A,k?649
MOV R0,A
MOV A,@R0
MOV R7,A
LCALL _OWCrc
MOV crc_result?650,R7
INC k?649
MOV A,k?649
CLR C
SUBB A,#08H
JC ?C0051
; }
; SOURCE LINE # 278
?C0050:
; i++;
; SOURCE LINE # 279
INC i?648
; }while( i<16);
; SOURCE LINE # 280
MOV A,i?648
CLR C
SUBB A,#010H
JC ?C0045
;
; send_byte_pc(crc_result); //发送CRC校验码
; SOURCE LINE # 282
MOV R7,crc_result?650
LCALL _send_byte_pc
; send_end_pc(); //发送结束字符
; SOURCE LINE # 283
LCALL send_end_pc
;
; ES =1; //允许串行口中断,接收命令字节
; SOURCE LINE # 285
SETB ES
; }
; SOURCE LINE # 286
RET
; END OF send_tmp_pc
;
; ///////////////////////////////////////////////////////////
; //名称:确认信号解析
; //功能:对接收到的PC确认信号进行解析,判断本次传送操作是否成功?
; //////////////////////////////////////////////////////////
; ////////////////////////////////////////////
; bit receive_ack(us)
RSEG ?PR?_receive_ack?MAIN_SUB
_receive_ack:
USING 0
; SOURCE LINE # 293
MOV us?755,R3
MOV us?755+01H,R2
MOV us?755+02H,R1
; unsigned char *us;
; SOURCE LINE # 294
; {
; unsigned char i;
; unsigned char data_tmp[2] ={0x00,0x00};
; SOURCE LINE # 297
MOV R0,#LOW (data_tmp?757)
MOV R4,#HIGH (data_tmp?757)
MOV R5,#00H
MOV R3,#0FFH
MOV R2,#HIGH (_?ix1000)
MOV R1,#LOW (_?ix1000)
MOV R6,#00H
MOV R7,#02H
LCALL ?C?COPY
; //data_tmp[0] =*(us+1);
; //unsigned char data_chk[15]={0xff,0x55,0x55,0xFF,0xAA,0x01,0x01,84}; //为观察指针变量引入测试变量
; //unsigned char data *us=&data_chk[0];
;
; for(i=0;i<15;)
; SOURCE LINE # 302
;---- Variable 'i?756' assigned to Register 'R7' ----
CLR A
MOV R7,A
?C0055:
; {
; SOURCE LINE # 303
; if( (*(us+i)==0xFF)&&( *(us+i+1)==0xAA )&&(*(us+i+2)==0x41) ) //识别帧同步字节
; SOURCE LINE # 304
MOV R3,us?755
MOV R2,us?755+01H
MOV R1,us?755+02H
MOV DPL,R7
MOV DPH,#00H
LCALL ?C?CLDOPTR
CPL A
JNZ ?C0057
MOV A,R7
MOV R4,#00H
ADD A,R1
MOV R1,A
MOV A,R4
ADDC A,R2
MOV R2,A
MOV DPTR,#01H
LCALL ?C?CLDOPTR
CJNE A,#0AAH,?C0057
MOV DPTR,#02H
LCALL ?C?CLDOPTR
CJNE A,#041H,?C0057
; {
; SOURCE LINE # 305
; data_tmp[0] =*(us+i+3);
; SOURCE LINE # 306
MOV DPTR,#03H
LCALL ?C?CLDOPTR
MOV data_tmp?757,A
; data_tmp[1] =*(us+i+4);
; SOURCE LINE # 307
MOV DPTR,#04H
LCALL ?C?CLDOPTR
MOV data_tmp?757+01H,A
; goto next;
; SOURCE LINE # 308
SJMP ?_receive_ack?next
; }
; SOURCE LINE # 309
?C0057:
; i++;
; SOURCE LINE # 310
INC R7
; }
; SOURCE LINE # 311
CJNE R7,#0FH,?C0055
;
; next: if( (data_tmp[0]==identity)&(data_tmp[1]==columne) ) //判断是否为对本2051系统
; SOURCE LINE # 313
?_receive_ack?next:
MOV A,data_tmp?757+01H
CJNE A,#01H,?C0060
MOV R7,#01H
SJMP ?C0061
?C0060:
MOV R7,#00H
?C0061:
MOV A,data_tmp?757
CJNE A,#01H,?C0062
MOV R6,#01H
SJMP ?C0063
?C0062:
MOV R6,#00H
?C0063:
MOV A,R6
ANL A,R7
JZ ?C0059
; return 1;
; SOURCE LINE # 314
SETB C
RET
?C0059:
; else
; return 0;
; SOURCE LINE # 316
CLR C
; }
; SOURCE LINE # 317
?C0064:
RET
; END OF _receive_ack
;
;
;
; ////////////////////////////////////////
; //名称:数据无线传输
; //功能:2051取RAM单元数据封装成数据帧发送给PC
; ///////////////////////////////////////
; void send_data_pc(void)
RSEG ?PR?send_data_pc?MAIN_SUB
send_data_pc:
USING 0
; SOURCE LINE # 325
; {
; SOURCE LINE # 326
; repeat_s:send_tmp_pc();
; SOURCE LINE # 327
?send_data_pc?repeat_s:
LCALL send_tmp_pc
?C0067:
; while(receive_en==1); //等待PC确认信号
; SOURCE LINE # 328
JB receive_en,?C0067
?C0068:
; if(!receive_ack(&receive_data[0]) )
; SOURCE LINE # 329
MOV R3,#00H
MOV R2,#HIGH (receive_data)
MOV R1,#LOW (receive_data)
LCALL _receive_ack
JNC ?send_data_pc?repeat_s
; goto repeat_s;
; SOURCE LINE # 330
?C0069:
; else
; receive_en =1;
; SOURCE LINE # 332
SETB receive_en
; }
; SOURCE LINE # 333
?C0071:
RET
; END OF send_data_pc
;
; ////////////////////////////////////////////////
; //名称:命令解析
; //功能:对接收到的PC命令进行处理,执行相应操作:温度采集,数据传送,初始参数设置作
; ///////////////////////////////////////////////
; void do_pc_cmd(void)
RSEG ?PR?do_pc_cmd?MAIN_SUB
do_pc_cmd:
USING 0
; SOURCE LINE # 339
; {
; SOURCE LINE # 340
;
; command=receive_cmd(&receive_data[0]); //接收PC主机命令字节
; SOURCE LINE # 342
MOV R3,#00H
MOV R2,#HIGH (receive_data)
MOV R1,#LOW (receive_data)
LCALL _receive_cmd
MOV command,R7
; //命令处理
; if(command==collect) //温度采集命令
; SOURCE LINE # 344
MOV A,command
CJNE A,#043H,?C0072
; {
; SOURCE LINE # 345
; send_ds_cmd(); //发温度采集命令给所有DS18B20
; SOURCE LINE # 346
LJMP send_ds_cmd
; }
; SOURCE LINE # 347
?C0072:
; else if(command==transmit) //数据传送命令
; SOURCE LINE # 348
MOV A,command
CJNE A,#054H,?C0074
; {
; SOURCE LINE # 349
; send_data_pc(); //EEPROM 数据包发送给PC
; SOURCE LINE # 350
LJMP send_data_pc
; //从PC端显示数据测试 //set for test
; }
; SOURCE LINE # 352
?C0074:
;
; else if(command==init)
; SOURCE LINE # 354
MOV A,command
CJNE A,#049H,?C0076
; {
; SOURCE LINE # 355
; configure_ds();
; SOURCE LINE # 356
LJMP configure_ds
; // verify_config(); //set for test
; }
; SOURCE LINE # 358
?C0076:
; else if(command==shedule)
; SOURCE LINE # 359
MOV A,command
CJNE A,#053H,?C0078
; {
; SOURCE LINE # 360
; change_time();
; SOURCE LINE # 361
LJMP change_time
; // 读取t1_data0,t1_data1变量值 //set for test
; }
; SOURCE LINE # 363
?C0078:
; else //非法命令
; error_set(); //非法命令转出错处理
; SOURCE LINE # 365
LCALL error_set
;
;
; }
; SOURCE LINE # 368
?C0080:
RET
; END OF do_pc_cmd
;
;
;
; /////////////////////////////
; //名称:温度采集子系统主程序
; ////////////////////////////
; //extern void read_all_tmp(void);
;
; main()
RSEG ?PR?main?MAIN_SUB
main:
USING 0
; SOURCE LINE # 377
; {
; SOURCE LINE # 378
;
; //初始化定时器0,定时器1
; SCON =0x50; //设置串行通信方式为1
; SOURCE LINE # 381
MOV SCON,#050H
; TMOD =0x21;
; SOURCE LINE # 382
MOV TMOD,#021H
;
; TH0 =0x4C; //50ms中断一次,初始值0x4C00
; SOURCE LINE # 384
MOV TH0,#04CH
; TL0 =0x00;
; SOURCE LINE # 385
CLR A
MOV TL0,A
; TR0 =1;
; SOURCE LINE # 386
SETB TR0
;
; TH1 =0xE8; //串行通信波特率为1200bps
; SOURCE LINE # 388
MOV TH1,#0E8H
; TL1 =0xE8;
; SOURCE LINE # 389
MOV TL1,#0E8H
; TR1 =1;
; SOURCE LINE # 390
SETB TR1
;
; //使能定时器中断,串行口中断,外部中断0
; ET0 =1;
; SOURCE LINE # 393
SETB ET0
; ET1 =0; //定时器1用于串行通信波特率发生器,禁止中断
; SOURCE LINE # 394
CLR ET1
; ES =1;
; SOURCE LINE # 395
SETB ES
;
; EA =1; //注意:任何一次子程序调用都会将EA置0 !!
; SOURCE LINE # 397
SETB EA
; //read_all_tmp();
; //无限循环,等待
; loop:while(receive_en==1&&collect_tmp_flg==0); //查询是否接收到pc命令?
; SOURCE LINE # 400
?main?loop:
?C0082:
JNB receive_en,?C0083
JNB collect_tmp_flg,?C0082
?C0083:
; // EA =0; //关总中断,避免冲突
;
; if(receive_en==0) //串口中断服务程序
; SOURCE LINE # 403
JB receive_en,?C0084
; {
; SOURCE LINE # 404
; do_pc_cmd(); //处理命令
; SOURCE LINE # 405
LCALL do_pc_cmd
; receive_en =1; //允许接收下一个命令
; SOURCE LINE # 406
SETB receive_en
; }
; SOURCE LINE # 407
SJMP ?C0085
?C0084:
; else if(collect_tmp_flg==1) //定时器0中断服务程序
; SOURCE LINE # 408
JNB collect_tmp_flg,?C0085
; {
; SOURCE LINE # 409
; collect_ds_tmp();
; SOURCE LINE # 410
LCALL collect_ds_tmp
; collect_tmp_flg =0; //清允许温度采集标志
; SOURCE LINE # 411
CLR collect_tmp_flg
; }
; SOURCE LINE # 412
?C0085:
;
; TF0 =0; //清定时器溢出标志
; SOURCE LINE # 414
CLR TF0
; RI =0; //清除接收数据标志
; SOURCE LINE # 415
CLR RI
; EA =1; //命令处理完毕后EA被自动清零,
; SOURCE LINE # 416
SETB EA
; goto loop; //此处必须插入EA=1语句
; SOURCE LINE # 417
SJMP ?C0082
; END OF main
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -