📄 noname1.asm
字号:
WP EQU P1.0
SCL EQU P1.1
SDA EQU P1.2
DIR EQU P1.7
SHORT BIT 00H ;短路标志位
CUT BIT 01H ;断路标志位
TIME BIT 02H ;过零标志位
FLAG BIT 03H ;6.7MS时间到
COUNTER DATA 7FH ;数据线上的位计数器
COUNTER1 DATA 7EH ;延时计数器
RI2CDATA DATA 7DH ;从24c02读出的数据暂存器
WI2CDATA DATA 7CH ;向24c02写入的数据暂存器
QADDR DATA 7BH ;24c02的地址寄存器
CADDR DATA 7AH ;24c02中的存储器地址
MADDR DATA 79H ;单片机内存地址
ADDR DATA 77H ;本机地址寄存器
COUNT DATA 78H ;触发个数计数器
MCOUNT DATA 2CH ;移位计数器
;=====================================================================================
ORG 000H
SJMP MAIN
ORG 0003H
LJMP INTSVE
ORG 000BH
; LJMP T0SVE
ORG 0023H
; LJMP RXSVE
MAIN: MOV SP, #60H ;设立栈底
MOV P1, #0FFH ;初始化P1
CLR P1.3 ;点亮CPU指示灯
MOV 20H,#0FFH ;初始化标志位区
; LCALL R4I2C ;读出4个24C02的验证数据
; LCALL JUDGE ;判断,不相同或为零则停机,否则减一
; LCALL W4I2C ;向4个24C02写入验证数据
; LCALL READ24 ;读出加热数据
LCALL INITIAL ;根据拨码开关的状态确定本机地址和485通信的波特率
SETB EX0
setb time
he: JB TIME, $ ;第一相过零
;SETB TR0 ;第一个6.7ms计时开始
SETB TIME ;置位
MOV A,#00H
MOV DPTR,#07FFFH ;第一块板的地址送入DPTR中
MOVX @DPTR,A ;触发可控硅
; lcall D1MS
;MOV A,#0ffh
;MOV DPTR,#07FFFH ;第一块板的地址送入DPTR中
;MOVX @DPTR,A ;触发可控硅
JB TIME, $ ;第一相过零
;SETB TR0 ;第一个6.7ms计时开始
SETB TIME ;置位
MOV A,#0ffH
MOV DPTR,#07FFFH ;第一块板的地址送入DPTR中
MOVX @DPTR,A ;触发可控硅
;lcall D1MS
;MOV A,#0ffh
;MOV DPTR,#0dFFFH ;第一块板的地址送入DPTR中
; MOVX @DPTR,A ;触发可控硅
sjmp he
D1MS :MOV R4,#24
DL :MOV R5,#0FAH
DL0 :DJNZ R5,DL0
DJNZ R4,DL
RET
;====================================================================================
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,T1工作在方式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,允许串口接收
MOV TCON ,#01H ;外部中断负边沿触发
MOV TH0 ,#0E5H
MOV TL0 ,#0F6H ;T0 6.7秒的初始化
MOV IE,#00H ;
MOV IP,#01H ;串口中断高优先级
SETB ES ;开串口中断
SETB ET0 ;开T0中断
; SETB EX0 ;开外部中断0
SETB TR1 ;启动T1
SETB EA ;开中断
RET
;==============================================================
INTSVE:CLR TIME
RETI
end
;mov a,#50
; mov 08h,a
; mov 09h,a
; mov 0ah,a
; mov 0bh,a
; mov 0ch,a
; mov 0dh,a
; mov 0eh,a
;mov 0fh,#0
; mov 10h,a
; mov 11h,a
; mov 12h,a
; mov 13h,a
; mov 14h,a
; mov 15h,a
;mov 16h,a
; mov 17h,#0
;mov 18h,a
; mov 19h,a
; mov 1ah,a
; mov 1bh,a
; mov 1ch,a
; mov 1dh,a
;mov 1eh,a
;mov 1fh,#0
SETB TIME
SETB FLAG
REDO :MOV COUNT,#00H
MOV MCOUNT,#00H
;LCALL GETAD
;LCALL GETVA
;LCALL OUTVA
INC MCOUNT
MOV 6CH,#00H
MOV 6DH,#00H
MOV 6EH,#00H
MOV R0,#21H ;将第一次状态数据区首地址送入R0
SETB EX0 ;开外部中断0
LCALL COLLECT ;采集三块电路板的状态
LCALL OUTVA
INC MCOUNT
GO2: LCALL TRIGGER
INC COUNT
MOV A, MCOUNT
CJNE A,#08H,GO1
MOV MCOUNT,#00H
LCALL GETVA
GO1: LCALL OUTVA
INC MCOUNT
MOV A,COUNT
CJNE A,#63H,GO2
MOV A,#0FFH
MOV 6CH,A
MOV 6DH,A
MOV 6EH,A
MOV R0,#24H ;将第二次状态数据区首地址送入R0
LCALL COLLECT ;采集三块电路板的状态
LCALL DEAL ;对电路状态进行判断处理
LJMP REDO
;====================================================================================
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,T1工作在方式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,允许串口接收
MOV TCON ,#01H ;外部中断负边沿触发
MOV TH0 ,#0E5H
MOV TL0 ,#0F6H ;T0 6.7秒的初始化
MOV IE,#00H ;
MOV IP,#01H ;串口中断高优先级
SETB ES ;开串口中断
SETB ET0 ;开T0中断
; SETB EX0 ;开外部中断0
SETB TR1 ;启动T1
SETB EA ;开中断
RET
;作用:根据拨码开关的状态确定本机地址和485通信的波特率,并完成串口和20MS定时器的初始化
;=====================================================================================
; 延时子程序
SOMENOP : MOV COUNTER1,#00H
SOMENOP1: DJNZ COUNTER1,SOMENOP1
RET
;==================================================
START : CLR WP ;取消写保护
SETB SDA ;释放数据线
SETB SCL ;将时钟线置高
LCALL SOMENOP ;调用延时子程序
CLR SDA ;SDA产生一个由高到低的跳变
LCALL SOMENOP ;调用延时子程序
CLR SCL ;将时钟线置低
RET
;作用:用于产生总线上的数据传输起始信号
;入口:无
;出口:无
;子程序调用:SOMENOP
;寄存器占用:无
;===================================================
STOP :SETB SCL ;将时钟线置高
CLR SDA ;将数据线线置低
LCALL SOMENOP ;调用延时子程序
SETB SDA ;SDA产生一个由低到高的跳变
LCALL SOMENOP ;调用延时子程序
SETB WP ;设置写保护
RET
;作用:用于产生总线上的数据传输结束信号
;入口:无
;出口: 无
;子程序调用:SOMENOP
;寄存器占用:无
;===================================================
WACK :CLR SCL ;将时钟线置低
SETB SDA ;释放数据线
LCALL SOMENOP ;延时等待ACK信号出现
SETB SCL ;将时钟线置高
LCALL SOMENOP ;准备读取ACK信号
MOV C,SDA ;读取应答信号
JC WACK ;判断应答信号
CLR SDA ;将数据线线置低
CLR SCL ;将时钟线置低
RET
;作用:等待接受器发来应答信号
;入口:无
;出口: 无
;子程序调用:SOMENOP
;寄存器占用:PSW
;=============================================
ACK :CLR SDA ;产生低电平的ACK信号
LCALL SOMENOP ;延时
SETB SCL ;将时钟线置高
LCALL SOMENOP ;延时
CLR SCL ;将时钟线置低
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -