📄 control.asm
字号:
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
;;====================================================================================
INITIAL:MOV DPTR,#0FDFFH ;取拨码开关的地址
MOVX A,@DPTR ;将拨码开关的状态送入A
PUSH ACC ;将状态备份
ANL A,#3FH
MOV ADDR,A ;将拨码开关的低六位作为本机地址存入地址寄存器
POP ACC ;取出备份
ANL A,#0C0H
SWAP A
RR A
RR A ;取出拨码开关的高两位用于波特率的的选择
MOV TMOD,#21H ;T0工作在方式1,T2工作在方式2
MOV PCON,#00H ;波特率不加倍
CJNE A,#00H,IN1 ;拨码开关的低两位为00则波特率设为2400
MOV TL1,#0F4H ;
MOV TH1,#0F4H
SJMP IN4
IN1: CJNE A,#01H,IN2 ;拨码开关的低两位为01则波特率设为4800
MOV TL1,#0FAH ;
MOV TH1,#0FAH
SJMP IN4
IN2: CJNE A,#02H,IN3 ;拨码开关的低两位为10则波特率设为9600
MOV TL1,#0FDH ;
MOV TH1,#0FDH
SJMP IN4
IN3: MOV PCON,#80H ;拨码开关的低两位为11则波特率设为19200
MOV TL1,#0FDH
MOV TH1,#0FDH
IN4: MOV SCON,#0F0H ;串口工作在方式3,允许串口接收
SETB ES ;开串口中断
SETB TR1 ;启动T1
SETB EA ;开中断
MOV TL0,#30H ;T0定时2MS初始化
MOV TH0,#0F8H
CLR TF0
RET
;作用:根据拨码开关的状态确定本机地址和485通信的波特率,并完成串口和20MS定时器的初始化
;====================================================================================
COPY: PUSH 00H
PUSH 01H
PUSH 02H
PUSH ACC
MOV R0,#08H
MOV R1,#30H
MOV R2,#18H
COPY1:MOV A,@R0
MOV @R1,A
INC R0
INC R1
DJNZ R2,COPY1
POP ACC
POP 02H
POP 01H
POP 00H
RET
;作用:将24路的加热数据送入相应的加热计数器中
;入口:@R0
;出口: @R1
;寄存器占用:A,R0,R1,R2
;子程序调用无
;=======================================================================================
DRIVE: PUSH 02H ; 保护现场
MOV R2,#08H ; 确定8路的输出状态
CLR A ;A清零
DRIVE1:CJNE @R1,#00H,DRIVE2 ; 该路是否触发完毕
SETB C ; 完毕则置高平
SJMP DRIVE3 ;
DRIVE2:CLR C ; 否则继续触发(输出低电平)
DEC @R1 ; 将该路的触发次数减一
DRIVE3:RRC A ; 将该状态位移入A中
INC R1 ; 准备判断下一路
DJNZ R2,DRIVE1 ; 8路是否处理完毕
POP 02H ; 恢复现场
RET
;作用:把以R1内容为首地址的8个通路的触发状态经过处理送入ACC中
;入口:R1
;出口:ACC
;寄存器占用:R1,R2,ACC,PSW
;子程序调用: 无
;====================================================================================
TRIGGER:MOV R1,#30H ;第一块板的加热计数器首地址送入R1
LCALL DRIVE ;将本次各路的触发状态送入A中
MOV DPTR,#7FFFH ;第一块板的地址送入DPTR中
MOVX @DPTR,A ;触发可控硅
MOV 29H,A ;将第一块板的状态存入29H
MOV R1,#38H ;第二块板的加热计数器首地址送入R1
LCALL DRIVE ;将本次各路的触发状态送入A中
MOV DPTR,#0DFFFH ;第二块板的地址送入DPTR中 '''''''''''????????检测
MOVX @DPTR,A ;触发可控硅
ANL A,29H ;第一块板的状态与第二块板的的状态作与运算
MOV 29H,A ;结果存入29H
MOV R1,#40H ;第三块板的加热计数器首地址送入R1
LCALL DRIVE ;将本次各路的触发状态送入A中
MOV DPTR,#0F7FFH ;第三块板的地址送入DPTR中
MOVX @DPTR,A ;触发可控硅
ANL A,29H ;三块电路板与运算
CJNE A,#0FFH,TRI1 ;结果不为为FFH则有输出
SETB P1.4 ;结果为FFH则熄灭输出指示灯
SJMP TRI2
TRI1: CLR P1.4 ;点亮输出指示灯
TRI2: RET
;====================================================================================
COLLECT:MOV DPTR,#0BFFFH ;第一块板的电路状态地址送入DPTR
MOVX A,@DPTR ;采集
MOV @R0,A ;将数据送入状态数据寄存器
INC R0 ;调整状态数据寄存器地址
MOV DPTR,#0EFFFH ;第一块板的电路状态地址送入DPTR
MOVX A,@DPTR ;采集
MOV @R0,A ;将数据送入状态数据寄存器
INC R0 ;调整状态数据寄存器地址
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 + -