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

📄 跑步机.asm

📁 本程式为跑步机电子表显示的完整程式,有仔细的注解
💻 ASM
📖 第 1 页 / 共 4 页
字号:
	CJNE	A,#10,SWTFAEND
	MOV	CNT_FAST,#0
	SETB	F_ADD
	JMP	SWTFAEND
SWTFAEN:
	INC	CNT_FAST
	MOV	A,CNT_FAST
	CJNE	A,#50,SWTFAEND
	SETB	F_SW_FALOCK1
	MOV	CNT_FAST,#0
	JMP	SWTFAEND
SWTFACLR:
	MOV	CNT_FAST,#0
	MOV	CNT_FLOCK,#0
	CLR	F_SW_FASTEN
	CLR	F_SW_FALOCK1
	CLR	F_SW_FALOCK2
SWTFAEND:

;================================================================

;减速按键检测

SWT_SLOW:
	JNB	S_SLOW,SWTSLCLR	
	JB	F_SW_SLLOCK2,SWTSLLOCK2
	JB	F_SW_SLLOCK1,SWTSLLOCK1
	JB	F_SW_SLOWEN,SWTSLEN
	SETB	F_SW_SLOWEN
	SETB	F_SUB
	MOV	CNT_SLOW,#0
	MOV	CNT_SLOCK,#0
	JMP	SWTSLEND
SWTSLLOCK1:
	INC	CNT_SLOW
	MOV	A,CNT_SLOW
	CJNE	A,#30,SWTSLEND
	MOV	CNT_SLOW,#0
	SETB	F_SUB
	INC	CNT_SLOCK
	MOV	A,CNT_SLOCK
	CJNE	A,#5,SWTSLEND
	SETB	F_SW_SLLOCK2
	JMP	SWTSLEND
SWTSLLOCK2:
	INC	CNT_SLOW
	MOV	A,CNT_SLOW
	CJNE	A,#10,SWTSLEND
	MOV	CNT_SLOW,#0
	SETB	F_SUB
	JMP	SWTSLEND
SWTSLEN:
	INC	CNT_SLOW
	MOV	A,CNT_SLOW
	CJNE	A,#50,SWTSLEND
	SETB	F_SW_SLLOCK1
	MOV	CNT_SLOW,#0
	JMP	SWTSLEND
SWTSLCLR:
	MOV	CNT_SLOW,#0
	MOV	CNT_SLOCK,#0
	CLR	F_SW_SLOWEN
	CLR	F_SW_SLLOCK1
	CLR	F_SW_SLLOCK2
SWTSLEND:

;================================================================
;清除键长按检测
;长按1秒清0
SWT_CLR:
	JNB	S_STOP,SWTCLRC
	INC	TM_SWCLR
	MOV	A,TM_SWCLR
	CJNE	A,#80,SWTCLREND
	SETB	F_CLR
SWTCLRC:		
	MOV	TM_SWCLR,#0
SWTCLREND:

;*****************************************************

;程式段计时(16段)

;*****************************************************
;计算方式为1分/程式段==单位计时
prodatset:
	JB	F_START,PDATSET1
	jmp	PDATSETEND
PDATSET1:
	MOV	A,#01H
	ADD	A,XX_PRODATL
	MOV	XX_PRODATL,A
	MOV	A,#0H
	ADDC	A,XX_PRODATH
	MOV	XX_PRODATH,A
	
	CLR	C
	MOV	A,XX_PRODATL	;计时值比较
	SUBB	A,#077H
	MOV	A,XX_PRODATH
	SUBB	A,#01H
	JC	PDATSETEND	;时间未到转结束

	MOV	XX_PRODATL,#0
	MOV	XX_PRODATH,#0
	INC	TIM_PRODAT
	MOV	A,TIM_PRODAT
	CJNE	A,L_PRODAT,PDATSETEND
	MOV	TIM_PRODAT,#0
	SETB	F_DAT_OVER
pdatsetend:

