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

📄 main_sub.src

📁 一个温度采集系统的单片机程序与WINDOWS 串口通信程序
💻 SRC
📖 第 1 页 / 共 2 页
字号:
; main_sub.SRC generated from: main_sub.c
; COMPILER INVOKED BY:
;        C:\Program Files\Keil\C51\BIN\C51.EXE main_sub.c BROWSE DEBUG OBJECTEXTEND TABS(6)

$NOMOD51

NAME	MAIN_SUB

P0	DATA	080H
P1	DATA	090H
P2	DATA	0A0H
P3	DATA	0B0H
T0	BIT	0B0H.4
AC	BIT	0D0H.6
T1	BIT	0B0H.5
EA	BIT	0A8H.7
IE	DATA	0A8H
rst_rf	BIT	0B0H.3
RD	BIT	0B0H.7
ES	BIT	0A8H.4
IP	DATA	0B8H
RI	BIT	098H.0
INT0	BIT	0B0H.2
CY	BIT	0D0H.7
TI	BIT	098H.1
INT1	BIT	0B0H.3
PS	BIT	0B8H.4
SP	DATA	081H
OV	BIT	0D0H.2
WR	BIT	0B0H.6
SBUF	DATA	099H
PCON	DATA	087H
SCON	DATA	098H
TMOD	DATA	089H
TCON	DATA	088H
led	BIT	090H.2
IE0	BIT	088H.1
IE1	BIT	088H.3
B	DATA	0F0H
ACC	DATA	0E0H
ET0	BIT	0A8H.1
ET1	BIT	0A8H.3
TF0	BIT	088H.5
TF1	BIT	088H.7
RB8	BIT	098H.2
TH0	DATA	08CH
EX0	BIT	0A8H.0
IT0	BIT	088H.0
TH1	DATA	08DH
TB8	BIT	098H.3
EX1	BIT	0A8H.2
IT1	BIT	088H.2
P	BIT	0D0H.0
SM0	BIT	098H.7
TL0	DATA	08AH
SM1	BIT	098H.6
TL1	DATA	08BH
SM2	BIT	098H.5
PT0	BIT	0B8H.1
PT1	BIT	0B8H.3
RS0	BIT	0D0H.3
TR0	BIT	088H.4
RS1	BIT	0D0H.4
TR1	BIT	088H.6
PX0	BIT	0B8H.0
PX1	BIT	0B8H.2
DPH	DATA	083H
DPL	DATA	082H
REN	BIT	098H.4
RXD	BIT	0B0H.0
TXD	BIT	0B0H.1
F0	BIT	0D0H.5
PSW	DATA	0D0H
?PR?_delay_time?MAIN_SUB                 SEGMENT CODE 
?PR?delay_time_1s?MAIN_SUB               SEGMENT CODE 
?DT?delay_time_1s?MAIN_SUB               SEGMENT DATA OVERLAYABLE 
?PR?timer0?MAIN_SUB  SEGMENT CODE 
?PR?serial_isr?MAIN_SUB                  SEGMENT CODE 
?PR?send_ack?MAIN_SUB                    SEGMENT CODE 
?PR?_receive_cmd?MAIN_SUB                SEGMENT CODE 
?DT?_receive_cmd?MAIN_SUB                SEGMENT DATA OVERLAYABLE 
?PR?send_tmp_pc?MAIN_SUB                 SEGMENT CODE 
?DT?send_tmp_pc?MAIN_SUB                 SEGMENT DATA OVERLAYABLE 
?PR?_receive_ack?MAIN_SUB                SEGMENT CODE 
?DT?_receive_ack?MAIN_SUB                SEGMENT DATA OVERLAYABLE 
?PR?send_data_pc?MAIN_SUB                SEGMENT CODE 
?PR?do_pc_cmd?MAIN_SUB                   SEGMENT CODE 
?PR?main?MAIN_SUB    SEGMENT CODE 
?C_INITSEG           SEGMENT CODE 
?CO?MAIN_SUB         SEGMENT CODE 
?BI?MAIN_SUB         SEGMENT BIT 
?DT?MAIN_SUB         SEGMENT DATA 
	EXTRN	CODE (configure_ds)
	EXTRN	CODE (send_syn_pc)
	EXTRN	CODE (_OWCrc)
	EXTRN	CODE (collect_ds_tmp)
	EXTRN	CODE (_send_byte_pc)
	EXTRN	CODE (error_set)
	EXTRN	CODE (_send_nbyt_pc)
	EXTRN	CODE (_send_pbyt_pc)
	EXTRN	CODE (_rdadr)
	EXTRN	DATA (?_rdadr?BYTE)
	EXTRN	CODE (_rdnbyt)
	EXTRN	DATA (?_rdnbyt?BYTE)
	EXTRN	CODE (send_end_pc)
	EXTRN	CODE (send_ds_cmd)
	EXTRN	CODE (change_time)
	EXTRN	CODE (?C?CLDOPTR)
	EXTRN	CODE (?C?CLDPTR)
	EXTRN	CODE (?C?COPY)
	EXTRN	CODE (?C_STARTUP)
	PUBLIC	pc_cmd_data
	PUBLIC	receive_data
	PUBLIC	command
	PUBLIC	t1_count1
	PUBLIC	t1_count0
	PUBLIC	byt_count
	PUBLIC	t1_data1
	PUBLIC	t1_data0
	PUBLIC	collect_tmp_flg
	PUBLIC	receive_en
	PUBLIC	index_rom
	PUBLIC	main
	PUBLIC	do_pc_cmd
	PUBLIC	send_data_pc
	PUBLIC	_receive_ack
	PUBLIC	send_tmp_pc
	PUBLIC	_receive_cmd
	PUBLIC	send_ack
	PUBLIC	serial_isr
	PUBLIC	timer0
	PUBLIC	delay_time_1s
	PUBLIC	_delay_time

	RSEG  ?DT?send_tmp_pc?MAIN_SUB
?send_tmp_pc?BYTE:
          i?648:   DS   1
          k?649:   DS   1
 crc_result?650:   DS   1
   id_count?651:   DS   1
    sla_adr?652:   DS   1
   init_adr?653:   DS   1
   tmp_data?654:   DS   8

	RSEG  ?DT?delay_time_1s?MAIN_SUB
?delay_time_1s?BYTE:
          i?142:   DS   1

	RSEG  ?DT?_receive_ack?MAIN_SUB
?_receive_ack?BYTE:
         us?755:   DS   3
	ORG  3
   data_tmp?757:   DS   2

	RSEG  ?DT?_receive_cmd?MAIN_SUB
?_receive_cmd?BYTE:
         us?543:   DS   3
	ORG  3
          i?544:   DS   1
          k?545:   DS   1
   data_tmp?546:   DS   8
 crc_result?547:   DS   1

	RSEG  ?BI?MAIN_SUB
     receive_en:   DBIT   1
collect_tmp_flg:   DBIT   1

	RSEG  ?DT?MAIN_SUB
       t1_data0:   DS   2
       t1_data1:   DS   2
      byt_count:   DS   1
      t1_count0:   DS   2
      t1_count1:   DS   2
        command:   DS   1
   receive_data:   DS   16
    pc_cmd_data:   DS   4

	RSEG  ?CO?MAIN_SUB
index_rom:
	DB	001H
	DB	001H

_?ix1000:
	DB	000H
	DB	000H


	RSEG  ?C_INITSEG
	DB	001H
	DB	byt_count
	DB	000H

	DB	0C1H, collect_tmp_flg + 000H	; bit-init

	DB	0C1H, receive_en + 080H	; bit-init

	DB	002H
	DB	t1_count0
	DW	00384H

	DB	002H
	DB	t1_count1
	DW	00050H

	DB	002H
	DB	t1_data0
	DW	00384H

	DB	002H
	DB	t1_data1
	DW	00050H

; #pragma src
; ///////////////////////////////////////////////
; //EEPROM存储区安排:
; //0000H~01FFH	512byte	DS18B20 ID
; //0200H~027FH	128byte	温度数据
; //0280H~03FFH	384byte	配置参数<温度报警上下限值,温度转换精度>
; #include<reg51.h>
; #include<intrins.h>
; #include<rount3.h>
; #include<rount5.h>
; #include<rount6.h>
; 
; #define collect	67              			//C ASCII 码为67
; #define transmit	84
; #define init	73
; #define shedule	83
; #define dat		68
; #define ack		65
; 
; sbit	led		=0x92;
; sbit 	rst_rf	=0xb3;
; 
; // GLOBAL VARIABLES
; unsigned char data receive_data[16];      	//串行通信变量,设为全局变量确保快速响应
; unsigned char data command;
; unsigned char byt_count	=0;               	//串行中断接收字节计数
; 
; bit	data collect_tmp_flg	=0;			//是否开始温度采集标志
; bit	data receive_en	=1;				//命令是否处理标志
; 
; unsigned int data t1_count0	=900;			//定时间隔参数
; unsigned int data t1_count1	=80;
; //PC命令修改下列两个参数值,可以改变温度采样时间间隔
; unsigned int data t1_data0	=900;
; unsigned int data t1_data1	=80;
; 
; ////////////////////////////
; //名称:延迟程序
; //功能:根据参数延迟
; ////////////////////////////
; void delay_time(unsigned int us)          	//29us/40us/52us/64us

	RSEG  ?PR?_delay_time?MAIN_SUB
