基于AT89C51单片机的电机控制综合课程设计.docx
《基于AT89C51单片机的电机控制综合课程设计.docx》由会员分享,可在线阅读,更多相关《基于AT89C51单片机的电机控制综合课程设计.docx(39页珍藏版)》请在冰点文库上搜索。
基于AT89C51单片机的电机控制综合课程设计
创新课程设计报告
设计题目:
基于AT89C51单片机的电机控制综合设计
学院:
机电工程学院
专业:
测控技术与仪器
班级学号:
071-13
姓名:
万鹏
同组人员:
郑朗、阮磊、梁文华
指导教师:
冯梅琳、王军
设计地点:
机电实验中心测控实验室
设计时间:
2010-10-10至2010-10-31
江西理工大学机电工程学院
目录
1系统的设计1
1.1设计的目的和要求1
1.2系统原理1
2系统的构成2
2.1控制器部分2
2.1.1控制器分析2
2.1.2控制器主要功能特性2
2.1.2控制器引脚功能描述3
2.2数据显示部分4
2.2.112864液晶显示模块概述4
2.2.2基本参数4
2.2.3模块引脚说明5
2.2.4具体指令介绍:
5
2.2.5显示坐标关系8
3硬件电路设计8
3.1LCD控制电路原理图8
3.2电机控制电路9
3.3速度反馈电路10
3.4MCU接口11
3.5按键电路11
4软件设计12
4.1程序要求12
4.2程序流程图12
4.3程序清单12
4.3.1LCD驱动程序12
4.3.2主函数程序17
5程序的调试21
5.1编程软件KEILC51简介21
5.2程序编译和调试21
6结语25
1系统的设计
1.1设计的目的和要求
基于AT89C51单片机的电机控制综合系统,以电机为被控对象,由AT89C51单片机作为控制器,结合速度反馈和LCD液晶显示模块,组成一个有较好控制性和实时性的电机控制综合系统。
1.2系统原理
系统的原理如上图1.2所示,控制器AT89C51通过外围电路控制电机转动。
由速度反馈电路反馈电机的速度信息,并进行伺服计算和控制。
整个系统的主要信息可以在LCD显示模块上显示。
2系统的构成
2.1控制器部分
2.1.1控制器分析
AT89C51是一种带4K字节闪存可编程可擦除只读存储器(FPEROM—FlashProgrammableandErasableReadOnlyMemory)的低电压、高性能CMOS8位微处理器。
单片机的可擦除只读存储器可以反复擦除1000次。
该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。
由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器。
AT89C单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。
2.1.2控制器主要功能特性
·与MCS-51兼容
·4K字节可编程闪烁存储器
·寿命:
1000写/擦循环
·数据保留时间:
10年
·全静态工作:
0Hz-24MHz
·三级程序存储器锁定
·128×8位内部RAM
·32可编程I/O线
·两个16位定时器/计数器
·5个中断源
·可编程串行通道
·低功耗的闲置和掉电模式
·片内振荡器和时钟电路
2.1.2控制器引脚功能描述
AT89C51提供以下标准功能:
4k字节Flash闪速存储器,128字节内部RAM,32个I/O口线,两个16位定时/计数器,一个5向量两级中断结构,一个全双工串行通信口,片内振荡器及时钟电路。
同时,AT89C51可降至0Hz的静态逻辑操作,并支持两种软件可选的节电工作模式。
空闲方式停止CPU的工作,但允许RAM,定时/计数器,串行通信口及中断系统继续工作。
掉电方式保存RAM中的内容,但振荡器停止工作并禁止其它所有部件工作直到下一个硬件复位。
Vcc:
电源电压
GND:
地
P0口是一组8位漏极开路型双向I/O口,也即地址/数据总线复用口。
作为输出口用
时,每位能吸收电流的方式驱动8个TTL逻辑门电路,对端口写“1”可作为高阻抗输入端用。
在访问外部数据存储器或程序存储器时,这组口线分时转换地址(低8位)和数据总线复用,在访问期间激活内部上拉电阻。
在FIash编程时,P0口接收指令字节,而在程序校验时,输出指令字节,校验时,要求外接上拉电阻。
P1口是一个带内部上拉电阻的8位双向I/O口,P1的输出缓冲级可驱动(吸收或输出电
流)4个TTL逻辑门电路。
对端口写“1”,通过内部的上拉电阻把端口拉到高电平,此时可作输入口。
作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流(IIL)。
FIash编程和程序校验期间,P1接收低8位地址。
P2口是一个带有内部上拉电阻的8位双向I/O口,P2的输出缓冲级可驱动(吸收或输出
电流)4个TTL逻辑门电路。
对端口写“1”,通过内部的上拉电阻把端口拉到高电平,此时可作输入口,作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流(IIL)。
在访问外部程序存储器或16位地址的外部数据存储器(例如执行MOVX@DPTR指令)时,P2口送出高8位地址数据。
在访问8位地址的外部数据存储器(如执行MOVX@RI指令)时,P2口线上的内容(也即特殊功能寄存器(SFR)区中R2寄存器的内容),在整个访问期间不改变。
Flash编程或校验时,P2亦接收高位地址和其它控制信号。
P3口是一组带有内部上拉电阻的8位双向I/O口。
P3口输出缓冲级可驱动(吸收或输
出电流)4个TTL逻辑门电路。
对P3口写入“1”时,它们被内部上拉电阻拉高并可作为输入端口。
作输入端时,被外部拉低的P3口将用上拉电阻输出电流(IIL)。
P3口除了作为一般的I/O口线外,更重要的用途是它的第二功能,如下表2.1.2所示:
表2.1P3口第二功能
端口引脚
第二功能
P3.0
RXD(串行输入口)
P3.1
TXD(串行输出口)
P3.2
INT0(外中断0)
P3.3
INT1(外中断1)
P3.4
T0(定时/计数器0外部输入)
P3.5
T1(定时/计数器1外部输入)
P3.6
WR(外部数据存储器写选通)
P3.7
RD(外部数据存储器读选通)
P3口还接收一些用于Flash闪速存储器编程和程序校验的控制信号。
RST:
复位输入。
当振荡器工作时,RST引脚出现两个机器周期以上高电平将使单片机复位。
ALE/PROG:
当访问外部程序存储器或数据存储器时,ALE(地址锁存允许)输出脉冲
用于锁存地址的低8位字节。
即使不访问外部存储器,ALE仍以时钟振荡频率的l/6输出固定的正脉冲信号,因此它可对外输出时钟或用于定时目的。
要注意的是:
每当访问外部数据存储器时将跳过一个ALE脉冲。
对Flash存储器编程期间,该引脚还用于输入编程脉冲(PROG)。
如有必要,可通过对特殊功能寄存器(SFR)区中的8EH单元的DO位置位,可禁止ALE操作。
该位置位后,只有一条MOVX和MOVC指令ALE才会被激活。
此外,该引脚会被微弱拉高,单片机执行外部程序时,应设置ALE无效。
PSEN:
程序储存允许(PSEN)输出是外部程序存储器的读选通信号,当AT89C51由外部程序
存储器取指令(或数据)时,每个机器周期两次PSEN有效,即输出两个脉冲。
在此期间,当访问外部数据存储器,这两次有效的PSEN信号不出现。
EAVPP:
外部访问允许。
欲使CPU仅访问外部程序存储器(地址为0000H—FFFFH),EA端必须保持低电平(接地)。
需注意的是:
如果加密位LB1被编程,复位时内部会锁存EA端状态。
如EA端为高电平(接VCC端),CPU则执行内部程序存储器中的指令。
Flash存储器编程时,该引脚加上+12V的编程允许电源Vpp,当然这必须是该器件是使用12V编程电压Vpp。
XTAL1:
振荡器反相放大器的及内部时钟发生器的输入端。
XTAL2:
振荡器反相放大器的输出端。
2.2数据显示部分
2.2.112864液晶显示模块概述
12864液晶显示模块是128×64点阵的汉字图形型液晶显示模块,可显示汉字及图形,内置国标GB2312码简体中文字库(16X16点阵)、128个字符(8X16点阵)及64X256点阵显示RAM(GDRAM)。
可与CPU直接接口,提供两种界面来连接微处理机:
8-位并行及串行两种连接方式。
具有多种功能:
光标显示、画面移位、睡眠模式等。
2.2.2基本参数
液晶屏类型STNFSTN
模块显示效果:
黄绿底黑字
蓝底白字白底黑字视角6点钟12点钟
驱动方式1/64DUTY1/9BIAS
背光LED白色LED黄绿色
控制器KS0108或兼容ST7920T6963C
数据总线8位并口/6800方式串口
温度特性工作温度:
-20℃~+70℃储藏温度:
-30℃~+80℃
点阵格式128x64
2.2.3模块引脚说明
表2.2LCD引脚说明
引脚
名称
方向
说明
引脚
名称
方向
说明
1
VSS
-
电源负极
11
DB4
I/O
数据4
2
VDD
-
电源正极(+5v)
12
DB5
I/O
数据5
3
VO
-
LCD偏压输入(悬空)
13
DB6
I/O
数据6
4
RS
H/L
数据/命令选择端(片选信号输入)
14
DB7
I/O
数据7
5
R/W
H/L
读/写控制信号(串行数据输入)
15
PSB
H/L
H:
并行数据模式L:
串行数据模式
6
E
H,H/L
使能信号(串行移位脉冲输入)
16
NC
-
空脚
7
DB0
I/O
数据0
17
/RST
H/L
复位端(L:
复位)
8
DB1
I/O
数据1
18
NC
-
空脚
9
DB2
I/O
数据2
19
BLA
-
背光源正极
10
DB3
I/O
数据3
20
BLK
-
背光源负极
2.2.4具体指令介绍:
1、清除显示(指令代码为01H)
CODE:
RWRSDB7DB6DB5DB4DB3DB2DB1DB0
L
L
L
L
L
L
L
L
L
H
功能:
清除显示屏幕,把DDRAM位址计数器调整为“00H”。
2、位址归位(02H)
CODE:
RWRSDB7DB6DB5DB4DB3DB2DB1DB0
L
L
L
L
L
L
L
L
H
X
功能:
把DDRAM位址计数器调整为“00H”,游标回原点,该功能不影响显示DDRAM。
3、点设定(07H/04H/05H/06H)
CODE:
RWRSDB7DB6DB5DB4DB3DB2DB1DB0
L
L
L
L
L
L
L
H
I/D
S
功能:
设定光标移动方向并指定整体显示是否移动。
I/D=1光标右移,I/D=0光标左移。
SH=1且DDRAM为写状态:
整体显示移动,方向由I/D决定(I/D=1左移,I/D=0右移)
SH=0或DDRAM为读状态:
整体显示不移动
4、显示状态开/关(08H/0CH/0EH/0FH)
CODE:
RWRSDB7DB6DB5DB4DB3DB2DB1DB0
L
L
L
L
L
L
H
D
C
B
功能:
D=1;整体显示ONC=1;游标ONB=1;游标位置ON.
5、游标或显示移位控制(10H/14H/18H/1CH)
CODE:
RWRSDB7DB6DB5DB4DB3DB2DB1DB0
L
L
L
L
L
H
S/C
R/L
X
X
功能:
10H/14H:
光标左/右移动;18H/1CH:
整体显示左右移动,光标跟随移动,AC值不变
6、功能设定(36H/30H/34H)
CODE:
RWRSDB7DB6DB5DB4DB3DB2DB1DB0
L
L
L
L
H
DL
X
ORE
X
X
功能:
DL=1(必须设为1)RE=1;扩充指令集动作RE=0:
基本指令集动作5、游标或显示移位控制(10H/14H/18H/1CH)
7、设定CGRAM位址(40H-7FH)
CODE:
RWRSDB7DB6DB5DB4DB3DB2DB1DB0
L
L
L
H
AC5
AC4
AC3
AC2
AC1
AC0
功能:
设定CGRAM位址到位址计数器(AC)
8、设定DDRAM位址(80H-9FH)
CODE:
RWRSDB7DB6DB5DB4DB3DB2DB1DB0
L
L
H
AC6
AC5
AC4
AC3
AC2
AC1
AC0
功能:
设定DDRAM位址到位址计数器(AC)
9、读取忙碌状态(BF)和位址(BF=1,状态忙)
CODE:
RWRSDB7DB6DB5DB4DB3DB2DB1DB0
H
L
BF
AC6
AC5
AC4
AC3
AC2
AC1
AC0
功能:
读取忙碌状态(BF)可以确认内部动作是否完成,同时可以读出位址计数器(AC)的值
10、写资料到RAM
CODE:
RWRSDB7DB6DB5DB4DB3DB2DB1DB0
L
H
D7
D6
D5
D4
D3
D2
D1
D0
功能:
写入资料到内部的RAM(DDRAM/CGRAM/TRAM/GDRAM)
11、读出RAM的值
CODE:
RWRSDB7DB6DB5DB4DB3DB2DB1DB0
H
H
D7
D6
D5
D4
D3
D2
D1
D0
功能:
从内部RAM读取资料(DDRAM/CGRAM/TRAM/GDRAM)
12、待命模式(01H)
CODE:
RWRSDB7DB6DB5DB4DB3DB2DB1DB0
L
L
L
L
L
L
L
L
L
H
功能:
进入待命模式,执行其他命令都可终止待命模式
13、卷动位址或IRAM位址选择(02H/03H)
CODE:
RWRSDB7DB6DB5DB4DB3DB2DB1DB0
L
L
L
L
L
L
L
L
H
SR
功能:
SR=1;允许输入卷动位址SR=0;允许输入IRAM位址
14、反白选择(04H\05H)
CODE:
RWRSDB7DB6DB5DB4DB3DB2DB1DB0
L
L
L
L
L
L
L
H
R1
R0
功能:
选择4行中的任一行作反白显示,并可决定反白的与否
15、睡眠模式(08H/0CH)
CODE:
RWRSDB7DB6DB5DB4DB3DB2DB1DB0
L
L
L
L
H
H
X
1RE
G
L
功能:
SL=1;脱离睡眠模式SL=0;进入睡眠模式
16、扩充功能设定(36H/30H/34H)
CODE:
RWRSDB7DB6DB5DB4DB3DB2DB1DB0
L
L
L
L
L
H
S/C
R/L
X
X
功能:
RE=1;扩充指令集动作RE=0;基本指令集动作G=1;绘图显示ONG=0;绘图显示OFF
17、设定IRAM位址或卷动位址(40H-7FH)
CODE:
RWRSDB7DB6DB5DB4DB3DB2DB1DB0
L
L
L
H
AC5
AC4
AC3
AC2
AC1
AC0
功能:
SR=1;AC5~AC0为垂直卷动位址SR=0;AC3~AC0写ICONRAM位址
18、设定绘图RAM位址(80H-FFH)
CODE:
RWRSDB7DB6DB5DB4DB3DB2DB1DB0
L
L
H
AC6
AC5
AC4
AC3
AC2
AC1
AC0
功能:
设定GDRAM位址到位址计数器(AC)
2.2.5显示坐标关系
X坐标
Line180H81H82H83H84H85H86H87H
Line290H91H92H93H94H95H96H97H
Line388H89H8AH8BH8CH8DH8EH8FH
Line498H99H9AH9BH9CH9DH9EH9FH
3硬件电路设计
3.1LCD控制电路原理图
3.2电机控制电路
电机H桥控制电路如下图3.2所示。
当DCMotorA为高电平时,NPN型三极管Q4导通,则PNP型三极管Q2和NPN型三极管Q6会同时导通;同时DCMotorB为低电平,NPN型三极管Q5关闭,则PNP型三极管Q3和NPN型三极管Q7会同时关闭。
此时,电流将从MOTORB经过电机向MOTORA方向流动,如此驱动电机正向转动。
反之,DCMotorA为低电平,DCMotorB为高电平,电机为反向转动。
如此可以实现电机的正反转控制。
调节DCMotorA或DCMotorB的导通时间,可以实现电机的调速控制。
3.3速度反馈电路
速度反馈电路如上图3.3所示。
当光耦Optoisolator1导通时,PNP型三极管Q1导通,指示灯LED1发光,此时DCMotorSpeed端口为低电平。
当光耦Optoisolator1不导通时,指示灯LED1不发光,此时DCMotorSpeed端口为高电平。
电机带了一个有四个缺口的转盘,如此。
当电机转动一圈时,会有4个脉冲输入给单片机,对这些脉冲进行计数,可以计算出电机的转动速度。
由于装在电机上的码盘格数比较少,而我们程序中速度的级数为255,相对较大。
给速度计数的T0计数器,为满足系统的实时控制性,则获取速度数据的时间应该尽量短(即程序中T0定时器初始化程序中的Delay延时)。
同时,这一时间又要满足当给定速度最大时,仍有足够的时间能够对速度反馈值进行正确的计数。
所以这一时间不能够太短。
合理的确定这一时间的方法是,给定电机速度为255,让其全速转动。
此时,从小到大更改计数延时Delay()的时间,然后在液晶显示器上观察反馈的速度值,当其刚好为255时,此时的延时Delay()时间为系统的的最佳速度采样时间。
经过上述处理后,我们发现获得的这个延时时间是相对比较长的,这是因为当给定速度较大时,电机需要转几十圈才能反馈出实际的速度值,所以反馈速度所需的时间比较长,实时控制的能力相对较差。
为克服以上系统的缺点,可以通过减少速度的级数,即减小Pwm_MAX的值来实现。
但是速度的级数减少后,电机调速的连续性就必然会降低,电机在速度动态变化过程中的稳定性就会相应降低。
另外,还可以采用增加电机码盘格数的方法来实现速度反馈的快速性和准确性,借此可以在较合理的时间内得到电机速度的准备值。
第二种改进方案更为合理和科学。
3.4MCU接口
3.5按键电路
按键电路如上图3.5所示。
当任意一个按键KEY被按下时,P2.0~P2.2引脚会对应的的产生一个低电平。
4软件设计
4.1程序要求
我们使用C语言对AT89C51进行控制程序的编写。
程序中使用到的资源有两个定时器资源,T0工作在16位外部计数模式,用于速度的反馈和计算等数据处理。
T1工作在8位定时器自动重载模式,引脚P3.4接计数信息输入端口。
在T1的定时溢出中断程序中进行速度的产生及对电机的控制操作。
系统使用到5个普通I/O口资源。
P1.6和P1.7为控制电机转动的两路控制信号。
P2.0作为加速按键信息输入端口,P2.1作为减速按键信息输入端口,P2.2作为方向控制键信息输入端口。
程序运行时,先进行LCD控制程序的初始化并对显示进行预处理。
然后读预设速度初值,由T1中断服务程序产生PWM速度控制信号,T0反馈速度信息并进行速度的计算处理。
KEY1和KEY2可对速度进行加减操作。
KEY3可对电机进行正反转的控制操作。
程序的编写要遵循性保证系统稳定性的前提下消耗尽量少消耗资源的原则,并要考虑实际的可操作性和满足系统在各种工作环境下能稳定正常运行的要求。
4.2程序流程图
4.3程序清单
4.3.1LCD驱动程序
/*
LCD.C
128×64LCD驱动程序头文件
*/
#ifndefLCD_H_
#defineLCD_H_
#include
sbitLCD_BL=P1^4;//定义背光控制信号
voidLcdLightOn();//点亮背光灯
voidLcdLightOff();//熄灭背光灯
voidLcdClear();//清屏
voidLcdInit();//初始化
voidLcdPutChar(unsignedcharc);//显示ASCⅡ码
voidLcdPuts(unsignedchar*s);//显示字符串
#endif//LCD_H_
/*
LCD.C
128×64LCD驱动程序
*/
#include
#include
unsignedcharLcdCursor;//定义屏幕光标(取值0~63,光标本身不可见)
inti,j;
voidLcdLightOn()//功能:
点亮背光灯
{
LCD_BL=1;
}
voidLcdLightOff()//功能:
熄灭背光灯
{
LCD_BL=0;
}
/*
函数:
LcdGetBF()
返回:
BF=1,表示忙,不可进行任何操作
BF=0,表示不忙,可以进行正常操作
*/
bitLcdGetBF()//功能:
读出状态位BF
{
unsignedchardat;
dat=XBYTE[0xD002];//XBYTE的定义见
return(bit)(dat&0x80);
}
voidLc