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

📄 controller.asm

📁 Controller of Axial Blood Pump
💻 ASM
字号:
	TBLOCK	DATA	20H
	RBLOCK	DATA	30H
	CYCLE	DATA	40H
	PACE	DATA	44H
	DIVDD	DATA	47H
	MIDL	DATA	4BH
	MIDH	DATA	4CH
	REMDR	DATA	4EH
	COUNT	DATA	52H
	STEP	EQU 	32H
	INUM	EQU 	04H
	TCP	EQU	00H
	RCMD	EQU     0FFH
	TCMD	EQU     00FH

		ORG 0000H
		JMP START
		ORG 0003H
		LJMP ADINT
		ORG 000BH
		LJMP OUTPUT
		ORG 0013H
		LJMP KEYINT
		ORG 001BH

		ORG 0023H
		LJMP SERINT

		ORG 0080H
START:	        MOV SP,#57H
		MOV R7,#INUM		;/* 初始化AD接口 */
		MOV P2,#0BFH
		MOV A,#0F7H
		ADD A,R7
		MOV R0,A
		MOVX @R0,A
		MOV DPTR,#7FFFH		;/* 初始化8279 */
		MOV A,#0D1H
		MOVX @DPTR,A            ;/* 清除RAM和FIFO */
		NOP
		NOP
LOOP:	        MOVX A,@DPTR
		JB ACC.7,LOOP           ;/* 测试清除完毕?*/
		MOV A,#34H
		MOVX @DPTR,A            ;/* 设置时钟为20分频 */
		MOV A,#0
		MOVX @DPTR,A            ;/* 设置键盘方式 */
		MOV IE,#86H		;/* 中断系统设置(只有键盘及输出功能,开通所有功能应设为#97H) */
		MOV TMOD,#20H		;/* 定时器工作方式设置,T1方式2,T0方式0,13位计数器 */
		MOV SCON,#50H		;/* 串口方式设置 */
		MOV R1,#DIVDD		;/* 常量初始化 */
		MOV @R1,#0F0H
		INC R1
		MOV @R1,#49H
		INC R1
		MOV @R1,#2
		MOV R6,#STEP
		MOV R5,#4
		MOV R3,#01H		 ;/* 定时初值初始化 */
		MOV R4,#0D7H		 ;/* 此定时初值对应转速230r/min,可保证CYCLE为两字节 */
		MOV TL1,#0FDH		 ;/* 串口通讯的波特率设置 =9.6K */
		MOV TH1,#0FDH
		SETB TR1
		MOV R2,#4
MAIN:					 ;/* 键盘响应程序,循环执行 */
		MOV A,R2
		MOV DPTR,#PTAB
		MOVC A,@A+DPTR		 ;/* 查表并转相应响应程序 */
		JMP @A+DPTR
                
PTAB:	        DB ERR-PTAB                       ;/* 键盘响应分支程序表 */
                DB ACCE-PTAB
                DB STARTUP-PTAB
		DB QUERY-PTAB
                DB KEEP-PTAB
                DB DECE-PTAB
						  ;/* 各路分支程序 */
ERR:	        NOP
		LJMP MAIN
ACCE:	        INC R3                            ;/* 加速 */
		CJNE R3,#20H,NEXT
		MOV R3,#0
		INC R4
		CJNE R4,#0FFH,NEXT		  ;/* 上限9400r/min,达到则转保持*/
		MOV R2,#4
		JMP NEXT
STARTUP:
		NOP				  ;/* 启动&停止*/
		MOV TL0,R3
		MOV TH0,R4
		CPL TR0
		LJMP MAIN
QUERY:	        NOP 			          ;/* 查询 */
		LJMP MAIN
KEEP:	        NOP			          ;/* 保持 */
		LJMP MAIN
DECE:	        DEC R3				  ;/* 减速 */
		CJNE R3,#0FFH,NEXT
		MOV R3,#1FH
		DEC R4
NEXT:	        NOP
		CALL CALC
		CALL DISPY
		LJMP MAIN
ADINT:					 ;/* AD转换中断子程序 */
		PUSH PSW		 ;/* 将选中通道的采样值处理后保存到指定单元 */
		PUSH ACC
		PUSH DPL
		PUSH DPH
		MOV P2,#0BFH
		MOV A,#TBLOCK
		ADD A,R7
		DEC A
		MOV R0,A
		MOVX A,@R0
		MOV @R0,A
		DJNZ R7,NEXT0
		MOV R7,#INUM
NEXT0:	        MOV A,#0F7H
		ADD A,R7
		MOV R0,A
		MOVX @R0,A
		POP DPH
		POP DPL
		POP ACC
		POP PSW

OUTPUT:						 ;/* 输出中断子程序 */
		PUSH PSW			 ;/* 根据输出状态寄存器R5值将输出时序表中相应内容送P1口 */
		PUSH ACC
		PUSH DPL
		PUSH DPH
		DJNZ R6,NEXT1
		MOV R6,#STEP
		MOV DPTR,#STAB
		MOV A,R5
		MOVC A,@A+DPTR		         ;/* 查表输出 */
		MOV P1,A
		DJNZ R5,NEXT1
		MOV R5,#4
NEXT1:	        MOV TL0,R3			 ;/* 重载定时初值并返回 */
		MOV TH0,R4
		POP DPH
		POP DPL
		POP ACC
		POP PSW
		RETI

