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

📄 gaichefa.asm

📁 单片机实现的无线控制小车
💻 ASM
字号:
;                 *************************************
;                 *                                   *
;                 *       遥控编码控制器              *
;                 *                                   *
;                 *          采用89c51             *
;                 *************************************
;
;  P1.0口按纽为前进,P1.1口按纽为后退,P1.2口按纽为左转弯,P1.3口按纽为右转弯,
; P1.4口按纽为自动驾驶,P3.5为编码输出
;
;*************************************
;*                                   *
;*      主程序和中断程序入口         *
;*                                   *
;*************************************
KEYWORD EQU 23H



ORG     0000H    		 ;程序执行开始地址
LJMP    START    ;跳至START执行
ORG     0003H    		 ;外中断0中断入口地址
RETI             ;中断返回(不开中断)
ORG     000BH    		 ;定时器T0中断入口地址
RETI             ;中断返回(不开中断)
ORG     0013H    		 ;外中断1中断入口地址
RETI             ;中断返回(不开中断)
ORG     001BH    		 ;定时器T1中断入口地址
RETI             ;中断返回(不开中断)
ORG     0023H    		 ;串行口中断入口地址
RETI             ;中断返回(不开中断)
ORG     002BH    		 ;定时器T2中断入口地址
RETI    		 	 ;中断返回(不开中断)
;
;*************************************
;*                                   *
;*       初始化程序中的各变量        *
;*                                   *
;*************************************
CLEARMEMIO:     CLR	A   		 	;清A
		DEC	A   		 	;A为#0FFH
		MOV     P1,A   		; P1口置1
                MOV     P3,A   		; P3口置1
                MOV     IE,#00H     ;关所有中断
                RET   		 		;子程序返回
;
;
;
;*************************************
;*                                   *
;*	    主  程   序                  *
;*                                   *
;*************************************
START:           CALL LED
                 LCALL   CLEARMEMIO      ;调用初始化
; 主体程序      
               
MAIN:           LCALL   KEYWORK         ;调用查键子程序
		LJMP	MAIN        		;转MAIN循环
		NOP						;PC值出错处理
		NOP
		NOP
		LJMP	START        	;转START重新启动
;
;**************************
;*                        *
;*	键盘工作子程序        *
;**************************
; 4*4行列扫描查键子程序
KEYWORK:     MOV    P1,#0FFH     	; 置P1口为输入状态
             CLR    P1.0       		;扫描第一行(第一行为0)
             MOV    A,P1       		;读入P1口值
             ANL    A,#0F0H       	;低四位为0
             CJNE   A,#0F0H,KEYCON  ;高四位不为全1(有键按下)转KEYCOON
             SETB   P1.0       		; 扫描第二行(第二行为0)
             CLR    P1.1       		;
             MOV    A,P1       		; 读入P1口值
             ANL    A,#0F0H       	; 低四位为0
             CJNE   A,#0F0H,KEYCON  ; 高四位不为全1(有键按下)转KEYCOON
             SETB   P1.1       		; 扫描第三行(第三行为0)
             CLR    P1.2       		;
             MOV    A,P1       		; 读入P1口值
             ANL    A,#0F0H       	; 低四位为0
             CJNE   A,#0F0H,KEYCON   ; 高四位不为全1(有键按下)转KEYCOON
             SETB   P1.2       		; 扫描第四行(第四行为0)
             CLR    P1.3       		;
             MOV    A,P1       		; 读入P1口值
             ANL    A,#0F0H       	; 低四位为0
             CJNE   A,#0F0H,KEYCON   ; 高四位不为全1(有键按下)转KEYCOON
             SETB   P1.3       		;结束行扫描
             RET       				;子程序返回
KEYCON:      LCALL  DL10MS          ;消抖处理
             MOV    A,P1       		;再读入P1口值
             ANL    A,#0F0H       	; 低四位为0
             CJNE   A,#0F0H,KEYCHE   ; 高四位不为全1,确有键按下,转KEYCHE
KEYOUT:      RET       				;干扰,子程序返回
KEYCHE:      MOV    A,P1       		;读P1口值
             MOV    KEYWORD,A        ;放入23H暂存
CJLOOP:         	;调显示子程序
             MOV    A,P1       		;读P1口值
             ANL    A,#0F0H       	;低四位为0
             CJNE   A,#0F0H,CJLOOP   ;高四位为全1(键还按着),转CJLOOP等待释放
             MOV    R7,#00H       	;键释放,置R7初值为#00H(查表次数)
             MOV    DPTR,#KEYTAB     ;取键值表首址
CHEKEYLOOP:  MOV    A,R7       		;查表次数入A
             MOVC    A,@A+DPTR       ;查表
             XRL    A,KEYWORD       	;查表值与P1口读入值比较
             JZ     KEYOK       		;为0(相等)转KEYOK
             INC    R7       			;不等,查表次数加1
             CJNE   R7,#10H,CHEKEYLOOP   ;查表次数不超过16次转CHEKEYLOOP再查
             RET       					;16次到,退出
;
KEYOK:       MOV    A,R7       		;查表次数入A(即键号值)
             MOV    B,A       		;放入B
             RL	    A       			;左移
	     ADD    A,B       		;相加(键号乘3处理JMP 3字节指令)
	     MOV    DPTR,#KEYFUNTAB	;取键功能散转表首址
	     JMP    @A+DPTR       	;查表
KEYFUNTAB:   LJMP   KEYFUN00       	; 键功能散转表。跳至0号键功能程序
	     LJMP   KEYFUN01       	; 跳至01号键功能程序
             LJMP   KEYFUN02       	; 跳至02号键功能程序
	     LJMP   KEYFUN03
             LJMP   KEYFUN04
	     LJMP   KEYFUN05
             LJMP   KEYFUN06
	     LJMP   KEYFUN07
             LJMP   KEYFUN08
	     LJMP   KEYFUN09
             LJMP   KEYFUN10
	     LJMP   KEYFUN11
             LJMP   KEYFUN12
	     LJMP   KEYFUN13
             LJMP   KEYFUN14
	     LJMP   KEYFUN15       	; 跳至15号键功能程序
             RET       				;散转出错返回
;
;键号对应P1口数值表(同时按下两键为无效操作)
KEYTAB:      DB     0EEH,0DEH,0BEH,7EH,0EDH,0DDH,0BDH,7DH
             DB    0EBH,0DBH,0BBH,7BH,0E7H,0D7H,0B7H,77H,0FFH,0FFH
;
;
KEYFUN00:       CLR     P2.0
                call    DL10MS;CALL    DELAY
		SETB    P2.0
                MOV     A,#02H     ;发2个脉冲
                LJMP    REMOTE     ;转发送程序
                RET
;
KEYFUN01:       CLR     P2.1
                call    DL10MS;CALL    DELAY
		SETB    P2.1
                MOV     A,#03H     ;发3个脉冲
                LJMP    REMOTE     ;转发送程序
                RET
;
KEYFUN02:       CLR     P2.2
                call    DL10MS;CALL    DELAY
		SETB    P2.2
                MOV     A,#04H     ;发4个脉冲
                LJMP    REMOTE     ;转发送程序
                RET
;
KEYFUN03:       CLR     P2.3
                call   DL10MS;CALL    DELAY
		SETB    P2.3
                MOV     A,#05H     ;发5个脉冲
                LJMP    REMOTE     ;转发送程序
                RET
;
KEYFUN04:       CLR     P2.4
                call   DL10MS;CALL    DELAY
		SETB    P2.4
                MOV     A,#06H     ;发6个脉冲
                LJMP    REMOTE     ;转发送程序
                RET
;
KEYFUN05:       CLR     P2.5 
                call   DL10MS;CALL    DELAY
		SETB    P2.5  
                MOV     A,#07H     ;发7个脉冲
                LJMP    REMOTE     ;转发送程序
                RET
;
KEYFUN06:       CLR     P2.6
                call   DL10MS;CALL    DELAY
		SETB    P2.6
                MOV     A,#08H     ;发8个脉冲
                LJMP    REMOTE     ;转发送程序
                RET
;
KEYFUN07:       MOV     A,#09H     ;发9个脉冲
                LJMP    REMOTE     ;转发送程序
                RET
;
;
KEYFUN08:       MOV     A,#0AH     ;发10个脉冲
                LJMP    REMOTE     ;转发送程序
                RET
;
KEYFUN09:       MOV     A,#0BH     ;发11个脉冲
                LJMP    REMOTE     ;转发送程序
                RET
;
KEYFUN10:       MOV     A,#0CH     ;发12个脉冲
                LJMP    REMOTE     ;转发送程序
                RET
;
KEYFUN11:       MOV     A,#0DH     ;发13个脉冲
                LJMP    REMOTE     ;转发送程序
                RET
;
KEYFUN12:       MOV     A,#0EH     ;发14个脉冲
                LJMP    REMOTE     ;转发送程序
                RET
;
KEYFUN13:       MOV     A,#0FH     ;发15个脉冲
                LJMP    REMOTE     ;转发送程序
                RET
;
KEYFUN14:       MOV     A,#10H 
                LJMP    REMOTE
		RET
KEYFUN15:       MOV     A,#11H
                LJMP    REMOTE
		RET
               

;
;
;*************************************
;*                                   *
;*         编 码 发 射 程 序         *
;*                                   *
;*************************************
;
REMOTE:         MOV     R1,A      ;?????A
                LJMP    OUT3      ;???????
OUT:            MOV     R0,#55H   ;1MS?????
OUT1:           CLR     P3.5      ;??????
                NOP      		 ;????(????21??)
                NOP
                NOP
                NOP
                NOP
                NOP
                NOP
                NOP
                NOP
                DJNZ    R0,OUT1   ;??????,?OUT1??
                MOV     R0,#55H   ;1MS?????
OUT2:           SETB     P3.5     ;??????
                NOP      		 ;????(????21??)
                NOP
                NOP
                NOP
                NOP
                NOP
                NOP
                NOP
                NOP
                DJNZ    R0,OUT2     ;??????,?OUT2??
                DJNZ    R1,OUT      ;???????OUT???
                LCALL   DL10MS      ;??????10??
                RET          		;??
OUT3:           MOV     R0,#0FFH     ;3MS?????
                LJMP    OUT1        ;?OUT1?????
LED:                     ;程序指示灯
 MOV R4,#0Ah
L0: CPL P2.7
mov  r5, #0ffh
L1: CALL DELAY
djnz r5,L1

DJNZ R4,L0
SETB P2.7
RET
;*************************************
;*                                   *
;*      延时 255 X 2 = 512 us       *
;*                                   *
;*************************************
DELAY:          MOV     R2,#0FFH
DELAY1:         DJNZ    R2,DELAY1
		RET
;
;*************************************
;*                                   *
;*           延时10ms程序           *
;*          (消按键抖动用)         *
;*************************************
DL10MS:         MOV     R3,#14H
DL10MS1:        LCALL   DELAY
                DJNZ    R3,DL10MS1
		RET
DL500MS:        MOV     R4,#32H
DL500MS1:       LCALL   DL10MS
                DJNZ    R4,DL500MS1
                RET
;
;
		END     			 ;程序结束

⌨️ 快捷键说明

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