⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.asm

📁 IIC汇编子程序 在伟福仿真器调试通过 在主程序中 直接复制即可使用!
💻 ASM
📖 第 1 页 / 共 2 页
字号:
        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 + -