_delay_time:
	USING	0
			; SOURCE LINE # 41
;---- Variable 'us?040' assigned to Register 'R6/R7' ----
; {  
			; SOURCE LINE # 42
; unsigned int data i;	
; 	for(i=0;i<=us;i++) 
			; SOURCE LINE # 44
;---- Variable 'i?041' assigned to Register 'R4/R5' ----
	CLR  	A
	MOV  	R5,A
	MOV  	R4,A
?C0001:
	SETB 	C
	MOV  	A,R5
	SUBB 	A,R7
	MOV  	A,R4
	SUBB 	A,R6
	JNC  	?C0004
; 	_nop_();
			; SOURCE LINE # 45
	NOP  	
	INC  	R5
	CJNE 	R5,#00H,?C0088
	INC  	R4
?C0088:
	SJMP 	?C0001
; }
			; SOURCE LINE # 46
?C0004:
	RET  	
; END OF _delay_time

; 	
; void delay_time_1s  (void)                	//实际模拟仿真测试 /0.9s

	RSEG  ?PR?delay_time_1s?MAIN_SUB
delay_time_1s:
	USING	0
			; SOURCE LINE # 48
; {
			; SOURCE LINE # 49
?C0005:
; unsigned char data i;
;       while(i<4)
			; SOURCE LINE # 51
	MOV  	A,i?142
	CLR  	C
	SUBB 	A,#04H
	JNC  	?C0007
;       {
			; SOURCE LINE # 52
; 	  delay_time(8000);
			; SOURCE LINE # 53
	MOV  	R7,#040H
	MOV  	R6,#01FH
	LCALL	_delay_time
;         _nop_();
			; SOURCE LINE # 54
	NOP  	
;         delay_time(8000);
			; SOURCE LINE # 55
	LCALL	_delay_time
;         i++;
			; SOURCE LINE # 56
	INC  	i?142
;       }
			; SOURCE LINE # 57
	SJMP 	?C0005
; } 
			; SOURCE LINE # 58
?C0007:
	RET  	
; END OF delay_time_1s

CSEG	AT	0000BH
	LJMP	timer0

; 
; 
; //////////////////////////////
; //名称:定时器0 ISR
; //功能:DS18B20定时温度采集,存储
; //////////////////////////////
; void timer0(void) interrupt 1 using 3

	RSEG  ?PR?timer0?MAIN_SUB
	USING	3
timer0:
	PUSH 	ACC
			; SOURCE LINE # 65
; {
; ET0	=0;
			; SOURCE LINE # 67
	CLR  	ET0
; TH0	=0x4C;
			; SOURCE LINE # 68
	MOV  	TH0,#04CH
; TL0	=0x00;
			; SOURCE LINE # 69
	MOV  	TL0,#00H
; 	if( (--t1_count0)==0 )
			; SOURCE LINE # 70
	MOV  	A,t1_count0+01H
	DEC  	t1_count0+01H
	JNZ  	?C0089
	DEC  	t1_count0
?C0089:
	DEC  	A
	ORL  	A,t1_count0
	JNZ  	?C0008
;       {
			; SOURCE LINE # 71
; 		if( (--t1_count1)==0 )
			; SOURCE LINE # 72
	MOV  	A,t1_count1+01H
	DEC  	t1_count1+01H
	JNZ  	?C0090
	DEC  	t1_count1
?C0090:
	DEC  	A
	ORL  	A,t1_count1
	JNZ  	?C0009
;   		{
			; SOURCE LINE # 73
; //			collect_ds_tmp();              	//此处可以调用温度采集程序<必须为再入函数>
; 			if(collect_tmp_flg==1)			//设置开始温度采集标志
			; SOURCE LINE # 75
	JNB  	collect_tmp_flg,?C0010
; 			_nop_();
			; SOURCE LINE # 76
	NOP  	
	SJMP 	?C0011
?C0010:
; 			else
; 			collect_tmp_flg	=1;
			; SOURCE LINE # 78
	SETB 	collect_tmp_flg
?C0011:
; 			
; 			t1_count1	=t1_data1;
			; SOURCE LINE # 80
	MOV  	t1_count1,t1_data1
	MOV  	t1_count1+01H,t1_data1+01H
;   		}		
			; SOURCE LINE # 81
?C0009:
; 		t1_count0	=t1_data0;
			; SOURCE LINE # 82
	MOV  	t1_count0,t1_data0
	MOV  	t1_count0+01H,t1_data0+01H
; 	}
			; SOURCE LINE # 83
?C0008:
; TF0	=0;	
			; SOURCE LINE # 84
	CLR  	TF0
; ET0	=1;
			; SOURCE LINE # 85
	SETB 	ET0
; EA	=1;                  					//(十进制,两位整数,两位小数,
			; SOURCE LINE # 86
	SETB 	EA
; }									//小数在低地址),存入EEPROM
			; SOURCE LINE # 87
	POP  	ACC
	RETI 	
