📄 跑步机.asm
字号:
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 + -