📄 h06.asm
字号:
WRITE : PUSH ACC ;保护现场
LCALL START ;发出数据传输起始信号
MOV A,#0FEH
ANL A,QADDR ;将该24C02的写命令字送入A中
LCALL SBYTE ;发出
LCALL WACK ;等待24C02的应答
MOV A,CADDR ;将要写入的存储器地址送入A中
LCALL SBYTE ;发出
LCALL WACK ;等待24C02的应答
MOV A, WI2CDATA ;将要写入的数据送入A中
LCALL SBYTE ;发出
LCALL WACK ;等待24C02的应答
LCALL STOP ;结束本次数据传输
LCALL SOMENOP ;等待24C02的内部写操作
POP ACC ;恢复现场
RET
;作用:向任一24c02的任一地址写入一个字节的数据
;入口:WI2CDATA(写数据暂存器),QADDR(24C02的地址) ,CADDR(24C02中的存储器地址)
;出口: 无
;子程序调用:SOMENOP ,SBYTE ,START, STOP, WACK
;寄存器占用:ACC,PSW,WI2CDATA ,QADDR ,CADDR
;===================================================================
READ : PUSH ACC ;保护现场
LCALL START ;发出数据传输起始信号
MOV A,#0FEH
ANL A,QADDR ;将该24C02的写命令字送入A中
LCALL SBYTE ;发出
LCALL WACK ;等待24C02的应答
MOV A, CADDR ;将要读的的存储器地址送入A中
LCALL SBYTE ;发出
LCALL WACK ;等待24C02的应答
LCALL START ;发出数据传输起始信号
MOV A,#1H
ORL A,QADDR ;将该24C02的读命令字送入A中
LCALL SBYTE ;发出
LCALL WACK ;等待24C02的应答
LCALL RBYTE ;取走数据
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 ;将数据送入状态数据寄存器
MOV TH0 ,#0E0H
MOV TL0 ,#0C0H
SETB TR0 ;1.3ms计时开始(关断A相的延时)
MOV A,#0FFH
MOV DPTR,#7FFFH ;第一块板的地址送入DPTR中
JB FLAG, $ ;1.3ms到?
SETB FLAG
MOVX @DPTR,A ;关断A相
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 ;调整状态数据寄存器地址
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 + -