基于单片机控制直流电机调速系统设计正文

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

目录
第一章引言 (2)
1.1 课题的研究意义 (2)
第二章总体设计方案 (3)
2.1设计思路与原理 (3)
2.2系统总体设计框图 (4)
2.3系统主要参数设计原理 (5)
第三章硬件设计 (6)
3.1使用设备 (6)
3.2 AT89S52单片机简介: (7)
3.3 PWM信号发生电路设计 (11)
3.4 显示与键盘模块 (11)
3.5 ZigBee无线收发模块 (12)
3.6 转动源模块 (14)
第四章系统的软件设计与实现 (15)
4.1 系统软件简介 (15)
4.2 编程语言简介 (15)
4.3程序设计 (16)
第五章上位机设计 (24)
5.1 函数介绍 (24)
5.2 前面板设计 (26)
5.3 程序框图设计 (27)
第六章运行与调试 (28)
个人小结 (31)
参考文献 (41)
附录1 (42)
第一章引言
1.1 课题的研究意义
直流电机具有良好的起动、制动性能,宜于在大范围内平滑调速,在许多需要调速或快速正反向的电力拖动系统中得到了广泛的应用。

近年来,交流调速系统发展很快,然而直流拖动系统无论是在理论上还是在实践上都比较成熟,并且从反馈闭环控制的角度来看,它又是交流拖动控制系统的基础,所以直流调速系统在生活中有着举足轻重的作用。

虽然随着电力技术的发展,特别是在大功率电力电子器件问世以后,直流电机拖动将有逐步被交流电机拖动所取代的趋势,但在中、小功率场合,常采用永磁直流电动机。

早期的直流电动机的控制均以模拟电路为基础,采用运算放大器、非线性集成电路以及少量的数字电路组成,控制自通的硬件部分非常复杂,功能单一,而且系统非常不灵活,调试困难。

随着单片机技术的不断进步,使得许多控制功能及算法可以采用软件技术来完成,为直流电动机的控制提供了更大的灵活性,并使系统能够达到更高的稳定性能,同时还具有软特性好,过载能力强,可进行PID调节,调速稳定等优势。

因此,本课题的研究具有很好的实际意义。

本次设计主要研究的是PID控制技术在运动控制领域中的应用,纵所周知运动控制系统最主要的控制对象是电机,在不同的生产过程中,电机的运行状态要满足生产要求,其中电机速度的控制在占有至关重要的作用,因此本次设计主要是利用PID控制技术对直流电机转速的控制。

其设计思路为:以AT89S52单片机为控制核心,产生占空比受PID算法控制的PWM脉冲实现对直流电机转速的控制。

同时利用光电传感器将电机速度转换成脉冲频率反馈到单片机中,构成转速闭环控制系统,达到转速无静差调节的目的。

因此该系统在硬件方面包括:电源模块、电机驱动模块、控制模块、速度检测模块、人机交互模块。

软件部分采用C语言进行程序设计,其优点为:可移植性强、算法容易实现、修改及调试方便、易读等。

第二章总体设计方案
2.1设计思路与原理
本文主要研究了利用AT89S52单片机控制PWM信号从而实现对直流电机转速进行控制的方法。

而中间利用了大家都比较熟悉的数字PID算法,以前大家用的比较多的是模拟PID算法,但是由于现场的系统参数、温度等条件发生变化,使系统很难达到最佳的控制效果,因此采用模拟PID控制器难以获得满意的控制效果。

数字PID不仅能够实现模拟PID所完成的控制任务,而且具备控制算法灵活、可靠性高等优点,应用面越来越广。

本实验还利用了Labview设计上位机来对直流电机的转速进行测量,并在Labview的前面板显示出转速,再通过Labview的串口通信反馈给单片机,然后利用数字PID算法调节转速,通过Labview实时检测转速大小。

单片机直流电机调速简介:单片机直流调速系统可实现对直流电动机的平滑调速。

PWM 是通过控制固定电压的直流电源开关频率,从而改变负载两端的电压,进而达到控制要求的一种电压调整方法。

在PWM驱动控制的调整系统中,按一个固定的频率来接通和断开电源,并根据需要改变一个周期内“接通”和“断开”时间的长短。

通过改变直流电机电枢上电压的“占空比”来改变平均电压的大小,从而控制电动机的转速。

因此,PWM又被称为“开关驱动装置”。

本系统以AT89S52单片机为核心,通过单片机控制,C语言编程实现对直流电机的平滑调速。

本实验主要运用的是脉冲触发(也就是上升沿触发中断)系统控制方案的分析:本直流电机调速系统以单片机系统为依托,根据PWM调速的基本原理,以直流电机电枢上电压的占空比来改变平均电压的大小,从而控制电动机的转速为依据,实现对直流电动机的平滑调速,并通过单片机控制速度的变化。

转速监测与反馈系统的分析:以往我们会使用测速发电机来进行转速的测量与分析,把输入的机械转速变换为电压信号输出,并要求输出的电压信号与转速成正比,分为直流与交流两种。

而运用Labview(G语言)设计转速测量系统是种大胆的尝试,用Labview 设计起来方便,操作简单,只要用Labview的串口通信就可以与单片机相连接,编入C代码就能实现监测功能。

2.2系统总体设计框图
由于上位机和单片机都具有串口,因此经常使用串口完成两者之间的数据交换,这就需要在上位端设计相应的串口通信程序。

完成了与单片机的数据交换后,就能在Labview 的前面板实时监测转速,用上位机监测到的数据反馈给MCU,用P1.7模拟PWM ,进而通过位置型PID 进行调整,将数据传输给转动源,实现调整转速的功能。

PWM 信号的产生与放大就是在PWM 驱动控制的调整系统中,按一个固定的频率来接通和断开电源,并且根据需要改变一个周期内“接通”和“断开”时间的长短。

通过改变直
转动源
光电对管 INTO MCU 转速显示 上位机监控 PID 调整 P1.7模拟PWM
流电机电枢上电压的“占空比”来达到改变平均电压大小的目的,从而来控制电动机的转速。

也正因为如此,PWM又被称为“开关驱动装置”。

2.3系统主要参数设计原理
模拟PID就是在现场安装的利用DDZII或者DDZIII型表再加上其他气动仪表的模块,对现场控制变量的模拟信号利用旋钮或拨盘对PID的三个值进行设定对或者手动控制输出的系统,其信号均为模拟信号。

数字PID就是把现场的控制变量的模拟信号和对现场受控变量的输出信号均转换成了数字信号,PID的实现也是通过数字信号的设定来完成的。

现在大多在DCS、PLC系统内完成的。

数字PID有两种模式:位置型PID算式,增量型PID算式。

增量型PID不需要做累加,控制量增量的确定仅与最近几次误差采样值有关,计算误差或计算精度问题对控制量的计算影响较小,而位置型算法要用到过去的误差累加值,容易产生大的累加误差。

增量型算法得出的是控制量的增量,例如阀门控制中,只输出阀门开度的变化部分,误动作影响小,必要时通过逻辑判断限制或禁止本次输出,不会严重影响系统的工作。

采用增量型算法,易实现手动到自动的无冲击切
第三章硬件设计
3.1使用设备
ZYMCU02主机模块、显示与键盘模块、ZigBee无线收发实验模块、转动源实验模块、电脑一台(已装KEIL和STC下载软件)、导线。

实验连线表:
图3.1 ZYMCU02主机模块
3.2 AT89S52单片机简介:
AT89S52为 ATMEL 所生产的一种低功耗、高性能CMOS8位微控制器,具有8K在系统可编程Flsah存储器。

(一)、AT89S52主要功能列举如下:
1、拥有灵巧的8位CPU和在系统可编程Flash
2、晶片内部具时钟振荡器(传统最高工作频率可至 12MHz)
3、内部程序存储器(ROM)为 8KB
4、内部数据存储器(RAM)为 256字节
5、32 个可编程I/O 口线
6、8 个中断向量源
7、三个 16 位定时器/计数器
8、三级加密程序存储器
9、全双工UART串行通道
(二)、AT89S52各引脚功能介绍:
图3.2
VCC:
AT89S52电源正端输入,接+5V。

VSS:
电源地端。

XTAL1:
单芯片系统时钟的反相放大器输入端。

XTAL2:
系统时钟的反相放大器输出端,一般在设计上只要在 XTAL1 和 XTAL2 上接上一只石英振荡晶体系统就可以动作了,此外可以在两引脚与地之间加入一 20PF 的小电容,可以使系统更稳定,避免噪声干扰而死机。

RESET:
AT89S52的重置引脚,高电平动作,当要对晶片重置时,只要对此引脚电平提升至高电平并保持两个机器周期以上的时间,AT89S51便能完成系统重置的各项动作,使得内部特殊功能寄存器之内容均被设成已知状态,并且至地址0000H处开始读入程序代码而执行程序。

