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

📄 bike.asm

📁 通过霍尔传感器测量车轮转动的次数
💻 ASM
📖 第 1 页 / 共 5 页
字号:
                mov     R1,#00h
                MOV     SLA,#0A0H
                MOV     SUBA,#00H
                CALL    IWRNBYTE
                call    delay5ms
                mov     R1,#00h
                MOV     SLA,#0A0H
                MOV     SUBA,#01H
                CALL    IWRNBYTE
                call    delay5ms
                mov     R1,#00h
                MOV     SLA,#0A0H
                MOV     SUBA,#02H
                CALL    IWRNBYTE
                call    delay5ms
                ret

qing_zong_licheng:
                mov     R1,#00h
                MOV     SLA,#0A0H
                MOV     SUBA,#03H
                CALL    IWRNBYTE
                call    delay5ms
                mov     R1,#00h
                MOV     SLA,#0A0H
                MOV     SUBA,#04H
                CALL    IWRNBYTE
                call    delay5ms
                mov     R1,#00h
                MOV     SLA,#0A0H
                MOV     SUBA,#05H
                CALL    IWRNBYTE
                call    delay5ms
                ret

qing_shangci_licheng:
                mov     R1,#00h
                MOV     SLA,#0A0H
                MOV     SUBA,#06H
                CALL    IWRNBYTE
                call    delay5ms
                mov     R1,#00h
                MOV     SLA,#0A0H
                MOV     SUBA,#07H
                CALL    IWRNBYTE
                call    delay5ms
                mov     R1,#00h
                MOV     SLA,#0A0H
                MOV     SUBA,#08H
                CALL    IWRNBYTE
                call    delay5ms
                ret



; 里程计数程序,用外中断0实现,计数用60H-62H内存单元
INTEX0:         PUSH    ACC              ; 累加器堆栈保护
                PUSH    PSW          	 ;状态字堆栈保护

                mov     6dh,#00h
                clr     TR0
                SETB    ET1             ;开定时中断T1
                setb    TR1              ;第一次进入中断才开始启动定时器1
                CLR     EX0              ;关外中断0

                jb     flag1,no_out
                ljmp   outex12    ;如果flag1为0,说明是奇数次进入中断
                                         ;如果为1,说明是偶数次进入中断,
                                         ;定时器的值可以作为测速的数据
     no_out:
                JNB     flag,INTEX112     ;溢出标志为0转INTEX11
                clr     TR1
                MOV     TL1,#0FFH       ;溢出时计时单元赋#0FFH(显示速度为零)
                MOV     TH1,#0FFH       ;
                MOV     6CH,#0FFH       ;
                MOV     68H,TL1       ;将时间计数值移入暂存单元68H-6BH
                MOV     69H,TH1       ;
                MOV     6AH,6CH       ;
                clr     flag
                ljmp    outex12

INTEX112:       clr     TR1
                inc     4fh
                mov     a,4fh
                subb    a,#9             ;每100米纪录一次数据
                jc      no_100mi
                mov     4fh,#00h
                mov     R1,40h       ;没有清除当前的里程记忆
                MOV     SLA,#0A0H
                MOV     SUBA,#00H
                CALL    IWRNBYTE
                call    delay5ms
                mov     R1,41h
                MOV     SLA,#0A0H
                MOV     SUBA,#01H
                CALL    IWRNBYTE
                call    delay5ms
                mov     R1,42h
                MOV     SLA,#0A0H
                MOV     SUBA,#02H
                CALL    IWRNBYTE
                call    delay5ms

                mov     R1,43h       ;总里程记忆,16711680米为一个上限
                MOV     SLA,#0A0H
                MOV     SUBA,#03H
                CALL    IWRNBYTE
                call    delay5ms
                mov     R1,44h
                MOV     SLA,#0A0H
                MOV     SUBA,#04H
                CALL    IWRNBYTE
                call    delay5ms
                mov     R1,45h
                MOV     SLA,#0A0H
                MOV     SUBA,#05H
                CALL    IWRNBYTE
                call    delay5ms
      no_100mi: clr     c


                MOV     68H,TL1       ;将时间计数值移入暂存单元68H-6BH
                MOV     69H,TH1       ;
                MOV     6AH,6CH       ;

                CLR     A             ;清A
                MOV     TL1,A         ;计时单元置0
                MOV     TH1,A         ;
                MOV     6CH,A         ;

                CLR     flag           ;清溢出标志
                cpl     flag1
                ljmp    ex1out

      outex12:  cpl     flag1

      ex1out:
                INC     40H          	 ;圈加1
                CLR     A           	 ;清A
                CJNE    A,40H,INTEX0OUT2  ;计数没溢出转INTEX0OUT
                INC     41H              ;溢出进位(41H加1)
                CJNE    A,41H,INTEX0OUT2  ; 计数没溢出转INTEX0OUT
                INC     42H           	 ; 溢出进位(42H加1)
