⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main_sub.src

📁 一个温度采集系统的单片机程序与WINDOWS 串口通信程序
💻 SRC
📖 第 1 页 / 共 2 页
字号:
	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 + -