微机课程设计报告Word文档下载推荐.docx
- 文档编号:19219222
- 上传时间:2023-01-04
- 格式:DOCX
- 页数:30
- 大小:187.57KB
微机课程设计报告Word文档下载推荐.docx
《微机课程设计报告Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《微机课程设计报告Word文档下载推荐.docx(30页珍藏版)》请在冰豆网上搜索。
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档。
键盘扫描与显示程序流程图:
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)
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
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()
if(cc)
delay0(0x100);
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的控制寄存器地址
步进电机的控制:
步进电机的励磁顺序如下表:
步进电机控制端口输出值:
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之间变化,若正转,则递增;
反转则递减。
keyscan();
if(mode==1)break;
outp(MY8255_C,c[i]);
判断是否运行,如运行,则跳出循环,给步进电机发驱动脉冲。
if(grd==4)
for(j=500;
j>
0;
j--)
delay1(0x10);
keyscan();
}
if(grd==1)
for(j=5000;
delay1(0x10);
keyscan();
判断档位,进行相应的延时,注意延时的时候也应每隔一定时间调用keyscan()键盘扫描及显示程序,已保证及时响应键盘输入,和刷新数码管,使数码管常亮。
DATASEGMENT
DTABLE3DB10H,30H,20H,60H,40H,0C0H,80H,90H
步进电机控制端口输出值存放在DTABLE3中
KAISHI:
CMP[SI+8],8
JAZHI1
CMP[SI+8],1
JBZHI8
JMPJIXU
ZHI1:
MOV[SI+8],01H
ZHI8:
MOV[SI+8],08H
JIXU:
CALLKEYSCAN
……
SFRUN:
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
JMPKAISHI
DANG4:
CMP[SI+6],08H
JNZKAISHI1
DA4:
DALLY1PROCNEAR;
软件延时子程序
PUSHCX
PUSHAX
MOVCX,00AFH
D11:
MOVAX,5000H
D22:
DECAX
JNZD22
POPCX
LOOPD11
RET
DALLY1ENDP
思路同C语言程序,不同的是,汇编程序中用[SI+8]来计数,以及在DALLY1子程序中调直接用KEYSCAN键盘扫描子程序。
应注意调用子程序前要将CX与AX寄存器的内容入栈进行保护。
附录1:
C语言程序清单
#include<
stdio.h>
stdlib.h>
conio.h>
bios.h>
ctype.h>
process.h>
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};
charc[]={0x10,0x30,0x20,0x60,0x40,0xc0,0x80,0x90};
intcc;
intn;
if(dir==1)i++;
if(dir==0)i--;
if(grd==4)
for(j=500;
delay1(0x10);
}
if(grd==3)
for(j=1000;
if(grd==2)
for(j=3000;
if(grd==1)
for(j=5000;
voiddelay1(inttime)
inti;
for(i=0;
i<
=time;
i++)
for(j=0;
j<
=0x700;
j++)
{}
return;
voidgetkey(void)
intj=0xfe;
=3;
outp(MY8255_A,j);
if(!
((inp(MY8255_C))&
0x01))
n=i+0;
action();
0x02))
n=i+4;
0x04))
n=i+8;
0x08))
n=i+12;
j<
<
=1;
voidccscan(void)
outp(MY8255_A,0x00);
cc=inp(MY8255_C);
cc=(~cc)&
0x0F;
voiddis(void)
intj=0xf7;
for(i=3;
i>
=0;
i--)
outp(MY8255_B,a[b[i]]);
j>
>
j|=0x80;
voidclear(void)
outp(MY8255_B,0x00);
voidkey(void)
if(bioskey
(1)!
=0)
exit(0);
voiddelay0(inttime)
=0x100;
附录2:
汇编程序清单
IOY0EQU0e400H;
片选IOY0对应的端口始地址
MY8255_AEQUIOY0+00H*4;
8255的A口地址
MY8255_BEQUIOY0+01H*4;
8255的B口地址
MY8255_CEQUIOY0+02H*4;
8255的C口地址
STACK1SEGMENTSTACK
DW256DUP(?
)
STACK1ENDS
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
MOV[SI+8],01H
MOVDX,MY8255_MODE;
初始化8255工作方式
MOVAL,81H;
方式0,A口、B口输出,C口低4位输入
OUTDX,AL
MOVDH,[SI+8]
CMPDH,8
JAZHI1
CMPDH,1
JBZHI8
JMPJIXU
MOVAH,1;
判断是否有按键按下
INT16H
JZSFRUN;
无按键则跳回继续循环,有则退出
QUIT:
MOVAX,4C00H;
结束程序退出
INT21H
MOVDH,[SI]
CMPDH,01H
JNZJIXU
MOVDH,[SI+4]
CMPDH,04H
OUTDX,AL
MOVDH,[SI+6]
CMPDH,05H
CALLKEYSCAN
DANG2:
CMPDH,06H
JNZDANG3
DA2:
DANG3:
CMPDH,07H
JNZDANG4
DA3:
CMPDH,08H
CALLKEYSCAN
PUSHCX
LOOPD11
KEYSCANPROCNEAR
BEGIN:
CALLDIS;
显示刷新
CALLCLEAR;
清屏
CALLCCSCAN;
扫描按键
JNZGETKEY1;
有键按下则跳置GETKEY1
JMPGOBACK1
GETKEY1:
CALLDIS;
显示刷新
CALLDALLY
CALLDALLY
CALLCLEAR;
再次扫描按键
JNZGETKEY2;
有键按下则跳置GETKEY2
JMPBEGIN;
否则跳回开始继续循环
GETKEY2:
MOVCH,0FEH
MOVCL,00H;
设置当前检测的是第几列
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 微机 课程设计 报告