INTEX0OUT2:
                INC     43H          	 ;圈加1
                CLR     A           	 ;清A
                CJNE    A,43H,INTEX0OUT  ;计数没溢出转INTEX0OUT
                INC     44H              ;溢出进位(44H加1)
                CJNE    A,44H,INTEX0OUT  ;计数没溢出转INTEX0OUT
                INC     45H           	 ;溢出进位(45H加1)
INTEX0OUT:

                call    lucheng_jisuan
                call    delay
                SETB    EX0        	     ;开外中断0
                SETB    ET0             ;开定时中断T0
                setb    TR0
                POP     PSW        	     ;状态字恢复
                POP     ACC
                RETI


; T1计数器中断服务程序。
INTT1:          PUSH    ACC            	;堆栈保护
                PUSH    PSW            	;

                INC     6CH          	;6CH计时 单元加1
                MOV     A,6CH          	;移入A
                subb    a,#128
                jc      INTT11
                setb    flag
                clr     TR1

INTT11:         clr     c
                POP     PSW          	;恢复堆栈
                POP     ACC
                RETI

;定时器0中断服务程序,定时50ms,溢出50次为2.5s作为一个计数周期,如果在一个计数周期内没有
;外部脉冲即认为车子停止
intt0:          PUSH    ACC            	;堆栈保护
                PUSH    PSW            	;
                INC     6dH          	;6dH计时单元加1
                MOV     A,6dH          	;移入A
                subb    a,#128
                jc      INTT01
                setb    flag

INTT01:         clr     c
                POP     PSW          	;恢复堆栈
                POP     ACC
                reti


LCD_INIT:
         	MOV	A,#34H			;34H--扩充指令操作
		LCALL	SEND_I
		MOV	A,#30H			;30H--基本指令操作
		LCALL	SEND_I
		MOV	A,#01H			;清除显示
		LCALL	SEND_I
		LCALL	DELAY2
		LCALL	DELAY2
		MOV	A,#06H			;指定在资料写入或读取时,光标的移动方向
		LCALL	SEND_I
		MOV	A,#0CH			;开显示,关光标,不闪烁
		LCALL	SEND_I
                RET

cls:            MOV	A,#01H
		LCALL	SEND_I
                ret

;***********************************************
SEND_D:		SETB	RS_STU			;写数据子程序
		MOV	DA_IN,A
		LCALL	SERIAL_WR
		RET

SEND_I:		CLR	RS_STU			;写指令子程序
		MOV	DA_IN,A
		LCALL	SERIAL_WR
		RET
;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
;DA_IN:     数据或指令
;RS_STU:    数据指令选择
;WR_COUNT1: 计数器1
;WR_COUNT2: 计数器2

SERIAL_WR:	PUSH	ACC
		MOV	A,DA_IN
		SETB	CS

		MOV	WR_COUNT1,#05H
		SETB	STD			;1
SERIAL_WR1:	CLR	SCLK
		SETB	SCLK
		DJNZ	WR_COUNT1,SERIAL_WR1

		CLR	STD			;RW
		CLR	SCLK
		SETB	SCLK
		JNB	RS_STU,CLR_RS
		SETB	STD			;写数据
		SJMP	SETB_RS
CLR_RS:		CLR	STD			;写指令
SETB_RS:	CLR	SCLK
		SETB	SCLK
		CLR	STD			;0
		CLR	SCLK
		SETB	SCLK

		MOV	WR_COUNT1,#02H
SERIAL_WR2:	MOV	WR_COUNT2,#04H
SERIAL_WR21:	RLC	A
		MOV	STD,C
		CLR	SCLK
		SETB	SCLK
		DJNZ	WR_COUNT2,SERIAL_WR21
		MOV	WR_COUNT2,#04H
		CLR	STD			;0
SERIAL_WR22:	CLR	SCLK
		SETB	SCLK
		DJNZ	WR_COUNT2,SERIAL_WR22
		DJNZ	WR_COUNT1,SERIAL_WR2

		CLR	SCLK
		CLR	CS
		LCALL	DELAY2
		POP	ACC
		RET


HBCD:     	MOV     B,#100		;分离出百位,存放在R3中
	        DIV	AB
	        MOV	R3,A
        	MOV	A,#10		;余数继续分离十位和个位
        	XCH	A,B
        	DIV	AB
	        SWAP	A
	        ORL	A,B		;将十位和个位拼装成BCD码
        	RET


FSDT:	        LCALL	MVR0
	        LCALL	RLN
	        LJMP	MOV0

FADD:	        CLR	F0
	        SJMP	AS
FSUB:        	SETB	F0
AS:	        LCALL	MVR1
        	MOV	C,F0
        	RRC	A
        	XRL	A,@R1
        	MOV	C,ACC.7
ASN:        	MOV	PFB,C
        	XRL	A,@R0
        	RLC	A
        	MOV	F0,C
        	LCALL	MVR0
        	LCALL	AS1

MOV0:        	INC	R0
        	INC	R0
        	MOV	A,R4
        	MOV	@R0,A
        	DEC	R0
        	MOV	A,R3
        	MOV	@R0,A
        	DEC	R0
        	MOV	A,R2
        	MOV	C,PFA
        	MOV	ACC.7,C
        	MOV	@R0,A
        	CLR	ACC.7
        	CLR	OV
        	CJNE	A,#3FH,MV01
	        SETB	OV
