资源描述
摘 要
本课题是对直流电机PWM调速器设计的研究,主要实现对电动机的控制。因此在设计中,对直流调速的原理,直流调速控制方式以及调速特性,PWM基本原理及实现方式进行了全面的阐述。
为实现系统的微机控制,在设计中,采用了STC89C51单片机作为整个控制系统的控制电路的核心部分,配以各种显示,驱动模块,实现对电动机的转速的显示和测量;由命令输入模块,光电隔离模块及H型驱动模块组成。采用带中断的独立式键盘作为命令的输入,单片机在程序的控制下,不断给光电隔离电路发送PWM波形,H型驱动电路完成电机的正反转控制。在设计中,采用PWM调速方式,通过改变PWM的占空比从而改变电动机的电枢电压,进而实现对电动机的调速。设计的整个控制系统,在硬件结构上采用了大量的集成电路模块,大大的简化了硬件电路,提高了系统的稳定性和可靠性,使整个系统的性能得到提高。
目录
摘 要 1
1 直流电机 3
1.1直流电机的结构 3
1.2直流电机的工作原理 3
1.3 直流电机的主要的技术参数 4
1.4直流电机的调速的技术指标 4
2 单片机的相关知识 6
2.1单片机的简介 6
2.2 单片机的发展史 6
2.2.1 4位单片机 6
2.2.2 8位单片机 6
2.2.3 16位单片机 6
2.2.4 32位单片机 7
2.2.5 64位单片机 7
2.3 单片机的特点 7
2.4 STC89C51单片机介绍 8
3硬件电路的设计 12
3.1控制电路的设计 12
3.2霍尔元件测速部分电路的设计 12
3.3 电机控制正反转电路设计 13
3.4 显示设计 16
4 软件设计 18
4.1 主程序部分 18
4.2 数码管显示设计 19
4.2.1 设计要求 19
4.2.2 程序设计注意事项 19
4.2.3 数码管显示程序设计 19
4.3 功能程序设计 19
5 直流测速系统仿真 21
5.1 直流测速系统仿真 21
5.1.1单片机最小系统仿真 22
5.1.2 数码管显示仿真 22
6结束语 24
参考文献 24
附1 源程序代码 25
附2 原理图 31
1 直流电机
1.1直流电机的结构
直流电机的结构应由定子和转子两大部分组成。直流电机运行时静止不动的部分称为定子,定子的主要作用是产生磁场,由机座、主磁极、换向极、端盖、轴承和电刷装置等组成。运行时转动的部分称为转子,其主要作用是产生电磁转矩和感应电动势,是直流电机进行能量转换的枢纽,所以通常又称为电枢,由转轴、电枢铁心、电枢绕组、换向器和风扇等组成。直流电机的结构如图
1.2直流电机的工作原理
直流电机模型如图1.2所示,磁极N,S间装着一个可以转动的铁磁圆柱体,圆柱体的表面固定着线圈abcd。当线圈流过电流的时候,线圈受到电磁力的作用,产生旋转。根据左手定则可知,当流过线圈中电流改变方向时,线圈的受力方向也将改变,因此通过改变线圈电流的方向实现改变电机的方向。
1.3 直流电机的主要的技术参数
额定功率Pn:在额定电流和电压下,电机的负载能力。
额定电压Ue:长期运行的最高电压。
额定电流Ie:长期运行的最大电流。
额定转速n:单位时间里面电机转速的快慢。
励磁电流If:施加到电极线圈上的电流。
1.4直流电机的调速的技术指标
1.4.1 调速范围
调速范围是指最低可控转速到最高可控转速的范围,最低可控转速对最高可控转速的比值,叫电机的调速比。
1.4.2 调速的相对稳定性和静差度
所谓相对稳定性,是指负载转矩在给定的范围里面变化所引起的速度的变化,它决定于机械特性的斜率。
静差度(又称静差率)是指当电动机在一条机械特性上运行时,由理想空载到满载时的转速降落与理想空载转速n0的比值。用百分数表示,即 ,在一般的情况下,取额定转矩下的速度落差,有
1.4.3 调速的平滑性
调速的平滑性是在一定的调速范围内,相邻两极速度变化的程度,用平滑系数表示,即
式中和相邻两极,即i级与i-1级的速度
1.4.4 调速时的容许输出
调速时的容许输出是指电动机在得到充分利用的情况下,在调速的过程中轴能够输出的功率和转矩。
2 单片机的相关知识
2.1单片机的简介
单片机是一种集成在电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计时器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电路)集成到一块硅片上构成的一个小而完善的计算机系统。
2.2 单片机的发展史
2.2.1 4位单片机
1975年,美国德克萨斯公司首次推出4位单片机TMS-1000,此后各个计算机公司竞相推出4位单片机。日本松下公司的MN1400系列。美国洛克威尔公司的PPS/1系列等。4位单片机的主要的应用的领域有:PC机的输入装置。电池的充电器,运动器材,带液晶显示器的音/视频产品控制器,一般家用电器的控制及遥控器,电子玩具,钟表,计算器,多功能电话等。
2.2.2 8位单片机
1972年,美国Intel公司首先推出8位微处理器8008,并与1976年9月率先推出MCS-48系列单片机。在这以后,8位单片机纷纷面世。例如莫斯特克和仙童公司合作生产的3870系列,摩托罗拉公司生产的6801系列等。随着集成电路工艺水平的提高,一些高性能的8位单片机相继问世,例如1978年摩托罗拉公司的MC6801。这类单片机的寻址能力达到64KB,片内ROM的容量达4-8KB,片内除带有并行I/O口,甚至还有A/D转换器的功能。8位单片机由于性能强大,被广泛用于自动化装置,智能接口,过程控制等各领域。
2.2.3 16位单片机
1983年以后,集成电路的集成度可达几十万只管/片,各系列16位单片机纷纷面世,这一阶段的代表产品有1983年Intel公司推出的MCS-96系列,1987年Intel公司推出了80C96 ,美国半导体公司推出了HPC16040。16位单片机主要用于工业控制,智能仪器仪表等场合。
2.2.4 32位单片机
随着高新技术智能机器人,激光打印机,图像与数据实时处理,复杂实时控制,网络服务器等领域的应用和发展,20世纪80年代末,推出了32位单片机,如摩托罗拉公司的MC683XX系列。32位单片机是单片机的发展趋势,随着技术的发展和开发成本的降低,将会和8位单片机并驾齐驱。
2.2.5 64位单片机
近年来,64位单片机在引擎控制,智能机器人,磁盘控制,算法密集的实时控制场所已有应用。如英国的Inmos 公司的Transputer T800是高性能的64位单片机
2.3 单片机的特点
1、单片机的特点
(1)高集成度,体积小,高可靠性
单片机将各功能部件集成在一块晶体芯片上,集成度很高,体积自然也是最小的。芯片本身是按工业测控环境要求设计的,内部布线很短,其抗工业噪音性能优于一般通用的CPU。单片机程序指令,常数及表格等固化在ROM中不易破坏,许多信号通道均在一个芯片内,故可靠性高。
(2)控制功能强
为了满足对对象的控制要求,单片机的指令系统均有极丰富的条件:分支转移能力,I/O口的逻辑操作及位处理能力,非常适用于专门的控制功能。
(3)低电压,低功耗,便于生产便携式产品
为了满足广泛使用于便携式系统,许多单片机内的工作电压仅为1.8V~3.6V,而工作电流仅为数百微安。
(4)易扩展
片内具有计算机正常运行所必需的部件。芯片外部有许多供扩展用的三总线及并行、串行输入/输出管脚,很容易构成各种规模的计算机应用系统。
(5)优异的性能价格比
单片机的性能极高。为了提高速度和运行效率,单片机已开始使用RISC流水线和DSP等技术。单片机的寻址能力也已突破64KB的限制,有的已可达到1MB和16MB,片内的ROM容量可达62MB,RAM容量则可达2MB。由于单片机的广泛使用,因而销量极大,各大公司的商业竞争更使其价格十分低廉,其性能价格比极高。
2.4 STC89C51单片机介绍
STC89C51单片机是一款低功耗、低电压、高性能CMOS8位单片机,片内含8KB(可经受1000次擦写周期)的FLASH可编程可反复擦写的只读程序存储器(EPROM),器件采用CMOS工艺和ATMEL公司的高密度,非易失性存储器(NURAM)技术制造,其输出引脚和指令系统都与MCS-51兼容,片内的FLASH存储器允许在系统内可改编程序或用常规的非易失性存储编程器来编程。因此,AT89C52是一种功能强,灵活性高且价格合理的单片机,可方便的应用在各个控制领域[1]。
STC89C51具有以下主要性能:
1.4KB可改编程序FLASH存储器;
2.全表态工作 :0~24HZ;
3.256X8字节内部RAM;
4.32个外部双向输入,输出(I、O)口;
如图2.1。
图2.1 STC89C51引脚说明
引脚功能说明如下[2]:
VCC:电源电压。
GND:地。
P0口:P0口是一组8位漏极开路型双向I/O口,也即地址/数据线复用口。作为输出口时,每位能吸收电流的方式驱动8个TTL逻辑门电路,对端口写“1”可作为高阻抗输入端。
在访问外部数据储存器或程序储存器时,这组口线分时转换地址(低8位)和数据总线复用,在访问期间激活内部上拉电阻。FLASH编程时,P0口接收指令字节,而在程序校验时,输出指令字节,校验时,要求外接上拉电阻。
P1口:P1是一个带内部上拉电阻的8位双向I/O口,P1的输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。对端口写“1”,通过内部的上拉电阻把端口拉到高电平,此时可作为输入口。作为输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流。FLASH编程和程序校验期间,P1接收低8位地址。
P2口:P2是一个带内部上拉电阻的8位双向I/O口,P2的输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。对端口写“1”,通过内部的上拉电阻把端口拉到高电平,此时可作为输入口。作为输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流。在访问外部程序储存器或16位地址的外部数据储存器(例如执行MOVX@DPTR指令)时,P2口送出高8位地址数据。在访问8位地址的外部数据储存器(例如执行MOVX@RI指令)时,P2口线上的内容(也即特殊功能寄存器(SFR)区中R2寄存器的内容),在整个访问期间不改变。FLASH编程或校验时,P2亦接收高位地址和其他控制信号。
P3口:P3是一个带内部上拉电阻的8位双向I/O口,P3的输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。对端口写“1”,通过内部的上拉电阻把端口拉到高电平,此时可作为输入口。作为输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流。
P3除了作为一般的I/O口线外,更重要的用途是它的第二功能,具体功能说明如表2-1。
P3口还接收一些用于FLASH闪速存储器编程和程序校的控制信号。
RST:复位输入。当振荡器工作时,RST引脚出现两个机器周期以上高电平将使单片机复位。
ALE/PROG:当访问外部程序存储器或数据存储器时,ALE(地址锁存允许)输出脉冲用于锁存地址的低8位字节。
端口引脚
第二功能
P3.0
RXD(串行输出口)
P3.1
TXD(串行输入口)
P3.2
INT0(外部中断0)
P3.3
INT1(外部中断1)
P3.4
T0(定时/计数器0)
P3.5
T1(定时/计数器0)
P3.6
WR(外部数据写选通)
P3.7
RD(外部数据读选通)
表3-1 P3口的第二功能表
即使不访问外部存储器,ALE仍以是时钟振荡频率的1/6输出固定的正脉冲信号,因此他可对外输出时钟或用于定时目的。要注意的是:每当访问外部数据存储器时将跳过一个ALE脉冲。对FLASH存储器编程期间,该引脚还用于输入编程脉冲(PROG)。
如有必要,可通过对特殊功能寄存器(SFR)区中的8EH单元的D0位置位,可禁止ALE操作。该位置位后,只有一条MOVX和MOVC指令ALE才会被激活。此外,该引脚会被微弱拉高,单片机执行外部程序时,应设置ALE无效。
PSEN:程序储存允许(PSEN)输出是外部程序存储器的读选通信号,当AT80C51由外部程序存储器取指令(或数据)时,每个机器周期两次PSEN有效,即输出两个脉冲。在此期间,当访问外部数据存储器,这两次有效的PSEN信号不出现。
EA/VPP:外部访问允许。欲使CPU仅访问外部程序储存器(地址为0000H-FFFFH),EA端必须保持低电平(接地)。需要注意的是:如果加密位LB1被编程,复位时内部会锁存EA端状态。如EA端为高电平(Vcc端),CPU则执行内部程序储存器中的指令。
FLASH储存器编程时,该引脚加上+12V的编程允许电源Vpp,当然这必须是该器件是使用12v编程电压。
XTAL1:振荡器反相放大器的及内部时钟发生器的输入端。
XTAL2:振荡器反相放大器的输出端
3硬件电路的设计
对题目进行深入的分析和思考,可以将整个模块分为以下几个部分:控制部分,显示电路,按键电路,霍尔元件测速电路,电机驱动电路。系统的框图如图3.1所示。
单
片
机
电机驱动
晶振电路
复位电路
显示电路
按键电路
测速电路
图3.1 系统框图
3.1控制电路的设计
控制电路主要由单片机来控制,编写一段程序使单片机发出的PWM脉冲来实现对驱动的控制。新一代的单片机增加了很多的功能,其中包括PWM功能。单片机通过初始化设置,使其能自动的发出PWM脉冲波,只有在改变占空比的时候CPU才干预。
3.2霍尔元件测速部分电路的设计
霍尔传感器是基于霍尔效应的一种磁敏式传感器。霍尔效应1897年首次被美国物理学家霍尔在金属材料中发现,但由于霍尔效应在金属材料中太微弱而没有得到人们的重视及较好的应用。直到20世纪50年代,随着半导体技术的发展,利用半导体材料做成的霍尔元件的霍尔效应比较显著,从而霍尔效应被人们所重视和充分利用,霍尔式传感器得到了快速的应用和发展。目前霍尔传感器已经广泛的应用于电磁、电流、水位、速度、振动等的测量领域。
由于霍尔元件产生的电势差很小,故通常将霍尔元件与放大器电路、温度补偿电路及稳压电源电路等集成在一个芯片上,称之为霍尔传感器。
霍尔传感器也称为霍尔集成电路,其外形较小,如图1所示,是其中一种型号的外形图。
3.3 电机控制正反转电路设计
H桥部分控制电路设计
知道通过调节直流电机的电压可以改变电机的转速,但是一般我们设计的电源大都是固定的电压,而且模拟可调电源不易于单片机控制,数字可调电源设计麻烦。所以这里用脉宽调制(PWM)来实现调速。方波的有效电压跟电压幅值和占空比有关,我们可以通过站空比实现改变有效电压。一般用软件模拟PWM可以有延时和定时两种方法,延时方法占用大量的CPU,所以这里采用定时方法。
直流电机旋转方向
一般利用H桥电路来实现调速。H桥驱动电路:
图3.3.1中所示为一个典型的直流电机控制电路。电路得名于“H桥驱动电路”是因为它的形状酷似字母H。4个三极管组成H的4条垂直腿,而电机就是H中的横杠(注意:图3.3.1及随后的两个图都只是示意图,而不是完整的电路图,其中三极管的驱动电路没有画出来)。
如图所示,H桥式电机驱动电路包括4个三极管和一个电机。要使电机运转,必须导通对角线上的一对三极管。根据不同三极管对的导通情况,电流可能会从左至右或从右至左流过电机,从而控制电机的转向。
图3.3.1 H桥驱动电路
要使电机运转,必须使对角线上的一对三极管导通。例如,如图4.13所示,当Q1管和Q4管导通时,电流就从电源正极经Q1从左至右穿过电机,然后再经Q4回到电源负极。按图中电流箭头所示,该流向的电流将驱动电机顺时针转动。当三极管Q1和Q4导通时,电流将从左至右流过电机,从而驱动电机按特定方向转动(电机周围的箭头指示为顺时针方向)。
图3.3.2H桥电路驱动电机顺时针转动
图3.3.3所示为另一对三极管Q2和Q3导通的情况,电流将从右至左流过电机。当三极管Q2和Q3导通时,电流将从右至左流过电机,从而驱动电机沿另一方向转动(电机周围的箭头表示为逆时针方向)。
图3.3.3 H桥驱动电机逆时针转动
实际电路图如下图所示:
图3.3.4 H桥原理图
3.4 显示设计
LED数码管是一种半导体发光器件,其基本单元是发光二极管,通过对其不同的管脚输入相对的电流,会使其发亮,从而显示出数字。可以显示:时间、日期、距离等可以用数字代替的参数。
数码管按段数分为七段数码管和八段数码管,八段数码管比七段数码管多一个发光二极管单元(多一个小数点显示);按能显示多少个“8”可分为1位、2位、4位等等数码管;按发光二极管单元连接方式分为共阳极数码管和共阴极数码管。共阳极数码管是指将所有发光二极管的阳极接到一起形成公共阳极(COM)的数码管。共阳极数码管在应用时应将公共极COM接到+5V,当某一字段发光二极管的阴极为低电平时,相应字段就点亮。当某一字段的阴极为高电平时,相应字段就不亮。
动态驱动是将所有数码管的8个显示笔划"a,b,c,d,e,f,g,dp"的同名端连在一起,另外为每个数码管的公共极COM增加位选通控制电路,通过由各自独立的I/O线控制,当单片机的P0口输出字形码时,所有数码管都接收到相同的字形码,但究竟是那个数码管会显示出字形,取决于单片机对P2.4-P2.7位选通COM端电路的控制,所以我们只要将需要显示的数码管的选通控制打开,该位就显示出字形,没有选通的数码管就不会亮。通过分时轮流控制各个数码管的COM端,就使各个数码管轮流受控显示,这就是动态驱动。
在本设计中采用了四位七段数码管,用动态驱动来显示距离的值,如图3.4所示。
图3.4.1 数码管结构图
4 软件设计
4.1 主程序部分
程序的完整流程图如图4.1所示:
本程序的功能是通过对测量的转速,并用L293D器件来控制电机的转速,与电机转动的方向。然后用4位数码管显示出来当前的转速与转动方向。
主程序程序设计如源程序代码。
开始
初始化
是否启动
否
是
变速
电机转动
电机转动
电机转动
切换方向
电机转动
显示当前转速
电机转动
计算转速
电机转动
是否切换转
是否加减速
是
否
是
否
是否停止
否
是
结束
电机转动
图 4.1.1 主程序流程图
4.2 数码管显示设计
4.2.1 设计要求
数码管要显示当前各种状态,当前转速与当前转动方向。当电机转速发生改变的时候,数码管显示内容立即显示当前转速。
4.2.2 程序设计注意事项
(1) 消除各个数码管之间的显示阴影部分;
(2) 由于硬件没有锁存器,需要延长数码管的点亮时间,从而使数码管显示的更加清晰;
(3) 合理运用程序空间,避免数码管显示不清晰;
(4) 动态扫描可以实现各个数码管的不同显示。
4.2.3 数码管显示程序设计
if(flat==0)
P0=table[11]; //"C"
else
P0=table[12]; //"A"
P2=0xfe;
delayms(3);
P2=0xfd;
P0=table[shuju/100];
delayms(3);
P2=0xfb;
P0=table[shuju%100/10];
delayms(3);
P2=0xf7;
P0=table[shuju%10];
delayms(3);
P2=0xff; //消隐部分
4.3 功能程序设计
功能程序部分,主要实现各个按键的功能。
主要功能如下:
(1) 启动/停止键:用来控制电机的启动和停止按键;
(2) 加速按键 :用来控制电机的转速,可以增加电机的当前转速;
(3) 减速按键 :用来控制电机的转速,减缓电机的转速;
(4) 正/反转按键:改变电机的转动方向。
主要功能按键程序如下:
if(K4==0) //启动 停止
{
delayms(5);
if(K4==0)
{
while(!K4);
num=!num;
}
}
if(K1==0) //加速键
{
delayms(5);
if(K1==0)
{
while(!K1);
if(num<3)
num++;
}
}
if(K2==0) //减速键
{
delayms(5);
if(K2==0)
{
while(!K2);
if(num>0)
num--;
}
}
if(K3==0) //电机正反转按键
{
delayms(5);
if(K3==0)
{
while(!K3);
flat++;
if(flat==2)
flat=0;
}
}
5 直流测速系统仿真
硬件电路完成以后,进行系统软件设计和仿真。首先要分析系统对软件的要求,然后进行软件的总体的设计,包括程序的总体设计和对程序的模块化设计。按整体功能分为多个不同的模块,单独设计、编程、调试,然后将各个模块装配联调,组成完整的软件。
根据设计的要求,单片机的任务是:内部进行计数,在计算出速度后显示。软件编程用C语言完成的,需要能掌握C语言,还要熟练AT89C51单片机。从程序流程图、编写程序、编译,到最后的调试,是很复杂的。下面作简单介绍:系统软件主程序的功能是完成系统的初始化、显示程序。
5.1 直流测速系统仿真
与以往的80C51单片机不同,AT89C51具有在线调试和下载功能,它由支持AT89C51的开发工具包Keil uVersion2.0开发系统来提供。也就是说,在用户系统保留AT89C51的情况下,通过开发系统与AT89C51的串行接口通信,直接对用户系统进行调试,并在调试完成后将调试好的程序下载到AT89C51中。Keil uVersion3.0开发系统提供四项功能:编译、下载、调试和模拟,分别由Keil uVersion2.0提供的编译器、在线串行下载器、调试器和模拟器来实现。Keil uVersion2.0编译器可在Windows操作系统下直接使用,编译C语言源程序,并生成16进制文件和列表文件。调试器采用Windows系统,允许用户使用AT89C51的UART串行接口在芯片上调试代码执行。在典型调试对话中,调试器提供对片内所有外围设备的访问、单步和设置断点的代码执行控制方式。模拟器采用Windows系统,能完全模拟AT89C51的所有功能。模拟器使用简单,结合了许多标准调试特征,包括多断点、单步以及代码执行跟踪等能力。
同样伟福仿真器是国内较好的仿真器之一,它能够仿真的CPU品种多、功能强。通过更换仿真头POD,可以对不同的CPU进行仿真。可仿真51系列,196系列,PIC系列,飞利蒲公司的552、LPC764、DALLAS320,华邦438等51增强型CPU。由于伟福编译过程没有Keil uVersion2.0那么繁琐,能对程序进行直接编译,省去了建立和设置工程等步骤,使用方便、快捷。所以本设计以Keil uVersion2.0为基础,运用C语言来编译程序。
当程序设计完以后,仿真部分运用Proteus仿真软件来实现,Proteus 软件是一款强大的单片机仿真软件,它除了具有和其他工具一样的原理编辑、印制电路板(PCB)自动或人工布线及电路仿真外,最大的特色是其电路仿真是交互的、可视化的。对于单片机学习和开发帮助极大。Proteus ISIS 是英国Lab center 公司开发的电路分析与实物仿真软件。它运行于Windows操作系统上,可以仿真、分析(SPICE)各种模拟器件和数字集成电路,包括单片机。
通过Proteus可以绘制硬件原理图,并设置元件参数;为单片机及其程序以及外部接口电路的仿真提供可能,验证设计的可行性与合理性;还可以为连接实际的硬件电路做好准备;如有必要时,可以利用它来设计电路板。
5.1.1单片机最小系统仿真
最小系统的仿真实验如图5-1所示。
图5-1 最小系统的仿真图
5.1.2 数码管显示仿真
数码管动态显示仿真模拟实验如图5-2 所示。
图5-2 动态显示仿真图
6结束语
通过本次课程设计,使我学到了许多书本上无法学到的知识,也使我深刻领会到单片机技术应用领域的广泛。不仅让我对我学过的单片机知识的巩固,同时也对单片机这门课产生了很大的兴趣,在课程设计的之中,体会良多,收获很大。
主要有以下方面:
1. 巩固了书本上学习的知识,通过本次的课程设计,对书本上面的知识更加的了解,也对编写程序有了一定的认识。
2. 在本次的课程设计中,我进一步加强了自己的动手的能力和运用专业知识的能力,从中学到如何去思考和解决问题
3. 通过本次的课程设计,让我了解到单片机技术对当今人们生活的重要性。同时这次课程设计也让我明白不管做什么事都要脚踏实地,刻苦努力的去做。
参考文献
[1].何立明,单片机中级教程[M] 北京:北京航天航空大学出版社2006.10
[2] 邹久朋,80C51单片机实用技术[M]北京航天航空大学出版社2008.04
[3]刘湘涛,江世明 单片机原理与应用[M]北京:电子工业出本社 2007.04
[4]李全利 单片机原理及接口技术(第二版)高等教育出版社 2009.01
附1 源程序代码
/****************************************************
========= 直流电机控制+速度显示 ==========
****************************************************/
#include<reg52.h> //头文件
#define uchar unsigned char //宏定义
#define uint unsigned int
#define CYCLE 10 //定义PWM的周期T为10ms
uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0Xff,0xc6,0x88};//0-9 R 共阳数码管段选数据
/***************************************************
端口定义
***************************************************/
sbit PWM1=P1^4; //PWM输出口1(电机正转)
sbit PWM2=P1^5; //PWM输出口2(电机反转)
sbit K1=P1^1; //加速
sbit K2=P1^2; //减速
sbit K3=P1^3; //正反转
sbit K4=P1^0; //启动停止
/***************************************************/
uchar PWM_ON=0; //PWM高电平时间
uchar count=0; //中断计时
uchar num=0;
uchar num1=0; //中断时间计数
uint num2=0; //外部中断次数
uchar flat=0; //正反转标示位
uchar flag=0; //刷新数据标示位
/***************************************************
函数名称:延时子函数
函数功能:按键消抖
***************************************************/
void delayms(uint xms)
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
/***************************************************
函数名称:按键子函数
函数功能:
***************************************************/
void key()
{
if(K4==0) //启动 停止
{
delayms(5);
if(K4==0)
{
while(!K4);
num=!num;
}
}
if(K1==0) //加速键
{
delayms(5);
if(K1==0)
{
while(!K1);
if(num<3)
num++;
}
}
if(K2==0) //减速键
{
delayms(5);
if(K2==0)
{
while(!K2);
if(num>0)
num--;
}
}
if(K3==0) //电机正反转按键
{
delayms(5);
if(K3==0)
{
while(!K3);
flat++;
if(flat==2)
flat=0;
}
}
switch(num)
{
case 0: PWM_ON=0; break; //占空比为00%
case 1: PWM_ON=4; break; //占空比为40%
case 2: PWM_ON=7; break; //占空比为70%
case 3: PWM_ON=10; break; //占空比为100%
default:
break;
}
}
/*******速度数据采集*****************************************/
void sudu()
{
uint shuju;
if(flag==1)
{
flag=0;
shuju=num2*2; //电机一秒转的圈数
num2=0;
}
if(flat==0)
P0=table[11]; //"C"
else
P0=table[12]; //"A"
P2=0xfe;
delayms(3);
P2=0xfd;
P0=table[shuju/100];
delayms(3);
P2=0xfb;
P0=table[shuju%100/10];
delayms(3);
P2=0xf7;
P0=table[shuju%10];
delayms(3);
P2=0xff;
}
void init()
{
PWM1=1; //初始化
PWM2=1;
TMOD=0x11; //打开定时器
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
ET0=1;
TR0=1;
EX0=1;
IT0=1;
TH1=(65536-1000)/256;
TL1=(65536-1000)%256;
EA=1;
ET1=1;
TR1=1;
}
/**************************************************
函数名称:主函数
函数功能:
**************************************************/
void main()
{
init();
while(1)
{
key
展开阅读全文