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

📄 mm.asm

📁 由于电动小汽车纯硬件控制具有很多缺点,并且不宜实现复杂运动的自动控制功能(不能用人工控制).而单片机具有体积小,重量轻,耗电少,功能强,控制灵活方便,价格低廉等优点.本设计就是以单片机89C51为核心
💻 ASM
字号:
        LEFTPWM        EQU     70H
        RIGHTPWM       EQU     6FH
        LEFTCOUNTER    EQU     6EH
        RIGHTCOUNTER   EQU     6DH
        PWMPERIOD      EQU     6CH
        INTCOUNTER     EQU     6BH
        SECOND         EQU     6AH

        BIT_COUNT	DATA	69H
	TIMER		DATA	68H
	TIMER1		DATA	67H
	TEN		DATA	66H
	DATA_IN		DATA	20H
	DATA_OUT	DATA	21H


	DAT	BIT	P2.7 		; HD7279A的DATA连接于P1.1
	KEY	BIT	P3.3 		; HD7279A的KEY连接于P3.1,吕昂原来的是P3.3
	CS	BIT	P2.6		; HD7279A的CS连接于P1.3
	CLK	BIT	P2.4 		; HD7279A的CLK连接于P1.2
        
        LEFTFORWARD     BIT     P2.0
        LEFTBACKWARD    BIT     P2.1
        RIGHTFORWARD    BIT     P2.2
        RIGHTBACKWARD   BIT     P2.3

        ORG     0000H
        LJMP    START

        ORG     000BH
        LJMP    INTT0

        ORG     001BH
        LJMP    INTT1

        ORG     0030H
START:  MOV     SP,#2FH
        MOV     TMOD,#21H      ;
        MOV     TH0,#3CH
        MOV     TL0,#0B0H
        SETB    EA
        SETB    ET0
        SETB    TR0
        LCALL   INITIAL                  
	MOV	DATA_OUT,#81H 	; 发复位(清除)指令
	CALL	SEND
        MOV	DATA_OUT,#0H 	; 发复位(清除)指令
	CALL	SEND
        MOV	DATA_OUT,#80H 	; 发复位(清除)指令
	CALL	SEND
        MOV	DATA_OUT,#0H 	; 发复位(清除)指令
	CALL	SEND
        SETB	CS			; 恢复CS为高电平       
LOOP:   MOV     P0,#0FFH
        MOV     P1,P0
        MOV     A,P0
        ANL     A,#05H        
LEFTLTURN:CJNE   A,#01H,RIGHTTURN
        CLR     ET1
        MOV     LEFTPWM,#15
        MOV     RIGHTPWM,#16
        LJMP    LOOP
RIGHTTURN:CJNE   A,#04H,OTHERS
        CLR     ET1                                                                                                                                                         
        MOV     LEFTPWM,#16
        MOV     RIGHTPWM,#15
        LJMP    LOOP
OTHERS: MOV     LEFTPWM,#15
        MOV     RIGHTPWM,#15          
     ;   MOV     A,SECOND
    ;    MOV     B,#10
    ;    DIV     AB
    ;    MOV	TEN,A
;	MOV	DATA_OUT,#10000001B 	; 下载数据且译码指令(第2位)
;	CALL	SEND
;	MOV	DATA_OUT,TEN 		; 发送十位数据到HD7279A
;	CALL	SEND
;	MOV	DATA_OUT,#10000000B 	; 下载数据且译码指令(第1位)
;	CALL	SEND
;	MOV	DATA_OUT,B 		; 发送个位数据到HD7279A
;	CALL	SEND
  ;      SETB	CS         
        LJMP    LOOP              
        
;;;
INITIAL:MOV     TH1,#06H       ;
        MOV     TL1,#06H       ;
        SETB    TR1
        setb    LEFTFORWARD
        clr     LEFTBACKWARD
        setb    RIGHTFORWARD
        clr     RIGHTBACKWARD
        MOV     LEFTPWM,#16
        MOV     LEFTCOUNTER,#0
        MOV     RIGHTPWM,#15
        MOV     RIGHTCOUNTER,#0
        MOV     PWMPERIOD,#100
        MOV     INTCOUNTER,#0
        MOV     SECOND,#0 
        SETB    ET1
        RET

;;;
INTT0:  PUSH    PSW
        PUSH    ACC
        MOV     TH0,#3CH
        MOV     TL0,#0B0H                
        INC     INTCOUNTER
        MOV     A,INTCOUNTER
        CJNE    A,#20,T0FIN
        MOV     INTCOUNTER,#0
        INC     SECOND                          
T0FIN:  POP     ACC
        POP     PSW
        RETI

;;;;
INTT1:  PUSH    PSW
        PUSH    ACC
        INC     LEFTCOUNTER
        INC     RIGHTCOUNTER
        MOV     A,LEFTCOUNTER
        CJNE    A,LEFTPWM,NOCHANGE
        cpl     LEFTforWARD
        LJMP    RIGHTTEST
NOCHANGE:CJNE   A,PWMPERIOD,RIGHTTEST
        cpl    LEFTforWARD
        MOV     LEFTCOUNTER,#0
RIGHTTEST:MOV     A,RIGHTCOUNTER
        CJNE    A,RIGHTPWM,NOCHANGE1
        cpl     RIGHTforWARD
        LJMP    T1FIN
NOCHANGE1:CJNE   A,PWMPERIOD,T1FIN
        cpl    RIGHTforWARD
        MOV     RIGHTCOUNTER,#0
T1FIN:  POP     ACC
        POP     PSW
        RETI


;;;;;
SEND:		MOV	BIT_COUNT,#8 		; 设定位计数器=8
		CLR	CS 			; 设CS为低电平
		LCALL	LONG_DELAY 		; 长延时
SEND_LOOP:	MOV	C,DATA_OUT.7 		; 输出1位
		MOV	DAT,C
		SETB	CLK 			; 设CLK为高电平
		MOV	A,DATA_OUT 		; 待发送数据左移
		RL	A
		MOV	DATA_OUT,A
		LCALL	SHORT_DELAY 		; 短延时
		CLR	CLK 			; 设CLK为低电平
		LCALL	SHORT_DELAY 		; 短延时
		DJNZ	BIT_COUNT,SEND_LOOP 	; 检查是否8位都发送完毕
		CLR	DAT 			; 发送完毕,返回
		RET

RECEIVE:	MOV	BIT_COUNT,#8 		; 设定位计数器=8
		SETB	DAT 			; 设P1.2(DATA)为高电平(输入状态)
		LCALL	LONG_DELAY 		; 长延时
RECEIVE_LOOP: 	SETB	CLK 			; 设CLK为高电平
		LCALL	SHORT_DELAY 		; 短延时
		MOV	A,DATA_IN 		; 数据左移
		RL	A
		MOV	DATA_IN,A
		MOV	C,DAT 			; 读取1位数据
		MOV	DATA_IN.0,C
		CLR	CLK 			; 设CLK为低电平
		LCALL	SHORT_DELAY
		DJNZ	BIT_COUNT,RECEIVE_LOOP	; 是否已接收8位数据
		CLR	DAT 			; 重设DAT口为低电平(输出状态)
		RET

;;;;
LONG_DELAY:	MOV	TIMER,#25 		; 延时时间约50us
DELAY_LOOP: 	DJNZ	TIMER,DELAY_LOOP
		RET
;;;;;
SHORT_DELAY:	MOV	TIMER,#4 		; 延时时间约8us
SHORT_LP:	DJNZ	TIMER,SHORT_LP
		RET

		END











⌨️ 快捷键说明

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