MV01:        	MOV	A,@R0
        	RET

MVR0:        	MOV	A,@R0
        	MOV	C,ACC.7
        	MOV	PFA,C
        	MOV	C,ACC.6
        	MOV	ACC.7,C
        	MOV	R2,A
        	INC	R0
        	MOV	A,@R0
        	MOV	R3,A
        	INC	R0
        	MOV	A,@R0
        	MOV	R4,A
        	DEC	R0
        	DEC	R0
        	RET

MVR1:        	MOV	A,@R1
        	MOV	C,ACC.7
        	MOV	PFB,C
        	MOV	C,ACC.6
        	MOV	ACC.7,C
        	MOV	R5,A
        	INC	R1
                MOV	A,@R1
        	MOV	R6,A
        	INC	R1
        	MOV	A,@R1
        	MOV	R7,A
        	DEC	R1
        	DEC	R1
        	RET

AS1:        	MOV	A,R6
        	ORL	A,R7
        	JZ	AS2
        	MOV	A,R3
        	ORL	A,R4
        	JNZ	EQ1
        	MOV	A,R6
        	MOV	R3,A
        	MOV	A,R7
        	MOV	R4,A
        	MOV	A,R5
        	MOV	R2,A
        	MOV	C,PFB
        	MOV	PFA,C
AS2:	        RET
EQ1:        	MOV	A,R2
        	XRL	A,R5
        	JZ	AS4
        	JB	ACC.7,EQ3
        	MOV	A,R2
        	CLR	C
        	SUBB	A,R5
        	JC	EQ4
EQ2:        	CLR	C
        	MOV	A,R6
        	RRC	A
        	MOV	R6,A
        	MOV	A,R7
        	RRC	A
        	MOV	R7,A
        	INC	R5
        	ORL	A,R6
        	JNZ	EQ1
        	MOV	A,R2
        	MOV	R5,A
        	SJMP	AS4
EQ3:	        MOV	A,R2
	        JNB	ACC.7,EQ2
EQ4:        	CLR	C
        	LCALL	RR1
        	ORL	A,R3
        	JNZ	EQ1
        	MOV	A,R5
        	MOV	R2,A
AS4:	        JB	F0,AS5
        	MOV	A,R4
        	ADD	A,R7
        	MOV	R4,A
        	MOV	A,R3
        	ADDC	A,R6
        	MOV	R3,A
        	JNC	AS2
        	LJMP	RR1
AS5:        	CLR	C
        	MOV	A,R4
        	SUBB	A,R7
        	MOV	B,A
        	MOV	A,R3
        	SUBB	A,R6
        	JC	AS6
        	MOV	R4,B
        	MOV	R3,A
	        LJMP	RLN
AS6:	        CPL	PFA
        	CLR	C
        	MOV	A,R7
        	SUBB	A,R4
	        MOV	R4,A
        	MOV	A,R6
	        SUBB	A,R3
        	MOV	R3,A
RLN:        	MOV	A,R3
        	ORL	A,R4
        	JNZ	RLN1
        	MOV	R2,#0C1H
	        RET
RLN1:	        MOV	A,R3
        	JB	ACC.7,RLN2
        	CLR	C
        	LCALL	RL1
        	SJMP	RLN
RLN2:        	CLR	OV
	        RET

RL1:	        MOV	A,R4
        	RLC	A
        	MOV	R4,A
        	MOV	A,R3
        	RLC	A
                MOV	R3,A
        	DEC	R2
        	CJNE	R2,#0C0H,RL1E
        	CLR	A
        	MOV	R3,A
        	MOV	R4,A
	        MOV	R2,#0C1H
RL1E:        	CLR	OV
	        RET

RR1:        	MOV	A,R3
        	RRC	A
	        MOV	R3,A
        	MOV	A,R4
        	RRC	A
        	MOV	R4,A
        	INC	R2
        	CLR	OV
        	CJNE	R2,#40H,RR1E
        	MOV	R2,#3FH
	        SETB	OV
RR1E:	        RET

FMUL:	        LCALL	MVR0
        	MOV	A,@R0
        	XRL	A,@R1
        	RLC	A
        	MOV	PFA,C
        	LCALL	MUL0
	        LJMP	MOV0
MUL0:        	LCALL	MVR1
MUL1:        	MOV	A,R3
        	ORL	A,R4
        	JZ	MUL6
        	MOV	A,R6
        	ORL	A,R7
        	JZ	MUL5
        	MOV	A,R7
        	MOV	B,R4
        	MUL	AB
        	MOV	A,B
        	XCH	A,R7
        	MOV	B,R3
        	MUL	AB
        	ADD	A,R7
        	MOV	R7,A
        	CLR	A
        	ADDC	A,B
        	XCH	A,R4
        	MOV	B,R6
        	MUL	AB
        	ADD	A,R7
        	MOV	R7,A
        	MOV	A,B
        	ADDC	A,R4
        	MOV	R4,A
        	CLR	A
        	RLC	A

⌨️ 快捷键说明

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