;============================================================
;倒计时启动与程式转换计时
TM_STAND:
	JNB	F_STAND,TM_STANDC
	INC	CNT_STAND
	MOV	A,CNT_STAND
	CJNE	A,#100,TM_STANDEND
	SETB	F_BUEN
	MOV	CNT_STAND,#0
	DEC	CNT_STA
	MOV	A,CNT_STA	
	CJNE	A,#0,TM_STANDEND
	MOV	CNT_STA,#1
TM_STANDC:
	MOV	CNT_STAND,#0
	CLR	F_STAND	
TM_STANDEND:	
;==============================================================
;运动计时/设定值倒计时
;==============================================================
TIM:
	JB	F_START,TIMIN
	CLR	F_TM		;时间双点显示标志
	JMP	TIMEND
TIMIN:
	INC	TM_SS
	CLR	C
	MOV	A,TM_SS
	SUBB	A,#50
	JC	TIMA
	CLR	F_TM
	JMP	TIMB	
TIMA:	SETB	F_TM	
TIMB:	MOV	A,TM_SS
	CJNE	A,#100,TIMEND
	MOV	TM_SS,#0

	MOV	R1,#TIMEL
	MOV	R0,#TIMEH
	INC	@R1
	CJNE	@R1,#60,TIM1
	MOV	@R1,#0
	INC	@R0
	CJNE	@R0,#100,TIM1
	MOV	@R0,#0
;	SETB	SW_STOP
TIM1:
	MOV	R0,#SET_TIMEH
	MOV	R1,#SET_TIMEL
	CJNE	@R0,#0,TIM2
	CJNE	@R1,#0,TIM2
	JMP	TIMEND
TIM2:
	MOV	A,@R1
	JZ	TIM3
	CLR	C
	MOV	A,@R1
	SUBB	A,#01H
	MOV	@R1,A
	JMP	TIM4
TIM3:	
	MOV	@R1,#59
	DEC	@R0
TIM4:	
	CJNE	@R0,#0,TIMEND
	CJNE	@R1,#0,TIMEND
	SETB	F_SET_OVER
TIMEND:
;================================================================
;里程累计:
DIS:
	JB	F_START,DISA	;测启动标志
	JMP	DISEND		;没有转结束
DISA:	MOV	A,#1
	ADD	A,CNT_DISL
	MOV	CNT_DISL,A
	MOV	A,#0
	ADDC	A,CNT_DISH
	MOV	CNT_DISH,A
	
	CLR	C
	MOV	A,CNT_DISL
	SUBB	A,DAMPL
	MOV	A,CNT_DISH
	SUBB	A,DAMPH
	JC	DISEND
	
	MOV	CNT_DISH,#0
	MOV	CNT_DISL,#0
	
	INC	CNT_D1
	MOV	A,CNT_D1
	CJNE	A,#16,DISC
	MOV	CNT_D1,#0
DISC:	
	MOV	R0,#DISH
	MOV	R1,#DISL
	MOV	A,#01H		;正向里程累加
	ADD	A,@R1
	MOV	@R1,A
	MOV	A,#0
	ADDC	A,@R0
	MOV	@R0,A
	
	CJNE	@R0,#27H,DISE	;溢出检测与处理
	CJNE	@R1,#010H,DISE
	MOV	@R0,#0
	MOV	@R1,#0
DISE:	
	MOV	R0,#SET_DISH	;检测里程设定值,为0转结束
	MOV	R1,#SET_DISL
	MOV	A,@R0
	JNZ	DISF
	MOV	A,@R1
	JNZ	DISF
	JMP	DISEND
DISF:	
	CLR	C
	MOV	A,@R1		;里程设定值递减
	SUBB	A,#01H
	MOV	@R1,A
	MOV	A,@R0
	SUBB	A,#0
	MOV	@R0,A
	JNZ	DISEND		;里程值到0检测
	MOV	A,@R1
	JNZ	DISEND
	SETB	F_SET_OVER	;到0时,置设定定到0标志
DISEND:	

;==============================================================
;100MS倍时
TMX:	INC	TM_S
	MOV	A,TM_S
	CJNE	A,#10,TMXEND
	MOV	TM_S,#0
	JMP	TMXOVER