KEYINT:						;/* 按键检测及识别中断子程序 */
		PUSH PSW			;/* 读扫描键值并转换成有序码,存储到指定状态寄存器R2 */
		PUSH ACC
		PUSH DPL
		PUSH DPH
		MOV DPTR,#7FFFH
		MOV A,#40H
		MOVX @DPTR,A	                ;/* 寻址,写读数据命令 */
		MOV DPTR,#6FFFH
		MOVX A,@DPTR		        ;/* 读扫描键值 */
		ANL A,#3FH
		MOV DPTR,#KTAB		        ;/* 查表转换成有序码 */
		MOVC A,@A+DPTR
		MOV R2,A			;/* 保存到指定状态寄存器R2 */
		POP DPH
		POP DPL
		POP ACC
		POP PSW
		RETI

SERINT:						;/* 串口通讯中断子程序 */
		PUSH PSW
		PUSH ACC
		MOV A,SBUF
		CJNE A,#TCP,QUIT
		CLR RI
		CLR ES
		JNB RI,$
		MOV A,SBUF
		CJNE A,#RCMD,NEXT2
RECV:	        MOV R1,#RBLOCK		        ;/* 接收程序块 */
		MOV SCON,#40H
		MOV SBUF,#0FFH
		MOV SCON,#50H
		JNB TI,$
		CLR TI
		CLR RI
LOOP0:	        JNB RI,$
		CLR RI
		MOV A,SBUF
		MOV @R1,A
		INC R1
		CJNE R1,#20H,LOOP0
		JMP QUIT
NEXT2:	        CJNE A,#TCMD,QUIT
SEND:	        MOV SCON,#40H		        ;/* 发送程序块 */
		MOV R0,#TBLOCK
		MOV SBUF,#7FH
		JNB TI,$
		CLR TI
LOOP1:	        MOV A,@R0
		MOV SBUF,A
		INC R0
		JNB TI,$
		CLR TI
		CJNE R0,#10H,LOOP1
		MOV SCON,#50H
QUIT:	        SETB ES			        ;/* 中断返回 */
		POP ACC
		POP PSW
		RETI

CALC:						;/* 转速计算子程序 */
		MOV MIDL,R3			;/* 计算转速,并转换成BCD码,存储到固定单元PACE */
		MOV MIDH,R4			;/* 参数传递 */
		MOV A,MIDL
		RL A				;/* 低字节左移3位 */
		RL A
		RL A
		MOV MIDL,A
		MOV COUNT,#3
LOOP2:	        CLR C				;/* 整体右移3位 */
		MOV A,MIDH
		RRC A
		MOV MIDH,A
		MOV A,MIDL
		RRC A
		MOV MIDL,A
		DJNZ COUNT,LOOP2
		CLR C				;/* 满溢值 - 初值 */
		CLR A
		SUBB A,MIDL
		MOV MIDL,A
		MOV A,#20H
		SUBB A,MIDH
		MOV MIDH,A
		MOV R1,#MIDL		        ;/* 乘以步长,将结果保存到CYCLE中 */
		MOV A,@R1
		MOV B,#STEP
		MUL AB
		MOV R0,#CYCLE
		MOV @R0,A
		INC R0
		INC R1
		MOV @R0,B
		MOV A,@R1
		MOV B,#STEP
		MUL AB
		ADDC A,@R0
		MOV @R0,A		        ;/* 以上计算一次状态改变所用的时间并保存到CYCLE中 */

		MOV R1,#DIVDD	                ;/* 被除数值传递 */
		MOV R0,#REMDR
		MOV COUNT,#3
LOOP3:	        MOV A,@R1
		MOV @R0,A
		INC R1
		INC R0
		DJNZ COUNT,LOOP3

		MOV B,#8		        ;/* 除法计算,移位相减法,三字节除以两字节 */
DIVL:	        CLR C
		MOV R0,#REMDR
		MOV A,@R0
		RLC A
		MOV @R0,A
		INC R0
		MOV A,@R0
		RLC A
		MOV @R0,A
		INC R0
		XCH A,@R0
		RLC A
		XCH A,@R0
		MOV F0,C
		CLR C
		MOV R1,#CYCLE
		SUBB A,@R1
		MOV MIDL,A
		INC R1
		MOV A,@R0
		SUBB A,@R1
		JB F0,DVME
		JC DMDE
DVME:	MOV @R0,A
		MOV A,MIDL
		DEC R0
		MOV @R0,A
		INC REMDR
DMDE:	        DJNZ B,DIVL
		CLR F0
		MOV R1,#PACE
		MOV A,REMDR
		MOV B,#10
		DIV AB
		MOV @R1,A
		INC R1
		MOV @R1,B
		RET

DISPY:						  ;/* 显示子程序 */
		MOV DPTR,#7FFFH		          ;/* 将固定转速单元PACE中内容送到8279显示RAM */
		MOV A,#90H
		MOVX @DPTR,A
		MOV DPTR,#6FFFH
		MOV R0,#PACE
		MOV A,@R0
		MOVX @DPTR,A
		INC R0
		MOV A,@R0
		MOVX @DPTR,A
		RET

KTAB:	        DB 01H	02H 03H 00H  00H	  ;/* 键的有序数码转换表 */
		DB 00H  00H 00H 04H  05H
STAB:	        DB 0FFH 55H 99H 0AAH 66H          ;/* 输出时序表,倒序 */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -