返回主页 单片机教程XL2000开发板 单片机学习 自制编程器 单片机资料 软件下载 电子技术产品介绍如何购买 论坛

;/********************************************************************************
;* 标题: xl系列单片机实验仪演示程序 LCD1602显示 步进电机控制器速度方向圈数可调*
;* 文件: lcd1602dj.asm *
;* 日期: 2006-1-5 *
;* 版本: 3.0 (试验通过版)可用xl600-xl1000单片机综合试验仪试验 *
;* 邮箱: sxj1974@163.com *
;* 网站: http://www.51c51.com www.8951.com *
;********************************************************************************
;* 描述: LCD1602显示 步进电机控制器速度方向圈数可调 *
;K1-启动与停止步进电机运行;K2-设定步进电机运行圈数 (1-20圈) *
;K3-设定步进电机转动方向;K4-设定步进电机运行速度 *
;步进电机的转速控制分16档,数字越小,转速越快。 *
;7.5度步进电机;周期7.5×4=30度,电机转动一圈需12个周期? *
;资源:p1.0-p1.3接反向器74ls14,输出后接步进电机 p3.7接小喇叭提供按键音 *
;p1.4-p1.7接端口按键:lcd1602插入实验仪 *
;********************************************************************************
;* 【版权】 Copyright(C)深圳市学林电子有限公司 www.51c51.com *
;* 【声明】 此程序仅用于学习与参考,引用请注明版权和作者信息! *
;* 【技术支持】请访问http://www.51c51.com/bbs/ 官方论坛 *
;********************************************************************************/

K1 EQU P1.4 ;K1键
K2 EQU P1.5 ;K2键
K3 EQU P1.6 ;K3键
K4 EQU P1.7 ;K4键

BA EQU P1.0 ;步进电机A端
BB EQU P1.1 ;步进电机B端
BC EQU P1.2 ;步进电机C端
BD EQU P1.3 ;步进电机D端

BEEP EQU P3.7 ;蜂鸣器
RS EQU P2.0
RW EQU P2.1
EN EQU P2.2
LCD_X EQU 2FH

RATE EQU 32H ;转速档次
D_BUF1 EQU 33H ;显示缓存1
D_BUF2 EQU 34H ;显示缓存2
TEMP EQU 35H ;临时过渡
TURN_NUM EQU 36H ;存放运行圈数
CYCLE EQU 37H ;存放周期数
;--------------------------------------------
ORG 0000H
JMP MAIN
ORG 000BH
JMP INTT0
ORG 0080H
;---------------------------------------------
MAIN:
MOV SP,#60H
ACALL SET_LCD ;显示启动画面
MOV R4,#0FH
MAIN1 :
MOV R5,#25 ;延时5S
CALL DELAY2
DJNZ R4,MAIN1
ACALL SET_LCD0
CLR 20H.0 ;转速设置加减标记
SETB 20H.1 ;正转、逆转标记
SETB 20H.2 ;圈数设置加减标记
SETB 20H.3 ;运行与停止标记
SETB 20H.4
MOV R0,#00H
MOV R1,#00H
MAIN2:
MOV TURN_NUM,#5 ;默认转5圈
MOV A,TURN_NUM
MOV LCD_X,#04H
ACALL DATA_CONV ;显示圈数
ACALL SET_LCD1 ;显示STOP

MOV R2,TURN_NUM
MOV CYCLE,#12 ;12个周期,电机转一圈。
MOV RATE,#08H ;预设为中速

MOV A,RATE
MOV LCD_X,#0DH
ACALL DATA_CONV ;显示转速比例

MOV P1,#0F0H
MOV TMOD,#01H
MOV TL0,#33H
MOV TH0,#0F5H
SETB EA
SETB ET0

M_LOOP:
MOV A,CYCLE ;12个周期,电机转一圈。
CJNE A,#00H,LOOP0
MOV CYCLE,#12
DEC R2
MOV A,R2
MOV LCD_X,#04H ;显示剩余圈数
ACALL DATA_CONV

CJNE R2,#00H,LOOP0
CLR TR0
MOV P1,#0F0H
MOV R2,TURN_NUM ;重新送圈数
SETB 20H.3 ;STOP
MOV A,R2
MOV LCD_X,#04H ;显示圈数
ACALL DATA_CONV
ACALL SET_LCD1
LOOP0:
JB 20H.1,LOOP0A
ACALL SET_LCDR ;<<
JMP LOOP0B
LOOP0A:
ACALL SET_LCDF ;>>
LOOP0B:
JB K1,LOOP1
JNB 20H.3,LOOP0C
ACALL SET_LCD2 ;RUNNING
SETB TR0 ;启动步进电机运行
CLR 20H.3 ;停止运行标记
CALL BEEP_BL
JMP LOOP1
LOOP0C:
CLR TR0 ;停止步进电机运行
SETB 20H.3 ;启动运行标记
MOV P1,#0F0H
MOV CYCLE,#12
MOV R2,TURN_NUM
ACALL SET_LCD1 ;STOP
CALL BEEP_BL
JMP M_LOOP
LOOP1:
JB K2,LOOP2
CALL BEEP_BL
JNB 20H.2,LOOP1B
MOV A,TURN_NUM ;增加圈数
INC A
MOV TURN_NUM,A
MOV LCD_X,#04H ;显示设定圈数
ACALL DATA_CONV
MOV R2,TURN_NUM
MOV A,TURN_NUM
CJNE A,#20,LOOP1A
CLR 20H.2
LOOP1A:
JMP LOOP2
LOOP1B:
MOV A,TURN_NUM ;减少圈数
DEC A
MOV TURN_NUM,A
MOV LCD_X,#04H ;显示设定圈数
ACALL DATA_CONV
MOV R2,TURN_NUM
MOV A,TURN_NUM
CJNE A,#01H,LOOP2
SETB 20H.2
LOOP2:
JB K3,LOOP3 ;换向
CLR TR0
MOV P1,#0F0H
SETB 20H.3 ;STOP标志
ACALL SET_LCD1
CPL 20H.1 ;换向标志
JB 20H.1,LOOP2A ;根据换向标志来显示转动方向
ACALL SET_LCDR
JMP LOOP2B
LOOP2A:
ACALL SET_LCDF
LOOP2B:
CALL BEEP_BL
MOV R2,TURN_NUM ;换向后,从设定值开始运行
MOV A,R2
MOV LCD_X,#04H ;显示设定圈数
ACALL DATA_CONV
LOOP3:
JB K4,LOOP4
CLR 20H.4 ;在运行过程调整速率时,要使步进电机先停止转动
CALL BEEP_BL
JNB 20H.0,LOOP5
mov temp,CYCLE
MOV A,RATE ;减速过程
INC A
MOV RATE,A
MOV LCD_X,#0DH
ACALL DATA_CONV
MOV A,RATE
CJNE A,#10H,LOOP4
CLR 20H.0
LOOP4:
SETB 20H.4
JMP M_LOOP
LOOP5:
MOV A,RATE ;加速过程
DEC A
MOV RATE,A
MOV LCD_X,#0DH
ACALL DATA_CONV
MOV A,RATE
CJNE A,#01H,LOOP6
SETB 20H.0
LOOP6:
SETB 20H.4
JMP M_LOOP
;---------------------------------------------
;步进电机正转走一步子程序
;---------------------------------------------
FFW:
MOV A,R0
MOV DPTR,#TABLE_F
MOVC A,@A+DPTR
CJNE A,#00H,FFW1
MOV R0,#00H
DEC CYCLE ;每8步为一个周期
JMP FFW2
FFW1:
MOV P1,A
INC R0
FFW2:
RET
;---------------------------------------------
;步进电机逆转走一步子程序
;---------------------------------------------
REV:
MOV A,R0
MOV DPTR,#TABLE_R
MOVC A,@A+DPTR
CJNE A,#00H,REV1
MOV R0,#00H
DEC CYCLE ;每8步为一个周期
JMP REV2
REV1:
MOV P1,A
INC R0
REV2:
RET
;---------------------------------------------
;中断服务子程序
;中断定时2ms
;20H.1=1 正转,20H.1=0 反转
;---------------------------------------------
INTT0:
PUSH ACC
CLR TR0
MOV TL0,#33H
MOV TH0,#0F5H
SETB TR0
JNB 20H.4,INTT0B ;K4键按下时,停止步进电机运行
INC R3
MOV B,R3
MOV A,RATE ;中断次数来调整延时时间的长短
CJNE A,B,INTT0B
MOV R3,#00H
JNB 20H.1,INTT0A
LCALL FFW ;步进电机正转
JMP INTT0B
INTT0A:
LCALL REV ;步进电机逆转
INTT0B: 
POP ACC
RETI
;-----------------------------------------------------
;
;-----------------------------------------------------
DATA_CONV:
MOV B,#10
DIV AB
JZ D_CONV1 ;高位为0,不显示
ADD A,#30H
JMP D_CONV2
D_CONV1:
MOV A,#20H
D_CONV2:
MOV D_BUF1,A ;高位
MOV A,B
ADD A,#30H
MOV D_BUF2,A ;低位
MOV B,LCD_X
MOV A,D_BUF1
CALL LCDP2
INC LCD_X
MOV B,LCD_X
MOV A,D_BUF2
CALL LCDP2
RET
;-----------------------------------------------------
; LCD 初始化设置
;-----------------------------------------------------
SET_LCD:
CLR EN
CALL INIT_LCD ;初始化 LCD
CALL DELAY1
MOV DPTR,#INFO1 ;指针指到显示信息1
MOV A,#1 ;显示在第一行
CALL LCD_SHOW
MOV DPTR,#INFO2 ;指针指到显示信息2
MOV A,#2 ;显示在第二行
CALL LCD_SHOW
RET
;-----------------------------------------------------
INFO1: DB " STEPPING MOTOR ",0 ;LCD 第一行显示信息
INFO2: DB "CONTROL PROCESS",0 ;LCD 第二行显示信息

;-----------------------------------------------------
SET_LCD0:
CLR EN
CALL INIT_LCD ;初始化 LCD
CALL DELAY1
MOV DPTR,#INFO3 ;指针指到显示信息1
MOV A,#1 ;显示在第一行
CALL LCD_SHOW
MOV DPTR,#INFO4 ;指针指到显示信息2
MOV A,#2 ;显示在第二行
CALL LCD_SHOW
RET
INFO3: DB " STOP ",0
INFO4: DB "NUM: RATE: ",0 ;LCD 第二行显示信息

SET_LCD1:
MOV DPTR,#INFO5 ;指针指到显示信息1
MOV A,#1 ;显示在第一行
CALL LCD_SHOW
RET
INFO5: DB " STOP ",0

SET_LCD2:
MOV DPTR,#INFO6 ;指针指到显示信息1
MOV A,#1 ;显示在第一行
CALL LCD_SHOW
RET
INFO6: DB " RUNNING ",0

SET_LCD3:
MOV DPTR,#INFO7 ;指针指到显示信息1
MOV A,#1 ;显示在第一行
CALL LCD_SHOW
RET
INFO7: DB " RUNNING ",0

SET_LCDF:
MOV LCD_X,#0CH
MOV A,#3EH ;显示>>
ACALL LCDP1
INC LCD_X
ACALL LCDP1
RET

SET_LCDR:
MOV LCD_X,#0CH
MOV A,#3CH ;显示<<
ACALL LCDP1
INC LCD_X
ACALL LCDP1
RET
LCD_CLR:
MOV LCD_X,#0CH
MOV A,#20H ;显示
ACALL LCDP1
INC LCD_X
ACALL LCDP1
RET
;--------------------------------------------------------
INIT_LCD: ;8位I/O控制 LCD 接口初始化
MOV A,#38H ;双列显示,字形5*7点阵
CALL WCOM
CALL DELAY1
MOV A,#38H ;双列显示,字形5*7点阵
CALL WCOM
CALL DELAY1
MOV A,#38H ;双列显示,字形5*7点阵
CALL WCOM
CALL DELAY1
MOV A,#0CH ;开显示,关光标,
CALL WCOM
CALL DELAY1
MOV A,#01H ;清除 LCD 显示屏
CALL WCOM
CALL DELAY1
RET
;----------------------------------------------------
LCD_SHOW: ;在LCD的第一行或第二行显示信息字符

CJNE A,#1,LINE2 ;判断是否为第一行
LINE1:
MOV A,#80H ;设置 LCD 的第一行地址
CALL WCOM ;写入命令
CALL CLR_LINE ;清除该行字符数据
MOV A,#80H ;设置 LCD 的第一行地址
CALL WCOM ;写入命令
JMP FILL
LINE2:
MOV A,#0C0H ;设置 LCD 的第二行地址
CALL WCOM ;写入命令
CALL CLR_LINE ;清除该行字符数据
MOV A,#0C0H ;设置 LCD 的第二行地址
CALL WCOM
FILL:
CLR A ;填入字符
MOVC A,@A+DPTR ;由消息区取出字符
CJNE A,#0,LC1 ;判断是否为结束码
RET
LC1:
CALL WDATA ;写入数据
INC DPTR ;指针加1
JMP FILL ;继续填入字符
RET
;---------------------------------------------------
CLR_LINE: ;清除该行 LCD 的字符
MOV R0,#24
CL1:
MOV A,#' '
CALL WDATA
DJNZ R0,CL1
RET
;----------------------------------------------------
MENU1: ;LCD 显示工作菜单信息
MOV DPTR,#MENU2
MOV A,#1 ;在第一行显示信息
CALL LCD_SHOW
RET
MENU2: DB " REMOTE CONTROL ",0

;-----------------------------------------------------
; 写指令使能子程序
;RS=L,RW=L,D0-D7=指令码,E=高脉冲
;-----------------------------------------------------
WCOM:
MOV P0,A
CLR RS
CLR RW
SETB EN
CALL DELAY0
CLR EN
RET
;-----------------------------------------------------
;写数据使能子程序
;RS=H,RW=L,D0-D7=数据,E=高脉冲
;----------------------------------------------------
WDATA:
MOV P0,A
SETB RS
CLR RW
SETB EN
CALL DELAY0
CLR EN
RET
DELAY0:
MOV R7,#250 ;延时500微秒
DJNZ R7,$
RET
;---------------------------------------------------
;在 LCD 显示字符
;A=ASC DATA, B=LINE X POS
;---------------------------------------------------

LCDP1: ;在LCD的第一行显示字符
PUSH ACC ;
MOV A,LCD_X ;设置显示地址
ADD A,#80H ;设置LCD的第一行地址
CALL WCOM ;写入命令
POP ACC ;由堆栈取出A
CALL WDATA ;写入数据
RET
LCDP2: ;在LCD的第二行显示字符
PUSH ACC ;
MOV A,B ;设置显示地址
ADD A,#0C0H ;设置LCD的第二行地址
CALL WCOM ;写入命令
POP ACC ;由堆栈取出A
CALL WDATA ;写入数据
RET

;-----------------------------------------------
;蜂鸣器响一声子程序
;-----------------------------------------------
BEEP_BL:
MOV R6,#100
BL1:
CALL DEX1
CPL BEEP
DJNZ R6,BL1
MOV R5,#25
CALL DELAY2
RET
DEX1:
MOV R7,#180
DEX2:
NOP
DJNZ R7,DEX2
RET
DELAY2: ;延时R5×10MS
MOV R6,#50
D1:
MOV R7,#100
DJNZ R7,$
DJNZ R6,D1
DJNZ R5,DELAY2
RET
;-----------------------------------------------
;延时5MS
;-----------------------------------------------
DELAY1:
MOV R6,#25
DL2:
MOV R7,#100
DJNZ R7,$
DJNZ R6,DL2
RET
TABLE_F:
DB 0F1H,0F3H,0F2H,0F6H,0F4H,0FCH,0F8H,0F9H
DB 00
TABLE_R:
DB 0F9H,0F8H,0FCH,0F4H,0F6H,0F2H,0F3H,0F1H
DB 00
;----------------------------------------------
;TABLE_F:
DB 0F3H,0F6H,0FCH,0F9H
DB 00
;TABLE_R:
DB 0F9H,0FCH,0F6H,0F3H
DB 00
;----------------------------------------------

END