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

📄 wind1.asm

📁 此程序是检测风速的单片机程序
💻 ASM
📖 第 1 页 / 共 2 页
字号:
	;USING	0
	;*****************************************************************************************
	LIGHTNESS	EQU	5
	;*****************************************************************************************
	;PUBLIC	PARAMETER	DEFINING
	CONSTANT1	EQU	360     ;常数1
	CONSTANT2	EQU	120     ;常数2
	STACKTOP	EQU	55H     ;堆栈
	SCANTIME	EQU	10000
	TWINKLEINTVL1	EQU	30      ;闪烁量
	TWINBIT2ON	EQU	30
	TWINBIT2OFF	EQU	45
	TWINBIT3ON	EQU	24
	TWINBIT3OFF	EQU	7
	TF2	BIT	0CFH
	TR2	BIT	0CAH
	ET2	BIT	0ADH
	OL	BIT	P0.2
	BUZR	BIT	P0.3
	ALM	BIT	20H.0
	ALM1	BIT	20H.1
	ALM2	BIT	20H.2
	ALMSODEN	BIT	23H.1
	LED1	BIT	P0.7
	LED2	BIT	P1.6
	LED3	BIT	P2.2
	LED4	BIT	P2.1
	FIRST_H	DATA	3CH
	FIRST_L	DATA	3DH
	SECOND_H	DATA	3EH
	SECOND_L	DATA	3FH
	RDT1_H	DATA	42H
	RDT1_L	DATA	43H
	T2CNT	DATA	44H
	TEMP1	DATA	39H
	TEMP2	DATA	3AH
	TEMP3	DATA	3BH
	BCDBUF1	DATA	35H
	BCDBUF2	DATA	36H
	BCDBUF3	DATA	37H
	BCDBUF4	DATA	38H
	PF_H	DATA	0FH
	PF_L	DATA	10H
	WS_H_BCD	DATA	32H
	WS_L_BCD	DATA	33H
	WINDSCALE_BCD	DATA	34H
	;*****************************************************************************************
	;KEYBOARD	PARAMETER	DEFINING
	KSL	EQU	60	;KEY'S	SOUND	LENGTH	SETTING
	SHIFTDLY	EQU	40
	SEQADJSPEED	EQU	150
	KMT1	EQU	100
	KMT2	EQU	45
	;按键分配
	FUN_X	BIT	P2.7	;FUN
	LEFTKEY_X	BIT	P2.4	;LEFTKEY
	ENTKEY_X	BIT	P2.5	;ENT
	RIGHTKEY_X	BIT	P2.6	;RIGHTKEY
	ESC_X	BIT	P2.3	;ESC
	;按键标志位
	FUN	BIT	21H.2	;运行
	ESC	BIT	21H.3	;退出
	ENT	BIT	21H.4	;进入
	LEFTKEY	BIT	21H.5	;增加键
	RIGHTKEY	BIT	21H.6	;减小键
	;按键关标志位
	RIGHTKEY_OFF	BIT	21H.7	;增加键关
	LEFTKEY_OFF	BIT	22H.0	;减小键关
	ENT_OFF	BIT	22H.1	;进入键关
	ESC_OFF	BIT	22H.2	;退出键关
	DESKTOP	BIT	23H.2
	FS	BIT	23H.3
	F1_1	BIT	22H.4
	F1_2	BIT	22H.5
	SEQADJ_EN	BIT	22H.6
	SEQADJ_SW	BIT	22H.7
	ADJBUF_PS_OK	BIT	23H.0
	KMTCNT1	DATA	12H
	KMTCNT2	DATA	13H
	FUNSEL_REG	DATA	14H
	ADJBUF	DATA	15H
	SHIFTDLYCNT	DATA	16H
	;*****************************************************************************************
	;X5045	PARAMETER	DEFINING
	CS5045	BIT	P1.5
	SCK	BIT	P1.4
	SO	BIT	P1.3
	SI	BIT	P1.2
	WREN_INST	EQU	06H	;WRITE	ENABLE	LATCH	INSTRUCTION	(WREN)
	WRDI_INST	EQU	04H	;WRITE	DISABLE	LATCH	INSTRUCTION	(WRDI)
	WRSR_INST	EQU	01H	;WRITE	STATUS	REGISTER	INSTRUCTION	(WRSR)
	RDSR_INST	EQU	05H	;READ	STATUS	REGISTER	INSTRUCTION	(RDSR)
	WRITE_INST	EQU	02H	;WRITE	MEMORY	INSTRUCTION	(WRITE)
	READ_INST	EQU	03H	;READ	MEMORY	INSTRUCTION	(READ)
	MAX_POLL	EQU	99H	;MAXIMUM	NUMBER	OF	POLLS
	INIT_STATE	EQU	09H	;INITIALIZATION	VALUE	FOR	CONTROL	PORTS
	X5045INT_VALUE	EQU	20H
	;*****************************************************************************************
	;MAX7219	PARAMETER	DEFINING
CYCSET7219:	;MACRO	ADDR,DAT
	MOV	A,#ADDR
	CALL	OUTBYT
	MOV	A,DAT
	CALL	OUTBYT
	CLR	LOAD
	SETB	LOAD
	RET
	LOAD	BIT	P2.0
	DIG0	EQU	1
	DIG1	EQU	2
	DIG2	EQU	3
	DIG3	EQU	4
	DIG4	EQU	5
	DIG5	EQU	6
	DIG6	EQU	7
	DIG7	EQU	8
	DECMOD	EQU	9
	INTENSITY	EQU	0AH
	SCANLIMIT	EQU	0BH
	SHUTDOWN	EQU	0CH
	DISPTEST	EQU	0FH
	DISP0	DATA	18H	;MAX7219	DISPLAY	REGISTER	DEFINING
	DISP1	DATA	19H
	DISP2	DATA	1AH
	DISP3	DATA	1BH
	DISP4	DATA	1CH
	DISP5	DATA	1DH
	DISP6	DATA	1EH
	DISP7	DATA	1FH
	LR7	EQU	40H
	LR5	EQU	41H
	LR4	EQU	42H
	LR3	EQU	43H
	LR2	EQU	44H
	LR6	EQU	45H
	;*****************************************************************************************
	;X5045	STORE	ADDRESS	DEFINING
	STOREMARK	EQU	74H
	WINDSCALE1	EQU	10
	WINDSCALE2	EQU	11
	WINDSC_M1	EQU	12
	WINDSC_M2	EQU	13
	;*****************************************************************************************
	;PUSH	RUNNING	DATA	TO	THE	STACK	AND	BACKING	OUT
	PROTECT	MACRO
	CLR	EA
	PUSH	ACC
	PUSH	B
	PUSH	DPH
	PUSH	DPL
	PUSH	PSW
	PUSH	AR0
	PUSH	AR1
	PUSH	AR2
	PUSH	AR3
	PUSH	AR4
	PUSH	AR5
	PUSH	AR6
	PUSH	AR7
	SETB	EA
	ENDM
	RESUME	MACRO
	CLR	EA
	POP	AR7
	POP	AR6
	POP	AR5
	POP	AR4
	POP	AR3
	POP	AR2
	POP	AR1
	POP	AR0
	POP	PSW
	POP	DPL
	POP	DPH
	POP	B
	POP	ACC
	SETB	EA
	ENDM
	;*****************************************************************************************
	RESTR	MACRO
	NOP
	NOP
	JMP	START
	ENDM
	FILLBLANK	MACRO
	RESTR
	RESTR
	RESTR
	RESTR
	RESTR
	RESTR
	RESTR
	RESTR
	RESTR
	RESTR
	ENDM
	;*****************************************************************************************
	;*****************************************************************************************
	;START	AND	INITIALIZE
	ORG	0000
	JMP	START
	ORG	0003H
	RESTR
	ORG	000BH
	JMP	T0_INT
	ORG	0013H
	RESTR
	ORG	001BH
	RESTR
	ORG	0023H
	RESTR
	ORG	002BH
	ORG	050
START:	MOV	SP,#STACKTOP
	CLR	PSW.3
	CLR	PSW.4
	MOV	DISP0,#88H
	MOV	DISP1,#88H
	MOV	DISP2,#88H
	MOV	DISP3,#88H
	MOV	DISP4,#88H
	MOV	DISP5,#88H
	MOV	DISP6,#88H
	MOV	DISP7,#88H
	CLR	LED1
	SETB	LED2
	CLR	LED3
	CLR	LED4
	CLR	ALM
	CLR	ALM1
	CLR	ALM2
	CLR	ALMSODEN
	CLR	BUZR
	CLR	OL
	SETB	SEQADJ_SW
	CLR	ADJBUF_PS_OK
	SETB	DESKTOP
	CLR	FS
	CLR	F1_1
	CLR	F1_2
	MOV	TWINBIT1CNT,#TWINKLEINTVL1
	MOV	TWINBIT2CNT1,#TWINBIT2ON	;20开
	MOV	TWINBIT2CNT2,#TWINBIT2OFF	;20关
	MOV	TWINBIT3CNT1,#TWINBIT3ON	;3开
	MOV	TWINBIT3CNT2,#TWINBIT3OFF	;关
	MOV	KMTCNT1,#KMT1
	MOV	KMTCNT2,#KMT2
	MOV	SHIFTDLYCNT,#SHIFTDLY
	MOV	T2CNT,#20
	MOV	FIRST_H,#0
	MOV	FIRST_L,#0
	MOV	SECOND_H,#0
	MOV	SECOND_L,#0
	MOV	RDT1_H,#0
	MOV	RDT1_L,#0
	MOV	WS_H_BCD,#0
	MOV	WS_L_BCD,#0
	MOV	WINDSCALE_BCD,#1
	CALL	INT7219
	CALL	INT5045
	CALL	DISPSERV
	CALL	LED2CTRL
	SETB	LED1
	SETB	LED4
	ORL	P1,#10111111B	;数码管设置
	ORL	P2,#11111001B	;按键设置
	MOV	TH2,#HIGH(-50000)
	MOV	TL2,#LOW(-50000)
	MOV	RCAP2H,#HIGH(-50000)
	MOV	RCAP2L,#LOW(-50000)
	MOV	TMOD,#51H	;定时器1和2都打开
	MOV	TH1,#0
	MOV	TL1,#0
	MOV	TH0,#HIGH(-SCANTIME)	;DEFINE	INTERVAL	OF	INTERRUPTION
	MOV	TL0,#LOW(-SCANTIME)	;定时1S
	SETB	TR0	;打开定时器0
	SETB	TR1	;打开定时器1
	SETB	TR2	;打开定时器2
	SETB	ET0	;打开中断0
	SETB	ET2	;打开中断2
	SETB	EA	;打开总中断
	;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
	;主程序
MAIN:	CALL	CYCSET7219	;调7219驱动程序
	CALL	KEYCTRL	;调按键检测程序
	CALL	RST_WDOG	;调看门狗
	CALL	DISPWIND	;调显示风速
	CALL	ALARM	;调报警控制程序
	CALL	COMPUTEPF
	JMP	MAIN
	;IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII
	;中断定时0
T0_INT:	;PROTECT
	CLR	EA
	PUSH	ACC
	PUSH	B
	PUSH	DPH
	PUSH	DPL
	PUSH	PSW
	PUSH	AR0
	PUSH	AR1
	PUSH	AR2
	PUSH	AR3
	PUSH	AR4
	PUSH	AR5
	PUSH	AR6
	PUSH	AR7
	SETB	EA
	CALL	KEYMONITOR
	CALL	SEQADJ
	CALL	DISPSERV
	CALL	TWINK1
	CALL	TWINK2
	CALL	TWINK3
	MOV	TH0,#HIGH(-SCANTIME)	;DEFINE	INTERVAL	OF	T0	INTERRUPTION
	MOV	TL0,#LOW(-SCANTIME)
	CLR	EA
	POP	AR7
	POP	AR6
	POP	AR5
	POP	AR4
	POP	AR3
	POP	AR2
	POP	AR1
	POP	AR0
	POP	PSW
	POP	DPL
	POP	DPH
	POP	B
	POP	ACC
	SETB	EA
	;RESUME
	RETI
	;IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII
	;中断定时2
T2_INT:	PUSH	ACC
	PUSH	PSW
	DJNZ	T2CNT,T2I1
T2I0:	MOV	A,TH1
	MOV	RDT1_L,TL1
	CJNE	A,TH0,T2I0
	MOV	RDT1_H,A
	MOV	TH1,#0
	MOV	TL1,#0
	MOV	T2CNT,#20
	SETB	COMPUTEPF_M
T2I1:	CLR	TF2
	POP	PSW
	POP	ACC
	RETI
	;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
	;=========================================================================================
	;FUNCTION	SUBROUTINES	AREA
	;风速和风级转换
	;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
;INPUT:	COMPUTEPF_M,RDT1_H,RDT1_L
;OUTPUT:	WS_H_BCD,WS_L_BCD,WINDSCALE_BCD
COMPUTEPF:	JB	COMPUTEPF_M,LCP0
	RET
LCP0:	CLR	COMPUTEPF_M
	MOV	SECOND_H,FIRST_H
	MOV	SECOND_L,FIRST_L
	MOV	FIRST_H,RDT1_H
	MOV	FIRST_L,RDT1_L
	MOV	A,FIRST_L
	ADD	A,SECOND_L
	MOV	R1,A
	MOV	A,FIRST_H
	ADDC	A,SECOND_H
	MOV	R0,A
	MOV	R4,AR0
	MOV	R5,AR1
	MOV	R6,#0
	MOV	R7,#2	;除以2
	CALL	DIV16_16
	CALL	ROUND
CONVERT:	CJNE	R4,#0,CONVER0
	CJNE	R5,#0,CONVER0
	MOV	R6,#0
	MOV	R7,#0	
	JMP	CONVER1
CONVER0:	MOV	R6,#0
	MOV	R7,#CONSTANT2	;R7=120
	CALL	MUL16_16	;乘以120
	MOV	A,#LOW(CONSTANT1)	;LOW=360
	ADD	A,R7
	MOV	R7,A
	MOV	A,R6
	ADDC	A,#HIGH(CONSTANT1)	;HIGH=360
	MOV	R6,A
	MOV	A,R5
	ADDC	A,#0
	MOV	R5,A
	MOV	TEMP1,R5
	MOV	TEMP2,R6
	MOV	TEMP3,R7
	MOV	R3,#TEMP1
	MOV	R4,#BCDBUF1
	MOV	R5,#3
	CALL	BINBCD	;R5R6R7三字节16位二进制转换位BCD码
	MOV	R4,BCDBUF1
	MOV	R5,BCDBUF2
	MOV	R6,BCDBUF3
	MOV	R7,BCDBUF4
	CALL	RRC4
	CALL	RRC4
	CALL	RRC4
	CALL	RRC4	;
CONVER1:	MOV	WS_H_BCD,R6
	MOV	WS_L_BCD,R7
	MOV	A,WS_H_BCD
	SUBB	A,#2	;减二
	JNC	CONVER2	;不为零转到	CONVER2
	MOV	WINDSCALE_BCD,#1H	;1级风
	RET	
CONVER2:	MOV	A,WS_H_BCD
	SUBB	A,#3H	;不为零转到	CONVER3
	JNC	CONVER3
	MOV	WINDSCALE_BCD,#2H	;2级风
	RET
CONVER3:	MOV	A,WS_H_BCD
	SUBB	A,#5H	;不为零转到	CONVER4
	JNC	CONVER4
	MOV	WINDSCALE_BCD,#3H	;3级风
	RET
CONVER4:	MOV	A,WS_H_BCD
	SUBB	A,#7H	;不为零转到	CONVER5
	JNC	CONVER5
	MOV	WINDSCALE_BCD,#4H	;4级风
	RET
CONVER5:	MOV	A,WS_H_BCD
	SUBB	A,#9H	;不为零转到	CONVER6
	JNC	CONVER6
	MOV	WINDSCALE_BCD,#5H	;5级风
	RET
CONVER6:	MOV	A,WS_H_BCD
	SUBB	A,#11H	;不为零转到	CONVER7
	JNC	CONVER7
	MOV	WINDSCALE_BCD,#6H	;6级风
	RET
CONVER7:	MOV	A,WS_H_BCD
	SUBB	A,#14H	;不为零转到	CONVER8
	JNC	CONVER8
	MOV	WINDSCALE_BCD,#7H	;7级风
	RET
CONVER8:	MOV	A,WS_H_BCD
	SUBB	A,#17H	;不为零转到	CONVER9
	JNC	CONVER9
	MOV	WINDSCALE_BCD,#8H	;8级风
	RET
CONVER9:	MOV	A,WS_H_BCD
	SUBB	A,#21H	;不为零转到	CONVER10
	JNC	CONVER10
	MOV	WINDSCALE_BCD,#9H	;9级风
	RET
CONVER10:	MOV	A,WS_H_BCD
	SUBB	A,#28H	;不为零转到	CONVER11
	JNC	CONVER11
	MOV	WINDSCALE_BCD,#10H	;10级风
	RET
CONVER11:	MOV	A,WS_H_BCD
	SUBB	A,#34H	;不为零转到	CONVER12
	JNC	CONVER12
	MOV	WINDSCALE_BCD,#11H	;11级风
	RET
CONVER12:	MOV	WINDSCALE_BCD,#12H	;12级风
	RET
	;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
ALARM:	MOV	DPTR,#WINDSC_M1
	CALL	BYTRD_VERIFY
	CJNE	A,#STOREMARK,AM0
	MOV	DPTR,#WINDSCALE1
	CALL	BYTRD_VERIFY
	MOV	TEMP1,A
	JMP	AM1
AM0:	MOV	TEMP1,#5
AM1:	MOV	DPTR,#WINDSC_M2
	CALL	BYTRD_VERIFY
	CJNE	A,#STOREMARK,AM2	
	MOV	DPTR,#WINDSCALE2
	CALL	BYTRD_VERIFY
	MOV	TEMP2,A
	JMP	AM3
