764.asm

来自「一个简单的煤矿继电保护的电路和代码」· 汇编 代码 · 共 334 行

ASM
334
字号
	;/* 定义I2CFG的位掩码  */
	CTVAL  EQU   02H   ;/*为I2CFG寄存器的参数定义,置位 ,CT1=1,CT0=0*/
	BTIR   EQU   10H   ;/*使用时只要用或运算即可取相应状态,TIRUN=1*/
	BMRQ   EQU   40H   ;/*MASTRQ=1*/

	;/* 定义I2CON的位掩码  */
	BCXA   EQU   80H   ;/*为I2CON寄存器的参数定义,置位CXA */ 
	BIDLE  EQU   40H   ;/*置位IDLE*/
	BCDR   EQU   20H   ;/*清DRDY*/
	BCARL  EQU   10H   ;/*清ARL*/
	BCSTR  EQU   08H   ;/*清STR*/
	BCSTP  EQU   04H   ;/*清STP*/
	BXSTR  EQU   02H   ;/*置位XSTR*/
        BXSTP  EQU   01H   ;/*置位XSTP*/
        ;用于本程序的RAM定位
        FLAGS      DATA   20H ;/*I2C软件标志位*/
        BITCNT     DATA   21H ;/*I2C计数器*/
        BYTECNT    DATA   22H ;/*数据字节长度计数器*/
        SLVAADR    DATA   23H ;/*丛机寻址字节*/
        SUBADR     DATA   24H ;/*丛机内指定地址*/
        STACKSAVE  DATA   25H ;/*为恢复I2C总线存储堆栈地址*/
        XMTDAT     DATA   30H ;/*接受数据缓冲区*/
        NOACK      BIT    FLAGS.0 ;/*无应答标志位*/
        FAULT      BIT    FLAGS.1 ;/*某些原因引起的总线失败标志*/
        RETRY      BIT    FLAGS.2 ;/*恢复总线后的重入标志*/
        ;复位和中断向量
         ORG  0000H
         AJMP RESET     ;硬件复位向量

         ORG  0073H
         AJMP TIMER1    ;定时器I中断向量,用作为I2C总线的看门狗
     






        TIME	BIT 00H		;定时标志位
	K32	BIT	P0.7	;CD4051选通
	K33	BIT	P0.6
	K34	BIT	P0.5
		
	K13	BIT	P0.3	;AD2543  P1口控制
	K14	BIT	P0.2
	KEOC	BIT	P0.4
	K16	BIT	P0.1
	K17	BIT	P0.0
		
	LWDAT	EQU	0F0H
	HIDAT	EQU	07H
		
	ORG	0000H
	LJMP	MAIN
	ORG	000BH
	LJMP	INT0
	ORG	0023H
	LJMP	SERVE1
;------------------------
        ORG	0100H
MAIN:	MOV	SP,#60H
	MOV	TMOD,#21H	;T0,工作方式1,16位;T1,工作方式2,通信
	MOV	TH0,#0FAH	;T0定时1.67ms,11.0592MHz
	MOV	TL0,#00H
			
        ;XXXXXXXXXXX
        mov	50h,#00h
	mov	51h,#00h
	mov	52h,#00h
	mov	53h,#00h
	mov	54h,#00h
	mov	55h,#00h
	mov	56h,#00h
	mov	57h,#00h
	mov	58h,#00h
	mov	59h,#00h
	mov	5Ah,#00h
	mov	5Bh,#00h
	;mov	5Ch,#11h
	;XXXXXXXXXXX
		
	LCALL D100      ;100ms
        LCALL D100
		
	MOV	TH1,#0FDH	;T1,  9600b/s
	MOV	TL1,#0FDH	;
	MOV	PCON,#00H	;SMOD0=0
	MOV	SCON,#50H	;串行通讯工作方式1,10bit
	SETB	TR1			;启动定时器T1
	SETB	ES
		
	MOV	30H,#40H	;面积存放首地址,  R0,#40H
	MOV	31H,#50H	;通信发射区首地址,R1,#50H
	MOV	32H,#0CH	;每周期20ms采集12次记数
	;	33H,#0CH	;12个RAM单元的数据异或处理
	;	34H			;通道控制字
	MOV     35H,#50H	;通信服务 发送区首地址
	MOV	36H,#0DH	;通信服务 记数单元
		
	CLR	RS0
	CLR	RS1
	CLR	TIME		;清定时标志位
	
	SETB	ET0
	SETB	TR0			;启动T0
	SETB	EA			;开中断

STA:
	mov	40h,#00h
	mov	41h,#00h
	mov	42h,#00h
	mov	43h,#00h
	mov	44h,#00h
	mov	45h,#00h
	mov	46h,#00h
	mov	47h,#00h
	mov	48h,#00h
	mov	49h,#00h
	mov	4Ah,#00h
	mov	4Bh,#00h		
;---------------------若定时到,开始
BEGIN:	 JNB	TIME,BEGIN	;定时时间是否到达
	 CLR	TIME


		
;-------------------AD采样通道选择
        MOV	34H,#00H;通道控制字
CH0:	CLR	K32
	CLR	K33		;CH0通道选通 
	CLR	K34
        LCALL	LPAD	;采样

CH1:	CLR	K32
	CLR	K33
	SETB	K34		;CH1通道
	LCALL	LPAD

CH2:    CLR	K32
	SETB	K33
	CLR	K34		;CH2
        LCALL	LPAD

CH3:	CLR     K32
	SETB	K33
	SETB	K34		;CH3
	LCALL	LPAD

CH7:	 SETB	K32
	SETB	K33
	SETB	K34
	LCALL	LPAD

AIN1:	MOV	34H,#10H;通道控制字#00010000B
	LCALL	LPAD
		
	MOV	30H,#40H;6路采样完成一次
	DJNZ	32H,BEGIN	;AD采样次数减一,减至0把新面积值送通信发送区

;---------------------数据送发送区	
	CLR	EA		;@@@@@@@@@@@@@@@@@@@
	MOV	30H,#40H	;R0,#40H
	MOV	31H,#50H	;R1,#50H
	MOV	33H,#0CH	;12个RAM单元的数据异或处理	
	MOV     5CH,#00H
MOVE:	;CLR	A
	MOV	R0,30H		;12次采集完成,开始往50H单元起的RAM送数据
	MOV	R1,31H
	MOV	A,@R0		;XCH  A,@R0  ;清旧面积数据单元
	MOV	@R1,A

;---------------------进行异或处理
	XRL	A,5CH
	MOV	5CH,A
;	mov	r7,a
	INC	30H
	INC	31H
	DJNZ	33H,MOVE	;异或处理结束
	SETB	EA			;数据存放结束,开中断
			
;---------------------数据存放发送区结束,重置
	MOV	30H,#40H	;R0,#40H,重设	
	MOV	31H,#50H	;R1,#50H
	MOV	32H,#0CH	;R6,#0CH,重设 ,12次采集次数
	LJMP	STA			;重新开始


;xxxxxxxxxxxxxxx数据采集					
LPAD:	LCALL	A_DREAD	;第一次舍弃不保存
	NOP    
	LCALL	A_DREAD
	LCALL	AREA	;AVERAGE
	RET			;LPAD程序段退出

A_DREAD:CLR	EA		;关中断
	MOV	C,KEOC		;查询EOC是否为1
	JNC	A_DREAD		;继续查询EOC
	CLR	C
		
	CLR	K16     ;CLK=0
	SETB	K17	;CS=1
	MOV	A,34H	;通道控制字R4
	CLR	K17	 ;CS=0,开始AD
MSB:    MOV	R5,#04H	 ;高4位数据
LOOP1:	MOV	C,K13
	RLC	A
	MOV	K14,C
	SETB	K16		;CLK=1
	CLR	K16		;CLK=0

;#################
	mov	r7,a
	DJNZ	R5,LOOP1
	ANL	A,#0FH
	MOV	R2,A	;高4位放R2
	MOV	A,34H	;通道控制字
	SWAP	A
LSB:	MOV	R5,#08H	;低8位数据
LOOP2:  MOV	C,K13
	RLC	A
	MOV	K14,C
	SETB	K16	;CLK=1
        CLR	K16	;CLK=0
;##################
	mov	r7,a
	DJNZ	R5,LOOP2
 	MOV	R3,A	;低8位放R3
	SETB	K17
	SETB	EA	;开中断
		
	 RET

;xxxxxxxxxxxxxxxxx采样数据值比较,求信号波形面积
AREA:	CLR		C
	MOV		A,R3	;低位数据
	;SUBB	A,#0E5H
	SUBB	A,#LWDAT
	MOV		A,R2	;高位数据
	;SUBB	A,#07H
	SUBB	A,#HIDAT
	JNC		HIGH	;高于参考电压

LOW:	;MOV	A,#0E5H		;低于参考值
	MOV	A,#LWDAT
	CLR	C
	SUBB	A,R3
	MOV	R3,A
	;MOV	A,#07H
	MOV	A,#HIDAT
	SUBB	A,R2
	MOV	R2,A
	SJMP	SUMAREA
HIGH:	CLR	C
	MOV	A,R3
	;SUBB	A,#0E5H
	SUBB	A,#LWDAT
	MOV	R3,A
	MOV	A,R2
	;SUBB	A,#07H
	SUBB	A,#HIDAT
	MOV	R2,A
	SJMP	SUMAREA

;---------------------------------------
SUMAREA:CLR	C		;每一路采样结束,采样数据求和
	MOV	R0,30H	;30H中存放面积地址,40H开始的RAM区
	MOV	A,@R0
	ADD	A,R3
	MOV	@R0,A	;低位保存
	INC	30H		;R0+1
	MOV	R0,30H
	MOV	A,@R0
	ADDC	A,R2
	MOV	@R0,A	;高位保存
	INC	30H		;R0+1
				
	RET

;************定时服务程序****
INT0:   MOV	TL0,#00H
	MOV	TH0,#0FAH
        SETB	TIME
		
	 RETI


;************通信服务程序****
SERVE1:	PUSH	PSW
	SETB	RS0
	CLR	RS1
	PUSH	ACC
	JBC	RI,RX_ACK
	CLR	TI
	DJNZ	36H,TXD1;36H为记数单元,判断是否发送完毕	
	MOV	36H,0DH	;记数标志重新设置
	SJMP	RETURN		
				
TXD1:   MOV	R1,35H
	MOV	A,@R1
	MOV	SBUF,A
	INC	35H
	SJMP	RETURN

;----------------------------				
RX_ACK:	MOV	A,SBUF
	XRL	A,#06H
	JZ	FIRST		;第一次发送
	SJMP	RETURN
FIRST:	MOV	36H,#0DH	;设置记数标志,13个TI信号
	MOV	35H,#50H	;确认第一次发送前,设置指针,50H开始的RAM区
	MOV	R1,35H
	MOV	A,@R1
	INC	35H
	MOV	SBUF,A
	SJMP	RETURN
					
RETURN:	POP	ACC
		CLR	RS1
		CLR	RS0
		POP	PSW
		
	        RETI
	
	  ;------------------------------
D100:           MOV 37H,#100    ;100ms
D1001:          MOV 38H,#250
D1002:          NOP
                NOP
                DJNZ 38H,D1002
                DJNZ 37H,D1001
                RET
      ;----------------------

 		END

⌨️ 快捷键说明

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