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

📄 复件 综合程序.asm

📁 该程序是一个基本8051单片机和0809模数转换芯片的数据采集系统
💻 ASM
字号:
      
        ORG	0000H
	LJMP	START
	ORG	0003H	;中断INT0入口
	LJMP	INT0
        ORG	0023H
	LJMP	RECE

 START: MOV     SP,#70H
        SETB    P3.5            ;上电后指示灯亮
        MOV	IE,#90H	        ;EA=1,ES=1,CPU开串行中断
	MOV	SCON,#50H	;设置串行口方式1,允许串行接收
        MOV	TMOD,#20H	;设置定时器T1为方式2
	MOV	TH1,#0FDH	;设置波特率为9600b/s
	MOV	TL1,#0FDH
        MOV     R6,#00H
        MOV     R1,#00H 
	SETB	TR1	
WAIT:   NOP
        CJNE    R6,#01H,WAIT
        LJMP    CAIJI

RECE:   CLR	EA
	PUSH	A
        MOV	A,SBUF          ;接收到一个数据
        CLR	RI
        CJNE	A,#43H,RECE1    ;是否收到传送信号"C"
        MOV     R6,#01H         ;收到"C"进入波形采集程序,闪2次
        LCALL   SH2
        LJMP    OUT             
RECE1:  CJNE    A,#44H,RECE2    ;收到"D"进入有效值采集程序,R1置1
        MOV     R6,#01H
        MOV     R1,#01H  
        CLR     P3.5            ;闪1次    
        LCALL	D1s
        SETB	P3.5          
        LJMP    OUT
RECE2:  CJNE    A,#53H,OUT      ;收到"S",传输数据
        LCALL   SEND
        
 OUT:	POP	A
        SETB	EA              ;开中断
	RETI

CAIJI:  CJNE    R1,#01H,CJ1     ;R1为1进行有效值采集,否则转至CJ1正常波形采集
  CJ0:  MOV     TCON,#01H       ;IT0=1,边沿触发
	MOV	R4,#01H
        MOV     R7,#00H
        MOV     R0,#08H
        CLR	P2.0	;ST=0
	CLR	P3.4	;OE=0
        CLR     P2.2	;ALE=0
	CLR	P2.7	;片选

	CLR	P3.3	;选通4路,电流正半波
	CLR   	P3.5
        SETB    P2.1
        LJMP    CAIJI1

  CJ1:  MOV	DPTR,#0000H	;DPTR=0,偶数地址存0路数据,奇数地址存1路数据
	MOV	TCON,#01H	;IT0=1,边沿触发方式,负跳变
	MOV	R2,#00H
        MOV     R7,#00H

	CLR	P2.0	;ST=0
	CLR	P3.4	;OE=0
        CLR     P2.2	;ALE=0
	CLR	P2.7	;片选

	CLR	P3.3	;选通0路,,输入电压
	CLR	P3.5
	CLR	P2.1
        MOV     R2,#01H
	
CAIJI1: SETB	P2.2	;通路地址锁存
	CLR	P2.2    
	SETB	P2.0	;ADC0809输出端清零
	CLR  	P2.0	;启动A/D转换
	MOV	IE,#81H  

WAIT1:	NOP		;等待中断
        CJNE    R1,#01H,WAIT2     ;判断是有效值采集则顺序执行
        JNB     RI,WAIT2 
        CLR     RI 
        MOV     A,SBUF 
        CJNE    A,#54H,WAIT2 
        LJMP    START 
WAIT2:  CJNE    R7,#01H,WAIT3      
        LJMP    BJ00
WAIT3:	LJMP	WAIT1

   
INT0:   CLR     EA
        PUSH    A
        CJNE    R1,#01H,INT02
INT01:  SETB  	P3.4	;输出使能有效
        MOV	P1,#0FFH
        NOP
        NOP
        LCALL   D5ms    ;0.5ms延时
      	MOV	A,P1
      	MOV    	@R0,A	;数据转存
	CLR  	P3.4	;关闭输
        CJNE    R0,#3AH,C1
        MOV     R7,#01H
        LJMP    SHAN
C1:	INC     R0
INT1:   CJNE    R4,#01H,INT2
        CLR    P3.3	;选通4路,电流正半波
	CLR    P3.5
	SETB   P2.1
	SETB   P2.2	;通路地址锁存
	CLR    P2.2
        LJMP   NEXT
        
INT2:   CLR    P3.3	;选通0路,电压正半波
	CLR    P3.5
	CLR    P2.1
	SETB   P2.2	;通路地址锁存
	CLR    P2.2
        LJMP   NEXT
        
INT02:  SETB	P3.4	;输出使能有效
        MOV	P1,#0FFH
        NOP
        NOP
      	MOV	A,P1
	MOVX	@DPTR,A	;数据转存
	CLR	P3.4	;关闭输出
	MOV	A,DPH	;判断是否存满
	CJNE	A,#7FH,SL
	MOV	A,DPL
	CJNE	A,#0FFH,SL
        MOV     R7,#01H
        LJMP    SHAN
        
SL:	INC	DPTR    ;继续采集
Zero:	CJNE	R2,#00H,First
	CLR	P3.3	;选通0路,电压正半波
	CLR	P3.5
	CLR	P2.1
	SETB	P2.2	;通路地址锁存
	CLR	P2.2
        MOV	R2,#01H
        LJMP    NEXT
        
First:  CJNE	R2,#01H,Second
        SETB	P3.3	;选通1路,电压负半波
	CLR	P3.5
	CLR	P2.1
	SETB	P2.2	;通路地址锁存
	CLR	P2.2
        MOV	R2,#02H
        LJMP    NEXT
        
Second:	CJNE	R2,#02H,Third
	CLR	P3.3	;选通4路,电流正半波
	CLR	P3.5
	SETB	P2.1
	SETB	P2.2	;通路地址锁存
	CLR	P2.2
        MOV	R2,#03H
        LJMP	NEXT
        
Third:	SETB	P3.3	;选通5路,电流负半波
	CLR	P3.5
	SETB	P2.1
	SETB	P2.2	;通路地址锁存
	CLR	P2.2
        MOV	R2,#00H

NEXT:   SETB   P2.0	;ADC0809再次采集
	CLR    P2.0
        SETB   EA
SHAN:   NOP
        POP    A
	RETI
        
BJ00:   NOP
        CJNE     R1,#00H,BJ01
        NOP
        LCALL   SH2
        LJMP    START    
BJ01:   LCALL    BB             ;调用去毛刺,比较求最大值子程序
        MOV      TMOD,#20H
        MOV      SCON,#50H
        MOV      TH1,#0FDH      ;设置波特率为9600b/s
        MOV      TL1,#0FDH
        SETB     TR1
        MOV      A,@R0         ;最大值放入A中
        MOV      SBUF,A
        JNB      TI,$
        CLR      TI             ;发送完毕
        
        CJNE     R4,#01H,ZH     ;R2=0,采集的是电压值,
        MOV      R4,#00H        ;采集电压
        MOV      R7,#00H
        MOV      R0,#08H
        CLR      P2.0	;ST=0
        CLR      P3.4	;OE=0
        CLR      P2.2	;ALE=0
        CLR      P2.7	;片选
        CLR      P3.3  	;选通0路,输入电压
        CLR      P3.5
        CLR      P2.1
        LJMP     CAIJI1

ZH:     LCALL   D1s
        LCALL   D1s
        LCALL   D1s
        LCALL   D1s
        LCALL   D1s
        LCALL   D1s
        LCALL   D1s
        LCALL   D1s
        LCALL   D1s
        LCALL   D1s
        LCALL   D1s
        LCALL   D1s
        LCALL   D1s
        LCALL   D1s
        LCALL   D1s
        LCALL   D1s
        LCALL   D1s
        LCALL   D1s
        LJMP    CJ0
        
 ;比较子程序 
BB:    MOV      R0,#08H       
       CJNE     R4,#01H,J1
B0:    CJNE     R0,#39H,B1    ;判断是否比较完
       LJMP     J1
B1:    CLR      C
       MOV      A,@R0
       INC      R0
       MOV      7AH,@R0
       CJNE     A,7AH,B2
       LJMP     B0
B2:    JNC      B0          ;C=0则A>R0,转B0
B3:    CJNE     R0,#39H,B4
       LJMP     J1
B4:    MOV      A,@R0      ;A<R0,把R0赋给A
       CLR      C
       INC      R0
       MOV      7AH,@R0
       CJNE     A,7AH,B5
       LJMP     B0
B5:    JNC       B6          ;C=0则A>R0,转B6
       LJMP     B3
B6:    DEC      R0
       MOV      @R0,#00H   ;把毛刺赋0
       INC      R0           ;指向下一单元
       LJMP     B0
J1:    MOV      R0,#0AH
       MOV      A,@R0
BJ:    CJNE     R0,#38H,BJ1
       LJMP     BJ2
BJ1:   INC      R0
       MOV      7AH,@R0
       CJNE     A,7AH,BJ3
       LJMP     BJ
BJ3:   JNC      BJ          ;A>R0,返回继续比较
       MOV      A,@R0       ;A<R0,将R0赋给A
       LJMP     BJ
BJ2:   MOV      @R0,A       ;最大值放在R0中
       RET


 ;发送1字节子程序
 SEND1: CLR   ES
        MOV   SBUF,A
        JNB   TI,$
        CLR   TI
        SETB  ES
        RET

  ;发送32K外部存储器数据子程序
 SEND:  MOV    DPTR,#0000H         ;首地址
  S1:   MOVX   A,@DPTR
        LCALL  SEND1               ;调发送1字节子程序
        MOV   R2,DPH                ;判断是否传完
        CJNE  R2,#07FH, NEXT1
        MOV   R3,DPL
        CJNE  R3,#0FFH,NEXT1
        CLR   P3.5                 ;发送完灯熄灭
        LJMP  OVER
 NEXT1: INC    DPTR
        LJMP    S1
 OVER:  RET


D1s:	MOV	R3,#0C8H	      ;延时1s
DL1:    LCALL   D5ms
        LCALL   D5ms
        LCALL   D5ms
        LCALL   D5ms
        LCALL   D5ms
        LCALL   D5ms
        LCALL   D5ms
        LCALL   D5ms
        LCALL   D5ms
        LCALL   D5ms
	DJNZ	R3,DL1
	RET

 D5ms:  MOV    R5,#49H
  DL2:  NOP
        NOP
        DJNZ   R5,DL2
        RET

SH2:    CLR     P3.5
        LCALL	D1s        ;闪2次
        SETB	P3.5
        LCALL	D1s
        CLR     P3.5
        LCALL	D1s
        SETB	P3.5 
        LCALL	D1s
        RET
        END

⌨️ 快捷键说明

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