AM2:	MOV	TEMP2,#6
AM3:	MOV	A,WINDSCALE_BCD
	SUBB	A,TEMP1
	JNC	AM4
	CLR	ALM
	CLR	ALM1
	CLR	ALM2
	CLR	OL
	JMP	ALMSLCTRL
AM4:	SETB	ALM
	SETB	ALM1
	MOV	A,WINDSCALE_BCD
	SUBB	A,TEMP2
	JNC	AM5
	CLR	ALM2
	CLR	OL
	JMP	ALMSLCTRL
AM5:	SETB	ALM2
	SETB	OL
	JMP	ALMSLCTRL
	;风级控制报警
ALMSLCTRL:	JB	ALM,ASC1
	CLR	LED3
	SETB	LED4
	JNB	ALMSODEN,ASC0
LED2CTRL:	SETB	LED2
	MOV	R2,#20
	CALL	DELAYX1
	CLR	LED2
	RET
	;显示风速
DISPWIND:	JB	DESKTOP,DW0
	RET
DW0:	MOV	A,WS_H_BCD
	ANL	A,#0F0H
	SWAP	A
	MOV	DISP0,A
	MOV	A,WS_H_BCD
	ANL	A,#0FH
	ORL	A,#80H
	MOV	DISP1,A
	MOV	A,WS_L_BCD
	ANL	A,#0F0H
	SWAP	A
	MOV	DISP2,A
	MOV	A,WS_L_BCD
	ANL	A,#0FH
	MOV	DISP3,A
	MOV	DISP4,#0FH
	MOV	DISP5,#0FH
	MOV	A,WINDSCALE_BCD
	ANL	A,#0FH
	MOV	DISP7,A
	MOV	A,WINDSCALE_BCD
	ANL	A,#0F0H
	JNZ	DW1
	MOV	DISP6,#0FH
	RET
DW1:	SWAP	A
	MOV	DISP6,A
	RET
	;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
	;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
	;TWINKLE	BIT
	;闪烁位
TWINK1:	DJNZ	TWINBIT1CNT,TWK1OUT
	MOV	TWINBIT1CNT,#TWINKLEINTVL1
	CPL	TWINBIT1
TWK1OUT:	RET
TWINK2:	MOV	A,TWINBIT2CNT1
	JZ	TWK2_0
	SETB	TWINBIT2
	DJNZ	TWINBIT2CNT1,TWK2OUT
	MOV	TWINBIT2CNT2,#TWINBIT2OFF
TWK2_0:	CLR	TWINBIT2
	DJNZ	TWINBIT2CNT2,TWK2OUT
	MOV	TWINBIT2CNT1,#TWINBIT2ON
TWK2OUT:	RET
TWINK3:	MOV	A,TWINBIT3CNT1
	JZ	TWK3_0
	SETB	TWINBIT3
	DJNZ	TWINBIT3CNT1,TWK3OUT
	MOV	TWINBIT3CNT2,#TWINBIT3OFF
TWK3_0:	CLR	TWINBIT3
	DJNZ	TWINBIT3CNT2,TWK3OUT
	MOV	TWINBIT3CNT1,#TWINBIT3ON
TWK3OUT:	RET
	;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
	;按键控制
KEYCTRL:	CALL	KEYSCAN
	CALL	TOPDISP
	CALL	FUNSEL
	CALL	P1SET
	CALL	P2SET
	RET
TOPDISP:	JB	DESKTOP,TOP1
	RET
TOP1:	CLR	FS
	CLR	F1_1
	CLR	F1_2
	CLR	ADJBUF_PS_OK
	MOV	FUNSEL_REG,#1
	JNB	FUN,TOP2
	SETB	FS
	CLR	DESKTOP
TOP2:	RET
FUNSEL:	JB	FS,FS1
	RET
FS1:	MOV	DISP0,#0FH
	MOV	DISP1,#0FH
	MOV	DISP2,#0EH
	MOV	R2,FUNSEL_REG
	MOV	R5,#1
	MOV	R6,#2
	CLR	SEQADJ_SW
	CALL	BCDADJ_16
	SETB	SEQADJ_SW
	MOV	A,ADJBUF
	MOV	FUNSEL_REG,A
	CJNE	A,#1,FS4
	MOV	DISP3,#1
	MOV	DPTR,#WINDSC_M1
	CALL	BYTRD_VERIFY

⌨️ 快捷键说明

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