EA/Vpp:
"EA"为英文"External Access"的缩写,表示存取外部程序代码之意,低电平动作,也就是说当此引脚接低电平后,系统会取用外部的程序代码(存于外部EPROM中)来执行
程序。

因此在8031及8032中,EA引脚必须接低电平,因为其内部无程序存储器空间。

如果是使用 8751 内部程序空间时,此引脚要接成高电平。

此外,在将程序代码烧录至8751内部EPROM时,可以利用此引脚来输入21V的烧录高压(Vpp)。

ALE/PROG:
ALE是英文"Address Latch Enable"的缩写,表示地址锁存器启用信号。

AT89S52可以利用这支引脚来触发外部的8位锁存器(如74LS373),将端口0的地址总线(A0~A7)锁进锁存器中,因为AT89S52是以多工的方式送出地址及数据。

平时在程序执行时ALE引脚的输出频率约是系统工作频率的1/6,因此可以用来驱动其他周边晶片的时基输入。

此外在烧录8751程序代码时,此引脚会被当成程序规划的特殊功能来使用。

PSEN:
此为"Program Store Enable"的缩写,其意为程序储存启用,当8051被设成为读取外部程序代码工作模式时(EA=0),会送出此信号以便取得程序代码,通常这支脚是接到EPROM的OE脚。

AT89S52可以利用PSEN及RD引脚分别启用存在外部的RAM与EPROM,使得数据存储器与程序存储器可以合并在一起而共用64K的定址范围。

PORT0(P0.0~P0.7):
端口0是一个8位宽的开路汲极(Open Drain)双向输出入端口,共有8个位,P0.0表示位0,P0.1表示位1,依此类推。

其他三个I/O端口(P1、P2、P3)则不具有此电路组态,而是内部有一提升电路,P0在当做I/O用时可以推动8个LS的TTL负载。

如果当EA引脚为低电平时(即取用外部程序代码或数据存储器),P0就以多工方式提供地址总线(A0~A7)及数据总线(D0~D7)。

设计者必须外加一锁存器将端口0送出的地址栓锁住成为A0~A7,再配合端口2所送出的A8~A15合成一完整的16位地址总线,而定址到64K 的外部存储器空间。

PORT2(P2.0~P2.7):
端口2是具有内部提升电路的双向I/O端口,每一个引脚可以推动4个LS的TTL负载,若将端口2的输出设为高电平时,此端口便能当成输入端口来使用。

P2除了当做一般I/O端口使用外,若是在AT89S52扩充外接程序存储器或数据存储器时,也提供地址总线的高字节A8~A15,这个时候P2便不能当做I/O来使用了。

PORT1(P1.0~P1.7):
端口1也是具有内部提升电路的双向I/O端口,其输出缓冲器可以推动4个LS TTL 负载,同样地若将端口1的输出设为高电平,便是由此端口来输入数据。

如果是使用8052
或是8032的话,P1.0又当做定时器2的外部脉冲输入脚,而P1.1可以有T2EX功能,可以做外部中断输入的触发脚位。

PORT3(P3.0~P3.7):
端口3也具有内部提升电路的双向I/O端口,其输出缓冲器可以推动4个TTL负载,同时还多工具有其他的额外特殊功能,包括串行通信、外部中断控制、计时计数控制及外部数据存储器内容的读取或写入控制等功能。

其引脚分配如下:
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,外部数据存储器的读取信号。

RST:复位输入。

当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。

ALE/PROG:当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。

在FLASH编程期间,此引脚用于输入编程脉冲。

在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。

因此它可用作对外部输出的脉冲或用于定时目的。

然而要注意的是:每当用作外部数据存储器时,将跳过一个ALE脉冲。

如想禁止ALE的输出可在SFR8EH地址上置0。

此时, ALE只有在执行MOVX,MOVC指令是ALE才起作用。

另外,该引脚被略微拉高。

如果微处理器在外部执行状态ALE禁止,置位无效。

/PSEN:外部程序存储器的选通信号。

在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。

但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。

/EA/VPP:当/EA保持低电平时,则在此期间外部程序存储器(0000H-FFFFH),不管是否有内部程序存储器。

注意加密方式1时,/EA将内部锁定为RESET;当/EA端保持高电平时,此间内部程序存储器。

在FLASH编程期间,此引脚也用于施加12V编程电源(VPP)。

XTAL1:反向振荡放大器的输入及内部时钟工作电路的输入。

XTAL2:来自反向振荡器的输出。

3.3 PWM信号发生电路设计
PWM(Pulse Width Modulation)——脉宽调制。

PWM的基本原理:PWM是通过控制固定电压的直流电源开关频率,改变负载两端的电压,从而达到控制要求的一种电压调整方法。

PWM可以应用在许多方面,比如:电机调速、温度控制、压力控制等等。

在PWM驱动控制的调整系统中,通过一个频率来接通和断开电源,就可以改变一个周期内“接通”和“断开”时间的长短,就可改变直流电机电枢上电压的“占空比”来达到改变平均电压大小的目的,平均电压是通过等效直流电流实现的,由冲量相等而形状不同的窄脉冲加在具有惯性的环节上时,其效果基本相同,冲量即指窄脉冲的面积,从而来控制电动机的转速。

也正因为如此,PWM又被称为“开关驱动装置”。

如图3.3所示:
图3.3 PWM方波
设电机始终接通电源时,电机转速最大为Vmax,设占空比为D= t1 / T,则电机的平均速度为Va = Vmax * D,其中Va指的是电机的平均速度;Vmax 是指电机在全通电时的最大速度;D = t1 / T是指占空比。

由上面的公式可见,当我们改变占空比D = t1 / T时,就可以得到不同的电机平均速度Vd,从而达到调速的目的。

严格来说,平均速度Vd 与占空比D并非严格的线性关系,但是在一般的应用中,我们可以将其近似地看成是线性关系。

图3.4 显示与键盘模块
3.4 显示与键盘模块
LED动态扫描方式:动态扫描显示接口是单片机中应用最为广泛的一种显示方式之一。

其接口电路是把所有显示器的8个笔划段a-h同名端连在一起,而每一个显示器的公共极COM是各自独立地受I/O线控制。

键盘是由一组按压式或触摸式开关构成的阵列。

智能仪表键盘的设置应由该仪表具体的功能来决定,因此,智能仪表往往采用专用的功能键盘。

矩阵式键盘适用于按键数量较多的场合,它由行线和列线组成,按键位于行、列的交
叉点上。

在按键数量较多的场合,矩阵式键盘比独立式键盘要节省很多的I/O 口。

3.5 ZigBee 无线收发模块
Z igbee 是一个由可多到65000个无线数传模块组成的一个无线数传网络平台,十分类
似现有的移动通信的CDMA 网或GSM 网,每一个Zigbee 网络数传模块类似移动网络的一个基站,在整个网络范围内,它们之间可以进行相互通信;每个网络节点间的距离可以从标准的75米,到扩展后的几百米,甚至几公里;另外整个Zigbee 网络还可以与现有的其它的各种网络连接。

图3.5 ZigBee无线收发模块
运用Z igbee的优点:
1.无网络使用费:使用移动网需要长期支付网络使用费,而且是按节点终端的数量计算的,而Zigbee没有这笔费用;
2.设备投入低:使用移动网需要购买移动终端设备,每个终端的价格在人民币1000元上下,而使用Zigbee 网络,不仅Zigbee网络节点模块(相当于基站)费用每只人民币不到1000元,而且,主要使用的网络子节点(相当于手机)的价格还要低得多;
3.通信更可靠:由于现有移动网主要是为手机通信而设计的,尽管CDMA-1X和GPRS 可以进行数据通信,但实践发现,不仅通信数率比设计速率低很多,而且数据通信的可靠信也存在一定的问题。

而Zigbee网络则是专门为控制数据的传输而设计的,因而控制数据的传输具有相当的保证。

4.高度的灵活性和低成本:首先,通过使用覆盖距离不同,功能不同的Zigbee网络节点,以及其它非Zigbee系统的低成本的无线收发模块,建立起一个Zigbee局部自动化控制网,(这个网络可以是星型,树状,网状及其共同组成的复合网结构)再通过互联网或移动网与远端的计算机相连,从而实现低成本,高效率的工业自动化遥测遥控;
3.6 转动源模块
图3.6 转动源模块
霍尔效应是磁电效应的一种,利用霍尔效应在电机上安装磁片,而将霍尔集成片安装在固定轴上,通过对脉冲的计数进行电机速度的检测,表达式为UH=KHIB,当被测圆盘上装上N只磁性体时,转盘每转一周磁场变化N次,每转一周霍尔电势就同频率相应变化,输出电势通过放大、整形和计数电路就可以测出被测旋转物的转速。

第四章系统的软件设计与实现
4.1 系统软件简介
本设计使用的软件是Keil编程软件。

Keil软件是目前最流行的开发单片机的软件,Keil提供了包括编译器、宏汇编、连接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境(μVision)将这些部分组合在一起。

使用Keil Software工具时的项目开发流程和其他软件开发项目的流程极其相似:①创建一个项目,从器件库中选择目标器件,配置工具设置。

②用C语言或汇编语言创建源程序。

③用项目管理器生成应用。

④修改源程序中的错误。

⑤测试连接应用。

4.2 编程语言简介
本设计采用C语言进行编程。

虽然汇编语言在控制底层硬件方面有着良好的性能且执行效率高,但是编程效率低,可移植性和可读性差,维护极其不便,从而导致整个系统的可靠性也较差。

C语言与汇编语言相较而言有以下优势:①可以大幅加快开发进度,特别是开发一些复杂的系统,程序量越大,用C语言就越有优势。

②可以实现软件的结构化编程,C语言使得软件的逻辑结构变得清晰、有条理。

③省去了人工分配单片机资源(包括寄存器、RAM等)的工作。

在汇编语言中要每一个子程序分配单片机的资源,而在C语言中,只要在代码中声明一下变量的类型,编译器就会自动分配相关资源,从而有效地避免了人工分配单片机资源可能带来的差错。

④当写好一个算法后,需要移植到不同的MCU上时,在汇编语言中只有重新编写代码,因而汇编语言的可移植性很差;而用C语言开发时,符合ANSI C标准的程序基本不必修改,只要将一些与硬件相关的代码做适度的修改,就可以移植到其他种类的单片机上。

⑤C语言提供data、idata、pdata、xdata、和code等存储器类型,针对单片机的内部数据存储空间、外部数据存储空间和程序空间自动为变量合理地分配空间,而且C语言提供复杂的数据类型,如指针、数组、结构体等,极大地增强了程序的处理能力和灵活性。

C语言较汇编语言的不足之处就是使用C语言写出来的代码会比用汇编语言占用的空间大5%~20%,所以执行起来效率就不及汇编语言。

4.3程序设计
主程序主程序是一个循环程序,其主要思路是,先设定好速度初始值,这个初始值与测速电路送来的值相比较得到一个误差值,然后用PID算法输出控制系数给PWM发生电路改变波形的占空比,进而控制电机的转速。

其程序流程图如图所示。

软件由1个主程序、1个中断子程序、1个PID控制算法子程序、1个定时器子程序、3个延时子程序和2个显示子程序组成。

主程序主程序是一个循环程序,其主要思路是由单片机P1.7口生数据送到PWM信号发生电路,然后用PID算法输出控制系数给PWM发生电路改变波形的占空比进而控制电机的转速。

主程序流程图如图3-1所示:
图3-1
1.主程序设计:
void main()
{
P1=0x00;
SCON=0x40;
PCON=0x80;
TMOD=0x21;
TL1=0xfa;TH1=0xfa;TH0=0XFE;TL0=0X33;
ES=0;ET0=1;EX0=1;
TR1=1;TR0=1;EA=1;
while(1)
{ while (key1==0||key2==0||key3==0||a==0) {
if(key1==0&&key2==1&&key3==1)
{
while(key1==0);
state_flag=~state_flag;
if(state_flag==1)
{
EX0=1;TR0=1;
en =0;en_1 =0;en_2 =0;un =0;
wide=150;
a=1;
//wide = set_count;
}
if(state_flag==0)
{
PWM = 0;
EA=0;TR0=0;
run_count=0;stop_count=0;
time=0;t1=0;t2=0;
display_num4(set_count);
a=0;
}
}
if(key1==1&&key2==0&&key3==1&&state_flag==0)
{
while(key2==0);
delay1(20);
set_count+=1;
if(set_count>300) set_count=100;
}
if(key1==1&&key2==1&&key3==0&&state_flag==0)
{
while(key3==0);
delay1(20);
if(set_count>100) set_count-=1;
if(set_count==100) set_count=300;
}
else
display_num4(stop_count);
}
while(key1==1&&key2==1&&key3==1&&a==1)
{
if(time==400)
{
time=0;stop_count=run_count/2;
run_count=0;
pid();
}
}
}
}
主程序主程序是一个循环程序,其主要思路是,首先判断系统的运行模式,如果KEY1键按下,且state_flag为1则系统处于运行模式,如果state__flag为0则为设置模式。

