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

📄 cartest.asm

📁 实现电机前进,后退
💻 ASM
📖 第 1 页 / 共 2 页
字号:
;        *LCM---89C52* *LCM---89C52* *LCM------------89C52*
;        *DB0---P0.0*  *DB4---P0.4*  *RS-------------P3.7*
;        *DB1---P0.1*  *DB5---P0.5*  *RW-------------P3.6*
;        *DB2---P0.2*  *DB6---P0.6*  *E--------------P3.5*
;        *DB3---P0.3*  *DB7---P0.7* *VLCD接到GND*
;实现电机前进,后退,左转,右转,液晶显示,有24C08,霍尔传感器,路程,速度,计时,串口收发
;注:89C52的晶振频率为12MHz
;***********************************************************************
;               变量定义
;***********************************************************************
BIT_COUNT       DATA        07FH
TIMER1          DATA        07EH
TIMER2          DATA        07DH
TIMER3          DATA        07CH
C08QS           DATA        07BH                             ;24C08保存(或读)起始地址
C08WS           DATA        07AH                             ;读(写)24C08的位数
TIME1           DATA        079H                             ;延时
TIME2           DATA        078H                             ;延时
TIME3           DATA        077H                             ;延时
;QS              DATA        076H                             ;半圈数
NR7             DATA        075H
NR6             DATA        074H
NR5             DATA        073H
NR4             DATA        072H
NR3             DATA        071H
NR2             DATA        070H
T9              DATA        069H
T8              DATA        068H
T7              DATA        067H
T6              DATA        066H
T5              DATA        065H
T4              DATA        064H
YANSHI          DATA        076H
JPBZ            BIT         20H.0                            ;键盘标志位
TCBZ            BIT         20H.1                            ;停车标志位
BAOZI           BIT         20H.2                            ;接收指令标志
SJT             BIT         23H.3                            ;时钟停止标志
ZENG            BIT         P1.2                             ;正转
FAN             BIT         p1.3                             ;反转
ZUO             BIT         P1.0                             ;左转
YOU             BIT         P1.1                             ;右转
SDA             BIT         P1.6                             ;24C08
SCL             BIT         P1.7                             ;24C08
FMQ             BIT         P2.0                             ;闹钟
J1              BIT         P2.1
J2              BIT         P2.2
EPIN            BIT         P3.5
RWPIN           BIT         P3.6
RSPIN           BIT         P3.7
;*********************主程序****************************************
            ORG     0000H
            AJMP    MAIN
            ORG     0003H                             ; 外部中断0入口地址
            AJMP    ts
            ORG     000BH                             ;定时器0中断入口地址
            AJMP    TINTRUP
            ORG     0023H                             ;串行口中断入口地址
            AJMP    CANKOU

MAIN:       SETB    P1.0
            SETB    P1.1
            SETB    P1.2
            SETB    P1.3
            SETB    P2.2
            SETB    P2.1
            MOV     26H,#00H
            MOV     25H,#00H
            MOV     24H,#00H
            MOV     41H,#00H
            MOV     42H,#00H
            MOV     43H,#00H
            MOV     44H,#00H
            MOV     46H,#00H
            MOV     47H,#00H
            MOV     52H,#00H
            MOV     53H,#00H
;*****************液晶显示程序********************************
            CLR     EPIN
START:      ACALL   LCDRESET
                                               ;在LCD第一行显示"XXXcm XX"
YJ:         ACALL   LINE1
            MOV     DPTR,#TAB1
            ACALL   DISPLAY1
                                              ;在LCD第二行显示"Xcm/s XX"
            ACALL   LINE2
            MOV     DPTR,#TAB2
            ACALL   DISPLAY2
            AJMP    START1

;******************液晶显示初始化程序**************************************
LCDRESET:   ACALL    DELAY20MS                ;延时20MS
            MOV      A,#38H                   ;显示模式设置(不检测忙信号)
            ACALL    LCDWCN                   ;共三次
            ACALL    DELAY5MS
            MOV      A,#38H
            ACALL    LCDWCN
            ACALL    DELAY5MS
            MOV      A,#38H
            ACALL    LCDWCN
            MOV      A,#38H                   ;显示模式设置(以后均检测忙信号)
            ACALL    LCDWC
            MOV      A,#08H                   ;显示关闭
            ACALL    LCDWC
            MOV      A,#01H                   ;显示清屏
            ACALL    LCDWC
            MOV      A,#06H                   ;显示光标移动设置(输入方式)
            ACALL    LCDWC
            MOV      A,#0CH                   ;显示开及光标设置
            ACALL    LCDWC
            RET
;*****************行起始程序***************************************
LINE1:      MOV      A,#80H                   ;设定欲显示的起始位置为第一行第1个字符
            ACALL    LCDWC
            RET
LINE2:      MOV      A,#0C0H                  ;设定欲显示的起始位置为第二行第一个字符
            ACALL    LCDWC
            RET
;***************LCD显示程序***************************************
DISPLAY1:   MOV      A,#00H
            ACALL    DIS1
NEXT1:      MOV      A,#01H
            ACALL    DIS1
            MOV      A,#02H
            ACALL    DIS1
            MOV      A,#03H
            ACALL    DIS1
            MOV      A,#04H
            ACALL    DIS1
            MOV      A,#05H
            ACALL    DIS1
            MOV      A,#06H
            ACALL    DIS1
            MOV      A,#07H
            ACALL    DIS1
            RET
DIS1:       MOVC     A,@A+DPTR
            ACALL    LCDWD
            RET
DISPLAY2:   MOV      A,#00H
            ACALL    DIS2
NEXT2:      MOV      A,#01H
            ACALL    DIS2
            MOV      A,#02H
            ACALL    DIS2
            MOV      A,#03H
            ACALL    DIS2
            MOV      A,#04H
            ACALL    DIS2
            MOV      A,#05H
            ACALL    DIS2
            MOV      A,#06H
            ACALL    DIS2
            MOV      A,#07H
            ACALL    DIS2
            RET
DIS2:       MOVC     A,@A+DPTR
            ACALL    LCDWD
            RET
;***********************取字符码**********************************
TAB1:       DB   57H,65H,6CH,63H                ;在LCD第一行显示"Welcome "
            DB   6FH,6DH,65H,20H

TAB2:       DB   54H,6FH,20H,59H                ;在LCD第二行显示"To You !"
            DB   6FH,75H,20H,21H

;**************************送控制字*********************************
LCDWC:                                          ;送控制字子程序(检测忙信号)
            CALL    WAITIDLE
LCDWCN:                                         ;送控制字子程序(不检测忙信号)
            CLR     RSPIN                       ;RS=0 RW=0 E=高脉冲
            CLR     RWPIN
            SETB    EPIN
            MOV     P0,A
            NOP
            CLR     EPIN
            
            RET
;*************************写字符子程序*************************************************
LCDWD:                                          ;写字符子程序
            CALL    WAITIDLE
            SETB    RSPIN                       ;RS=1 RW=0 E=高脉冲
            CLR     RWPIN
            MOV     P0,A
            SETB    EPIN
            NOP
            CLR     EPIN
            RET
;*************************检测BF是否忙**************************************
WAITIDLE:
            PUSH    ACC                                 ;正常读写操作之前必须检测LCD控制器状态
            MOV     P0,#0FFH
            CLR     RSPIN                               ;RS=0 RW=1 E=高电平
            SETB    RWPIN
            SETB    EPIN
WTD_PA:     NOP                                        ;DB7:    0  LCD控制器空闲
            JB      P0.7,WTD_PA                        ;        1  LCD控制器忙
            CLR     EPIN
            POP     ACC
            RET
;**************************开始*******************************************************
START1:     JB      J2,$
            MOV     TMOD,#21H
            MOV     TL0,#0B0H                         ;定时器初值
            MOV     TH0,#3CH                          ;方式一50MS定时
            MOV     TH1,#0E6H                         ;串行口波特率1200bps
            MOV     TL1,#0E6H
            MOV     R4,#00H
            MOV     R2,#00H                            ;清外部中断0计数单元
            MOV     C08QS,#01H                        ;注入参数:从01H开始注入到02H开始的2位
            MOV     C08WS,#04H                        ;读(写)的24C08的位数
            CLR     SJT
            CLR     F1
            CLR     JPBZ
            CLR     TCBZ
            MOV     R0,#60H
            ACALL   R24C0800                          ;从24c08中读数
            MOV     A,61H
            MOV     45H,A
            MOV     A,62H
            MOV     46H,A
            MOV     A,62H
            MOV     47H,A
            SETB    ET0                                ;开定时中断
            SETB    IT0                                ;边沿触发方式
            SETB    EX0                                ;开外部中断0
            SETB    TR0
            SETB    ES                                 ;开串口中断
            SETB    PS                                 ;串口为高优先级
            SETB    EA                                 ;CPU允许中断
            MOV     SCON,#50H                          ;串口1 、允许接收
            SETB    TR1                                ;启动串口发送、 接收
            MOV     A,#1                               ;发出发信号给IC1
            ACALL   TANSFER
            SETB    FAN
            CLR     ZENG
            ACALL   D100MS
            ;LCALL   QIDONG1
;*****************液晶显示程序********************************
                                               ;在LCD第一行显示"XXXcm XX"
YJ1:        ACALL   LINE11
            MOV     DPTR,#TAB11
            ACALL   DISPLAY11
                                              ;在LCD第二行显示"Xcm/s XX"
            ACALL   LINE22
            MOV     DPTR,#TAB22
            ACALL   DISPLAY22
            JB      SJT,$
            AJMP    QD

;*****************行起始程序***************************************
LINE11:     MOV      A,#80H                   ;设定欲显示的起始位置为第一行第1个字符
            ACALL    LCDWC1
            RET
LINE22:     MOV      A,#0C0H                  ;设定欲显示的起始位置为第二行第一个字符
            ACALL    LCDWC1
            RET
;***************LCD显示程序***************************************
DISPLAY11:  MOV      A,41H
            ACALL    DIS11
NEXT11:     MOV      A,42H
            ACALL    DIS11
            MOV      A,43H
            ACALL    DIS11
            MOV      A,44H
            ACALL    DIS11
            MOV      A,#0AH
            ACALL    DIS11
            MOV      A,#0BH
            ACALL    DIS11
            MOV      A,45H
            ACALL    DIS11
            MOV      A,46H
            ACALL    DIS11
            RET
DIS11:      MOVC     A,@A+DPTR
            ACALL    LCDWD1
            RET
DISPLAY22:  MOV      A,47H
            ACALL    DIS22
NEXT22:     MOV      A,#0AH
            ACALL    DIS22
            MOV      A,#0BH
            ACALL    DIS22
            MOV      A,#0CH
            ACALL    DIS22
            MOV      A,#0DH
            ACALL    DIS22
            MOV      A,#0EH
            ACALL    DIS22
            MOV      A,24H
            ACALL    DIS22
            MOV      A,25H
            ACALL    DIS22
            RET
DIS22:      MOVC     A,@A+DPTR
            ACALL    LCDWD1
            RET
;***********************取字符码**********************************
TAB11:      DB   30H,31H,32H,33H                ;在LCD第一行显示"XXXXcm X"
            DB   34H,35H,36H,37H
            DB   38H,39H,63H,6DH,20H
TAB22:      DB   30H,31H,32H,33H                ;在LCD第二行显示"Xcm/s XX"
            DB   34H,35H,36H,37H
            DB   38H,39H,63H,6DH
            DB   2FH,73H,20H
;**************************送控制字*********************************
LCDWC1:                                          ;送控制字子程序(检测忙信号)
            CALL    WAITIDLE1
LCDWCN1:                                         ;送控制字子程序(不检测忙信号)
            CLR     RSPIN                       ;RS=0 RW=0 E=高脉冲
            CLR     RWPIN
            MOV     P0,A
            SETB    EPIN
            NOP
            CLR     EPIN
            ACALL   DELAY5MS
            RET
;*************************写字符子程序*************************************************
LCDWD1:                                          ;写字符子程序
            CALL    WAITIDLE1
            SETB    RSPIN                       ;RS=1 RW=0 E=高脉冲
            CLR     RWPIN
            MOV     P0,A
            SETB    EPIN
            NOP
            CLR     EPIN
            RET
;*************************检测BF是否忙**************************************
WAITIDLE1:
            PUSH    ACC                                 ;正常读写操作之前必须检测LCD控制器状态
            MOV     P0,#0FFH
            CLR     RSPIN                               ;RS=0 RW=1 E=高电平
            SETB    RWPIN
            SETB    EPIN
WTD_PA1:    NOP                                        ;DB7:    0  LCD控制器空闲
            JB      P0.7,WTD_PA1                        ;        1  LCD控制器忙
            CLR     EPIN
            POP     ACC
            RET
QD:         LCALL   QIDONG                             ;直道行驶
            LCALL   WS08                               ;往24C08中写数
JPBJ:       JB      F1,JP
            JB      J1,JP
            INC     60H
            MOV     A,60H
            CJNE    A,#0AH,NEXT
            SETB    F1
JP:         JB      JPBZ,NEXT
            JB      J2,NEXT
            DEC     60H

⌨️ 快捷键说明

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