📄 缝焊控制.asm
字号:
;---------------------------------------------
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 + -