江苏大学 单片机课程设计.docx
《江苏大学 单片机课程设计.docx》由会员分享,可在线阅读,更多相关《江苏大学 单片机课程设计.docx(13页珍藏版)》请在冰豆网上搜索。
江苏大学单片机课程设计
第一章前言
单片机作为微型计算机的一个重要分支,以广泛应用到工业控制、智能仪器和家用电器等各个领域,特别是Intel公司生产的MCS-51系列单片机,由于其集成度高、处理功能强、结构简单、可靠性高、价格低廉等一系列特点,已成为应用系统开发的首选单片机之一。
随着单片机技术的日益成熟和广泛应用,单片机技术已成为工科学生,特别是电类学生必须掌握的一门专业技术。
步进电机作为执行元件,是机电一体化的关键产品之一,随着工业自动化的发展,步进电机的应用越来越广泛,广泛应用在各自动化控制系统中,步进电机是一种用于开环控制的驱动元件。
它是用电脉冲信号进行控制,将电脉冲信号转换成相应的角位移或线位移的微电动机。
步进电动机已成为除直流电动机和交流电动机以外的第三类电动机。
步进电动机的发展与计算机工业密切相关。
自从步进电动机在计算机外围设备中取代小型直流电动机以后,使其设备的性能提高,很快地促进了步进电动机的发展。
另一方面,微型计算机和数字控制技术的发展,又将作为数控系统执行部件的步进电动机推广应用到其他领域,如电加工机床、小功率机械加工机床、测量仪器、光学和医疗仪器以及包装机械等。
发展趋势之一,是继续沿着小型化的方向发展。
随着电动机本身应用领域的拓宽以及各类整机的不断小型化,要求与之配套的电动机也必须越来越小,在57、42机座号的电动机应用了多年后,现在其机座号向39、35、30、25方向向下延伸。
瑞士ESCAP公司最近还研制出外径仅10mm的步进电动机。
发展趋势之二,是改圆形电动机为方形电动机。
由于电动机采用方型结构,使得转子有可能设计得比圆形大,因而其力矩体积比将大为提高。
同样机座号的电动机,方形的力矩比圆形的将提高30%-40%。
发展趋势之三,对电动机进行综合设计。
即把转子位置传感器,减速齿轮等和电动机本体综合设计在一起,这样使其能方便地组成一个闭环系统,因而具有更加优越的控制性能。
发展趋势之四,向五相和三相电动机方向发展。
目前广泛应用的二相和四相电动机,其振动和噪声较大,而五相和三相电动机具有优势性。
而就这两种电动机而言,五相电动机的驱动电路比三相电动机精密且复杂,因此三相电动机系统的价格比要比五相电动机更低一些。
随着我国制造业的发展,嵌入式系统已经成为制造业的核心技术,它被广泛地应用到工业控制、仿真系统、医疗仪器、信息家电、通信设备等众多领域。
目前,围绕嵌入式系统展开研究和开发,已经成为计算机软硬件技术发展最活跃的方向之一。
嵌入式系统不同与通常纯粹的软件系统或硬件系统,而是软件与硬件通过自爱一起的,有些功能既可以用软件实现,也可以通过硬件实现。
另外,嵌入式系统设计所面临的挑战不仅涉及到计算机软件和硬件,也不涉及到许多非计算机工程方面的问题,注入机械尺寸问题、功耗问题和制造成本问题等,即使是计算机工程方面的问题,大部分系统在实时性、可靠性和多速率等问题方面也都有特别要求。
目前,实现嵌入式系统的硬件方法主要有:
定制逻辑(ASIC),现场可编程逻辑门阵列(FPGA)和嵌入式微处理器三种。
在实际系统实施中,绝大多数系统是采用嵌入式微处理器方式,如:
单片机、单板机或嵌入式微处理器芯片等。
这是因为用微处理器实现嵌入式系统是一种十分有效的方法,它使得在不同价位上设计不同特性的产品系列成为可
能,并且能够扩展新特性以满足飞速发展变化的市场需求。
第二章系统硬件设计
2.1步进电机简介
本课程设计采用单片机软件实现对步进电机的运转控制,使用单片机的Pl口循环输出代码,经功率放大器来控制步进电机的三相绕组,从而控制步进电机运转。
步进电机以三相六拍的工作方式转动。
过改变三相通电顺序来实现转向的控制,若按A→AB→B→BC→C→CA→A次序通电为正转,则按A→AC→C→CB→B→BA→A次序通电为反转。
用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;分频设置
MOVX@DPTR,A
ACALLOFFLED;调用子程序清除8279RAM
MOVDPTR,#COM_8279
MOVA,#80H;写显示RAM命令,从左面第一个LED开始进行
MOVX@DPTR,A
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
MOVX@DPTR,A;把LED数值送到端口地址
MOVA,R1;键值给A
MOVR0,31H
MOV@R0,A;将键盘真实值送到40H中(此程序保证键盘真实值被保留)
INC31H;31H自加,指向41H
MOVDPTR,#DISPCODE;段代码给数据指针
MOVCA,@A+DPTR;键值是多少就偏移多少单元
MOVDPTR,#DAT_8279
MOVX@DPTR,A;将键值的段代码送到显示接口
INC30H;30H内容加一,LED数值加一
MOVA,30H;LED数值送给A
CJNEA,#88H,WAIT;判断LED八个显示是否全部被操作,若没有则返回继续读键值
MOV30H,#80H;全部被操作后,从最左边重新开始
MOV31H,#40H
SJMPWAIT;以上程序保证了8个数码管全部显示
COMMKEY:
MOVDPTR,#PROGCOMM;其它键的处理与命令,PROGCOMM首地址给数据指针
MOVA,R1
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
MOVA,R2
CJNEA,#06H,L1
RET
NEXTP:
MOVR2,#00H;实现电机的点动反转
MOVDPTR,#NUMBER2;反转首地址
L2:
MOVA,R2
MOVCA,@A+DPTR
MOVP1,A;电动机六拍依次给P1口,每输入一次调用一次延时,共六次
ACALLDELAY
INCR2
MOVA,R2
CJNEA,#06H,L2
RET
EXECP:
ACALLTIME;调用步进停止转动电机
RET
OFFLED:
MOVA,#0DFH;共阳极数码管,11011111,显示RAM置为FF,数码管关闭
MOVDPTR,#COM_8279
MOVX@DPTR,A;将状态字送给端口地址
OFFLED1:
MOVXA,@DPTR
JBACC.7,OFFLED1
RET;判断是否清0完毕,清除完则返回主程序
SCANKEY:
MOVDPTR,#COM_8279;等待按键
MOVXA,@DPTR;接口地址得到的数值给A
ANLA,#07H;00000111相与,只看后三位状态
CJNEA,#00H,HAVEKEY;后三位不为零则有键输入,跳转到HAVEKEY
CLRC;无按键C清零
RET;返回
HAVEKEY:
MOVDPTR,#DAT_8279;有键读键值
MOVXA,@DPTR;键值给A
MOVB,A;备份键值
MOVR1,#00H
MOVDPTR,#KEYCODE;;查键值表,首地址取出,放到数据指针中
KEYLOOP:
CLRA
MOVCA,@A+DPTR;首地址键值给A
CJNEA,B,NOKEY;比较A与读入键值大小,若相等则找到键值,否则继续寻找
AJMPFOUNDKEY;找到键值,进行处理
NOKEY:
INCDPTR;指针偏移一个单元
INCR1;键值大小增加一
AJMPKEYLOOP;未找到循环继续找
FOUNDKEY:
MOVA,R1;键值大小给A
SETBC;C置一并返回
RET
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
RET
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
SWAPA
ORLA,43H
MOVR4,A
L5:
MOVR2,#00H
L4:
MOVDPTR,#NUMBER1;电机开始步进转动
MOVA,R2
MOVCA,@A+DPTR
MOVP1,A
ACALLLATE
INCR2
ACALLCTIME1;调用步距程序
MOVA,R2
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:
LCALLSHOW1;调用显示程序
RET
SHOW1:
MOVR0,#40H;把改变后的千位百位值再送回显示的地址
MOVA,R3
ANLA,#0F0H
SWAPA
MOV@R0,A
INCR0
MOVA,R3
ANLA,#0FH
MOV@R0,A
INCR0
MOVA,R4;把改变后的十位个位值再送回显示的地址
ANLA,#0F0H
SWAPA
MOV@R0,A
INCR0
MOVA,R4
ANLA,#0FH
MOV@R0,A
LCALLSHOW2
RET
SHOW2:
MOV30H,#80H;把改变后的值都显示出来
MOV31H,#40H
MOVR5,#08H;一共八位
L6:
MOVDPTR,#COM_8279;键盘显示接口
MOVA,30H
MOVX@DPTR,A
MOVR0,31H;取40H中的数据送给R0
MOVA,@R0
MOVDPTR,#DISPCODE;取段代码
MOVCA,@A+DPTR
MOVDPTR,#DAT_8279;送键盘显示接口
MOVX@DPTR,A
INC31H;送下一位数据
INC30H
DJNZR5,L6;送完八位结束
RET
END