📄 main_sub.lst
字号:
230 2 i++;
231 2 }
232 1
233 1 next: if( (data_tmp[0]==identity)&(data_tmp[1]==columne) ) //判断是否为对本2051系统
-
234 1 {
235 2 for(k=0;k<4;k++)
236 2 pc_cmd_data[k] =data_tmp[k+3]; // 提取命令帧中的数据字节
237 2 send_ack(); //发送确认信号帧
238 2 return (data_tmp[2]); //返回控制指令
239 2 }
240 1 else
C51 COMPILER V7.00 MAIN_SUB 06/14/2005 17:21:11 PAGE 5
241 1 error:return (0x00);
242 1 }
243
244 ////////////////////////////////////////////
245 //名称:温度数据传输程序
246 //功能:将温度数据打包传送给PC,加入CRC校验和前向纠错
247 //////////////////////////////////////////
248 //unsigned char code index_rom[2] ={0x01,0x01}; //仓库号,列号
249
250 void send_tmp_pc(void)
251 {
252 1 unsigned char data i,k;
253 1 unsigned char data crc_result;
254 1 unsigned char data id_count=0;
255 1 unsigned char sla_adr;
256 1 unsigned char init_adr;
257 1 unsigned char data tmp_data[8];
258 1
259 1 i =0;
260 1 sla_adr =0xA4; //24C08硬件地址
261 1 init_adr =0x00; //温度数据在EEPROM存放首地址
262 1
263 1 ES =0; //串行口采用查询方式发送数据
264 1
265 1 for(k=0;k<2;k++) //计算仓库号,列号 CRC码
266 1 OWCrc(index_rom[k]);
267 1 do
268 1 {
269 2 if(i==0)
270 2 {
271 3 rdadr(&tmp_data[0],sla_adr,init_adr,8); //从EEPROM读出8个字节
272 3 send_syn_pc();
273 3 send_byte_pc(68); //发送标识符D<ASCII>
274 3 send_pbyt_pc(&index_rom[0]); //发送仓库号,列号
275 3 send_nbyt_pc(&tmp_data[0]); //发送8个字节->>PC
276 3 for(k=0;k<8;k++) //测试计算CRC码时间
277 3 OWCrc(tmp_data[k]);
278 3 }
279 2 else
280 2 {
281 3 rdnbyt(&tmp_data[0],sla_adr,8);
282 3 send_nbyt_pc(&tmp_data[0]);
283 3 for(k=0;k<8;k++)
284 3 crc_result =OWCrc(tmp_data[k]);
285 3 }
286 2 i++;
287 2 }while( i<4); //?????容量为16个DS18B20
288 1
289 1 send_byte_pc(crc_result); //发送CRC校验码
290 1 send_end_pc(); //发送结束字符
291 1
292 1 ES =1; //允许串行口中断,接收命令字节
293 1 }
294
295 ///////////////////////////////////////////////////////////
296 //名称:确认信号解析
297 //功能:对接收到的PC确认信号进行解析,判断本次传送操作是否成功?
298 //////////////////////////////////////////////////////////
299 ////////////////////////////////////////////
300 bit receive_ack(us)
301 unsigned char *us;
302 {
C51 COMPILER V7.00 MAIN_SUB 06/14/2005 17:21:11 PAGE 6
303 1 unsigned char i;
304 1 unsigned char data_tmp[2] ={0x00,0x00};
305 1 //data_tmp[0] =*(us+1);
306 1 //unsigned char data_chk[15]={0xff,0x55,0x55,0xFF,0xAA,0x01,0x01,84}; //为观察指针变量引入测试变量
307 1 //unsigned char data *us=&data_chk[0];
308 1
309 1 for(i=0;i<16;)
310 1 {
311 2 if( (*(us+i)==0xFF)&&( *(us+i+1)==0xAA )&&(*(us+i+2)==0x41) ) //识别帧同步字节
312 2 {
313 3 data_tmp[0] =*(us+i+3);
314 3 data_tmp[1] =*(us+i+4);
315 3 goto next;
316 3 }
317 2 i++;
318 2 }
319 1
320 1 next: if( (data_tmp[0]==identity)&(data_tmp[1]==columne) ) //判断是否为对本2051系统
-
321 1 return 1;
322 1 else
323 1 return 0;
324 1 }
325
326
327
328 ////////////////////////////////////////
329 //名称:数据无线传输
330 //功能:2051取RAM单元数据封装成数据帧发送给PC
331 ///////////////////////////////////////
332 void send_data_pc(void)
333 {
334 1 unsigned int data i,j;
335 1
336 1 send_nxt:
337 1 i =100;
338 1 j =1000;
339 1
340 1 repeat_s:send_tmp_pc();
341 1 while(i>1)
342 1 {
343 2 while(j>1)
344 2 {
345 3 if(receive_en==0)
346 3 { receive_en =1; //等待PC确认信号,启动定时器0,设置时限 1.4s
347 4
348 4 if(!receive_ack(&receive_data[0]) ) //此处问题待解决
349 4 goto send_nxt;
350 4 else
351 4 return;
352 4 }
353 3
354 3 j--;
355 3 }
356 2 j =1000;
357 2 i--;
358 2 }
359 1
360 1 }
*** WARNING C280 IN LINE 340 OF MAIN_SUB.C: 'repeat_s': unreferenced label
361
362 ////////////////////////////////////////////////
C51 COMPILER V7.00 MAIN_SUB 06/14/2005 17:21:11 PAGE 7
363 //名称:命令解析
364 //功能:对接收到的PC命令进行处理,执行相应操作:温度采集,数据传送,初始参数设置作
365 ///////////////////////////////////////////////
366 void do_pc_cmd(void)
367 {
368 1
369 1 command=receive_cmd(&receive_data[0]); //接收PC主机命令字节
370 1 //命令处理
371 1 if(command==collect) //温度采集命令
372 1 {
373 2 send_ds_cmd(); //发温度采集命令给所有DS18B20
374 2 }
375 1 else if(command==transmit) //数据传送命令
376 1 {
377 2 send_data_pc(); //EEPROM 数据包发送给PC
378 2 //从PC端显示数据测试 //set for test
379 2 }
380 1
381 1 else if(command==init)
382 1 {
383 2 configure_ds();
384 2 // verify_config(); //set for test
385 2 }
386 1 else if(command==shedule)
387 1 {
388 2 change_time();
389 2 // 读取t1_data0,t1_data1变量值 //set for test
390 2 }
391 1 else //非法命令
392 1 error_set(); //非法命令转出错处理
393 1
394 1
395 1 }
396
397
398
399 /////////////////////////////
400 //名称:温度采集子系统主程序
401 ////////////////////////////
402 //extern void read_all_tmp(void);
403
404 main()
405 {
406 1
407 1 //初始化定时器0,定时器1
408 1 SCON =0x50; //设置串行通信方式为1
409 1 TMOD =0x21;
410 1
411 1 TH0 =0x4C; //50ms中断一次,初始值0x4C00
412 1 TL0 =0x00;
413 1 TR0 =1;
414 1
415 1 TH1 =0xE8; //串行通信波特率为1200bps
416 1 TL1 =0xE8;
417 1 TR1 =1;
418 1
419 1 //使能定时器中断,串行口中断,外部中断0
420 1 ET0 =1;
421 1 ET1 =0; //定时器1用于串行通信波特率发生器,禁止中断
422 1 ES =1;
423 1
424 1 EA =1; //注意:任何一次子程序调用都会将EA置0 !!
C51 COMPILER V7.00 MAIN_SUB 06/14/2005 17:21:11 PAGE 8
425 1 //read_all_tmp();
426 1 //无限循环,等待
427 1 loop:while(receive_en==1&&collect_tmp_flg==0); //查询是否接收到pc命令?
428 1 // EA =0; //关总中断,避免冲突
429 1
430 1 if(receive_en==0) //串口中断服务程序
431 1 {
432 2 receive_en =1; //允许接收下一个命令
433 2 do_pc_cmd(); //处理命令
434 2 }
435 1 else if(collect_tmp_flg==1) //定时器0中断服务程序
436 1 {
437 2 collect_ds_tmp();
438 2 collect_tmp_flg =0; //清允许温度采集标志
439 2 }
440 1
441 1 TF0 =0; //清定时器溢出标志
442 1 RI =0; //清除接收数据标志
443 1 EA =1; //命令处理完毕后EA被自动清零,
444 1 goto loop; //此处必须插入EA=1语句
445 1
446 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 878 ----
CONSTANT SIZE = 4 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 30 37
IDATA SIZE = ---- ----
BIT SIZE = 2 1
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 1 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -