江苏大学电气学院单片机课程设计Word文件下载.docx
《江苏大学电气学院单片机课程设计Word文件下载.docx》由会员分享,可在线阅读,更多相关《江苏大学电气学院单片机课程设计Word文件下载.docx(15页珍藏版)》请在冰豆网上搜索。
本设计采用8155接口芯片构成的4*8键盘的接口电路,其中A口为输出,作为列线;
C口为输入,作为行线。
当所有的键没有被按下时,C口输入均为高;
若某列线为低,恰好该列上有键被按下,则键所在的行线为低。
三.设计原理
系统中使用20BY-0型号步进电机,它使用+5V直流电源,步距角为18度,电机线圈由A、B、C、D四相组成。
步进电机驱动原理是通过对它每相线圈中的电流的顺序切换来使电机旋转,驱动电路由脉冲信号来控制,所以调节脉冲信号的频率便可改变步进电机的转速。
BA、BB、BC、BD即为脉冲信号输入插孔,驱动器输出A、B、C、D接步进电机。
四.连线图
步进电机模块插头接实验系统J3插座,(顺接)把P1.0~P1.3分别接到BA~BD插孔。
五.设计说明及流程
1.数码管显示字形
LED显示器是由发光二极管构成的字段组成的显示器。
显示程序任务:
设置显示缓冲区(7EH-79H),存放待显示数据和字符(位置码)。
显示译码:
程序存储器中建立字形码常数表,查表得出对应数据和字符的字形码。
输出显示:
输出字形码到显示端口
2.字位口表(从高位起)
3.键盘显示原理图
(1)显示子程序模块
采用动态显示方式,即一位一位地轮流点亮(扫描)6位显示器。
在8032RAM存储器中设置六个显示缓冲区单元7EH-79H,分别存放6位显示器的显示数据(从高到低)。
(2)键盘输入模块
实验系统有4×
8的键盘结构(见键扫显示原理图)。
键盘的行线通过电阻接+5V,当键盘上没有键闭合时所有的行线和列线都断开,行线都为高电平。
当键盘上某一键闭合时,则该键所对应的行线和列线都短路。
CPU逐行逐列地检查键盘的状态,可判断键盘上有无键闭合。
CPU对键盘上闭合键的键号确定,可根据行线和列线的状态计算求得,也可以根据行线和列线的状态查表求得。
说明:
实际的键盘分布如图所示,每个方框代表一个键,中间的数字代表键值,及键盘上印着的数字,每个键上方的小数字代表键在扫描时的键号:
(3)步进电机控制模块
实现步进电机的转动方式以及转速控制原理:
四相四拍运行方式,即AB-BC-CD-DA-AB或A-B-C-D-A或者四相八拍方式,即A-AB-B-BC-C-CD-D-DA-A-AB实验时控制P1口对应位为“1”。
通过控制每一拍的间隔来控制电机的转速。
内存使用分配表
步序
控制位
工作
状态
控制
模型
P1.7
P1.6
P1.5
P1.4
P1.3D相
P1.2
C相
P1.1
B相
P1.0
A相
1
1
AB
03H
2
BC
06H
3
CD
OCH
4
DA
09H
6.程序清单
ORG0000H
AJMPMAIN
ORG001BH;
设置中断服务程序跳转
LJMPT1INT
ORG0300H
MAIN:
ACALLSHURU;
调用输入程序,等待确认后返回
MOVR1,79H
MOVR2,7AH
MOVR3,7BH
MOVR4,7CH
MOVR5,#00H
MOVA,7DH;
读取设定的速度等级0-F
MOVR6,#4;
循环左移4位
N1:
RLA
DJNZR6,N1
MOVTMOD,#10H;
T1模式1,16位记数模式
MOVTH1,A;
左移后的速度等级存放到TH1
MOVTL1,#00H;
按此装载则0等级的定时最长,转速最慢,F等级的转速最快。
SETBEA;
开中断
SETBET1
SETBTR1
WAIT:
ACALLXS;
调用显示子程序并等待T1中断
JNBET1,N5;
若中断关闭则步数已减为零,重新执行主程序
SJMPWAIT
N5:
AJMPMAIN
RM:
DB03H,06H,0CH,09H,00H;
正转控制字
LM:
DB03H,09H,0CH,06H,00H;
反转控制字
T1INT:
PUSHACC;
T1中断服务程序
PUSHPSW;
保护现场
PUSHDPH
PUSHDPL
MOVA,7EH;
读取转向
JNZLEFT;
A中内容不为0,则转反转
MOVDPTR,#RM
AJMPN2
LEFT:
MOVDPTR,#LM
N2:
MOVA,R5;
设置R5作为RM或LM的偏移量
MOVCA,@A+DPTR
MOVP1,A
INCDPTR
MOVA,R5
MOVCA,@A+DPTR;
取下一步控制字
JNZNEXT1;
如不等于0则R5自增1,否则R5清零
MOVR5,#00H
AJMPN3
NEXT1:
INCR5
N3:
CJNER1,#00H,M1;
执行步数减1并判断是否为0
CJNER2,#00H,M2
CJNER3,#00H,M3
CJNER4,#00H,M4
CLRET1;
步数减为0,关闭中断
CLREA
M4:
DECR4
MOVR3,#09H
MOV7CH,R4
AJMPM43
M3:
DECR3
M43:
MOVR2,#09H
MOV7BH,R3
AJMPM32
M2:
DECR2
M32:
MOVR1,#09H
MOV7AH,R2
AJMPM21
M1:
DECR1
M21:
MOV79H,R1
MOVA,7DH
MOVR6,#4
N4:
DJNZR6,N4
MOVTH1,A
MOVTL1,#00H
POPDPL;
恢复现场
POPDPH
POPPSW
POPACC
RETI;
中断返回
SHURU:
MOVR0,#7EH;
置显缓指针初值
MOVR1,#7EH;
置键入缓冲指针初值
MOV79H,#00H;
初始化设定值
MOV7AH,#00H
MOV7BH,#00H
MOV7CH,#00H
MOV7DH,#00H
MOV7EH,#00H
MOVR3,#06H;
存放未设置数码管个数
SHURU1:
ACALLKS1;
判断是否有键闭合
JZXY;
(A)=0,无键闭合,调显示延时
ACALLXD;
(A)/=0,有键闭合,进行消抖延时
CJNEA,#16H,XY
;
判断是否是确认键按下,如不是,继续输入;
如是,返回主程序
RET
XY:
ACALLXS
AJMPSHURU1
XD:
ACALLT12ms;
消抖,延时12ms
ACALLKS1;
延时后看是否仍有键闭合
JNZN0;
仍有键闭合,转扫描程序
N0:
ACALLSAOM1
SAOM1:
MOVR2,#0FEH;
R2记列的扫描字
MOVR4,#0H;
R4记列号
SAOM2:
MOVDPTR,#0FFDDH;
将扫描字送列
MOVA,R2
MOVX@DPTR,A
INCDPTR;
指向行地址
MOVXA,@DPTR;
读取行值
JBACC.0,LONE;
第0行无键按下,转查第
MOVA,#00H;
第0行有键按下,置0行首键号#00H
AJMPQJH;
转求键号
LONE:
JBACC.1,LTWO
MOVA,#08H
AJMPQJH
LTWO:
JBACC.2,LTHR
MOVA,#10H
LTHR:
JBACC.3,NEXT
MOVA,#18H
QJH:
ADDA,R4;
键号=行首键号+列号
PUSHACC;
键号进栈保护
SAOM3:
等待键释放
JNZSAOM3
POPACC;
键释放,返回,A中存键号
CJNEA,#16H,AAA;
根据键号判断是否是确认键
AJMPCHS
AAA:
ACALLQJZ;
以键号求键值,返回值A中为待显示数值
MOV@R1,A
DJNZR3,CHS
若按键数超过6个,则R3重新赋值,重新设置设定值
MOVR3,#06H
MOVR1,#7EH
CHS:
NEXT:
INCR4;
增加列号值
JNBACC.7,CHS;
第8列是否已经扫描
RLA;
第8列未扫描,转下一列扫描
MOVR2,A
AJMPSAOM2
QJZ:
MOVDPTR,#TAB1;
求键值子程序
MOVCA,@A+DPTR
TAB1:
DB7,4,8,5,9,6,0AH,0BH
按顺序为键号从0-31,表中为对应键值
DB1,0,2,0FH,3,0EH,0CH,0DH
DB0,1,0,1,0,1,0,1
DB2,3,2,3,2,3,2,3
XS:
MOV30H,#20H;
30H单元存放字位码
XS1:
MOVDPTR,#TAB
MOVA,@R0;
R0指向7E-79H单元
查表得R0所指单元的值的字形码
MOVDPTR,#0FFDCH;
字形口地址
MOVX@DPTR,A;
送字形口地址
字位码地址
MOVA,30H
送字位码
ACALLT1ms;
延时1ms
DECR0
JBACC.0,XS2
判断是否已显示最右边数码管,是则重置指针R0
RRA
MOV30H,A
AJMPXS1
XS2:
MOVR0,#7EH
TAB:
DB0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H
DB80H,90H,88H,83H,0C6H,0A1H,86H,8EH
T1ms:
MOVR7,#02H;
延时1ms
L4:
MOVR6,#0F8H
L3:
DJNZR6,L3
DJNZR7,L4
T12ms:
MOVR7,#18H;
延时12ms程序
L6:
L5:
DJNZR6,L5
DJNZR7,L6
KS1:
MOVDPTR,#0FFDDH
判键闭合子程序,有键闭合则A不为0
MOVA,#00H
MOVXA,@DPTR
CPLA
ANLA,#0FH
END
7.心得体会
这次单片机课程设计为期五天,课题是步进电机控制,具体要求是:
从键盘上输入正、反转命令,转速参数(16级)和转动步数显示在LED显示器上。
显示器上显示:
单片机依显示器上显示的正、反转命令,转速级数和转动步数进行相应动作,转动步数减为零时停止转动。
前两天,我完成了按键与显示程序,在调试按键程序的时候,一直出现显示与按键不对应的情况,摸索了很久,才弄明白实验箱的按键的键号与单片机书上又些许不同。
找出了出错的原因,很快就把程序调试成功了。
后两天,主要编写电机控制主程序,以及整体程序的调试。
在此过程中,我们遇到了很多困难。
首先,第一次尝试时数码管根本没有反应,跟别谈转动电机,对着程序看了很久,才意识到可能是寄存器中的值在不断调用中出现错误了。
解决方法是运用定时器中断来控制电机转动。
这样,经过好几次修改,程序终于运作成功了。
通过这次课程设计,我明白了我们要抓住有限的机会去认真完成课程设计,就拿单片机这门课来说,离考试已经有一段时间,也许你会有这个发现:
部分考试时记住的内容现在已经忘了,但认真完成课程设计之后,你会发现,你对知识的理解会更加