📄 跑步机.asm
字号:
;**********************************************************
;跑步机电子表源程序(GM-005_LED)
;作者:陈伟亮
;时间:20060712
;版本:V1.0
;使用芯片:AT89C52
;**********************************************************
;----------------------------------------------------------
;宏定义:
INTIN MACRO
CLR EA ;关毕总中断
PUSH PSW
PUSH ACC
PUSH DPH
PUSH DPL
SETB RS0 ;选择第二组工作寄存器
ENDM
INTOUT MACRO
POP DPL
POP DPH
POP ACC
POP PSW
CLR RS0 ;恢复成第一组工作寄存器
SETB EA
ENDM
;==========================================================
;引脚定义:
PULIN BIT P2.1
PTST BIT P3.2
DAT BIT P3.0
CLK BIT P3.1
BU BIT P2.5
SEND BIT P2.6
REV BIT P2.7
SCAN1 BIT P1.0
SCAN2 BIT P1.1
SCAN3 BIT P1.2
SCAN4 BIT P1.3
SCAN5 BIT P1.4
SCAN6 BIT P1.5
SCAN7 BIT P1.6
KOUT1 BIT P2.4
KOUT2 BIT P2.3
KOUT3 BIT P2.2
K1 BIT P0.2
K2 BIT P0.3
K3 BIT P0.4
K4 BIT P0.5
;==========================================================
;低位RAM定义:00--7F直接/间接寻址
;**********************************************************
;位/标志定义:20--2F 128BIT
F_BUEN BIT 00H ;蜂鸣使能标志
F_BUENS BIT 01H
F_SOVER BIT 02H
F_BUENQ BIT 03H
F_BU BIT 04H
F_S BIT 05H
F_ERR BIT 06H
F_SENDEN BIT 07H
F_SR BIT 08H
F_SW_FALOCK1 BIT 0AH
F_SW_FALOCK2 BIT 0BH
F_SW_FASTEN BIT 0CH
F_SW_SLLOCK1 BIT 0DH
F_SW_SLLOCK2 BIT 0EH
F_SW_SLOWEN BIT 0FH
F_SW_UPEN BIT 10H
F_SW_DWNEN BIT 11H
F_SW_UPLOCK BIT 12H
F_SW_DWNLOCK BIT 13H
F_UP BIT 14H
F_DWN BIT 15H
F_BLINKEN BIT 16H
F_START BIT 17H
F_SET_OVER BIT 18H
F_DAT_OVER BIT 19H
F_TM BIT 1AH
F_STAND BIT 1BH
F_MODE BIT 1CH
F_PRO BIT 1DH
F_EN_PUL BIT 1EH
F_PULE BIT 1FH
F_PULSET BIT 20H
F_CLR BIT 21H
F_NOP BIT 22H
F_BLK_TIM BIT 23H
F_BLK_DIS BIT 24H
F_BLK_CALO BIT 25H
F_BLK_SPD BIT 26H
F_BLK_DZ BIT 27H
F_BLK_RUN BIT 27H
F_STPBLK BIT 29H
F_BLK_BMI BIT 2AH
F_RET BIT 2BH
F_NOPRET BIT 2CH
F_SPDSET BIT 2DH
F_PAU BIT 2EH
F_SCAN BIT 2FH
F_END BIT 30H
ACK BIT 31H
F_ODO BIT 32H
F_ZDL BIT 33H
F_ZDLS BIT 34H
F_KMH BIT 35H
F_RUNEN BIT 36H
F_BMI BIT 37H
F_CLRS BIT 38H
F_SPD_DISF BIT 39H
F_GO BIT 3AH
F_GOOD BIT 3BH
F_ADD BIT 3CH ;加速按键标志
F_SUB BIT 3DH ;减速按键标志
;*******************************************
INTTMP DATA 2AH
INTTMP1 DATA 2BH
S_PRO BIT INTTMP.0
S_MODE BIT INTTMP.1
S_START BIT INTTMP.2
S_STOP BIT INTTMP.3
S_FAST BIT INTTMP.4
S_SLOW BIT INTTMP.5
S_2KM BIT INTTMP1.0
S_4KM BIT INTTMP1.1
S_6KM BIT INTTMP1.2
S_8KM BIT INTTMP1.3
S_10KM BIT INTTMP1.4
S_12KM BIT INTTMP1.5
FLAG_SW DATA 2CH
SW_PRO BIT FLAG_SW.0
SW_MODE BIT FLAG_SW.1
SW_START BIT FLAG_SW.2
SW_STOP BIT FLAG_SW.3
SW_FAST BIT FLAG_SW.4
SW_SLOW BIT FLAG_SW.5
FLAG_SW1 DATA 2DH
SW_2KM BIT FLAG_SW1.0
SW_4KM BIT FLAG_SW1.1
SW_6KM BIT FLAG_SW1.2
SW_8KM BIT FLAG_SW1.3
SW_10KM BIT FLAG_SW1.4
SW_12KM BIT FLAG_SW1.5
BUF_SW DATA 2EH
BUF_SW1 DATA 2FH
;**********************************************************
;00-1F--工作寄存器区
DAT_TH DATA 17H
DAT_TL DATA 18H
CNT_S DATA 19H
CNT_REV DATA 1AH
CNT_SEND DATA 1BH
CNT_ERR DATA 1CH
;30--6F 64BIT 通用/高使用率寄存器区
DLYCNT DATA 30H ;延时计数
CNT_BU DATA 32H ;蜂鸣计时
CNT_BUS DATA 33H ;蜂鸣次数
AMP_BU DATA 34H
DPYCNT DATA 37H
COUNT DATA 38H
TEMP DATA 39H
TM_SWCLR DATA 3AH
CNT_FAST DATA 3BH
CNT_FLOCK DATA 3CH
CNT_SLOW DATA 3DH
CNT_SLOCK DATA 3EH
CNT_UP DATA 3FH
CNT_DWN DATA 40H
CNT_DAT_PRO DATA 41H
CNT_DISL DATA 42H
CNT_DISH DATA 43H
CNT_CALOL DATA 44H
CNT_CALOH DATA 45H
DAMPL DATA 46H
DAMPH DATA 47H
CAMPL DATA 48H
CAMPH DATA 49H
XX_PRODATL DATA 4AH
XX_PRODATH DATA 4BH
TIM_PRODAT DATA 4CH
L_PRODAT DATA 4DH
CNT_STA DATA 4EH
TM_SS DATA 4FH
TM_CLR DATA 50H
TM_S DATA 51H
CNT_STAND DATA 52H
DISM_TIME DATA 53H
DISM_DIS DATA 54H
DISM_CALO DATA 55H
DISM_SPD DATA 56H
TM_PUL DATA 57H
PULSEL_7L8 DATA 58H
PULSEL_1L8 DATA 59H
TM_S1 DATA 5AH
TM_NOP DATA 5BH
CNT_MODE DATA 5CH
TM_BLK DATA 5DH
TM_STPBLK DATA 5EH
CNT_BMI DATA 5FH
AGE DATA 60H
SEX DATA 61H
HHT DATA 62H
WHT DATA 63H
BMI DATA 64H
INCL_D DATA 65H
SPD_D DATA 66H
C_SPD DATA 67H
TM_SCAN DATA 68H
NUMBYTE DATA 69H
SUBA DATA 6AH
CNT_ODO DATA 6CH
TM_PRO DATA 6DH
FD_INCL DATA 6EH
HSPD DATA 6FH
LSPD DATA 70H
NUM_RUN DATA 71H
CNT_D1 DATA 72H
TM_SPD_DISF DATA 74H
NUM_MEN DATA 75H
BUF_SPD DATA 77H
BUF_INCL DATA 79H
;==========================================================
;80--FF SFR区 只能直接寻址
;==========================================================
;高位RAM定义:80--FF间接寻址
SPEED EQU 080H
INCL EQU 081H
TIMEL EQU 082H
TIMEH EQU 083H
SET_TIMEL EQU 084H
SET_TIMEH EQU 085H
CALOL EQU 086H
CALOH EQU 087H
SET_CALOL EQU 088H
SET_CALOH EQU 089H
DISL EQU 08AH
DISH EQU 08BH
SET_DISL EQU 08CH
SET_DISH EQU 08DH
PULSE EQU 08EH
DIS_RL EQU 090H
DIS_RH EQU 091H
;速度区:
MTD EQU 0A0H
MRD EQU 0A0H
BUFADD1 EQU 0A0H
;0A0H--0AFH
;扬升区:
BUFADD2 EQU 0B0H
;0B0H--0BFH
;显示缓冲区
BUFADD3 EQU 0C0H
;0C0H--0DFH
DPY1 EQU 0C0H
DPY2 EQU 0C1H
DPY3 EQU 0C2H
DPY4 EQU 0C3H
DPY5 EQU 0C4H
DPY6 EQU 0C5H
DPY7 EQU 0C6H
DPY8 EQU 0C7H
DPY9 EQU 0C8H
DPY10 EQU 0C9H
LEDA1 EQU 0CAH
LEDA2 EQU 0CBH
LEDB1 EQU 0CCH
LEDB2 EQU 0CDH
;保存区,不可清0
;E0-FF堆栈区
;==========================================================
;扩展RAM定义:00--2FF间接寻址
;----------------------------------------------------------
;----------------------------------------------------------
ORG 000H
LJMP START_R ;初始化入口
ORG 0003H
LJMP INT0SUB ;外部中断0入口
ORG 000BH
LJMP T0SUB ;计时0中断
ORG 0013H
LJMP INT1SUB ;外部1中断
ORG 001BH
LJMP T1SUB ;计时1中断
ORG 0023H
LJMP UART_SPI_SUB ;串口/PSI中断
ORG 0080H
;----------------------------------------------------------
INT0SUB:RETI
INT1SUB:RETI
UART_SPI_SUB:RETI
;----------------------------------------------------------
;计时0中断 500us
T0SUB:
INTIN
MOV TH0,#11100000B ;T0初值
MOV TL0,#00011000B
;*************************************************************
;通迅子程:
SENDP:
JB F_ERR,SENDDIS ;有错误不发送信号
JB F_SENDEN,SENDPEN ;发送使能检测
SENDDIS:SETB SEND ;不发送处理
MOV CNT_SEND,#0
JMP SENDPEND
SENDPEN:
JB F_SR,SENDP1 ;初始移位标志
SETB F_SR
MOV CNT_S,#0
MOV A,DAT_TL
RLC A
MOV DAT_TL,A
MOV A,DAT_TH
RLC A
MOV DAT_TH,A
MOV F_S,C ;设置位电平标志(0,1)
SENDP1: INC CNT_S ;开始位传送
JNB F_S,SENDL
SENDH: MOV A,#4 ;位1
JMP SENDL1
SENDL: MOV A,#2 ;位0
SENDL1: CLR C
SUBB A,CNT_S
CPL C
MOV SEND,C
MOV A,CNT_S
CJNE A,#6,SENDPEND
;========开始接收========================================
RECEIVE:
SETB REV
MOV A,DAT_TL
RRC A
MOV C,REV
RLC A
MOV DAT_TL,A
CLR F_SR
INC CNT_SEND
MOV A,CNT_SEND
CJNE A,#13,SENDPEND
CLR F_SENDEN
REVSET:
INC CNT_REV
MOV CNT_SEND,#0
MOV A,#00011111B
ANL A,DAT_TH
MOV DAT_TH,A
CJNE A,#00011001B,REVSET1
JMP REVE0
REVSET1:
MOV A,CNT_REV
JNB ACC.3,SENDPEND
MOV A,DAT_TH
CJNE A,#00011010B,REVE1
JMP REVEN
REVE0: CLR F_ERR
MOV CNT_ERR,#0
MOV A,CNT_REV
JNB ACC.2,SENDPEND
MOV CNT_REV,#0
JMP SENDPEND
REVE1: MOV CNT_ERR,#1
MOV CNT_REV,#0
SETB F_ERR
JMP SENDPEND
REVEN: MOV A,#00011111B
ANL A,DAT_TL
MOV CNT_ERR,A
SETB F_ERR
MOV CNT_REV,#0
SENDPEND:
;********************************************************
;显示扫描
DISSCAN:
ORL P1,#0FFH
MOV DPTR,#DCN_TAB
MOV A,DPYCNT
CLR C
RLC A
JMP @A+DPTR
DCN_TAB:
JMP DCNH1
JMP DCNH2
JMP DCNH3
JMP DCNH4
JMP DCNH5
JMP DCNH6
JMP DCNH7
;===========================================================
DCNH1:
MOV A,#DPY6
CALL DSEND
MOV A,#DPY5
CALL DSEND
CLR SCAN1
JMP DCNHEND
;===========================================================
DCNH2:
MOV A,#DPY7
CALL DSEND
MOV A,#DPY4
CALL DSEND
CLR SCAN2
JMP DCNHEND
;===========================================================
DCNH3:
MOV A,#DPY3
CALL DSEND
MOV A,#DPY10
CALL DSEND
CLR SCAN3
JMP DCNHEND
;===========================================================
DCNH4:
MOV A,#DPY2
CALL DSEND
MOV A,#DPY9
CALL DSEND
CLR SCAN4
JMP DCNHEND
;===========================================================
DCNH5:
MOV A,#DPY1
CALL DSEND
MOV A,#DPY8
CALL DSEND
CLR SCAN5
JMP DCNHEND
;===========================================================
DCNH6:
MOV A,#LEDA2
CALL DSEND
MOV A,#LEDA1
CALL DSEND
CLR SCAN6
JMP DCNHEND
;===========================================================
DCNH7:
MOV A,#LEDB2
CALL DSEND
MOV A,#LEDB1
CALL DSEND
CLR SCAN7
JMP DCNHEND
;===========================================================
DCNHEND:
INC DPYCNT
MOV A,DPYCNT
CJNE A,#7,DCNHE1
MOV DPYCNT,#0
DCNHE1:
;********************************************************
INTOUT
RETI
;========================================================
DSEND:
MOV R0,A
MOV A,@R0
MOV R2,A
MOV R1,#8
DSEND1: MOV A,R2
RLC A
CPL C
MOV DAT,C
NOP
NOP
NOP
MOV R2,A
SETB CLK
NOP
NOP
NOP
CLR CLK
DJNZ R1,DSEND1
RET
;========================================================
DLY: NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
RET
;--------------------------------------------------------
;计时1中断 10ms
T1SUB:
INTIN
MOV TH1,#0B1H ;T1初值
MOV TL1,#0E0H
;*********************************************************
INC DLYCNT ;延时计数==10ms
;*********************************************************
;*********************************************************
;蜂鸣
BUPD: JNB F_BUENS,BUPQ
INC CNT_BU
CLR C
MOV A,CNT_BU
SUBB A,#30
JNC BUPD1
SETB BU
JMP BUPD2
BUPD1: CLR BU
BUPD2: CLR C
MOV A,CNT_BU
SUBB A,#80
JC BUPEND
MOV CNT_BU,#0
DJNZ CNT_BUS,BUPEND
JMP BUPCLR
BUPQ: JNB F_BUENQ,BUPI
INC CNT_BU
CLR C
MOV A,CNT_BU
SUBB A,#5
JNC BUPQ1
SETB BU
JMP BUPQ2
BUPQ1: CLR BU
BUPQ2: CLR C
MOV A,CNT_BU
SUBB A,#10
JC BUPEND
MOV CNT_BU,#0
DJNZ CNT_BUS,BUPEND
JMP BUPCLR
BUPI: MOV AMP_BU,#4
JNB F_SOVER,BUPI1
MOV AMP_BU,#30
BUPI1: JNB F_BUEN,BUPCLR
INC CNT_BU
CLR C
MOV A,CNT_BU
SUBB A,AMP_BU
JNC BUPI2
SETB BU
JMP BUPI3
BUPI2: CLR BU
BUPI3: CLR C
MOV A,AMP_BU
ADD A,#2
SUBB A,CNT_BU
JNC BUPEND
BUPCLR:
CLR F_BUEN
CLR F_BUENS
CLR F_BUENQ
MOV CNT_BU,#0
MOV CNT_BUS,#0
BUPEND:
;********************************************************
;读按键值
CLR KOUT1
CLR KOUT2
CLR KOUT3
MOV P0,#0FFH
MOV INTTMP,#0H
MOV INTTMP1,#0H
SETB KOUT1
CALL DLY
SETB K1
NOP
NOP
MOV C,K1
MOV S_2KM,C
SETB K2
NOP
NOP
MOV C,K2
MOV S_12KM,C
SETB K3
NOP
NOP
MOV C,K3
MOV S_SLOW,C
SETB K4
NOP
NOP
MOV C,K4
MOV S_PRO,C
CLR KOUT1
SETB KOUT2
CALL DLY
SETB K1
NOP
NOP
MOV C,K1
MOV S_4KM,C
SETB K2
NOP
NOP
MOV C,K2
MOV S_10KM,C
SETB K3
NOP
NOP
MOV C,K3
MOV S_FAST,C
SETB K4
NOP
NOP
MOV C,K4
MOV S_MODE,C
CLR KOUT2
SETB KOUT3
CALL DLY
SETB K1
NOP
NOP
MOV C,K1
MOV S_6KM,C
SETB K2
NOP
NOP
MOV C,K2
MOV S_8KM,C
SETB K3
NOP
NOP
MOV C,K3
MOV S_STOP,C
SETB K4
NOP
NOP
MOV C,K4
MOV S_START,C
CLR KOUT3
;**************************************************
TSWA:
MOV A,INTTMP
ADD A,INTTMP1
CJNE A,#0,TSWA1
CLR F_SOVER
JMP TSWAEND
;如果有按键按下清30秒清0计时与标志
TSWA1:
MOV TM_CLR,#0
CLR F_CLR
MOV TM_NOP,#0
TSWAEND:
;**************************************************
TSWB:
MOV A,INTTMP
CJNE A,#0H,TSWB1
MOV BUF_SW,#0
JMP TSWBEND
TSWB1:
MOV A,INTTMP
CJNE A,BUF_SW,TSWB2
JMP TSWBEND
TSWB2: MOV FLAG_SW,A
MOV BUF_SW,A
TSWBEND:
TSWC:
MOV A,INTTMP1
CJNE A,#0H,TSWC1
MOV BUF_SW1,#0
JMP TSWCEND
TSWC1:
MOV A,INTTMP1
CJNE A,BUF_SW1,TSWC2
JMP TSWCEND
TSWC2: MOV FLAG_SW1,A
MOV BUF_SW1,A
TSWCEND:
;================================================================
;加速按键检测
SWT_FAST:
JNB S_FAST,SWTFACLR
JB F_SW_FALOCK2,SWTFALOCK2
JB F_SW_FALOCK1,SWTFALOCK1
JB F_SW_FASTEN,SWTFAEN
SETB F_SW_FASTEN
SETB F_ADD
MOV CNT_FAST,#0
MOV CNT_FLOCK,#0
JMP SWTFAEND
SWTFALOCK1:
INC CNT_FAST
MOV A,CNT_FAST
CJNE A,#30,SWTFAEND
MOV CNT_FAST,#0
SETB F_ADD
INC CNT_FLOCK
MOV A,CNT_FLOCK
CJNE A,#5,SWTFAEND
SETB F_SW_FALOCK2
JMP SWTFAEND
SWTFALOCK2:
INC CNT_FAST
MOV A,CNT_FAST
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -