📄 control.asm
字号:
WP EQU P1.0
SCL EQU P1.1
SDA EQU P1.2
DIR EQU P1.7
SHORT BIT 00H ;短路标志位
CUT BIT 01H ;断路标志位
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 ;触发个数计数器
;=====================================================================================
ORG 000H
SJMP MAIN
ORG 0023H
LJMP RXSVE
MAIN: MOV SP, #50H ;设立栈底
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通信的波特率
;mov r0,#0 ;并完成串口和20MS定时器的初始化
REDO: LCALL COPY ;将24路的加热数据送入相应的加热计数器中
MOV COUNT,#64H ;初始化计数器
NEXT: LCALL ON ;触发一次
LCALL D1MS
MOV R0,#21H ;将第一次状态数据区首地址送入R0
LCALL COLLECT ;采集三块电路板的状态
CLR TR0
WORK: LCALL TRIGGER ;进行一次触发
MOV TL0,#18H ;T0定时2MS初始化
MOV TH0,#0FcH
SETB TR0
JNB TF0, $ ;等待2MS时间到
CLR TR0
CLR TF0 ;清TF0
DJNZ COUNT , WORK ;100次结束?
LCALL OFF ;第二次电路状态采集
LCALL DELAY
MOV R0,#24H ;将第二次状态数据区首地址送入R0
LCALL COLLECT ;采集三块电路板的状态
LCALL DEAL ;对电路状态进行判断处理
LJMP REDO
;------------------------------------------------------------------------------------
; 延时子程序
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 ;将时钟线置低
RET
;作用:向发送器发送应答信号
;入口:无
;出口: 无
;子程序调用:SOMENOP
;寄存器占用:无
;=================================================
NACK : SETB SDA ;产生高电平的NACK信号
LCALL SOMENOP ;延时
SETB SCL ;将时钟线置高
LCALL SOMENOP ;延时
CLR SCL ;将时钟线置低
RET
;作用:向发送器发送NACK信号
;入口:无
;出口: 无
;子程序调用:SOMENOP
;寄存器占用:无
;===========================================
SBYTE : MOV COUNTER,#8H ;发出8个数据位
SBYTE1 : CLR SCL ;将时钟线置为低电平
RLC A ;最高位移入C中
MOV SDA,C ;送入数据线
LCALL SOMENOP ;延时
SETB SCL ;将时钟线置为高电平
LCALL SOMENOP ;延时
DJNZ COUNTER,SBYTE1 ;判断8个数据位是否发送完毕
CLR SCL ;发送完毕将时钟线置为低电平
RET
;作用:向接受器发送一个字节数据
;入口:ACC(待发送的数据)
;出口: 无
;子程序调用:SOMENOP
;寄存器占用:ACC,PSW,COUNTER
;==================================================
RBYTE :MOV COUNTER,#8H ;共接收8个数据位
CLR A ;将A清零
SETB SDA ;释放数据线
RBYTE1 :CLR SCL ;将时钟线置低
LCALL SOMENOP ;延时
SETB SCL ;将时钟线置高
LCALL SOMENOP ;延时
MOV C,SDA ;读入一位数据
RLC A ;移入A中
SETB SDA ;释放总线
DJNZ COUNTER,RBYTE1;判断是否接收完8位数据
MOV RI2CDATA,A ;接受完后存入读数据暂存器
CLR SCL ;将时钟线置低
RET
;作用:从发送器接收一个字节的数据
;入口:无
;出口: RI2CDATA
;子程序调用:SOMENOP
;寄存器占用:ACC,PSW,COUNTER,RI2CDATA
;=====================================================
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的应答
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -