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

📄 缝焊控制.asm

📁 这是我设计的一款缝焊机程序
💻 ASM
📖 第 1 页 / 共 5 页
字号:
;---------------------------------------------
TA:	CLR	ET0		;禁止定时器0中断
	CLR	IE0
	CLR	TR0
	SETB	EX0
	JNB	REG_WELD,TA1      ;2007/3/19
	SETB	WELDING
	SETB	BIT_COUNTER
	SJMP	TA3
TA1:	CLR	WELDING
TA3:	MOV	P1,OUTFLAG
	RETI
;-------------------------------------------
;二字节BCD合并成16进制,入口R5、R4,出口R5、R4
;-------------------------------------------
TWO_BCDTOHEX:	MOV	A,R5
		MOV	R2,A
		ACALL	BCDTOHEX
		MOV	B,#64H
		MUL	AB
		MOV	R6,A
		XCH	A,B
		MOV	R5,A
		MOV	A,R4
		MOV	R2,A
		ACALL	BCDTOHEX
		ADD	A,R6
		MOV	R4,A
		MOV	A,R5
		ADDC	A,#00H
		MOV	R5,A
		RET
;---------------------------------------------
;单字节BCD码转换成HEX,入口R2,出口R2
;---------------------------------------------
BCDTOHEX:	MOV	A,R2
		ANL	A,#0F0H
		SWAP	A
		MOV	B,#0AH
		MUL	AB
		MOV	R3,A
		MOV	A,R2
		ANL	A,#0FH
		ADD	A,R3
		MOV	R2,A
		RET
;----------------------------------------------------
;单字节HEX转换成BCD码,R2入口,R3百位,R2(十位、个位)
;----------------------------------------------------
HEXTOBCD:	MOV	A,R2
		MOV	B,#64H
		DIV	AB
		MOV	R3,A
		MOV	A,#0AH
		XCH	A,B
		DIV	AB
		SWAP	A
		ADD	A,B
		MOV	R2,A
		RET
;-----------------------------------------------------
;双字节HEX转换成BCD码,入口R3、R2,出口R6(万位)、
;R5(千位、百位)、R4(十位、个位)
;-----------------------------------------------------
HEX16TOBCD:	CLR	A
		MOV	R4,A
		MOV	R5,A
		MOV	R6,A
		MOV	R7,#10H
LP0:		CLR	C
		MOV	A,R2
		RLC	A
		MOV	R2,A
		MOV	A,R3
		RLC	A
		MOV	R3,A
		MOV	A,R4
		ADDC	A,R4
		DA	A
		MOV	R4,A
		MOV	A,R5
		ADDC	A,R5
		DA	A
		MOV	R5,A
		MOV	A,R6
		ADDC	A,R6
		DA	A
		MOV	R6,A
		DJNZ	R7,LP0
		RET
;----------------------------------------------------------
;字节合并,入口地址R1原地址,出口R2,影响R3,ACC
;----------------------------------------------------------
BZJ_HBIN:	MOV	A,@R1
		ANL	A,#0FH
		MOV	R3,A
		INC	R1
		MOV	A,@R1
		ANL	A,#0FH
		SWAP	A
		ORL	A,R3
		MOV	R2,A
		INC	R1
		RET
;-------------------------------------------
;计数器的变换,下面子程序修改于2004年5月24日晚
;-------------------------------------------

;----------------------------------------------------------
;数据判断1
;----------------------------------------------------------
BZJ_ADJUST:	CJNE	A,#00H,BZJ_JUST1
BZJ_JUST2:	MOV	A,#00H
		RET
BZJ_JUST1:	JC	BZJ_JUST2
		CJNE	A,#09H,BZJ_JUST3
BZJ_JUST3:	JC	BZJ_JUST4
		MOV	A,#09H
BZJ_JUST4:	RET
;---------------------------------------------------
RDFR2401:	MOV	A,PRO_NUM
		MOV	B,#10H
		MUL	AB
		MOV	SUBA,A
		MOV	A,B
		CLR	C
		RRC	A
		JC	RD_PAGE2
        	MOV   	SLA,#0A0H
        	SJMP	RD_PAGE1
RD_PAGE2:	MOV	SLA,#0A2H
RD_PAGE1:       MOV	NUMBYTE,#10H
         	LCALL 	IRDNBYTE
        	RET
;---------------------------------------------------
WRTO2401:	MOV	A,PRO_NUM
		MOV	B,#10H
		MUL	AB
		MOV	SUBA,A
		MOV	A,B
		CLR	C
		RRC	A
		JC	WR_PAGE1
       		MOV   	SLA,#0A0H
       		SJMP	WR_PAGE2
WR_PAGE1:	MOV	SLA,#0A2H
WR_PAGE2:       MOV	NUMBYTE,#10H
                LCALL   IWRNBYTE
        	RET
;--------------------------------------------------------------------------------------------------------
;VI2C_ASM.ASM
;I2C 软件包的底层子程序,使用前要定义好SCL和SDA。在标准80C51模式
;(12 CLOCK)下,对主频要求是不高于12MHZ(1个机器周期1US);若FOSC>12MHZ
;则要增加相应的NOP指令数。在使用本软件包时,请在你的程序的未尾加入
;$INCLUDE (VI2C_ASM.ASM)即可。
;--------------------------------------------------------------------------------------------------------
;启动I2C总线子程序
START:    SETB  SDA
          NOP
          SETB  SCL     ;起始条件建立时间大于4.7US
          NOP
          NOP
          NOP
          NOP
          NOP
          CLR  SDA
          NOP           ;起始条件锁定时大于4US
          NOP
          NOP
          NOP
          NOP
          CLR   SCL     ;钳住总线,准备发数据
          NOP
          RET
;------------------------------------------------
;结束总线子程序
;------------------------------------------------
STOP:     CLR    SDA
          NOP
          SETB   SCL    ;发送结束条件的时钟信号
          NOP           ;结束总线时间大于4US
          NOP
          NOP
          NOP
          NOP
          SETB  SDA    	;结束总线
          NOP          	;保证一个终止信号和起始信号的空闲时间大于4.7US
          NOP
          NOP
          NOP
          RET
;-------------------------------------------------
;发送应答信号子程序
;-------------------------------------------------
MACK:     CLR  	SDA      ;将SDA置0
          NOP
          NOP
          SETB 	SCL
          NOP            ;保持数据时间,即SCL为高时间大于4.7US
          NOP
          NOP
          NOP
          NOP
          CLR  	SCL
          NOP
          NOP
          RET
;--------------------------------------------------
;发送非应答信号
;--------------------------------------------------
MNACK: 	  SETB 	SDA        ;将SDA置1
          NOP
          NOP
          SETB 	SCL
          NOP
       	  NOP              ;保持数据时间,即SCL为高时间大于4.7US
          NOP
          NOP
          NOP
          CLR  SCL
          NOP
          NOP
          RET
;--------------------------------------------------
; 检查应答位子程序
; 返回值,ACK=1时表示有应答
;--------------------------------------------------
CACK:	SETB  SDA
        NOP
        NOP
        SETB  SCL
        CLR   ACK
        NOP
        NOP
        MOV  C,SDA
        JC    CEND
        SETB  ACK           	 ;判断应答位
CEND:	NOP
        CLR  SCL
        NOP
        RET
;---------------------------------------------------
;发送字节子程序
;字节数据放入ACC
;每发送一字节要调用一次CACK子程序,取应答位
;---------------------------------------------------
WRBYTE: MOV  R0,#08H
WLP: 	RLC   A              	;取数据位
        JC     WR1
        SJMP  WR0            	;判断数据位
WLP1:   DJNZ  R0,WLP
        NOP
        RET
WR1:    SETB  SDA            	;发送1
        NOP
        SETB  SCL
        NOP
        NOP
        NOP
        NOP
        NOP
        CLR   SCL
        SJMP  WLP1
WR0:  	CLR   SDA            	;发送0
        NOP
        SETB  SCL
        NOP
        NOP
        NOP
        NOP
        NOP
        CLR  SCL
        SJMP WLP1
;-------------------------------------------------------
;读取字节子程序
;读出的值在ACC
;每取一字节要发送一个应答/非应答信号
;--------------------------------------------------------
RDBYTE: MOV  R0,#08H
RLP:    SETB  SDA
        NOP
        SETB  SCL         	;时钟线为高,接收数据位
        NOP
        NOP
        MOV  C,SDA        	;读取数据位
        MOV  A,R2
        CLR   SCL          	;将SCL拉低,时间大于4.7US
        RLC   A            	;进行数据位的处理
        MOV  R2,A
        NOP
        NOP
        NOP
        DJNZ  R0,RLP        	;未够8位,再来一次
        RET
;---------------------------------------------------------------
; 无子地址器件写字节数据
; 入口参数: 数据为ACC、器件从地址SLA
; 占用:  A、R0、CY
;---------------------------------------------------------------
IWRBYTE: PUSH   ACC
IWBLOOP: LCALL  START      	;起动总线
         MOV    A,SLA
         LCALL  WRBYTE     	;发送器件从地址
         LCALL  CACK
         JNB     ACK,RETWRB     ;无应答则跳转
         POP     ACC       	;写数据
         LCALL  WRBYTE
         LCALL  CACK
         LCALL  STOP
         RET
RETWRB:  POP     ACC
         LCALL  STOP
         RET
;----------------------------------------------------------------
;无子地址器件读字节数据
;入口参数: 器件从地址SLA
;出口参数: 数据为ACC
;占用 A 、R0、R2 、CY
;----------------------------------------------------------------
IRDBYTE: LCALL  START
         MOV    A,SLA        		;发送器件从地址
         INC     A
         LCALL  WRBYTE
         LCALL  CACK
         JNB     ACK,RETRDB
         LCALL  RDBYTE       	;进行读字节操作
         LCALL  MNACK          	;发送非应信号
RETRDB:  LCALL  STOP             	;结束总线
         RET
;---------------------------------------------------------------
;向器件指定子地址写N个数据
;入口参数:  器件从地址SLA、器件子地址SUBA 、
;发送数据缓冲区MTD、发送字节数NUMBYTE
; 占用:  A 、R0 、R1 、R3 、CY
;----------------------------------------------------------------
IWRNBYTE: MOV    A,NUMBYTE
          MOV    R3,A
          LCALL  START        	;起动总线
          MOV    A,SLA
          LCALL  WRBYTE       	;发送器件从地址
          LCALL  CACK
          JNB     ACK,RETWRN	 ;无应答则退出
          MOV    A,SUBA       	 ;指定子地址
          LCALL  WRBYTE
          LCALL  CACK
          mov	r1,#MBUF_ADDR	;MOV    R1,#MTD
WRDA:     MOV    A,@R1
          LCALL  WRBYTE       	;开始写入数据
          LCALL  CACK
          JNB     ACK,IWRNBYTE
          INC     R1
          DJNZ    R3,WRDA      	;判断写完没有
RETWRN:   LCALL  STOP
          RET
;-----------------------------------------------------------------
;向器件指定子地址读取N个数据
;入口参数:  器件从地址SLA、器件子地址SUBA、接收字节数NUMBYTE
;出口参数:  接收数据缓冲区MTD
;占用:A、 R0、 R1、 R2、 R3、 CY
;----------------------------------------------------------------
IRDNBYTE:  MOV    R3,NUMBYTE
           LCALL  START
           MOV    A,SLA
           LCALL  WRBYTE        ;发送器件从地址
           LCALL  CACK
           JNB    ACK,RETRDN
           MOV    A,SUBA        ;指定子地址
           LCALL  WRBYTE
           LCALL  CACK
           LCALL  START         ;重新起动总线
           MOV    A,SLA
           INC    A             ;准备进行读操作
           LCALL  WRBYTE
           LCALL  CACK
           JNB    ACK,IRDNBYTE
           mov	  r1,#MBUF_ADDR	;MOV    R1,#MRD
RDN1:      LCALL  RDBYTE      	;读操作开始
           MOV    @R1,A
           DJNZ    R3,SACK
           LCALL  MNACK       	;最后一字节发非应答位
RETRDN:    LCALL  STOP 			;并结束总线
           RET
SACK:      LCALL  MACK
           INC     R1
           SJMP   RDN1
;*********************************************************************************************
;                         请注意
;
;占用内部资源:         R0,R1,R2,R3,ACC,CY。
;在你的程序里要做以下定义:
;使用前须定义变量:  SLA 器件从地址  SUBA器件子地址  NUMBYTE读/写的字节数 ,位变量ACK
;使用前须定义常量:  SDA SCL 总线位  MTD 发送数据缓冲区首址    MRD 接收数据缓冲区首址
;(ACK为调试/测试位,ACK为0时表示无器件应答)
;
;**********************************************************************************************
;***********************************************************
;* 向BC728X发送一个字节子程序,待发送数据存于DATA_OUT
;************************************************************
SEND:		CLR	CLK		;在CLK输出一脉冲
		SETB	CLK
WAIT1:		JB	DAT,SEND	;等待DAT变为低电平
                NOP
		CLR	CLK		;再输出一CLK脉冲
                NOP
		SETB	CLK
                NOP
WAIT2:		JNB	DAT,WAIT2	;等待DAT恢复高电平(输入状态)
		MOV	BIT_COUNT,#8
SEND_LOOP:	MOV	C,DATA_OUT.7	;输出BIT7
		MOV	DAT,C
		CLR	CLK		;输出一CLK脉冲
		SETB	CLK
 		MOV	A,DATA_OUT
  		RL	A
 		MOV	DATA_OUT,A	;DATA_OUT左移一位
		NOP			;短暂延时
		NOP
 		NOP
		DJNZ	BIT_COUNT,SEND_LOOP
		SETB	DAT		;恢复DAT为高电平
		R

⌨️ 快捷键说明

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