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

📄 第8次小车寻迹.asm

📁 小车程序
💻 ASM
📖 第 1 页 / 共 3 页
字号:
      ORL A,#30H
      MOV COM,A
      LCALL LCDWRITE
      MOV  COM,#0B7H
      LCALL LCDWRITE
      MOV  COM,#0D6H
      LCALL LCDWRITE
      RET
ZZ50M:
      SETB P1.0
      CLR  P1.1
      MOV R3,#198
      MOV R4,#5
      LCALL WRITE_TIME
AAA2: LCALL  READ_TIME
      LCALL  SJ
      LCALL  FENDIS
      LCALL  MIAODIS
      SETB P0.0
      SETB P0.1
      LCALL DELAY1
      CLR P0.0
      CLR P0.1
      LCALL DELAY1
      DJNZ R3,AAA2
      DJNZ R4,AAA2
      RET
FZ_160M:
      CLR  P1.0
      SETB P1.1
      MOV R3,#0
      MOV R4,#8
      LCALL WRITE_TIME
AAAD2:LCALL  READ_TIME
      LCALL  SJ
      LCALL  FENDIS
      LCALL  MIAODIS
      SETB P0.0
      SETB P0.1
      LCALL DELAY1
      CLR P0.0
      CLR P0.1
      LCALL DELAY1
      DJNZ R3,AAAD2
      DJNZ R4,AAAD2
      RET

DELAY3:MOV R5,#200
DD1:    MOV R6,#100
DD2:    MOV R7,#100
       DJNZ R7,$
       DJNZ R6,DD2
       DJNZ R5,DD1
       RET
DELAY1S:MOV R5,#20
DDC1:    MOV R6,#100
DDC2:    MOV R7,#100
       DJNZ R7,$
       DJNZ R6,DDC2
       DJNZ R5,DDC1
       RET
DELAY05S:MOV R5,#130
DDA1:    MOV R6,#200
DDA2:    MOV R7,#100
       DJNZ R7,$
       DJNZ R6,DDA2
       DJNZ R5,DDA1
       RET

PING:  PUSH 03H
       MOV    START,#0F8H     ;写入命令(11111000)
       MOV    COM,#80H    ;设定显示位置
       LCALL  LCDWRITE
       MOV    START,#0FAH
       MOV    DPTR,#TAB1
       MOV    R3,#2
PING1: LCALL  DIS8
       DJNZ   R3,JS1
       POP 03H
       RET
JS:    PUSH   03H
       MOV    START,#0F8H     ;写入命令(11111000)
       MOV    COM,#80H    ;设定显示位置
       LCALL  LCDWRITE
       MOV    START,#0FAH
       MOV    DPTR,#TAB2
       MOV    R3,#2
JS1:   LCALL  DIS8
       DJNZ   R3,JS1
       POP    03H
        RET
QJ:    PUSH   03H
       MOV    START,#0F8H     ;写入命令(11111000)
       MOV    COM,#80H    ;设定显示位置
       LCALL  LCDWRITE
       MOV    START,#0FAH
       MOV    DPTR,#TAB3
       MOV    R3,#2
QJ1:   LCALL  DIS8
       DJNZ   R3,QJ1
       POP 03H
       RET
FH:    PUSH   03H
       MOV    START,#0F8H     ;写入命令(11111000)
       MOV    COM,#80H    ;设定显示位置
       LCALL  LCDWRITE
       MOV    START,#0FAH
       MOV    DPTR,#TAB3
       MOV    R3,#2
FH1:   LCALL  DIS8
       DJNZ   R3,FH1
       POP 03H
       RET
CHUXIAN:PUSH 03H
       MOV    START,#0F8H     ;写入命令(11111000)
       MOV    COM,#80H    ;设定显示位置
       LCALL  LCDWRITE
       MOV    START,#0FAH
       MOV    DPTR,#TAB5
       MOV    R3,#5
CHUXIAN1:
       LCALL  DIS8
       DJNZ   R3,CHUXIAN1
CHUXIAN2:MOV    START,#0F8H     ;写入命令(11111000)
       MOV    COM,#88H    ;设定显示位置
       LCALL  LCDWRITE
       MOV    START,#0FAH
       MOV    DPTR,#TAB6
       MOV    R3,#5
CHUXIAN3:
       LCALL  DIS8
       DJNZ   R3,CHUXIAN3
CHUXIAN4:
       MOV    START,#0F8H     ;写入命令(11111000)
       MOV    COM,#90H    ;设定显示位置
       LCALL  LCDWRITE
       MOV    START,#0FAH
       MOV    DPTR,#TAB11
       MOV R3,#5
CHUXIAN5:
       LCALL DIS8
       DJNZ R3,CHUXIAN5
       MOV    START,#0F8H     ;写入命令(11111000)
       MOV    COM,#98H    ;设定显示位置
       LCALL  LCDWRITE
       MOV    START,#0FAH
       MOV    DPTR,#TAB12
       MOV R3,#5
CHUXIAN6:
       LCALL DIS8
       DJNZ R3,CHUXIAN6
       POP  03H
       RET
HT:    PUSH 03H
       MOV    START,#0F8H     ;写入命令(11111000)
       MOV    COM,#80H    ;设定显示位置
       LCALL  LCDWRITE
       MOV    START,#0FAH
       MOV    DPTR,#TAB4
       MOV    R3,#2
HT1:   LCALL  DIS8
       DJNZ   R3,HT1
       POP 03H
       RET
SJ:    PUSH 03H
       MOV    START,#0F8H     ;写入命令(11111000)
       MOV    COM,#90H    ;设定显示位置
       LCALL  LCDWRITE
       MOV    START,#0FAH
       MOV    DPTR,#TAB8
       MOV    R3,#3
SJ1:   LCALL  DIS8
       DJNZ   R3,SJ1
       POP 03H
       RET
DIS8:  CLR    A
       MOVC   A,@A+DPTR
       INC    DPTR
       MOV    COM,A
       LCALL  LCDWRITE
       CLR    A
       MOVC   A,@A+DPTR
       INC    DPTR
       MOV    COM,A
       LCALL  LCDWRITE
       RET
TING5S:CLR P0.0
       CLR P0.1
       MOV R5,#8
DDD1:  MOV R6,#00H
DDD2:  MOV R7,#00H
       DJNZ R7,$
       DJNZ R6,DDD2
       DJNZ R5,DDD1
       RET
TAB1:  DB "平衡   "
TAB2:  DB "结束   "
TAB3:  DB "前进   "
TAB4:  DB "后退    "
TAB5:  DB "1.静态平衡"
TAB6:  DB "3.动寻平衡"
TAB7:  DB "返回"
TAB8:  DB "时间:"
TAB9:  DB "请放重物到AC之间"
TAB10: DB "按任意键继续    "
TAB11: DB "2.小车寻迹"
TAB12: DB "4.动态平衡"
YIMA:        PUSH B
             MOV R7,A
             MOV B,#10
             SUBB A,B
             JNC YIMA1
             MOV A,R7
             ORL A,#30H
             JMP YIMA2
YIMA1:       MOV A,R7
             ADD A,#37H
YIMA2:       POP B
             RET
DL40MS:                        ;延时子程序
        PUSH    00H            ;40MS
        PUSH    01H
        PUSH    02H
        MOV     R2,#01H
DL_PA:  MOV     R0,#0FFH
DL_PB:  MOV     R1,#0FFH
        DJNZ    R1,$
        DJNZ    R0,DL_PB
        DJNZ    R2,DL_PA
        POP     02H
        POP     01H
        POP     00H
        RET
        NOP
        NOP
        NOP
        RET
DELAY10US:NOP
          NOP
          NOP
          NOP
          NOP
          RET
AD_DATA:
	MOV R0,#ADDR
	MOV R1,#1
	ACALL RD_AD
	MOV R0, #ADDR
	MOV R1,#1;有效转换开始
	ACALL RD_AD
	RET
RD_AD:
	CLR CLK2543; 置CLK为低
	SETB CS2543;置CS为高
	NOP
	NOP
	CLR CS2543;置CS为低,转换开始
	MOV R4,#08; 8位控制字移入TLC2543,高8位;结果移出TLC2543
	MOV A,R1; 控制字装入A中
	ADLOP1:
	MOV C,DOUT;?移出一位结果进入C
	RLC A; C中结果从A的最低位进入,控制字最;高位移入C
	MOV DIN, C; 1位控制字移入TLC2543

	SETB CLK2543

	NOP

	NOP

	NOP

	NOP

	CLR CLK2543

	DJNZ R4,ADLOP1;?是否移完?

	MOV R2, A; 结果的高8位装入R2
	
	MOV A, #0

	MOV R4, #04;读取低4位转换结果

	ADLOP2:

	MOV C, DOUT

	RLC A

	SETB CLK2543

	NOP

	NOP

	NOP

	NOP

	CLR CLK2543

	DJNZ R4, ADLOP2

	MOV R3, A; 低4位转换结果装入R3

	SETB CS2543

	RET
DISK1:  PUSH   02H
        PUSH   03H
        MOV    START,#0F8H     ;写入命令(11111000)
	MOV    COM,#80H    ;设定显示位置
        LCALL  LCDWRITE
        MOV    START,#0FAH
        MOV    A,R2
        SWAP   A
        ANL    A,#0FH
        LCALL  YIMA
        MOV    COM,A
        LCALL  LCDWRITE
        MOV    A,R2
        ANL    A,#0FH
        LCALL  YIMA
        MOV    COM,A
        LCALL LCDWRITE
        MOV    A,R3
        SWAP   A
        ANL    A,#0FH
        LCALL  YIMA
        MOV    COM,A
        LCALL  LCDWRITE
        MOV    A,R3
        ANL    A,#0FH
        LCALL  YIMA
        MOV    COM,A
        LCALL LCDWRITE
        POP    03H
        POP    02H
        RET
LCDRESET:
        LCALL  DL1MS           ;延时等待内部复位
        MOV    START,#0F8H     ; 写入命令(11111000)
	MOV    COM,#30H        ;使用基本指令集
	LCALL  LCDWRITE
	MOV    COM,#0CH
	LCALL  LCDWRITE        ;整体显示ON
	MOV    COM,#01H        ;清屏
	LCALL  LCDWRITE
        MOV    COM,#06H
        LCALL  LCDWRITE
        LCALL  DL1MS
	RET
LCDWRITE:                      ;模块写入子程序
	MOV    A,COM           ;送待发数据命令A
	ANL    A,#0F0H         ;屏蔽低4位
	MOV    HDATA,A         ;将高4位送HDATA单元
	MOV    A,COM           ;取低4位
	SWAP   A               ;高低4位互换
	ANL    A,#0F0H
	MOV    LDATA,A         ;将低4位送LDATA单元
	MOV    A,START         ;取起始字节
	LCALL  SENDBIT         ;发送
	LCALL  DL1MS           ;延时1ms
	MOV    A,HDATA
	LCALL  SENDBIT
	LCALL  DL1MS
	MOV    A,LDATA
	LCALL  SENDBIT
	LCALL  DL1MS
	RET

SENDBIT:                       ;串行字节数据发送子程序
	MOV     R7,#08H        ;发送8位
SEND_1: RLC     A
        MOV     STD,C          ;数据送数据线
	CLR     SCLK           ;产生同步时钟
	SETB    SCLK
	DJNZ    R7,SEND_1      ;未发送完8位继续
	RET
DL1MS:                         ;延时子程序
        PUSH    00H            ;0.1MS
        PUSH    01H
        PUSH    02H
        MOV     R2,#01H
WA_PA:  MOV     R0,#01H
WA_PB:  MOV     R1,#0fH
        DJNZ    R1,$
        DJNZ    R0,WA_PB
        DJNZ    R2,WA_PA
        POP     02H
        POP     01H
        POP     00H
        RET
        NOP
        RET
	WRITE_TIME:
	MOV DS_ADDR,#0AH
	MOV A,#20H
	LCALL WRITE_DS
	MOV DS_ADDR,#0BH
	MOV A,#22H
	LCALL WRITE_DS
	MOV DS_ADDR,#0
	MOV A,#0
	LCALL WRITE_DS
	MOV DS_ADDR,#2
	MOV A,#0
	LCALL WRITE_DS
	RET	
	READ_TIME:
	MOV DS_ADDR,#0AH
	LCALL READ_DS
	JBC ACC.7,READ_TIME ;更新标志
	MOV DPTR,#0
	MOVX A,@DPTR
	MOV MIAO,A
	MOV DPTR,#2
	MOVX A,@DPTR
	MOV FEN,A
	RET
	READ_DS:
	MOV DPH,#0H
	MOV DPL,DS_ADDR
	MOVX A,@DPTR
	RET
	WRITE_DS:
	MOV DPH,#0H
	MOV DPL,DS_ADDR
	MOVX @DPTR,A
	RET

SEND_DATE: LCALL SEND                   ;发送DATA_OUT中命令
             LCALL MIDDLE_DELAY           ;两字节间要有25us延时
             MOV DATA_OUT,DATA_OUT1       ;将DATA_IN中数据发送给DATA_OUT
             LCALL SEND
             SETB CS
             RET
    ;发送一个字节到HD7279 ,高位再前
       SEND: PUSH 07H
             MOV R7,#8                    ;设定位计数器
             CLR CS                       ;设CS为低电平
             LCALL LONG_DELAY             ;长延时
SEND_LOOP: MOV C,DATA_OUT.7
             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 R7,SEND_LOOP            ;检查是否8位均发送完毕
             CLR DAT                      ;发送完毕返回
             POP 07H
             RET
     ;从HD7279接收一个字节,高位在前
    RECEIVE: PUSH 07H
             MOV R7,#8                    ;设定位计数器
             SETB DAT                     ;置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                    ;读取一位数据
             MOV DATA_IN.0,C
             CLR CLK
             LCALL SHORT_DELAY
             DJNZ R7,RECEIVE_LOOP         ;检查是否8位均发送完毕
             CLR DAT                      ;重设DAT为低电平
             POP 07H
             RET
 WAIT: JB KEY,WAIT
             MOV DATA_OUT,#00010101B      ;读键值命令
             CALL SEND
             CALL RECEIVE
             SETB CS
      WAIT1: JNB KEY,WAIT1
             RET
  LONG_DELAY:PUSH 06H
             MOV R6,#12                   ;延时50US
  DELAY_LOOP:DJNZ R6,DELAY_LOOP
             POP 06H
             RET
MIDDLE_DELAY:PUSH 06H                     ;延时25US
             MOV R6,#4
 DELAY_LOOP1:DJNZ R6,DELAY_LOOP
             POP 06H
             NOP
             RET
SHORT_DELAY: NOP
             NOP                          ;延时8US
             NOP
             NOP
             RET
  DELAY25MS: PUSH 06H                     ;延时25MS
             PUSH 07H
             MOV R6,#31
     DE25MS1:MOV R7,#0F5H
     DE25MS2:DJNZ R7,DE25MS2
             DJNZ R6,DE25MS1
             POP 07H
             POP 06H
             RET
             DELAY:    PUSH 02H                   
             PUSH 03H
             PUSH 04H
   LOOP3:    MOV R4,#8
   LOOP2:    MOV R3,#0C8H
   LOOP1:    MOV R2,#0E6H
   LOOP4:    DJNZ R2,LOOP4
             DJNZ R3,LOOP1
             DJNZ R4,LOOP2
             POP 04H
             POP 03H
             POP 02H
             RET

⌨️ 快捷键说明

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