;/******************************************************************************** ;* 标题: 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
|