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

📄 跑步机.asm

📁 本程式为跑步机电子表显示的完整程式,有仔细的注解
💻 ASM
📖 第 1 页 / 共 4 页
字号:
;**********************************************************
;跑步机电子表源程序(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 + -