江苏大学 单片机课程设计文档格式.docx
《江苏大学 单片机课程设计文档格式.docx》由会员分享,可在线阅读,更多相关《江苏大学 单片机课程设计文档格式.docx(13页珍藏版)》请在冰豆网上搜索。
用89C51的P1.1、P1.2、P1.3分别按图1所示的A、B、C三信号格式送数即可,正转时输出的顺序为02H→06H→04H→0CH→08H→0AH→02H,反转时输出的顺序为02H→0AH→08H→0CH→04H→06H→02H。
2.2专用键盘显示接口芯片8279
8279是专用键盘/显示器控制芯片,能对显示器自动扫描,能识别键盘上按下键的键号;
可充分提高CPU的工作效率。
8279与MCS-51接口方便,由它构成的标准键盘/显示器接口在微机应用系统中使用越来越广泛。
2.2.18279特征
●能同时执行键盘与显示器操作。
●扫描式键盘工作方式。
●有8个键盘FIFO(FirstinFirstout)存储器。
●带触点去抖动的双键锁定或N键巡回功能。
●两个8位或16位的数字显示器。
●可左/右输入的16字节显示用RAM。
●由键盘输入产生中断信号。
●扫描式传感器工作方式。
●用选通方式输入信号。
●单个16字符显示器。
●可编程扫描定时。
●工作方式可由CPU编程。
图2-18279芯片示意图
2.2.28279命令状态字
表1命令状态字
表2命令状态字
2.3其他器件选择
1.74LS373:
74LS373是八D锁存器(三态).一个封装中有八个锁存器,三态总线驱动输出,置数全并行存取,缓冲控制输入,时钟/使能输入有改善抗扰度的滞后作用。
在电路中的作用是:
由于P0口既是数据口又是地址口,所以加一个锁存器锁存地址。
2.74LS138为3线-8线译码器共有54/74S138和54/74LS138两种线路结构型式。
利用G1、/(G2A)和/(G2B)可级联扩展成24线译码器;
若外接一个反相器还可级联扩展成32线译码器。
若将选通端中的一个作为数据输入端时,74LS138还可作数据分配器。
电路中的作用是:
使器件的地址连续,用三根线控制八根线。
3.74LS240:
八单线驱动器。
(反码,三态输出),这种八缓冲器和线驱动器是为提高三态输出存储地址驱动器,时钟驱动器和总线定向接收器和发射器的性能可和集成度而特意设计的。
4.7451:
8路驱动器,增强数码管显示的亮度。
2.4电路原理图及说明
MCS-51采用8279扩展的键盘、显示器的接口电路控制三相步进电机的运转,P1.1、P1.2、P1.3分别接三相步进电机的A、B、C三相,构成一个完整的单片机应用系统,设计20个键组成的键盘以输入数据与命令,8只LED显示器用于系统显示输出。
采用89C51的P1口输出信号,经放大驱动一台步进电机,电路图见附录1。
第三章系统软件设计
3.1程序流程图:
图3-1
3.2程序清单(详见附录2)
3.3调试过程
1)在调试过程中,我们遇到了以下问题:
i.按EXEC键后的速度不明显。
ii.当输入200步,1000步后,步进电机不按步数进给,无法停止。
2)问题解决方案:
i.我们将EXEC键的处理程序L3中设置步数的部分放到延时程序中LATE2,可以使调速变得明显
ii.我们将LOOP9后的程序“DJNZR4,LOOP8改为”CJNER4,#00H,LOOP8
DJNZR3,LOOP9”CJNER3,#00H,LOOP9
这样就不会让R3为0时再自减。
第四章总结
十天时间转眼间就过去了,不得不说这十天过的很充实。
刚开始,看到一切都是那么的陌生,经过三天的摸索,终于能够看懂程序,好的开始就是成功的一般,看懂了程序,心中就有了计划,第四天开始尝试着编写程序,写程序要求要求的是严谨的思维,一丝不苟的态度,以及较强的逻辑思维能力,我并不是一个专业的程序员,以前也没写过这么复杂的程序。
于是,我把程序的要求和程序的运行步骤详细的写了出来,一步一步踏踏实实,经过四天的尝试,各个程序模块已经完成,实践是检验真理的唯一标准,第一次编译出错是难免的,几个比较严重的错误已经在上面调试过程中列了出来,功夫不负有心人,在同学老师的帮助下,一个完整的程序终于写好了。
在这次实习过程中,我锻炼自己的思考能力,动手能力。
总而言之,纸上得来终觉浅,绝知此事要躬行。
附录1硬件逻辑图
附录图1
附录2程序清单
DAT_8279EQU0C000H;
键盘显示接口
COM_8279EQU0C001H
ORG0000H
NOP
AJMPMAIN
ORG0030H
MAIN:
CLREA;
内外程序存储器选择端,可以使用内部存储器
MOVSP,#60H;
设置堆栈指针
CLRA
MOVPSW,A;
程序状态字清零
MOVIE,A;
中断允许寄存器清零
MOVR0,#7FH
INIT:
MOV@R0,A;
清除CPURAM
DJNZR0,INIT
INIT8279:
MOVDPTR,#COM_8279;
初始化8279
MOVX@DPTR,A
MOVA,#34H;
分频设置
ACALLOFFLED;
调用子程序清除8279RAM
MOVDPTR,#COM_8279
MOVA,#80H;
写显示RAM命令,从左面第一个LED开始进行
BACK:
MOVDPTR,#DAT_8279;
写入数据进行显示
MOVA,#81H
MOVX@DPTR,A;
LED数码管显示为q
MOV30H,#80H;
LED数值所在地址放入30H
MOV31H,#40H;
存放熟知的地址在31H,
WAIT:
ACALLSCANKEY
JNCWAIT;
无键跳转
MOVA,R1
JBACC.4,COMMKEY;
判断是否为命令键,是则跳转,不是则顺序执行
KEYNUM:
MOVA,30H;
有键赋值,LED数值给A
MOVDPTR,#COM_8279
把LED数值送到端口地址
MOVA,R1;
键值给A
MOVR0,31H
将键盘真实值送到40H中(此程序保证键盘真实值被保留)
INC31H;
31H自加,指向41H
MOVDPTR,#DISPCODE;
段代码给数据指针
MOVCA,@A+DPTR;
键值是多少就偏移多少单元
MOVDPTR,#DAT_8279
将键值的段代码送到显示接口
INC30H;
30H内容加一,LED数值加一
LED数值送给A
CJNEA,#88H,WAIT;
判断LED八个显示是否全部被操作,若没有则返回继续读键值
全部被操作后,从最左边重新开始
MOV31H,#40H
SJMPWAIT;
以上程序保证了8个数码管全部显示
COMMKEY:
MOVDPTR,#PROGCOMM;
其它键的处理与命令,PROGCOMM首地址给数据指针
ANLA,#03H;
00000011相与,只看后两位
RLA;
PROGCOMM中各句程序间相隔两个单元,保证跳转正常
JMP@A+DPTR;
判断执行哪部操作
PROGCOMM:
AJMPLASTP
AJMPNEXTP
AJMPEXECP
LASTP:
MOVR2,#00H;
实现电机的点动正转
MOVDPTR,#NUMBER1;
正转首地址
L1:
MOVA,R2
MOVCA,@A+DPTR
MOVP1,A;
电动机六拍依次给P1口,每输入一次调用一次延时,共六次
ACALLDELAY
INCR2
CJNEA,#06H,L1
RET
NEXTP:
实现电机的点动反转
MOVDPTR,#NUMBER2;
反转首地址
L2:
CJNEA,#06H,L2
EXECP:
ACALLTIME;
调用步进停止转动电机
OFFLED:
MOVA,#0DFH;
共阳极数码管,11011111,显示RAM置为FF,数码管关闭
将状态字送给端口地址
OFFLED1:
MOVXA,@DPTR
JBACC.7,OFFLED1
RET;
判断是否清0完毕,清除完则返回主程序
SCANKEY:
等待按键
MOVXA,@DPTR;
接口地址得到的数值给A
ANLA,#07H;
00000111相与,只看后三位状态
CJNEA,#00H,HAVEKEY;
后三位不为零则有键输入,跳转到HAVEKEY
CLRC;
无按键C清零
返回
HAVEKEY:
有键读键值
MOVB,A;
备份键值
MOVR1,#00H
MOVDPTR,#KEYCODE;
;
查键值表,首地址取出,放到数据指针中
KEYLOOP:
CLRA
首地址键值给A
CJNEA,B,NOKEY;
比较A与读入键值大小,若相等则找到键值,否则继续寻找
AJMPFOUNDKEY;
找到键值,进行处理
NOKEY:
INCDPTR;
指针偏移一个单元
INCR1;
键值大小增加一
AJMPKEYLOOP;
未找到循环继续找
FOUNDKEY:
键值大小给A
SETBC;
C置一并返回
NUMBER1:
DB02H,06H,04H,0CH,08H,0AH
NUMBER2:
DB02H,0AH,08H,0CH,04H,06H
LATE:
MOVA,44H;
调速延时循环
SWAPA
ORLA,45H
MOVR7,A
L3:
DJNZR7,L3
DJNZR6,LATE
RET
DELAY:
MOVR7,#20H;
点动延时循环
DELAY1:
MOVR6,#0EFH
DJNZR6,$
DJNZR7,DELAY1
KEYCODE:
DB0C1H,0C8H,0C9H,0D0H,0D8H,0E0H,0C2H,0CAH
DB0D1H,0D9H,0DAH,0C3H,0CBH,0D2H,0D3H,0DBH
COMCODE:
DB0E3H,0E2H,0E1H,00H
DISPCODE:
DB0CH,9FH,4AH,0BH,99H,29H,28H,8FH
DB08H,09H,88H,38H,6CH,1AH,68H,0E8H
DB0C8H,3AH,0ECH,0FFH
TIME:
MOVA,40H;
把千位百位放到R3
SWAPA;
高低四位交换
ORLA,41H;
逻辑或
MOVR3,A
MOVA,42H;
把十位个位放到R4
ORLA,43H
MOVR4,A
L5:
MOVR2,#00H
L4:
电机开始步进转动
MOVP1,A
ACALLLATE
ACALLCTIME1;
调用步距程序
CJNEA,#06H,L4
AJMPL5
CTIME1:
CJNER4,#00H,MM1;
R4不为零则转移
CJNER3,#00H,MM2;
R3不为零则转
AJMPMM4;
都为零时转到MM4
MM1:
DJNZR4,MM5;
R4减1,不为零则转移
AJMPMM6;
为零则转移到MM6
MM6:
LCALLSHOW1;
调用显示程序
SJMPCTIME1
MM2:
DECR3;
R3减1
SJMPMM1
MM4:
LCALLSHOW1
LJMPBACK;
步进到零时回到初值
MM5:
SHOW1:
MOVR0,#40H;
把改变后的千位百位值再送回显示的地址
MOVA,R3
ANLA,#0F0H
MOV@R0,A
INCR0
ANLA,#0FH
INCR0
MOVA,R4;
把改变后的十位个位值再送回显示的地址
MOVA,R4
MOV@R0,A
LCALLSHOW2
SHOW2:
把改变后的值都显示出来
MOVR5,#08H;
一共八位
L6:
MOVA,30H
MOVR0,31H;
取40H中的数据送给R0
MOVA,@R0
取段代码
送键盘显示接口
送下一位数据
INC30H
DJNZR5,L6;
送完八位结束
END