; END OF timer0

CSEG	AT	00023H
	LJMP	serial_isr

; 
; /////////////////////////////
; //名称:串口 ISR
; //功能:接收PC主机命令
; ////////////////////////////
; void	serial_isr(void) interrupt 4 

	RSEG  ?PR?serial_isr?MAIN_SUB
	USING	0
serial_isr:
	PUSH 	ACC
	PUSH 	PSW
	MOV  	PSW,#00H
	PUSH 	AR0
	PUSH 	AR7
	USING	0
			; SOURCE LINE # 93
; {
;   if(TI==1)
			; SOURCE LINE # 95
	JNB  	TI,?C0013
;   TI	=0;
			; SOURCE LINE # 96
	CLR  	TI
	SJMP 	?C0018
?C0013:
;   else if(RI==1&&(receive_en==1))
			; SOURCE LINE # 97
	JNB  	RI,?C0015
	JNB  	receive_en,?C0015
; 	{
			; SOURCE LINE # 98
; 	RI	=0;
			; SOURCE LINE # 99
	CLR  	RI
; 	receive_data[byt_count++]=SBUF;
			; SOURCE LINE # 100
	MOV  	R7,byt_count
	INC  	byt_count
	MOV  	A,#LOW (receive_data)
	ADD  	A,R7
	MOV  	R0,A
	MOV  	@R0,SBUF
; 		if(byt_count>16)
			; SOURCE LINE # 101
	MOV  	A,byt_count
	SETB 	C
	SUBB 	A,#010H
	JC   	?C0018
; 		{
			; SOURCE LINE # 102
; 		byt_count	=0;
			; SOURCE LINE # 103
	MOV  	byt_count,#00H
; 		receive_en	=0;
			; SOURCE LINE # 104
	CLR  	receive_en
; 		}
			; SOURCE LINE # 105
; 	}
			; SOURCE LINE # 106
	SJMP 	?C0018
?C0015:
;   else
;   RI	=0;
			; SOURCE LINE # 108
	CLR  	RI
; }
			; SOURCE LINE # 109
?C0018:
	POP  	AR7
	POP  	AR0
	POP  	PSW
	POP  	ACC
	RETI 	
; END OF serial_isr

; 
; ///////////////////////////////////////////////////////
; //名称:测试程序
; //功能:检测配置DS18B20是否成功
; /////////////////////////////////////////////////////
; /*
; void verify_config(void)
; {
; bit 	data flag;
; bit	data page_ch_flg;
; unsigned char i,j;
; unsigned char id_count	=0;
; unsigned char init_adr0,sla_adr;
; unsigned char config_data[9];
; unsigned char id_rom[8];
; 
; i	=0;	
; j	=0;
; sla_adr	=0xA0;						//DS18B20 ID在EEPROM中存放首地址
; init_adr0	=0x00;													
; id_count	=0;
; page_ch_flg	=0;
; 
; flag	=OWReset();
; 	if(!flag)
; 	{
; 	   do
; 	   {	
; 		if(page_ch_flg==1)
; 		{
; 			sla_adr	=0xA2;
; 			rdnbyt(&id_rom[0],sla_adr,8);
; 			goto next;
; 		}			
; 		if(id_count==0xf8)
; 		page_ch_flg	=1;
; 		
; 		if(j==0)
; 		rdadr(&id_rom[0],sla_adr,init_adr0,8);
; 		else
; 		rdnbyt(&id_rom[0],sla_adr,8);
; 		
; next:		id_count+=8;		
; 		OWReset();
; 		OWWriteByte(0x55);           				//发匹配ID命令
; 		for(i=0;i<8;i++)
; 		{
; 			OWWriteByte(id_rom[i]);
; 		}
; 		OWWriteByte(0xBE);           				//送出Read ScatchPad命令   
; 		for(i=0;i<9;i++)
; 		{
; 			config_data[i]	=OWReadByte();
;             }
; 		
; 		j++;
;          }while(!OWReset()&&(j<64) );            		// 读取64个DS18B20 ID    
;        }   
; _nop_();         
; }
; */
; 
; ////////////////////////////////////////////////////////////
; //名称:确认信号帧回复
; //功能:接收到正确的PC命令帧,回复确认信号帧
; ///////////////////////////////////////////////////////////
; unsigned char code index_rom[2]	={0x01,0x01};   			//仓库号,列号
; 
; void	send_ack(void)

	RSEG  ?PR?send_ack?MAIN_SUB