TMXEND:	JMP	TM1SUBEND
TMXOVER:
;============================================================
;发送信息控制
SENDCON:
	JB	PTST,SENDCONC
	MOV	A,CNT_REV
	JB	ACC.1,SENDCON_INCL
SENDCON_SPD:
	MOV	R0,#INCL
	MOV	BUF_INCL,@R0
	MOV	DAT_TH,#00010101B
	MOV	DAT_TL,BUF_SPD
	JMP	SENDCONR
SENDCON_INCL:
	MOV	BUF_SPD,C_SPD
	MOV	DAT_TH,#00010010B
	MOV	DAT_TL,BUF_INCL
SENDCONR:
	MOV	R0,#3
SENDCONR1:	
	MOV	A,DAT_TL
	RLC	A
	MOV	DAT_TL,A
	MOV	A,DAT_TH
	RLC	A
	MOV	DAT_TH,A
	DJNZ	R0,SENDCONR1
	SETB	F_SENDEN
	JMP	SENDCONEND
SENDCONC:
	CLR	F_SENDEN
SENDCONEND:	
;============================================================
;热量累计:
CALO:	
	JB	F_START,CALOA
	JMP	CALOEND		
CALOA:	
	MOV	A,#01H		;里程计数器累加
	ADD	A,CNT_CALOL
	MOV	CNT_CALOL,A
	MOV	A,#0
	ADDC	A,CNT_CALOH
	MOV	CNT_CALOH,A
	
	CLR	C
	MOV	A,CNT_CALOL	;计时比较
	SUBB	A,CAMPL		;未到转结束
	MOV	A,CNT_CALOH
	SUBB	A,CAMPH
	JC	CALOEND
	
	MOV	CNT_CALOH,#0
	MOV	CNT_CALOL,#0

	MOV	R0,#CALOH
	MOV	R1,#CALOL
	MOV	A,#01H
	ADD	A,@R1
	MOV	@R1,A
	MOV	A,#0H
	ADDC	A,@R0
	MOV	@R0,A

	CJNE	@R0,#03H,CALOB
	CJNE	@R1,#0E8H,CALOB
	MOV	@R0,#0
	MOV	@R1,#0
CALOB:
	MOV	R0,#SET_CALOH	
	MOV	R1,#SET_CALOL
	MOV	A,@R0		;热量设定值为0检测
	JNZ	CALOC
	MOV	A,@R1
	JNZ	CALOC
	JMP	CALOEND
CALOC:	
	CLR	C
	MOV	A,@R1		;热量设定值递减
	SUBB	A,#01H
	MOV	@R1,A
	MOV	A,@R0
	SUBB	A,#0
	MOV	@R0,A
		
	MOV	A,@R0
	JNZ	CALOEND
	MOV	A,@R1
	JNZ	CALOEND
	SETB	F_SET_OVER		
CALOEND:
;============================================================	
TRUN:	JNB	F_RUNEN,TRUNEND
	INC	NUM_RUN
	MOV	A,NUM_RUN
	CJNE	A,#16,TRUNEND
	MOV	NUM_RUN,#0
TRUNEND:						
;============================================================
TM_DISF:
	JNB	F_SPD_DISF,TM_DISFC
	INC	TM_SPD_DISF
	MOV	A,TM_SPD_DISF
	CJNE	A,#10,TM_DISFEND
TM_DISFC:
	MOV	TM_SPD_DISF,#0
	CLR	F_SPD_DISF
	SETB	F_SPDSET
TM_DISFEND:	
;************************************************************

;心跳检测

;************************************************************	
ptmtst:
	MOV	R1,#PULSE
	INC	TM_PUL
	MOV	A,TM_PUL
	SUBB	A,#75
	JC	PTMTSTEND
	CLR	C
	MOV	A,PULSEL_1L8		;心跳最低值检测
	SUBB	A,#03H
	JC	PTMTST1			;小于最低值,认为无心跳
	SETB	F_EN_PUL		;设置心跳有效标志
	MOV	TM_CLR,#0		;清30秒清0计时器
	MOV	A,PULSEL_1L8		;1/8心跳值与老的7/8心跳值加
	ADD	A,PULSEL_7L8
	MOV	@R1,A			;得到新的心跳值		
	CLR	C			;求1/8心跳值
	RRC	A
	CLR	C
	RRC	A
	CLR	C
	RRC	A
	MOV	PULSEL_1L8,A		;1/8心跳值		
	CLR	C
	MOV	A,@R1
	SUBB	A,PULSEL_1L8
	MOV	PULSEL_7L8,A		;得到新的7/8心跳值	
	JMP	PTMTSTEND1
ptmtst1:
	clr	F_EN_PUL		;清心跳使能标志
PTMTSTEND1:	
	MOV	PULSEL_1L8,#0
	MOV	TM_PUL,#0
PTMTSTEND:
;****************************************************

;心率闪烁检测与显示设定

;****************************************************

tstp:	SETB	PULIN
	JB	F_PULE,TSTP1	;测脉搏电平标志,为高测低,为低测高
	JNB	PULIN,TSTPEND
	SETB	F_PULE
tstp1:	JB	PULIN,TSTPEND		;检测口电平
	CLR	F_PULE
	INC	PULSEL_1L8
tstpend:
;**************************************************************
;闪烁计时:
;**************************************************************
TM_BLKA:
	JNB	F_STPBLK,TM_BLKB
	MOV	TM_BLK,#0
	CLR	F_BLINKEN
	INC	TM_STPBLK
	MOV	A,TM_STPBLK
	CJNE	A,#20,TM_BLKEND
	CLR	F_STPBLK
TM_BLKB:
	MOV	TM_STPBLK,#0
	INC	TM_BLK
	MOV	A,TM_BLK
	CJNE	A,#5,TM_BLKEND
	MOV	TM_BLK,#0
	JB	F_BLINKEN,TM_BLKB1
	SETB	F_blinken
	JMP	TM_BLKEND
TM_BLKB1:
	CLR	F_BLINKEN
TM_BLKEND:

;==============================================================
;2.5S倍时
TMX1:	INC	TM_S1
	MOV	A,TM_S1
	CJNE	A,#25,TMX1END
	MOV	TM_S1,#0
	JMP	TMX1OVER
TMX1END:JMP	TM1SUBEND
TMX1OVER:
;==============================================================
;40秒清0计时
TMCLR:
	JB	F_START,TMCLR1
	INC	TM_CLR
	MOV	A,TM_CLR
	CJNE	A,#3,TMCLR0
	SETB	F_CLRS
TMCLR0:	
	MOV	A,TM_CLR
	CJNE	A,#25,TMCLREND
	SETB	F_CLR
TMCLR1:	MOV	TM_CLR,#0
TMCLREND:
;=============================================================
;10分无负载关机计时
TMTNOP:
	JB	F_START,TMTNOPCLR
	INC	TM_NOP
	MOV	A,TM_NOP
	CJNE	A,#240,TMTNOPEND	
	SETB	F_NOP
	JMP	TMTNOPEND
TMTNOPCLR:
	MOV	TM_NOP,#0
	CLR	F_NOP
TMTNOPEND:
;*********************************************************
TM1SUBEND:
	INTOUT	
	RETI
;---------------------------------------------------------	








;----------------------------------------------------------
START_R:
	CLR	BU
	MOV	COUNT,#200
	DJNZ	COUNT,$
	MOV	SP,#0E0H	
;延时:
	MOV	R0,#200
DL0:	MOV	R1,#200
DL1:	DJNZ	R1,DL1
	DJNZ	R0,DL0
	
	CALL	SCLR
	CALL	DC2AMPL
	JMP	SCLREND
;==========================================================
;通用寄存器清0
;高低128位:
SCLR:
	MOV	R0,#0C0H
SCLR1:	
	MOV	@R0,#0H
	DJNZ	R0,SCLR1
;设置初值
	MOV	R0,#SPEED
	MOV	@R0,#10		;速度为1.5KM
	MOV	R0,#PULSEL_7L8
	MOV	@R0,#70	
	MOV	LSPD,#10
	MOV	HSPD,#120
	RET
SCLREND:
;==========================================================
;定时器0/1设置
TMSET:	MOV	TMOD,#00010000B	;设置计时器0为13位,计时器1为16位
	MOV	TH0,#11001110B	;T0初值
	MOV	TL0,#00000000B
	MOV	TH1,#0B1H	;T1初值
	MOV	TL1,#0E0H
	MOV	TCON,#01010000B	;启动T0/T1 关毕外部中断0/1
;==========================================================
;中断设置
INTSET:	MOV	IE,#10001010B	;开启T0/T1中断
;==========================================================
;显示测试与初始化
DISST:
RESET:
	CLR	BU
	CLR	F_BUEN
	CLR	F_BUENS
	CLR	F_NOP
	MOV	TM_NOP,#0
	CALL	DISALL
	MOV	A,#100
	CALL	DELAY
	SETB	BU
	MOV	A,#20
	CALL	DELAY
	CLR	BU

;----------------------------------------------------------
MCLR:
	SETB	BU
	MOV	A,#50
	CALL	DELAY
	CLR	BU
	CALL	CLRALL	
	CALL	SETLRES
	CALL	SPD2RAM
	MOV	R0,#SPEED
	MOV	@R0,LSPD
	CALL	DC2AMPL	
	MOV	R0,#PULSEL_7L8
	MOV	@R0,#70		
;---------------------------------------------------------
MAIN:	SETB	F_RUNEN
;----------------------------------------------------------
;无负载关机检测	
NOPSET:
	JB	F_NOP,NOPSIN
	JMP	NOPTSTEND
NOPSIN:	CALL	DISOFF
	CALL	SWCLR
NOPS1:	MOV	A,FLAG_SW
	CJNE	A,#0,NOPRET
	MOV	A,FLAG_SW1
	CJNE	A,#0,NOPRET
	JMP	NOPS1
NOPRET:	JMP	RESET
NOPTSTEND:					
;----------------------------------------------------------
;安全开关检测
LIFESET:
	SETB	PTST
	JB	PTST,LIFEIN
	JMP	LIFESETEND
LIFEIN:	
	CALL	SWCLR
	CALL	DISOFF
	MOV	R0,#DPY1
LIFEI1:	CJNE	R0,#DPY6,LIFEI2
	MOV	@R0,#00000010B
	JMP	LIFEI4
LIFEI2:	CJNE	R0,#DPY7,LIFEI3
	MOV	@R0,#00000010B
	JMP	LIFEI4
LIFEI3:	MOV	@R0,#01000000B
LIFEI4:	INC	R0
	CJNE	R0,#DPY10+1,LIFEI1
		
	MOV	CNT_BUS,#10
	SETB	F_BUENS
LIF1:	JNB	F_NOP,LIF2
	JMP	LIFESETEND
LIF2:	JB	F_BUENS,LIF3	

	MOV	A,5D
	CALL	DELAY
LIF3:	SETB	PTST	
	JB	PTST,LIF1
	MOV	A,#10
	CALL	DELAY
	JMP	RESET
LIFESETEND:	
;----------------------------------------------------------
;错误信号检测	
ERRSET:
	JB	F_ERR,ERRIN
	JMP	ERRSETEND
ERRIN:	
	CLR	F_START	
	CALL	DISOFF
	MOV	R0,#DPY1
	MOV	@R0,#01111001B
	INC	R0
	MOV	@R0,#00111111B
	INC	R0
	MOV	A,CNT_ERR
	CALL	BCD2DIS
	MOV	@R0,A
	MOV	CNT_BUS,#5
	SETB	F_BUENS
	CLR	F_CLR
	MOV	TM_CLR,#0
ERRS1:	SETB	PTST
	JNB	PTST,ERRS2
	JMP	LIFESET
ERRS2:	JNB	F_CLR,ERRS1		
	JMP	MCLR
ERRSETEND:
;----------------------------------------------------------
	CALL	MODETST	
;---------------------------------------------------------	
;----------------------------------------------------------
;模式/程式跳转
MODEJMP:
	MOV	A,CNT_MODE
        CJNE    A,#0,MDJ0
        JMP     MODE_NEM
MDJ0:   CJNE	A,#1,MDJ1
	JMP	MODE_TIM	
MDJ1:	CJNE	A,#2,MDJ2
	JMP	MODE_DIS
MDJ2:	CJNE	A,#15,MDJ3
	JMP	MODE_BMI
MDJ3:	JMP	MODE_PRO	
;==========================================================
;正常模式
MODE_NEM:
        MOV     DISM_TIME,#0
        MOV     DISM_DIS,#0
        MOV     DISM_CALO,#0
        MOV	DISM_SPD,#0
        CLR     F_BLK_TIM
        CLR     F_BLK_DIS
        CLR     F_BLK_CALO
        CLR     F_CLR
        MOV     TM_CLR,#0
	MOV	L_PRODAT,#80	        
        JMP     MODEJMPEND	
;==========================================================
;时间递减模式	
MODE_TIM:
        MOV     DISM_TIME,#1
        MOV     DISM_DIS,#0
        MOV     DISM_CALO,#0
        MOV	DISM_SPD,#0        
        SETB    F_BLK_TIM
        CLR     F_BLK_DIS
        CLR     F_BLK_CALO
	CALL	MPTSET
	MOV	R0,#SET_TIMEH
	MOV	L_PRODAT,@R0
	JMP	MODEJMPEND
;==========================================================
;距离递减模式
MODE_DIS:
        MOV     DISM_TIME,#0
        MOV     DISM_DIS,#1
        MOV     DISM_CALO,#0
        MOV	DISM_SPD,#0        
        CLR     F_BLK_TIM
        SETB    F_BLK_DIS
        CLR     F_BLK_CALO
	CALL	MPDSET
	MOV	L_PRODAT,#80
	JMP	MODEJMPEND	
;==========================================================
;热量递减模式
MODE_CALO:
        MOV     DISM_TIME,#0
        MOV     DISM_DIS,#0
        MOV     DISM_CALO,#1
        MOV	DISM_SPD,#0        
        CLR	F_BLK_TIM
        CLR     F_BLK_DIS
        SETB    F_BLK_CALO
	CALL	MPCSET
	MOV	L_PRODAT,#80	
	JMP	MODEJMPEND
;==========================================================
;内置程式
MODE_PRO:
        MOV     DISM_TIME,#1
        MOV     DISM_DIS,#0
        MOV     DISM_CALO,#0
        MOV	DISM_SPD,#1        
        SETB    F_BLK_TIM
        CLR     F_BLK_DIS
        CLR     F_BLK_CALO
	CALL	MPTSET
	MOV	R0,#SET_TIMEH
	MOV	L_PRODAT,@R0	
	JMP	MODEJMPEND
;==========================================================
;测脂程式
MODE_BMI:
	MOV	SEX,#1
	MOV	AGE,#25
	MOV	HHT,#170
	MOV	WHT,#70
	MOV	CNT_BMI,#0
	MOV	BMI,#0	
	CLR	F_EN_PUL
	SETB	F_BMI
	CALL	SWCLR
	MOV	TM_CLR,#0
	MOV	DISM_SPD,#4
MBMI1:	
	CALL	FATMTST
	CALL	LMTFAT
	CALL	DISPLAY
	JB      SW_PRO,MBMI4
	JB	F_CLR,MBMI4
	MOV	A,CNT_BMI
	CJNE	A,#4,MBMI1
	MOV	TM_CLR,#0
MBMI2:	CALL	DISPLAY
	JB	F_CLR,MBMI4
	JB      SW_PRO,MBMI4
	JNB	F_EN_PUL,MBMI2
	CALL	BMISET
	CALL	SWCLR
MBMI3:	CLR	F_EN_PUL
	CALL	DISPLAY
	JB      SW_PRO,MBMI4
	JB	F_CLR,MBMI4
	JMP	MBMI3
MBMI4:	JMP	MCLR	

;==========================================================
MODEJMPEND:
;==========================================================

⌨️ 快捷键说明

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