微机课程设计报告小型步进电机控制系统设计.doc

上传人:土8路 文档编号:10253025 上传时间:2021-05-03 格式:DOC 页数:24 大小:300.50KB
返回 下载 相关 举报
微机课程设计报告小型步进电机控制系统设计.doc_第1页
第1页 / 共24页
微机课程设计报告小型步进电机控制系统设计.doc_第2页
第2页 / 共24页
微机课程设计报告小型步进电机控制系统设计.doc_第3页
第3页 / 共24页
微机课程设计报告小型步进电机控制系统设计.doc_第4页
第4页 / 共24页
微机课程设计报告小型步进电机控制系统设计.doc_第5页
第5页 / 共24页
点击查看更多>>
资源描述

《微机课程设计报告小型步进电机控制系统设计.doc》由会员分享,可在线阅读,更多相关《微机课程设计报告小型步进电机控制系统设计.doc(24页珍藏版)》请在三一文库上搜索。

1、设计题15:小型步进电机控制系统设计(限1-2人)设计要求:(1)、分别用C语言和汇编语言编程完成硬件接口功能设计;(2)、基于80x86微机接口硬件电路设计调试;(3)、控制功能要求:小键盘给定分段速度,数码管显示当前步进电机启动与停止、方向、速度信息;(4)、具有本地与远程(串行方式下)功能。(由于技术有限,该功能没有实现)。 使用硬件:8086 PC,8255芯片,键盘数码管,步进电机驱动电路,步进电机系统设计:键盘采用实验板提供的4*4键盘,使用4个数码管实时显示系统当前状态。键位分配:第三行第一个键UP第四行前两个键R/LS/R方向键(R/L):控制步进电机运行方向,无论电机处于运行

2、或停止状态,每按下一次,电机转动方向反向;暂停键/运行(S/R):控制电机运行与否。电机转动时按下,电机暂停,当前电机运行参数不变,再次按下时,电机继续按暂停前参数运行;档位键(UP):无论电机处于任何状态,均可设定电机档位。(四档循环)数码管显示信息:左起第一个数码管显示当前电机的运行状态:S(Stop)表示当前电机为停止状态;E(Enable)表示当前电机为运行状态;P(Pause)表示当前电机为暂停状态。第二个数码管未使用,只有小数点点亮。第三个数码管显示电机运行方向:C(Clockwise)表示电机运行方向为顺时针;A(Anti-clockwise)表示电机运行方向为逆时针。第四个数码

3、管显示电机的档位:1、2、3、4分别表示1、2、3、4档。键盘数码管内部连线如下图: 数码管显示最高位为当前运行状态(S/R) 第二位不使用一直显示“-”第三位显示当前的运行方向(R/L)第四位显示当前你的运行档位数码管和小键盘内部接线图如下:键盘扫描与显示程序设置三个标志位:1.运行状态标志MODE:0 = 停止(Stop)1 = 运行(Run)2.方向标志DIR(Direction):0 = 逆时针(Right) 1 = 顺时针(Left)3.档位标志GRD(Grade):1 = 1 档2 = 2档3 = 3档4 = 4档C语言程序中:char a=0x6d,0x76, 0x76,0x0e

4、,0x06,0x5b,0x4f,0x66,0x80;char b=0x00,0x09,0x04,0x05;int dir=1;int mode=0;int grd=1;数组a中存放数码管的编码,一次为:“S”、“R”、“R”、“L”、“1”、“2”、“3”、“4”、“.”数组b中分别存放四个数码管应显示的编码在数组a中对应的位置,例如:b的初值为:0,9,4,5,则数码管会对应显示:“ S -L 1 ”。汇编程序中:DATA SEGMENTDTABLE1 DB 6DH,79H,73H,77H,39H,06H,5BH,4FH,66H,80HDATA ENDSMOV SI,3000HMOV SI,

5、00HMOV SI+2,09HMOV SI+4,04HMOV SI+6,05HDTABLE1中存放数码管的编码。SISI+2SI+4SI+6 中分别存放四个数码管应显示的编码在DTABLE1中对应的位置。与C程序中不同,汇编程序中取消了dir、mode、grd三个独立的变量,而是直接用SISI+4SI+6来代表,即:SI=0时,表示停止状态;SI=1时,表示运行状态;SI+4=3时,表示方向为逆时针;SI+4=4时,表示方向为顺时针;SI+6=5时,表示档位为1档;SI+6=6时,表示档位为2档;SI+6=7时,表示档位为3档;SI+6=8时,表示档位为4档。键盘扫描与显示程序流程图:C语言程

6、序中:void action(void) if(n=0) if(dir=1) dir=0; else dir=1; if(n=1) if(mode=1) mode=2; else mode=1; if(n=2) dir=1; mode=0; grd=1; if(n=4) grd=1; if(n=5) grd=2; if(n=6) grd=3; if(n=7) grd=4;void putbuf(void) b0=mode; b2=dir+3; b3=grd+4; dis(); clear(); ccscan(); while (cc) dis(); clear(); ccscan(); 汇编程

7、序中:PUTBUF PROC NEAR ;保存键值子程序 MOV SI,3000H CMP AL,00HJNZ MODEDIR:CMP SI+4,03HJZ DIR1 MOV SI+4,03H JMP LASTDIR1:MOV SI+4,04H JMP LASTMODE:CMP AL,01HJNZ STOPCMP SI,01HJZ MODE1MOV SI,01HJMP LASTMODE1:MOV SI,02HJMP LASTSTOP:CMP AL,02HJNZ GRD1MOV SI,00HMOV SI+4,04HMOV SI+6,05HGRD1:CMP AL,04H JZ SPEEDUPSPE

8、EDUP: PUSH AX MOV AL,SI+6 CMP AL,08H JZ BACK INC ALJMP GOBACKBACK: MOV SI+6,05HLAST:POP AXCALL DISCALL CLEARCALL CCSCANGOBACK: RETPUTBUF ENDP最后,应注意读取键盘时要有一定的延时,来跳过键盘在刚按下时产生的抖动。void keyscan() dis(); clear(); ccscan(); if (cc) dis(); delay0(0x100); delay0(0x100); clear(); ccscan(); if (cc) getkey(); p

9、utbuf(); key();电路接线图如下:则各端口地址如下:MY8255_A EQU IOY0+00H*4 ;8255的A口地址,输出,键盘列选MY8255_B EQU IOY0+01H*4 ;8255的B口地址,输出,数码管编码MY8255_C EQU IOY0+02H*4 ;8255的C口地址,低四位输入,读键盘行号;高四位输出,控制步进电机MY8255_MODE EQU IOY0+03H*4 ;8255的控制寄存器地址步进电机的控制:步进电机的励磁顺序如下表:步进电机控制端口输出值:C语言程序中:char c = 0x10,0x30,0x20,0x60,0x40,0xc0,0x80,

10、0x90;步进电机控制端口输出值存放在数组c中。void main() int i=0; int j; outp(MY8255_MODE, 0x81); while(1) while(i=0) if(dir=1) i+;if(dir=0) i-; if(i7) i=0; if(i0;j-) delay1(0x10); keyscan(); if(grd=1) for(j=5000;j0;j-)delay1(0x10);keyscan();判断档位,进行相应的延时,注意延时的时候也应每隔一定时间调用keyscan()键盘扫描及显示程序,已保证及时响应键盘输入,和刷新数码管,使数码管常亮。汇编程序

11、中:DATA SEGMENTDTABLE3 DB 10H,30H,20H,60H,40H,0C0H,80H,90HDATA ENDS步进电机控制端口输出值存放在DTABLE3中KAISHI:MOV SI,3000H CMP SI+8,8JA ZHI1CMP SI+8,1JB ZHI8JMP JIXUZHI1:MOV SI+8,01HJMP JIXUZHI8:MOV SI+8,08HJIXU:CALL KEYSCANSFRUN:MOV SI,3000H CMP SI,01HJNZ JIXUCMP SI+4,04HJNZ ZIJIANINC SI+8JMP RUNKAISHI1: JMP KAIS

12、HIZIJIAN:DEC SI+8RUN:MOV AL,SI+8MOV BX,OFFSET DTABLE3 AND AX,00FFH ADD BX,AXDEC BX MOV AL,BX MOV DX,MY8255_C OUT DX,ALDANG1:CMP SI+6,05HJNZ DANG2 PUSH CXMOV CX,10HDA1:CALL DALLY1CALL DALLY1CALL DALLY1CALL DALLY1JMP KAISHIDANG4:CMP SI+6,08HJNZ KAISHI1DA4:CALL DALLY1JMP KAISHIDALLY1 PROC NEAR ;软件延时子程序

13、 PUSH CX PUSH AX MOV CX,00AFHD11: MOV AX,5000HD22: DEC AX JNZ D22 PUSH CX PUSH AX CALL KEYSCAN POP AX POP CX LOOP D11 POP AX POP CX RETDALLY1 ENDP思路同C语言程序,不同的是,汇编程序中用SI+8来计数,以及在DALLY1子程序中调直接用KEYSCAN键盘扫描子程序。应注意调用子程序前要将CX与AX寄存器的内容入栈进行保护。附录1:C语言程序清单#include #include #include #include #include #include

14、void dis(void);void key(void);void clear(void);void ccscan(void);void action(void);void putbuf(void);void getkey(void);void delay0(int time);void keyscan(void);void delay1(int time);#define IOY0 0x0C400#define MY8255_A IOY0+0x00*4#define MY8255_B IOY0+0x01*4#define MY8255_C IOY0+0x02*4#define MY8255

15、_MODE IOY0+0x03*4char a=0x6d,0x79,0x73,0x77,0x39,0x06,0x5b,0x4f,0x66,0x80;char b=0x00,0x09,0x04,0x05;char c = 0x10,0x30,0x20,0x60,0x40,0xc0,0x80,0x90;int dir=1;int mode=0;int grd=1;int cc;int n;void main() int i=0; int j; outp(MY8255_MODE, 0x81); while(1) while(i=0) while(1) keyscan(); if(mode=1) br

16、eak; key(); if(dir=1) i+; if(dir=0) i-; outp(MY8255_C, ci); if(grd=4) for(j=500;j0;j-) delay1(0x10); keyscan(); if(grd=3) for(j=1000;j0;j-) delay1(0x10); keyscan(); if(grd=2) for(j=3000;j0;j-) delay1(0x10); keyscan(); if(grd=1) for(j=5000;j0;j-) delay1(0x10); keyscan(); key(); if(i7) i=0; if(i0) i=7

17、; void delay1(int time) int i; int j; for(i=0;i=time;i+) for(j=0;j=0x700;j+) return;void keyscan() dis(); clear(); ccscan(); if (cc) dis(); delay0(0x100); delay0(0x100); clear(); ccscan(); if (cc) getkey(); putbuf(); key();void getkey(void) int i; int j = 0xfe; for(i=0;i=3;i+) outp(MY8255_A, j); if

18、( !( (inp(MY8255_C) & 0x01) ) n = i + 0; action(); return; if ( !( (inp(MY8255_C) & 0x02) ) n = i + 4; action(); return; if ( !( (inp(MY8255_C) & 0x04) ) n = i + 8; action(); return; if ( !( (inp(MY8255_C) & 0x08) ) n = i + 12; action(); return; j =0;i-) outp(MY8255_A, j); outp(MY8255_B, abi); delay

19、0(0x100); j = 1; j |= 0x80; void clear(void) outp(MY8255_B, 0x00);void action(void) if(n=0) if(dir=1) dir=0; else dir=1; if(n=1) if(mode=1) mode=2; else mode=1; if(n=2) dir=1; mode=0; grd=1; if(n=4) grd=1; if(n=5) grd=2; if(n=6) grd=3; if(n=7) grd=4;void putbuf(void) b0=mode; b2=dir+3; b3=grd+4; dis

20、(); clear(); ccscan(); while (cc) dis(); clear(); ccscan(); void key(void) if (bioskey(1) != 0) exit(0); void delay0(int time) int i; int j; for(i=0;i=time;i+) for(j=0;j=0x100;j+) return;附录2:汇编程序清单IOY0 EQU 0e400H ;片选IOY0对应的端口始地址MY8255_A EQU IOY0+00H*4 ;8255的A口地址MY8255_B EQU IOY0+01H*4 ;8255的B口地址MY82

21、55_C EQU IOY0+02H*4 ;8255的C口地址MY8255_MODE EQU IOY0+03H*4 ;8255的控制寄存器地址STACK1 SEGMENT STACK DW 256 DUP(?)STACK1 ENDSDATA SEGMENTDTABLE1 DB 6DH,79H,73H,77H,39H,06H,5BH,4FH,66H,80HDTABLE3 DB 10H,30H,20H,60H,40H,0C0H,80H,90HDATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATASTART: MOV AX,DATAMOV DS,AXMOV SI,3

22、000HMOV SI,00HMOV SI+2,09HMOV SI+4,04HMOV SI+6,05HMOV SI+8,01HMOV DX,MY8255_MODE ;初始化8255工作方式 MOV AL,81H ;方式0,A口、B口输出,C口低4位输入 OUT DX,ALKAISHI:MOV SI,3000H MOV DH,SI+8CMP DH,8JA ZHI1CMP DH,1JB ZHI8JMP JIXUZHI1:MOV SI+8,01HJMP JIXUZHI8:MOV SI+8,08HJIXU:CALL KEYSCANMOV AH,1 ;判断是否有按键按下INT 16HJZ SFRUN ;无

23、按键则跳回继续循环,有则退出QUIT: MOV AX,4C00H ;结束程序退出INT 21HSFRUN:MOV SI,3000H MOV DH,SICMP DH,01HJNZ JIXUMOV DH,SI+4CMP DH,04HJNZ ZIJIANINC SI+8JMP RUNKAISHI1: JMP KAISHIZIJIAN:DEC SI+8RUN:MOV AL,SI+8MOV BX,OFFSET DTABLE3 AND AX,00FFH ADD BX,AXDEC BX MOV AL,BX MOV DX,MY8255_C OUT DX,ALDANG1:MOV DH,SI+6CMP DH,05

24、HJNZ DANG2 PUSH CXMOV CX,10HDA1:CALL DALLY1CALL DALLY1CALL DALLY1CALL DALLY1CALL KEYSCANJMP KAISHIDANG2:CMP DH,06HJNZ DANG3DA2:CALL DALLY1CALL DALLY1CALL DALLY1JMP KAISHIDANG3:CMP DH,07HJNZ DANG4DA3:CALL DALLY1CALL DALLY1JMP KAISHIDANG4:CMP DH,08HJNZ KAISHI1DA4:CALL DALLY1CALL KEYSCANJMP KAISHIDALLY

25、1 PROC NEAR ;软件延时子程序 PUSH CX PUSH AX MOV CX,00AFHD11:MOV AX,5000HD22:DEC AX JNZ D22PUSH CX PUSH AX CALL KEYSCAN POP AX POP CXLOOP D11 POP AX POP CX RETDALLY1 ENDPKEYSCAN PROC NEAR BEGIN:CALL DIS ;显示刷新 CALL CLEAR ;清屏CALL CCSCAN ;扫描按键JNZ GETKEY1 ;有键按下则跳置GETKEY1 JMP GOBACK1GETKEY1:CALL DIS ;显示刷新 CALL D

26、ALLY CALL DALLY CALL CLEAR ;清屏CALL CCSCAN ;再次扫描按键JNZ GETKEY2 ;有键按下则跳置GETKEY2JMP BEGIN ;否则跳回开始继续循环GETKEY2:MOV CH,0FEHMOV CL,00H ;设置当前检测的是第几列COLUM: MOV AL,CH ;选取一列,将X1X4中一个置0 MOV DX,MY8255_A OUT DX,AL MOV DX,MY8255_C ;读Y1Y4,用于判断是哪一行按键闭合 IN AL,DXL1: TEST AL,01H ;是否为第1行 JNZ L2 ;不是则继续判断 MOV AL,00H ;设置第1行

27、第1列的对应的键值JMP KCODEBEGIN1:JMP BEGINL2: TEST AL,02H ;是否为第2行 JNZ L3 ;不是则继续判断 MOV AL,04H ;设置第2行第1列的对应的键值 JMP KCODEL3: TEST AL,04H ;是否为第3行 JNZ L4 ;不是则继续判断 MOV AL,08H ;设置第3行第1列的对应的键值JMP KCODEL4: TEST AL,08H ;是否为第4行 JNZ NEXT ;不是则继续判断 MOV AL,0CH ;设置第4行第1列的对应的键值KCODE: ADD AL,CL ;将第1列的值加上当前列数,确定按键值CALL PUTBUF

28、 ;保存按键值PUSH AXKON: CALL DIS ;显示刷新CALL CLEAR ;清屏CALL CCSCAN ;扫描按键,判断按键是否弹起JNZ KON ;未弹起则继续循环等待弹起POP AXNEXT: INC CL ;当前检测的列数递增 MOV AL,CHTEST AL,08H ;检测是否扫描到第4列JZ BEGIN1 ROL AL,1 ;没检测到第4列则准备检测下一列MOV CH,ALJMP COLUMGOBACK1:RETKEYSCAN ENDPCCSCAN PROC NEAR ;扫描是否有按键闭合子程序 MOV AL,00H MOV DX,MY8255_A ;将4列全选通,X1

29、X4置0OUT DX,AL MOV DX,MY8255_C IN AL,DX ;读Y1Y4NOT AL AND AL,0FH ;取出Y1Y4的反值RETCCSCAN ENDPCLEAR PROC NEAR ;清除数码管显示子程序 MOV DX,MY8255_B ;段位置0即可清除数码管显示 MOV AL,00H OUT DX,ALRETCLEAR ENDPDIS PROC NEAR ;显示键值子程序 PUSH AX PUSH SI MOV SI,3006H MOV DL,0F7HMOV AL,DLAGAIN: PUSH DX MOV DX,MY8255_A OUT DX,AL ;设置X1X4,选通一个数码管 MOV AL,SI ;取出缓冲区中存放键值 MOV BX,OFFSET DTABLE1AND A

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 社会民生


经营许可证编号:宁ICP备18001539号-1