send_ack:
	USING	0
			; SOURCE LINE # 178
; {
			; SOURCE LINE # 179
;       ES	=0;
			; SOURCE LINE # 180
	CLR  	ES
;       send_syn_pc();
			; SOURCE LINE # 181
	LCALL	send_syn_pc
; 	send_byte_pc(65);								//发送标识符A<ASCII>	
			; SOURCE LINE # 182
	MOV  	R7,#041H
	LCALL	_send_byte_pc
; 	send_pbyt_pc(&index_rom[0]);
			; SOURCE LINE # 183
	MOV  	R6,#HIGH (index_rom)
	MOV  	R7,#LOW (index_rom)
	LCALL	_send_pbyt_pc
; 	send_end_pc();
			; SOURCE LINE # 184
	LCALL	send_end_pc
;      	ES	=1;
			; SOURCE LINE # 185
	SETB 	ES
; }
			; SOURCE LINE # 186
	RET  	
; END OF send_ack

; 
; ////////////////////////////////////////////
; //名称:串口查询方式接收程序
; //功能:中断后,关中断使能,以查询方式接收PC命令字节,
; //      并对命令进行解析,返回命令值 
; /////////////////////////////////////////////
; unsigned char pc_cmd_data[4];	
; #define 	identity	1
; #define 	columne	1
; 
; unsigned char receive_cmd(us)

	RSEG  ?PR?_receive_cmd?MAIN_SUB
_receive_cmd:
	USING	0
			; SOURCE LINE # 197
	MOV  	us?543,R3
	MOV  	us?543+01H,R2
	MOV  	us?543+02H,R1
; unsigned char *us;
			; SOURCE LINE # 198
; {
; unsigned char i,k;
; unsigned char data_tmp[8];
; unsigned char crc_result;
; //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<16;)
			; SOURCE LINE # 207
	CLR  	A
	MOV  	i?544,A
?C0020:
; 	{
			; SOURCE LINE # 208
; //		data_tmp[0]	=*us;										//set for test varibles
; //		data_tmp[1]	=*(us+1);
; 		if( (*(us+i)==0xFF)&&( *(us+i+1)==0xAA )&&(*(us+i+2)==0x44) )	  	//识别帧同步字节	
			; SOURCE LINE # 211
	MOV  	R3,us?543
	MOV  	R2,us?543+01H
	MOV  	R1,us?543+02H
	MOV  	DPL,i?544
	MOV  	DPH,#00H
	LCALL	?C?CLDOPTR
	CPL  	A
	JNZ  	?C0022
	MOV  	R6,A
	MOV  	A,R1
	ADD  	A,i?544
	MOV  	R1,A
	MOV  	A,R6
	ADDC 	A,R2
	MOV  	R2,A
	MOV  	DPTR,#01H
	LCALL	?C?CLDOPTR
	XRL  	A,#0AAH
	JNZ  	?C0022
	MOV  	DPTR,#02H
	LCALL	?C?CLDOPTR
	XRL  	A,#044H
	JNZ  	?C0022
; 		{
			; SOURCE LINE # 212
; 			for(k=0;k<8;k++)
			; SOURCE LINE # 213
	MOV  	k?545,A
?C0023:
; 			{
			; SOURCE LINE # 214
; 				data_tmp[k]	=*(us+i+3+k);              	 			// 此处采用for语句得不到正确值?
			; SOURCE LINE # 215

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -