微机课程设计报告.docx
- 文档编号:6214106
- 上传时间:2023-01-04
- 格式:DOCX
- 页数:30
- 大小:187.57KB
微机课程设计报告.docx
《微机课程设计报告.docx》由会员分享,可在线阅读,更多相关《微机课程设计报告.docx(30页珍藏版)》请在冰豆网上搜索。
微机课程设计报告
设计题15:
小型步进电机控制系统设计(限1-2人)
设计要求:
(1)、分别用C语言和汇编语言编程完成硬件接口功能设计;
(2)、基于80x86微机接口硬件电路设计调试;
(3)、控制功能要求:
小键盘给定分段速度,数码管显示当前步进电机启动与停止、方向、速度信息;
(4)、具有本地与远程(串行方式下)功能。
(由于技术有限,该功能没有实现)。
使用硬件:
8086PC,8255芯片,键盘数码管,步进电机驱动电路,步进电机
系统设计:
键盘采用实验板提供的4*4键盘,使用4个数码管实时显示系统当前状态。
键位分配:
第三行第一个键
第四行前两个键
方向键(R/L):
控制步进电机运行方向,无论电机处于运行或停止状态,每按下一次,电机转动方向反向;
暂停键/运行(S/R):
控制电机运行与否。
电机转动时按下,电机暂停,当前电机运行参数不变,再次按下时,电机继续按暂停前参数运行;
档位键(UP):
无论电机处于任何状态,均可设定电机档位。
(四档循环)
数码管显示信息:
左起第一个数码管显示当前电机的运行状态:
S(Stop)表示当前电机为停止状态;E(Enable)表示当前电机为运行状态;P(Pause)表示当前电机为暂停状态。
第二个数码管未使用,只有小数点点亮。
第三个数码管显示电机运行方向:
C(Clockwise)表示电机运行方向为顺时针;A(Anti-clockwise)表示电机运行方向为逆时针。
第四个数码管显示电机的档位:
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语言程序中:
chara[]={0x6d,0x76,0x76,0x0e,0x06,0x5b,0x4f,0x66,0x80};
charb[]={0x00,0x09,0x04,0x05};
intdir=1;
intmode=0;
intgrd=1;
数组a[]中存放数码管的编码,一次为:
“S”、“R”、“R”、“L”、“1”、“2”、“3”、“4”、“.”
数组b[]中分别存放四个数码管应显示的编码在数组a[]中对应的位置,例如:
b[]的初值为:
0,9,4,5,则数码管会对应显示:
“S-L1”。
汇编程序中:
DATASEGMENT
DTABLE1DB6DH,79H,73H,77H,39H,06H,5BH,4FH,66H,80H
DATAENDS
MOVSI,3000H
MOV[SI],00H
MOV[SI+2],09H
MOV[SI+4],04H
MOV[SI+6],05H
DTABLE1中存放数码管的编码。
[SI][SI+2][SI+4][SI+6]中分别存放四个数码管应显示的编码在DTABLE1中对应的位置。
与C程序中不同,汇编程序中取消了dir、mode、grd三个独立的变量,而是直接用[SI][SI+4][SI+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语言程序中:
voidaction(void)
{
if(n==0)
{
if(dir==1)dir=0;
elsedir=1;
}
if(n==1)
{
if(mode==1)mode=2;
elsemode=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;
}
voidputbuf(void)
{
b[0]=mode;
b[2]=dir+3;
b[3]=grd+4;
dis();
clear();
ccscan();
while(cc)
{
dis();
clear();
ccscan();
}
}
汇编程序中:
PUTBUFPROCNEAR;保存键值子程序
MOVSI,3000H
CMPAL,00H
JNZMODE
DIR:
CMP[SI+4],03H
JZDIR1
MOV[SI+4],03H
JMPLAST
DIR1:
MOV[SI+4],04H
JMPLAST
MODE:
CMPAL,01H
JNZSTOP
CMP[SI],01H
JZMODE1
MOV[SI],01H
JMPLAST
MODE1:
MOV[SI],02H
JMPLAST
STOP:
CMPAL,02H
JNZGRD1
MOV[SI],00H
MOV[SI+4],04H
MOV[SI+6],05H
GRD1:
CMPAL,04H
JZSPEEDUP
SPEEDUP:
PUSHAX
MOVAL,[SI+6]
CMPAL,08H
JZBACK
INCAL
JMPGOBACK
BACK:
MOV[SI+6],05H
LAST:
POPAX
CALLDIS
CALLCLEAR
CALLCCSCAN
GOBACK:
RET
PUTBUFENDP
最后,应注意读取键盘时要有一定的延时,来跳过键盘在刚按下时产生的抖动。
voidkeyscan()
{
dis();
clear();
ccscan();
if(cc)
{
dis();
delay0(0x100);
delay0(0x100);
clear();
ccscan();
if(cc)
{
getkey();
putbuf();
}
}
key();
}
电路接线图如下:
则各端口地址如下:
MY8255_AEQUIOY0+00H*4;8255的A口地址,输出,键盘列选
MY8255_BEQUIOY0+01H*4;8255的B口地址,输出,数码管编码
MY8255_CEQUIOY0+02H*4;8255的C口地址,低四位输入,读键盘行号;
高四位输出,控制步进电机
MY8255_MODEEQUIOY0+03H*4;8255的控制寄存器地址
步进电机的控制:
步进电机的励磁顺序如下表:
步进电机控制端口输出值:
C语言程序中:
charc[]={0x10,0x30,0x20,0x60,0x40,0xc0,0x80,0x90};
步进电机控制端口输出值存放在数组c[]中。
voidmain()
{
inti=0;
intj;
outp(MY8255_MODE,0x81);
while
(1)
{
while((i<=7)&&(i>=0))
{
……
if(dir==1)i++;
if(dir==0)i--;
……
}
if(i>7)i=0;
if(i<0)i=7;
}
}
首先保证使计数值i在0-7之间变化,若正转,则递增;反转则递减。
while
(1)
{
keyscan();
if(mode==1)break;
key();
}
outp(MY8255_C,c[i]);
判断是否运行,如运行,则跳出循环,给步进电机发驱动脉冲。
if(grd==4)
for(j=500;j>0;j--)
{
delay1(0x10);
keyscan();
}
……
if(grd==1)
for(j=5000;j>0;j--)
{
delay1(0x10);
keyscan();
}
判断档位,进行相应的延时,注意延时的时候也应每隔一定时间调用keyscan()键盘扫描及显示程序,已保证及时响应键盘输入,和刷新数码管,使数码管常亮。
汇编程序中:
DATASEGMENT
DTABLE3DB10H,30H,20H,60H,40H,0C0H,80H,90H
DATAENDS
步进电机控制端口输出值存放在DTABLE3中
KAISHI:
MOVSI,3000H
CMP[SI+8],8
JAZHI1
CMP[SI+8],1
JBZHI8
JMPJIXU
ZHI1:
MOV[SI+8],01H
JMPJIXU
ZHI8:
MOV[SI+8],08H
JIXU:
CALLKEYSCAN
……
SFRUN:
MOVSI,3000H
CMP[SI],01H
JNZJIXU
CMP[SI+4],04H
JNZZIJIAN
INC[SI+8]
JMPRUN
KAISHI1:
JMPKAISHI
ZIJIAN:
DEC[SI+8]
RUN:
MOVAL,[SI+8]
MOVBX,OFFSETDTABLE3
ANDAX,00FFH
ADDBX,AX
DECBX
MOVAL,[BX]
MOVDX,MY8255_C
OUTDX,AL
DANG1:
CMP[SI+6],05H
JNZDANG2
PUSHCX
MOVCX,10H
DA1:
CALLDALLY1
CALLDALLY1
CALLDALLY1
CALLDALLY1
JMPKAISHI
……
DANG4:
CMP[SI+6],08H
JNZKAISHI1
DA4:
CALLDALLY1
JMPKAISHI
DALLY1PROCNEAR;软件延时子程序
PUSHCX
PUSHAX
MOVCX,00AFH
D11:
MOVAX,5000H
D22:
DECAX
JNZD22
PUSHCX
PUSHAX
CALLKEYSCAN
POPAX
POPCX
LOOPD11
POPAX
POPCX
RET
DALLY1ENDP
思路同C语言程序,不同的是,汇编程序中用[SI+8]来计数,以及在DALLY1子程序中调直接用KEYSCAN键盘扫描子程序。
应注意调用子程序前要将CX与AX寄存器的内容入栈进行保护。
附录1:
C语言程序清单
#include
#include
#include
#include
#include
#include
voiddis(void);
voidkey(void);
voidclear(void);
voidccscan(void);
voidaction(void);
voidputbuf(void);
voidgetkey(void);
voiddelay0(inttime);
voidkeyscan(void);
voiddelay1(inttime);
#defineIOY00x0C400
#defineMY8255_AIOY0+0x00*4
#defineMY8255_BIOY0+0x01*4
#defineMY8255_CIOY0+0x02*4
#defineMY8255_MODEIOY0+0x03*4
chara[]={0x6d,0x79,0x73,0x77,0x39,0x06,0x5b,0x4f,0x66,0x80};
charb[]={0x00,0x09,0x04,0x05};
charc[]={0x10,0x30,0x20,0x60,0x40,0xc0,0x80,0x90};
intdir=1;
intmode=0;
intgrd=1;
intcc;
intn;
voidmain()
{
inti=0;
intj;
outp(MY8255_MODE,0x81);
while
(1)
{
while((i<=7)&&(i>=0))
{
while
(1)
{
keyscan();
if(mode==1)break;
key();
}
if(dir==1)i++;
if(dir==0)i--;
outp(MY8255_C,c[i]);
if(grd==4)
for(j=500;j>0;j--)
{
delay1(0x10);
keyscan();
}
if(grd==3)
for(j=1000;j>0;j--)
{
delay1(0x10);
keyscan();
}
if(grd==2)
for(j=3000;j>0;j--)
{
delay1(0x10);
keyscan();
}
if(grd==1)
for(j=5000;j>0;j--)
{
delay1(0x10);
keyscan();
}
key();
}
if(i>7)i=0;
if(i<0)i=7;
}
}
voiddelay1(inttime)
{
inti;
intj;
for(i=0;i<=time;i++)
{
for(j=0;j<=0x700;j++)
{}
}
return;
}
voidkeyscan()
{
dis();
clear();
ccscan();
if(cc)
{
dis();
delay0(0x100);
delay0(0x100);
clear();
ccscan();
if(cc)
{
getkey();
putbuf();
}
}
key();
}
voidgetkey(void)
{
inti;
intj=0xfe;
for(i=0;i<=3;i++)
{
outp(MY8255_A,j);
if(!
((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<<=1;
}
}
voidccscan(void)
{
outp(MY8255_A,0x00);
cc=inp(MY8255_C);
cc=(~cc)&0x0F;
}
voiddis(void)
{
inti;
intj=0xf7;
for(i=3;i>=0;i--)
{
outp(MY8255_A,j);
outp(MY8255_B,a[b[i]]);
delay0(0x100);
j>>=1;
j|=0x80;
}
}
voidclear(void)
{
outp(MY8255_B,0x00);
}
voidaction(void)
{
if(n==0)
{
if(dir==1)dir=0;
elsedir=1;
}
if(n==1)
{
if(mode==1)mode=2;
elsemode=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;
}
voidputbuf(void)
{
b[0]=mode;
b[2]=dir+3;
b[3]=grd+4;
dis();
clear();
ccscan();
while(cc)
{
dis();
clear();
ccscan();
}
}
voidkey(void)
{
if(bioskey
(1)!
=0)
{
exit(0);
}
}
voiddelay0(inttime)
{
inti;
intj;
for(i=0;i<=time;i++)
{
for(j=0;j<=0x100;j++)
{}
}
return;
}
附录2:
汇编程序清单
IOY0EQU0e400H;片选IOY0对应的端口始地址
MY8255_AEQUIOY0+00H*4;8255的A口地址
MY8255_BEQUIOY0+01H*4;8255的B口地址
MY8255_CEQUIOY0+02H*4;8255的C口地址
MY8255_MODEEQUIOY0+03H*4;8255的控制寄存器地址
STACK1SEGMENTSTACK
DW256DUP(?
)
STACK1ENDS
DATASEGMENT
DTABLE1DB6DH,79H,73H,77H,39H,06H,5BH,4FH,66H,80H
DTABLE3DB10H,30H,20H,60H,40H,0C0H,80H,90H
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
MOVSI,3000H
MOV[SI],00H
MOV[SI+2],09H
MOV[SI+4],04H
MOV[SI+6],05H
MOV[SI+8],01H
MOVDX,MY8255_MODE;初始化8255工作方式
MOVAL,81H;方式0,A口、B口输出,C口低4位输入
OUTDX,AL
KAISHI:
MOVSI,3000H
MOVDH,[SI+8]
CMPDH,8
JAZHI1
CMPDH,1
JBZHI8
JMPJIXU
ZHI1:
MOV[SI+8],01H
JMPJIXU
ZHI8:
MOV[SI+8],08H
JIXU:
CALLKEYSCAN
MOVAH,1;判断是否有按键按下
INT16H
JZSFRUN;无按键则跳回继续循环,有则退出
QUIT:
MOVAX,4C00H;结束程序退出
INT21H
SFRUN:
MOVSI,3000H
MOVDH,[SI]
CMPDH,01H
JNZJIXU
MOVDH,[SI+4]
CMPDH,04H
JNZZIJIAN
INC[SI+8]
JMPRUN
KAISHI1:
JMPKAISHI
ZIJIAN:
DEC[SI+8]
RUN:
MOVAL,[SI+8]
MOVBX,OFFSETDTABLE3
ANDAX,00FFH
ADDBX,AX
DECBX
MOVAL,[BX]
MOVDX,MY8255_C
OUTDX,AL
DANG1:
MOVDH,[SI+6]
CMPDH,05H
JNZDANG2
PUSHCX
MOVCX,10H
DA1:
CALLDALLY1
CALLDALLY1
CALLDALLY1
CALLDALLY1
CALLKEYSCAN
JMPKAISHI
DANG2:
CMPDH,06H
JNZDANG3
DA2:
CALLDALLY1
CALLDALLY1
CALLDALLY1
JMPKAISHI
DANG3:
CMPDH,07H
JNZDANG4
DA3:
CALLDALLY1
CALLDALLY1
JMPKAISHI
DANG4:
CMPDH,08H
JNZKAISHI1
DA4:
CALLDALLY1
CALLKEYSCAN
JMPKAISHI
DALLY1PROCNEAR;软件延时子程序
PUSHCX
PUSHAX
MOVCX,00AFH
D11:
MOVAX,5000H
D22:
DECAX
JNZD22
PUSHCX
PUSHAX
CALLKEYSCAN
POPAX
POPCX
LOOPD11
POPAX
POPCX
RET
DALLY1ENDP
KEYSCANPROCNEAR
BEGIN:
CALLDIS;显示刷新
CALLCLEAR;清屏
CALLCCSCAN;扫描按键
JNZGETKEY1;有键按下则跳置GETKEY1
JMPGOBACK1
GETKEY1:
CALLDIS;显示刷新
CALLDALLY
CALLDALLY
CALLCLEAR;清屏
CALLCCSCAN;再次扫描按键
JNZGETKEY2;有键按下则跳置GETKEY2
JMPBEGIN;否则跳回开始继续循环
GETKEY2:
MOVCH,0FEH
MOVCL,00H;设置当前检测的是第几列
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 微机 课程设计 报告