微机课程设计报告小型步进电机控制系统设计_第1页
微机课程设计报告小型步进电机控制系统设计_第2页
微机课程设计报告小型步进电机控制系统设计_第3页
微机课程设计报告小型步进电机控制系统设计_第4页
微机课程设计报告小型步进电机控制系统设计_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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,

30、选通一个数码管 mov al,si ;取出缓冲区中存放键值 mov bx,offset dtable1and ax,00ffhadd bx,ax mov al,bx mov dx,my8255_b out dx,al ;写入数码管adpcall dallydec sidec si ;取下一个键值 pop dx mov al,dltest al,01h ;判断是否显示完? jz out1 ;显示完,返回ror al,1 mov dl,aljmp again ;未显示完,跳回继续out1: pop sipop ax retdis endpputbuf proc near ;保存键值子程序 mov si,3000h cmp al,00hjnz modedir:cmp si+4,03hjz dir1 mov si+4,03h jmp lastdir1:m

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论