如果系统处于设置模式,则关闭定时器中断和外部中断,同时初始化部分变量,KEY2为按键加,KEY3为按键减。

如果系统处于运行模式,xcount开始计时,当xcount=82时,即为1s时,调用串口中断子程序,单片机开始发送数据,模拟I/O口输出PWM,此时PWM波的频率为81.43Hz,周期为12.82ms,然后调用PID函数,计算出PWM波输出的占空比,最后上位机显示转速。

2. PID控制算法子程序设计:
void pid(void) //PID 计算输出量
{
en=set_count-stop_count;
un=a0*en-a1*en_1+a2*en_2;//计算输出量
if(un > 400)un = 400;
else if(un <-400)un = -400;
en_2=en_1;en_1=en; //更新误差
wide += un/4; //计算wide,用于调节PWM的占空比,计算周期为100ms
if(wide>900)wide=900; //防止超限,确保计算饿wide值有效
else if(wide<10)wide=10;
}
位置式PID控制:
增量式PID控制:
从表达式我们可以得出以下结论:
(1)位置式PID控制的输出与整个过去的状态有关,用到了误差的累加值;而增量式PID的输出只与当前拍和前两拍的误差有关,因此位置式PID控制的累积误差相对更大;
(2)增量式PID控制输出的是控制量增量,并无积分作用,因此该方法适用于执行机构带积分部件的对象,如步进电机等,而位置式PID适用于执行机构不带积分部件的对象,如电液伺服阀。

(3)由于增量式PID输出的是控制量增量,如果计算机出现故障,误动作影响较小,而执行机构本身有记忆功能,可仍保持原位,不会严重影响系统的工作,而位置式的输出直接对应对象的输出,因此对系统影响较大。

(4)PID调节器的参数整定方法有很多,但可归结为理论计算法和试测法两种。

用理论计算法设计调节器的前提是能获得被控对象准确的数学模型,这在工业过程中一般较难做到。

因此,实际用得较多的还是试测法。

这种方法最大优点就是整定参数时不依赖对象的数学模型,简单易行。

当然,这是一种近似的方法,有时可能略嫌粗糙,但相当适用,可解决一般实际问题。

本文使用试测法。

3.延时子程序:
void delay(uint time)
{
uint i;
for(i=0;i<time&&key1==1;i++)
display_num4(stop_count);
}
void delay1_ms(uint time) //1ms延时函数
{
uint i,j;
for(i=0;i<time;i++)
for(j=0;j<123;j++);
}
void delay1(uint num)
{
uint i;
for(i=0;i<num;i++)
display_num4(set_count);
}
4.显示子程序:
void display_num1(uint dat,uchar num1) //指定的位上显示指定的一位数据{
P0=xianshi[dat]; //段显
switch(num1)
{
case 1: P2=0x01;break;
case 2: P2=0x02;break;
case 3: P2=0x04;break;
case 4: P2=0x08;break;
default: break;
}
delay1_ms(2);
}
void display_num4(uint num) //四位数据显示函数
{
uint qian,bai,shi,ge;
qian=num/1000;
if(qian==0)qian=11;
display_num1(qian,4);
bai=(num%1000)/100;
if(qian==11&&bai==0)bai=11;
display_num1(bai,3);
shi=(num%100)/10;
if(qian==11&&bai==11&&shi==0)shi=11;
display_num1(shi,2);
ge=num%10;
display_num1(ge,1);
}
5.外中断子程序:
void int0() interrupt 0 //外部中断0用于电机转速测量{ EX0=0;run_count++;EX0=1;
6.
void time0() interrupt 1 //定时器0用于产生PWM ,占空比通过PID计算获得
{// SBUF='a';
//while(TI) {TI=0;}
TR0=0;
time++;
TH0=0XFF;TL0=0X9c;//计数器0赋初值 100us
if(low_flag==0)t1++;//低电平时间计时
t2++;
if(t2==1000) //用于确定PWM的周期,t2乘以定时器的中断周期即为PWM的周期
{PWM=1; t2=0; low_flag=0;}
if(t1==wide)//wide的值即为低电平的时间
{PWM=0;t1=0;low_flag=1;}
TR0=1; /**/
}。

相关文档
最新文档