📄 main.asm
字号:
FLAG_CURE BIT 0H ;开始工作标志位,状态为1表示开始治疗
FLAG_END_CURE BIT 1H ;治疗时间到标志位,状态为1表示治疗时间到
FLAG_END_HZ BIT 2H ;电磁波脉冲时间到标志位,状态为1表示一个频率脉冲时间到
MCU_E2RAM BIT P1.6 ;继电器控制开关位,状态为0表示E2RAM由ARM控制
SCR_COIL_ON BIT P2.3
SCR_COIL_OFF BIT P2.2
SCR_RES_ON BIT P2.5
SCR_RES_OFF BIT P2.4
BIG_R BIT P2.6 ;大电阻继电器控制
MIN_R BIT P2.7 ;小电阻继电器控制
TEMP_ACQ_SNAP EQU 20H ;单片机写温度时间
CURE_TIME_SET EQU 22H ;设定的治疗时间所需的定时器0累积次数,从ARM获得
CURE_TIME_SUM EQU 23H ;治疗时间所需的定时器0累积次数
TEMP_SUM EQU 24H ;温度采集时间所需的定时器0累积次数
FREQ_SET EQU 25H ;设定的工作频率需要的定时器1累积次数,从ARM获得
FREQ_SUM EQU 26H ;工作频率需要的定时器1累积次数
ADDR EQU 32H
START EQU 33H
STOP EQU 34H
FRE EQU 35H
CURE_T EQU 36H
ORG 00H
LJMP MAIN
ORG 03H
LJMP INTR_GET_DATA
ORG 0BH
LJMP INTR_T_CURE
ORG 13H
LJMP MAIN
ORG 1BH
LJMP INTR_HZ
ORG 30H
MAIN: LCALL INIT ;
LCALL B_CURE ;
LCALL E_CURE ;
LJMP MAIN
;-----------------------
;********初始化*********
INIT: NOP
LCALL D200MS
CLR FLAG_END_CURE ;标志位初始化
CLR FLAG_END_HZ
CLR FLAG_CURE
MOV CURE_TIME_SUM,0H ;寄存器初始化
MOV FREQ_SUM,0H
MOV TEMP_SUM,0H
CLR MCU_E2RAM ;同ARM通讯继电器初始化,
SETB SCR_RES_ON ;放电线圈初始化
CLR SCR_RES_OFF
SETB SCR_COIL_ON ; 线圈初始化
CLR SCR_COIL_OFF
NOP ;MCS51单片机初始化
CLR IT0 ;外部中断0初始化,低电平有效
SETB EX0
MOV TMOD,11H ;定时器0、定时器1初始化
MOV TH0,15H ;定时器T0管理治疗时间
MOV TL0,9FH ;60ms
MOV TH1,0ECH ;定时器T1管理频率时间
MOV TL1,77H ;5ms
SETB EA
RET
;-----------------------
;********开始工作进行治疗*********
B_CURE: NOP
NOP
B_CURE0:NOP
JB FLAG_CURE,B_CURE0
SETB BIG_R ;控制大电阻继电器闭合
MOV R3,#0AH
DEL_2S: LCALL D200MS
DJNZ R3,DEL_2S ;电源通过大电阻充电
CLR MIN_R ;控制小电阻继电器闭合
LCALL D200MS ;大电阻,小电阻电路一起充电线圈关闭状态
SETB SCR_COIL_ON
B_CURE1:CLR SCR_COIL_OFF ;从 B_CURE到 B_CURE1为充电时间
NOP
NOP
B_CURE2:JB FLAG_END_CURE,E_CURE
CLR SCR_COIL_ON ;控制输出交变电压
SETB SCR_COIL_OFF
LCALL DEL_10MS
SETB SCR_COIL_ON
CLR SCR_COIL_OFF
B_CURE3:JNB FLAG_END_HZ,B_CURE3 ;改过
CLR FLAG_END_HZ
LJMP B_CURE2
RET
E_CURE: CLR FLAG_END_CURE
NOP
CLR TR0
CLR TR1
CLR ET0
CLR ET1
SETB SCR_COIL_ON ;控制输出交变电压
CLR SCR_COIL_OFF
SETB MIN_R ;控制小电阻继电器开
LCALL D200MS
CLR BIG_R ;控制大电阻继电器开
CLR SCR_RES_ON
SETB SCR_RES_OFF
LCALL D200MS
LCALL D200MS
LCALL D200MS
SETB SCR_RES_ON
CLR SCR_RES_OFF
RET
;-----------------------
;********外部中断0*********
INTR_GET_DATA: NOP
NOP
SETB MCU_E2RAM ;控制继电器位常闭状态,单片机控制E2RAM
LCALL D200MS
LCALL D200MS
MOV ADDR,#0A1H
LCALL READ_RAM ;单片机从e2ram的0xa1地址读取开始信号
MOV A,ADDR
MOV START,A ;未延时5ms
MOV ADDR,#0A2H
LCALL READ_RAM
MOV A,ADDR
MOV STOP,A ;读停止信号
MOV ADDR,#0A3H
LCALL READ_RAM
MOV A,ADDR
MOV FRE,A ;读频率设定
MOV ADDR,#0A4H
LCALL READ_RAM
MOV A,ADDR
MOV CURE_T,A ;读时间设定
CLR MCU_E2RAM ;控制继电器位常闭状态,ARM控制E2RAM
LCALL D200MS
MOV A,START
CJNE A,#55H,J_STOP ;;???与c中的对不上
SETB FLAG_CURE
MOV A,FRE
MOV DPTR,#TAB
CJNE A,#1,J_2
MOVC A,@A+DPTR
MOV FREQ_SET,A
J_2: CJNE A,#2,J_3
MOVC A,@A+DPTR
MOV FREQ_SET,A
J_3: CJNE A,#3,J_4
MOVC A,@A+DPTR
MOV FREQ_SET,A
J_4: CJNE A,#4,J_5
MOVC A,@A+DPTR
MOV FREQ_SET,A
J_5: CJNE A,#5,J_6
MOVC A,@A+DPTR
MOV FREQ_SET,A
J_6: CJNE A,#6,J_7
MOVC A,@A+DPTR
MOV FREQ_SET,A
J_7: SETB ET0
SETB ET1 ;定时器T1开启
SETB TR0
SETB TR1
RETI
J_STOP: NOP
NOP
SETB FLAG_END_CURE
RETI ;是reti 还是ret?
;-----------------------
;********定时器1中断*********
INTR_HZ:NOP
NOP
CLR TR1
CLR ET1
INC FREQ_SUM
MOV A,FREQ_SET
CJNE A,FREQ_SUM,I_HZ
SETB FLAG_END_HZ
MOV FREQ_SUM,0H
I_HZ: MOV TH1,0ECH ;5ms
MOV TL1,77H
SETB ET1 ;定时器T1开启
SETB TR1
RETI
;-----------------------
;********定时器0中断*********
INTR_T_CURE:NOP
NOP
CLR TR0
CLR ET0
INC CURE_TIME_SUM
INC TEMP_SUM
MOV A,TEMP_SUM
CJNE A,#250,I_CURE ;15S间隔采集一次温度数据
LCALL TEMP_GET
MOV TEMP_SUM,#0H
I_CURE: NOP
MOV A,CURE_TIME_SUM
CJNE A,CURE_TIME_SET,IT_CURE
SETB FLAG_END_CURE
CLR CURE_TIME_SUM
IT_CURE:MOV TH0,15H
MOV TL0,9FH
SETB ET0
SETB TR0 ;定时器T0管理治疗时间
RETI
DEL_10MS:NOP
NOP
MOV R1,#8H ; 8(5*250+2)=10MS
D101S: MOV R2,#0FAH
D102S: NOP
NOP
NOP
DJNZ R2,D101S
DJNZ R1,D102S
RET
D200MS: NOP
NOP
MOV R1,#09CH ; 156(5*256+2)=200MS
D2001S:MOV R2,#0FFH
D2002S:NOP
NOP
NOP
DJNZ R2,D2001S
DJNZ R1,D2002S
RET
DEL1: NOP
NOP
RET
DEL10MS:NOP
NOP
RET
TAB: DB 0H,200,40,20,12,10,8
;**************************************************************************************
; IIC子程序 *
; *
;**************************************************************************************
SDA EQU P1.5
SCL EQU P1.4
SLA DATA 0A0H
HIGH1 DATA 00H
ADDR DATA 0A1H
ACK BIT 3H ;ACK为应答信号
PRM EQU 40H
B0 EQU 43H ;温度参数
S EQU 44H ;发送来的温度
RETC EQU 41H ; 读数据位,接收的数据放入retc中
ACK_A BIT 05H
START_I2C: SETB SDA ;发送起始条件的数据信号
NOP
SETB SCL
NOP ;起始条件建立时间大于4.7us,延时
NOP
NOP
NOP
NOP
CLR SDA ;发送起始信号
NOP ;起始条件锁定时间大于4μs
NOP
NOP
NOP
NOP
CLR SCL ;钳住I2C总线,准备发送或接收数据
NOP
NOP
RET
STOP_I2C: CLR SDA
NOP
SETB SCL
NOP
NOP
NOP
NOP
NOP
SETB SDA
NOP
NOP
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -