📄 update07.asm
字号:
LCALL NACK ;发出非应答信号
LCALL STOP ;结束数据传输
POP ACC ;恢复现场
RET
;作用:从任一24c02的任一地址读出一个数据放入RI2CDATA中
;入口:QADDR(24C02的地址) ,CADDR(24C02中的存储器地址)
;出口: RI2CDATA
;子程序调用:SOMENOP ,SBYTE ,START, STOP, WACK ,NACK
;寄存器占用:ACC,PSW,RI2CDATA ,QADDR ,CADDR
;========================================================
PWRITE: PUSH 00H
PUSH 02H
PUSH ACC ;保护现场
MOV R0, MADDR ;待写入数据存储器首地址送入R0
MOV R2,#08H ;写入数据个数
LCALL START ;发出数据传输起始信号
MOV A,#0FEH
ANL A,QADDR ;将该24C02的写命令字送入A中
LCALL SBYTE ;发出
LCALL WACK ;等待24C02的应答
MOV A,CADDR ;要写入的24C02的存储器首地址
LCALL SBYTE ;发出
LCALL WACK ;等待24C02的应答
PWRITE1:
MOV A, @R0
LCALL SBYTE ;发出
LCALL WACK ;等待24C02的应答
LCALL SOMENOP ;延时
INC R0 ; 数据存储器地址加一
DJNZ R2 , PWRITE1;8个数据是否写完
LCALL STOP ;结束数据传输
LCALL SOMENOP ;等待24C02的内部写操作
POP ACC
POP 02H
POP 00H ;恢复现场
RET
;作用:向任一24c02的任一起始地址开始连续写入8个以MADDR为首地址的数据
;入口:QADDR(24C02的地址) ,CADDR(24C02中的存储器首地址),MADDR(待写入数据存储器首地址)
;出口: 无
;子程序调用:SOMENOP ,SBYTE ,START, STOP, WACK ,NACK
;寄存器占用:ACC,PSW ,QADDR ,CADDR ,MADDR ,R0,R2
;===========================================================================
READ24: PUSH 00H
PUSH 01H
PUSH 02H
PUSH ACC ;保护现场
CLR WP ;取消写保护
MOV R0, #08H ;待存入的数据存储器首地址送入R0
MOV R1, #02h ;24C02中要读出的数据首地址送入R1
MOV QADDR,#0A0H
MOV R2,#18H ;读取数据的个数送入R2
READ241:MOV CADDR,R1
INC R1 ;要读出的数据地址加一
LCALL READ ;读出数据
MOV @R0, RI2CDATA ;将数据存入单片机内
INC R0 ;调整内存地址
DJNZ R2, READ241 ;判断是否操作完
POP ACC
POP 02H
POP 01H
POP 00H ;恢复现场
RET
;作用:从任一24c02读出以CADDR为首地址的24 个数据存放在以MADDR为首地址的数据存储区
;入口:QADDR(24C02的地址) ,CADDR(24C02中要读出的数据首地址),MADDR(待存入的数据存储器首地址)
;出口: 以MADDR为首地址的24个存储单元
;子程序调用:read
;寄存器占用:ACC,QADDR ,CADDR ,MADDR ,R0,R1,R2 ,RI2CDATA
;;====================================================================================
;====================================================================================
FIRST_COL:MOV A,6CH
MOV DPTR,#7FFFH ;第一块板的地址送入DPTR中
JB TIME, $ ;第一相过零
MOVX @DPTR,A ;触发第一块板的可控硅
SETB TIME ;置位
MOV TH0 ,#0F0H
MOV TL0 ,#60H
SETB TR0 ;4ms计时开始(采集第一块板状态的延时)
JB FLAG, $ ;4ms到?
SETB FLAG
MOV DPTR,#0BFFFH ;第一块板的电路状态地址送入DPTR
MOVX A,@DPTR ;采集
MOV @R0,A ;将数据送入状态数据寄存器
INC R0 ;调整状态数据寄存器地址
MOV TH0 ,#0F6H
MOV TL0 ,#3CH
SETB TR0 ;2.5ms计时开始(B相过零的延时)
MOV A,6DH
MOV DPTR,#0DFFFH ;第二块板的地址送入DPTR中
JB FLAG, $ ;2.5ms到?
SETB FLAG
MOVX @DPTR,A ;触发第二块板的可控硅
MOV TH0 ,#0F0H
MOV TL0 ,#60H
SETB TR0 ;4ms计时开始(采集第二块板状态的延时)
JB FLAG, $ ;4ms到?
SETB FLAG
MOV DPTR,#0EFFFH ;第二块板的电路状态地址送入DPTR
MOVX A,@DPTR ;采集
MOV @R0,A ;将数据送入状态数据寄存器
INC R0 ;调整状态数据寄存器地址
MOV TH0 ,#0FCH
MOV TL0 ,#18H
SETB TR0 ;1ms计时开始(关断A相的延时)
MOV A,#0FFH
MOV DPTR,#7FFFH ;第一块板的地址送入DPTR中
JB FLAG, $ ;1ms到?
SETB FLAG
MOVX @DPTR,A ;关断A相
MOV TH0 ,#0FAH
MOV TL0 ,#24H
SETB TR0 ;1.5ms计时开始(C相过零的延时)
MOV A,6EH
MOV DPTR,#0F7FFH ;第三块板的地址送入DPTR中
JB FLAG, $ ;1.5ms到?
SETB FLAG
MOVX @DPTR,A ;触发第三块板的可控硅
MOV TH0 ,#0F0H
MOV TL0 ,#60H
SETB TR0 ;4ms计时开始(采集第三块板状态的延时)
JB FLAG, $ ;4ms到?
SETB FLAG
MOV DPTR,#0FBFFH ;第三块板的电路状态地址送入DPTR
MOVX A,@DPTR ;采集
MOV @R0,A ;将数据送入状态数据寄存器
; MOV TH0 ,#0FDH
; MOV TL0 ,#0A8H
; SETB TR0 ;0.6ms计时开始(关断B相的延时)
MOV A,#0FFH
MOV DPTR,#0DFFFH ;第二块板的地址送入DPTR中
; JB FLAG, $ ;0.6ms到?
; SETB FLAG
MOVX @DPTR,A ;关断B相
RET
;作用:将三块电路板的电路状态采入并存放到以R0内容为首地址的状态数据寄存区中
;入口:3个244
;出口:以R0内容为首地址的状态数据寄存区
;子程序调用:无
;寄存器占用:DPTR,A,R0
;====================================================================================
SECEND_COL:MOV A,6CH
MOV DPTR,#7FFFH ;第一块板的地址送入DPTR中
JB TIME, $ ;第一相过零
MOVX @DPTR,A ;触发第一块板的可控硅
SETB TIME ;置位
MOV TH0 ,#0F0H
MOV TL0 ,#60H
SETB TR0 ;4ms计时开始(采集第一块板状态的延时)
JB FLAG, $ ;4ms到?
SETB FLAG
MOV DPTR,#0BFFFH ;第一块板的电路状态地址送入DPTR
MOVX A,@DPTR ;采集
MOV @R0,A ;将数据送入状态数据寄存器
INC R0 ;调整状态数据寄存器地址
; MOV TH0 ,#0FAH
; MOV TL0 ,#88H
; SETB TR0 ;1.4ms计时开始(C相关断的延时)
MOV DPTR,#0F7FFH ;第三块板的地址送入DPTR中
;JB FLAG, $ ;1.4ms到?
;SETB FLAG
mov a,#0ffh
MOVX @DPTR,A ;关断C相
MOV TH0 ,#0F6H
MOV TL0 ,#3CH
SETB TR0 ;2.5ms计时开始(B相过零的延时)(可以变小一点)
MOV A,6DH
MOV DPTR,#0DFFFH ;第二块板的地址送入DPTR中
JB FLAG, $ ;2.5ms到?
SETB FLAG
MOVX @DPTR,A ;触发第二块板的可控硅
MOV TH0 ,#0F0H
MOV TL0 ,#60H
SETB TR0 ;4ms计时开始(采集第二块板状态的延时)
JB FLAG, $ ;4ms到?
SETB FLAG
MOV DPTR,#0EFFFH ;第二块板的电路状态地址送入DPTR
MOVX A,@DPTR ;采集
MOV @R0,A ;将数据送入状态数据寄存器
INC R0
MOV TH0 ,#0F6H
MOV TL0 ,#3CH
SETB TR0 ;2.5ms计时开始(C相过零的延时)
MOV A,6EH
MOV DPTR,#0F7FFH ;第三块板的地址送入DPTR中
JB FLAG, $ ;2.5ms到?
SETB FLAG
MOVX @DPTR,A ;触发第三块板的可控硅
MOV TH0 ,#0F0H
MOV TL0 ,#60H
SETB TR0 ;4ms计时开始(采集第三块板状态的延时)
JB FLAG, $ ;4ms到?
SETB FLAG
MOV DPTR,#0FBFFH ;第三块板的电路状态地址送入DPTR
MOVX A,@DPTR ;采集
MOV @R0,A ;将数据送入状态数据寄存器
RET
;作用:将三块电路板的电路状态采入并存放到以R0内容为首地址的状态数据寄存区中
;入口:3个244
;出口:以R0内容为首地址的状态数据寄存区
;子程序调用:无
;寄存器占用:DPTR,A,R0
;=======================================================================================
RXSVE: CLR ES
CLR RI
PUSH ACC
PUSH 00H
MOV A,SBUF
XRL A,ADDR
JZ RXSVE1
RXSVE2:
RETI
RXSVE1:CLR SM2
CLR P1.7
MOV SBUF,ADDR
SETB P1.7
JNB RI,$
CLR RI
reti
;===================================================================================
DEAL: SETB SHORT
SETB CUT
SETB P1.5
SETB P1.6
MOV A,21H
XRL A,24H
CJNE A,#0FFH,DE1 ;第一块电路板有问题吗?,有则进行检测
DE2 : MOV A,22H
XRL A,25H
CJNE A,#0FFH,DE3 ;第二块电路板有问题吗?,有则进行检测
DE4 : MOV A,23H
XRL A,26H
CJNE A,#0FFH,DE5 ;第三块电路板有问题吗?,有则进行检测
LJMP DEAL3 ;电路没有问题不作任何处理
DE1 :MOV R0,#08H ;第一块板的数据区首地址送入R0
MOV R5,#01H ;第一块板号送入R5
MOV A,21H ;第一块板的第一次采集的电路状态送入A
MOV R1,24H ;第一块板的第二次采集的电路状态送入R1
LCALL DONE ;判断处理
SJMP DE2 ;检测第二块电路板
DE3: MOV R0,#10H ;第二块板的数据区首地址送入R0
MOV R5,#02H ;第二块板号送入R5
MOV A,22H ;第二块板的第一次采集的电路状态送入A
MOV R1,25H ;第二块板的第二次采集的电路状态送入R1
LCALL DONE ;判断处理
SJMP DE4 ;检测第三块电路板
DE5 : MOV R0,#18H ;第三块板的数据区首地址送入R0
MOV R5,#03H ;第三块板号送入R5
MOV A,23H ;第三块板的第一次采集的电路状态送入A
MOV R1,26H ;第三块板的第二次采集的电路状态送入R1
LCALL DONE ;判断处理
DE6: JNB SHORT,DEAL1 ;短路了则进入DEAL1
SJMP DEAL2 ;否则判断是否断路
DEAL1: CLR P1.6 ;翻转短路指示灯
DEAL2: JB CUT ,DEAL3 ;未断路则电路正常则返回
DEAL4: CLR P1.5 ;翻转断路指示灯
DEAL3:RET
;作用:判断各个电路的运行状况,出现异常则上传故障码,并进行指示灯的闪烁
;入口:A(第一次采集的电路状态),R0(加热数据区首地址),R1(第二次采集的电路状态),R5(板号)
;出口:无
;子程序调用:DONE
;寄存器占用
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -