📄 cartest.asm
字号:
; *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 + -