直流电机调速控制系统设计.doc
前 言在化工生产中,流体传输和液体搅拌是很重要的部分,而这些均有电机来完成,所以对电机的速度调节是更加的重要。电子电路设计是一个对工作和实践经验要求非常强的专业,它要求我们掌握扎实的理论知识,并要求我们有充分的实践环境。大学三年的学习即将结束,在这大学三年里我完成了规定的课程,并取得了不错的成绩,熟练地掌握了Protel制图、PCB板设计等专业知识,虽然在学校里接触不多,但是通过在实习期间的学习接触,已经掌握了相关内容,同时发现其中的许多知识与自己的专业知识相关联,而且它把自己所学的分散知识很好的结合在一起综合利用。毕业设计是大学学习过程中的最后一个环节,也是最重要的一个环节,是对以前所学的基础理论知识及所掌握的技能的综合运用和检验。直流电动机具有良好的起动、制动性能。宜于在大范围内平滑调速。在许多需要调速或快速正反向的电力拖动领域中得到了广泛的应用,特别是在我们化工生产中流体传输和液体搅拌中起着很重要的作用。从控制的角度来看直流调速还是交流拖动系统的基础。早期直流电动机的控制均以模拟电路为基础,采用运算放大器、非线性集成电路以及少量的数字电路组成,控制系统的硬件部分非常复杂,功能单一,而且系统非常不灵活、调试困难。阻碍了直流电动机控制技术的发展和应用范围的推广。随着单片机技术的日新月异,使得许多控制功能及算法可以采用软件技术来完成,为直流电动机的控制提供了更大的灵活性。并使系统能达到更高的性能。采用单片机构成控制系统,可以节约人力资源和降低系统成本。从而有效的提高工作效率。在毕业设计的过程中,肯定会遇到很多困难和许多疑惑,但是在指导教师赵艳启老师和我师傅高明志工程师的悉心指导和自己的努力下,克服了所有的困难,圆满的完成本次毕业设计,给大学生活画上一个圆满的句号。由于我的水平有限,缺乏实际的电器设计经验,设计中肯定会存在错误和不妥之处,敬请各位老师批评指正。1系统原理1.1 直流电机调速原理图1.1所示电枢电压为Ua,电枢电流为Ia,电枢回路总电阻为Ra,电机常数Ca,励磁磁通量是。根据KVL方程:电机转速n=(Ua-IaRa)/Ca,其中,对于极对数p,匝数为N,电枢支路数为a的电机来说:电机常数Ca=pN/60a,意味着电机确定后,该值是不变的。而在Ua-IaRa中,由于Ra仅为绕组电阻,导致IaRa非常小,所以Ua-IaRa约等于Ua。由此可见我们改变电枢电压时,转速n即可随之改变。图1.1直流电机原理图1.2 系统硬件组成原理图1.2 调速系统硬件原理框图直流电机调速系统硬件原理框图如图1.2所示,以89C51单片机为控制核心,包括测速电路、电源电路、数模转换电机驱动电路、显示电路、键盘控制电路。1.3 直流电动机转速控制系统的工作原理直流电动机的转速与施加于电动机两端的电压大小有关。本系统用DAC0832控制输出到直流电动机的电压的方法来控制电动机的转速。当电动机转速小于设定值时,DAC0832芯片的输出电压增大,当大于设定值时则DAC0832芯片输出电压减小,从而使电动机以设定的速度恒速旋转。我们采用比例调节器算法。控制规律:Y=KPe(t)+KI 式中:Y-比例调节器输出,KP-比例系数,KI -积分系数e(t)-调节器的输入,一般为偏差值。系统采用了比例积分调节器,简称PI调节器,使系统在扰动的作用下,通过PI调节器的调节器作用使电动机的转速达到静态无差,从而实现了静态无差。无静差调速系统中,比例积分调节器的比例部分使动态响应比较快(无滞后),积分部分使系统消除静差。1.4 转速测量电路原理转速是工程上一个常用的参数,旋转体的转速常以每分钟的转数来表示。其单位为r/min。转速的测量方法很多,由于转速是以单位时间内的转数来衡量的,因此采用霍尔元器件测量转速是较为常用的一种测量方法。霍尔器件是有半导体材料制成的一种薄片,器件的长、宽、高分别为l、b、d。若在垂直于薄片平面(沿厚度d)方向施加外加磁场B,在沿l方向的两个端面加以外电场,则有一定的电流经过。由于电子在磁场中运动,所以将受到一个洛仑磁力,其大小为:flqVB式中:fl洛仑磁力,q载流子电荷,V载流子运动速度,B磁感应强度。这样使电子的运动轨迹发生偏移,在霍尔元器件薄片的两个侧面分别产生电子积聚或电荷过剩,形成霍尔电场,霍尔元器件两个侧面间的电位差称为霍尔电压。霍尔电压大小为: =×I×B/d(mV) 式中:-霍尔常数,d-元件厚度,B-磁感应强度,I-控制电流设= /d ,则=×I×B (mV)为霍尔器件的灵敏系数(mV/mA/T),它表示该霍尔元件在单位磁感应强度和单位控制电流下输出霍尔电动势的大小。应注意,当电磁感应强度B反向时,霍尔电动势也反向。若控制电流保持不变,则霍尔感应电压将随外界磁场强度而变化,根据这一原理,可以将一块永久磁钢固定在电动机的转轴上转盘的边沿,转盘随被测轴旋转,磁钢也将跟着同步旋转,在转盘附近安装一个霍尔元件,转盘随轴旋转时,霍尔元件受到磁钢所产生的磁场影响,故输出脉冲信号,其频率和转速成正比,测出脉冲的周期或频率即可计算出转速。2系统设计2.1 直流电动机转速控制系统硬件设计通过自制5V电源来确保工作电压正常,由霍尔元件及外围器件组成的测速电路将电动机转速转换成脉冲信号,送至单片机的计数器T1,由T1测出电动机的实际转速,并与设定值比较形成偏差。根据比较结果,使DAC0832输出控制电压增大或减小。功放电路将DAC0832输出的模拟电压转换成具有一定输出功率的电动机控制电压。2.1.1系统电源电源部分采用价格低廉简单易用的7805芯片,在7805的前端加了一个变压器,将220V的电压降至6V,然后通过桥式整流滤波电路加至7805输入端。如图2.1.1所示。 图2.1.1系统电源 2.1.2电机测速及驱动部分测速在这里选用美国史普拉格公司(SPRAGUE)生产的3000系列霍尔开关传感器3013,它是一种硅单片集成电路,器件的内部含有稳压电路、霍尔电势发生器、放大器、史密特触发器和集电极开路输出电路,具有工作电压范围宽、可靠性高、外电路简单、输出电平可与各种数字电路兼容等特点。LM324,它价格便宜,带有真差动输入的四运算放大器。因为DAC0832输出的为电流,所以需要接一个运放,将信号转化为电压输出。电路如图2.1.2所示。图2.1.2电机测速及驱动部分2.1.3数模转换DAC0832是采用CMOS工艺制成的单片电流输出型8位D/A转换器,其内部结构如图图2.1.3a所示:芯片内有两级输入寄存器,使DAC0832具备双缓冲、单缓冲和直通三种输入方式,以便适于各种电路的需要(如要求多路D/A异步输入、同步转换等)。D/A转换结果采用电流形式输出。要是需要相应的模拟信号,可通过一个高输入阻抗的线性运算放大器实现这个供功能。运放的反馈电阻可通过RFB端引用片内固有电阻,还可以外接。该片逻辑输入满足TTL电压电平范围,可直接与TTL电路或微机电路相接。图2.1.3a DAC0832内部结构图Vcc:芯片电源电压, 为:+5V+15V;VREF:参考电压,为:-10V+10V ;RFB:反馈电阻引出端, 此端可接运算放大器输出端;AGND:模拟信号地;DGND:数字信号地;DI7 DI0:数字量输入信号,其中: DI0为最低位,DI7为最高位;ILE:输入锁存允许信号, 高电平有效;CS:片选信号, 低电平有效;WR1:写信号1,低电平有效;当ILE、CS、WR1同时有效时, LE=1,输入寄存器的输出随输入而变化;WR1在上升沿时 , LE=0, 将输入数据锁存到输入寄存器;XFER:转移控制信号,低电平有效;WR2:写信号2,低电平有效;当XFER、WR2同时有效时, LE2=1,DAC寄存器输出随输入而变化; WR1在上升沿时, LE=0, 将输入数据锁存到DAC寄存器,数据进入D/A转换器,开始D/A转换;IOUT1:模拟电流输出端1,当输入数字为:全”1”时, 输出电流最大,约为:255/256;全”0”时, 输出电流为0;IOUT2:模拟电流输出端2 ,IOUT1 + I OUT2 = 常数。数模转换如图2.5.3b所示。其中DAC0832的DI0 DI7 8个数字量输入端接89C51单片机的P0.0P0.7端。由于DAC0832采用了直通的方式,所以可以直接往其数据端口加上数值,就能从DAC0832后面的运放的输出端得到所需的模拟电压。由于其输出电压可根据公式: =X/计算得来,因而在需要输出某个电压值时,按该式求出对应的数值,通过P0端口输出,就可以得到所需的模拟电压。图2.1.3b数模转换2.1.4 8421BCD编码键盘手动控制转速部分采用8421编码的键盘,“0”表示“0000”,“1”表示“0001”,, “9”表示“1001”。如图2.1.4所示图2.1.4 8421BCD编码键盘2.1.5显示部分采用74LS164串入并出的移位寄存器给出串行口扩展的3位L ED 显示接口电路,如图2.1.5所示图2.1.5显示部分2.1.6系统心脏AT89C51单片机VCC:供电电压。 GND:接地。 P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。当P1口的管脚第一次写1时,被定义为高阻输入。P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。在FIASH编程时,P0 口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。P1口:P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。在FLASH 编程和校验时,P1口作为第八位地址接收。 P2口:P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。并因此作为输入时,P2口的管脚被外部拉低,将输出电流。这是由于内部上拉的缘故。P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。P2口在FLASH编程和校验时接收高八位地址信号和控制信号。 P3口:P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。口管脚备选功能P3.0RXD(串行输入口)P3.1TXD(串行输出口)P3.2/INT0(外部中断0)P3.3/INT1(外部中断1)P3.4T0(记时器0外部输入)P3.5T1(记时器1外部输入)P3.6/WR(外部数据存储器写选通)P3.7/RD(外部数据存储器读选通)P3口也可作为AT89C51的一些特殊功能口,如下表所示:P3口同时为闪烁编程和编程校验接收一些控制信号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:来自反向振荡器的输出。振荡器特性: XTAL1和XTAL2分别为反向放大器的输入和输出。该反向放大器可以配置为片内振荡器。石晶振荡和陶瓷振荡均可采用。如采用外部时钟源驱动器件,XTAL2应不接。有余输入至内部时钟信号要通过一个二分频触发器,因此对外部时钟信号的脉宽无任何要求,但必须保证脉冲的高低电平要求的宽度。芯片擦除:整个PEROM阵列和三个锁定位的电擦除可通过正确的控制信号组合,并保持ALE管脚处于低电平10ms 来完成。在芯片擦操作中,代码阵列全被写“1”且在任何非空存储字节被重复编程以前,该操作必须被执行。 此外,AT89C51设有稳态逻辑,可以在低到零频率的条件下静态逻辑,支持两种软件可选的掉电模式。在闲置模式下,CPU停止工作。但RAM,定时器,计数器,串口和中断系统仍在工作。在掉电模式下,保存RAM的内容并且冻结振荡器,禁止所用其他芯片功能,直到下一个硬件复位为止。 串口通讯:单片机的结构和特殊寄存器,这是你编写软件的关键。至于串口通信需要用到那些特殊功能寄存器呢,它们是SCON,TCON,TMOD,SCON等,各代表什么含义呢? SBUF 数据缓冲寄存器这是一个可以直接寻址的串行口专用寄存器。有朋友这样问起过“为何在串行口收发中,都只是使用到同一个寄存器SBUF?而不是收发各用一个寄存器。”实际上SBUF 包含了两个独立的寄存器,一个是发送寄存,另一个是接收寄存器,但它们都共同使用同一个寻址地址99H。CPU 在读SBUF 时会指到接收寄存器,在写时会指到发送寄存器,而且接收寄存器是双缓冲寄存器,这样可以避免接收中断没有及时的被响应,数据没有被取走,下一帧数据已到来,而造成的数据重叠问题。发送器则不需要用到双缓冲,一般情况下我们在写发送程序时也不必用到发送中断去外理发送数据。操作SBUF寄存器的方法则很简单,只要把这个99H 地址用关键字sfr定义为一个变量就可以对其进行读写操作了,如sfr SBUF = 0x99;当然你也可以用其它的名称。通常在标准的reg51.h 或at89x51.h 等头文件中已对其做了定义,只要用#include 引用就可以了。 SCON 串行口控制寄存器通常在芯片或设备中为了监视或控制接口状态,都会引用到接口控制寄存器。SCON 就是51 芯片的串行口控制寄存器。它的寻址地址是98H,是一个可以位寻址的寄存器,作用就是监视和控制51 芯片串行口的工作状态。51 芯片的串口可以工作在几个不同的工作模式下,其工作模式的设置就是使用SCON 寄存器。它的各个位的具体定义如下: SM0 SM1 SM2 REN TB8 RB8 TI RI SM0、SM1 为串行口工作模式设置位,这样两位可以对应进行四种模式的设置。串行口工作模式设置。SM0SM1模式功能波特率000同步移位寄存器fosc/120118位UART可变1029位UARTfosc/32 或fosc/641139位UART可变在这里只说明最常用的模式1,其它的模式也就一一略过,有兴趣的朋友可以找相关的硬件资料查看。表中的fosc 代表振荡器的频率,也就是晶振的频率。UART 为(Universal Asynchronous Receiver)的英文缩写。 SM2 在模式2、模式3 中为多处理机通信使能位。在模式0 中要求该位为0。 REM 为允许接收位,REM 置1 时串口允许接收,置0 时禁止接收。REM 是由软件置位或清零。如果在一个电路中接收和发送引脚P3.0,P3.1 都和上位机相连,在软件上有串口中断处理程序,当要求在处理某个子程序时不允许串口被上位机来的控制字符产生中断,那么可以在这个子程序的开始处加入REM=0 来禁止接收,在子程序结束处加入REM=1 再次打开串口接收。大家也可以用上面的实际源码加入REM=0 来进行实验。 TB8 发送数据位8,在模式2 和3 是要发送的第9 位。该位可以用软件根据需要置位或清除,通常这位在通信协议中做奇偶位,在多处理机通信中这一位则用于表示是地址帧还是数据帧。 RB8 接收数据位8,在模式2 和3 是已接收数据的第9 位。该位可能是奇偶位,地址/数据标识位。在模式0 中,RB8 为保留位没有被使用。在模式1 中,当SM2=0,RB8 是已接收数据的停止位。 TI 发送中断标识位。在模式0,发送完第8 位数据时,由硬件置位。其它模式中则是在发送停止位之初,由硬件置位。TI 置位后,申请中断,CPU 响应中断后,发送下一帧数据。在任何模式下,TI 都必须由软件来清除,也就是说在数据写入到SBUF 后,硬件发送数据,中断响应(如中断打开),这时TI=1,表明发送已完成,TI不会由硬件清除,所以这时必须用软件对其清零。 RI 接收中断标识位。在模式0,接收第8 位结束时,由硬件置位。其它模式中则是在接收停止位的半中间,由硬件置位。RI=1,申请中断,要求CPU 取走数据。但在模式1 中,SM2=1时,当未收到有效的停止位,则不会对RI 置位。同样RI 也必须要靠软件清除。常用的串口模式1 是传输10 个位的,1 位起始位为0,8 位数据位,低位在先,1 位停止位为1。它的波特率是可变的,其速率是取决于定时器1 或定时器2 的定时值(溢出速率)。AT89C51 和AT89C2051 等51 系列芯片只有两个定时器,定时器0 和定时器1,而定时器2是89C52 系列芯片才有的。 波特率在使用串口做通讯时,一个很重要的参数就是波特率,只有上下位机的波特率一样时才可以进行正常通讯。波特率是指串行端口每秒内可以传输的波特位数。有一些初学的朋友认为波特率是指每秒传输的字节数,如标准9600 会被误认为每秒种可以传送9600个字节,而实际上它是指每秒可以传送9600 个二进位,而一个字节要8 个二进位,如用串口模式1 来传输那么加上起始位和停止位,每个数据字节就要占用10 个二进位,9600 波特率用模式1 传输时,每秒传输的字节数是9600÷10960 字节。51 芯片的串口工作模式0的波特率是固定的,为fosc/12,以一个12M 的晶振来计算,那么它的波特率可以达到1M。模式2 的波特率是固定在fosc/64 或fosc/32,具体用那一种就取决于PCON 寄存器中的SMOD位,如SMOD 为0,波特率为focs/64,SMOD 为1,波特率为focs/32。模式1 和模式3 的波特率是可变的,取决于定时器1 或2(52 芯片)的溢出速率。那么我们怎么去计算这两个模式的波特率设置时相关的寄存器的值呢?可以用以下的公式去计算。 波特率(2SMOD÷32)×定时器1 溢出速率 上式中如设置了PCON 寄存器中的SMOD 位为1 时就可以把波特率提升2 倍。通常会使用定时器1 工作在定时器工作模式2 下,这时定时值中的TL1 做为计数,TH1 做为自动重装值 ,这个定时模式下,定时器溢出后,TH1 的值会自动装载到TL1,再次开始计数,这样可以不用软件去干预,使得定时更准确。在这个定时模式2 下定时器1 溢出速率的计算公式如下: 溢出速率(计数速率)/(256TH1) 上式中的“计数速率”与所使用的晶体振荡器频率有关,在51 芯片中定时器启动后会在每一个机器周期使定时寄存器TH 的值增加一,一个机器周期等于十二个振荡周期,所以可以得知51 芯片的计数速率为晶体振荡器频率的1/12,一个12M 的晶振用在51 芯片上,那么51 的计数速率就为1M。通常用11.0592M 晶体是为了得到标准的无误差的波特率,那么为何呢?计算一下就知道了。如我们要得到9600 的波特率,晶振为11.0592M 和12M,定时器1 为模式2,SMOD 设为1,分别看看那所要求的TH1 为何值。代入公式: 11.0592M 9600(2÷32)×(11.0592M/12)/(256-TH1) TH1250 12M 9600(2÷32)×(12M/12)/(256-TH1) TH1249.49 上面的计算可以看出使用12M 晶体的时候计算出来的TH1 不为整数,而TH1 的值只能取整数,这样它就会有一定的误差存在不能产生精确的9600 波特率。当然一定的误差是可以在使用中被接受的,就算使用11.0592M 的晶体振荡器也会因晶体本身所存在的误差使波特率产生误差,但晶体本身的误差对波特率的影响是十分之小的,可以忽略不计。2.2 直流电动机转速控制系统软件设计1、 编程思路:控制系统程序的功能是用89C51单片机的T0、T1测出电动机的实际转速,并与给定值进行比较。根据比较结果,使DAC0832芯片的输出控制电压增大或减小。30H单元存放实际转速与设定值是否相等的标志。“1”表示相等,“0”表示不相等。40H单元存放送入DAC0832芯片的数字控制电压。7FFFH为DAC0832地址。2、 系统流程图如图2.2所示:图2.2 直流电动机转速控制系统流程图3 结论本系统用单片机构成电动机转速的控制系统,采用比例积分调节器算法,效率高,电路简单,使用也比较广泛。本测速系统采用集成霍尔传感器敏感速率信号,具有频率响应快、抗干扰能力强等特点。霍尔传感器的输出信号经信号调理后,通过单片机对连续脉冲记数来实现转速测控,并且充分利用了单片机的内部资源,有很高的性价比。经过测试并对误差进行分析发现,该系统的测量误差在5以内,并且在测量范围内转速越高测量精度越高。所以该系统在一般的转速检测和控制中均可应用。致 谢在此,我要衷心的感谢我的指导老师赵艳启老师在这次毕业设计中给我的指导和帮助,虽然赵老师是年轻老师,平时课业非常繁忙,但对我们的指导却是一丝不苟,非常认真和详细。每周基本上都是她主动联系我们询问情况,比如:做的进度怎么样了,这周有没有遇到什么问题等等。同时,指导过程中怕我们遗忘,不止一次得给我们讲解各种毕业设计各个阶段应该注意的问题和采取的措施。同时我还感谢我的师傅高明志,在我遇到一些技术问题时,给了我很多建议和帮助。如今在赵老师的指导下,我顺利的完成了我的毕业设计,再次感谢赵老师对我的指导和帮助。同时,也非常的感谢我的同学给我的帮助。参考文献1、陈亚林编51单片机实验指导书南京工业职业技术学院2005.102、陈伯时主编电力拖动自动控制系统机械工业出版社3、余永权,汪明慧,黄英编著单片机在控制系统中的的应用电子工业出版社4、唐绪伟,城市交通信号灯模拟控制系统期刊论文-微计算机2005(28)5、宋凤娟, 廉文利, 付云强,单片机在调速控制系统中的应用期刊论文 -微计算机信息2006,22(32)6、楼然苗,李光飞编著51单片机设计实例北京航空航天大学出版社 7、何立民MCS-51系列单片机应用系统设计系统配置与接口技术M北京:北京航空航天大学出版社,19908、宋国梅,基于89C51的转速测量系统设计期刊论文- 潍坊学院学报第8卷第6期9、朱永金,成有才编单片机应用技术(C语言)中国劳动社会保障出版社10、杨刚,周群.电子系统设计与实践M.北京:电子工业出版社,2004.附录:附图1电路总原理图软件程序/*函数:Motor功能:单片机控制电机转速并显示转速*/#include <reg51.h>#define uchar unsigned char #define uint unsigned intuint data cnt0,cnt1;uchar v=0; /定时器1溢出标志uint flag=0;/1分钟计数溢出标志uint t0=5,t1=5;/Pwm占空比标志sbit pwm=P20;sbit S0=P25; /数码管位选通sbit S1=P26;sbit S2=P27;/按键sbit J0=P10;sbit J1=P11;sbit J2=P12;sbit J3=P13;/74HC164与单片机的接口sbit DA=P36;sbit CLK=P37;/共阴极数码管段码表uchar code led_7seg10=0x3f,0x06,0x5b,0x4f, /0,1,2,3 0x66,0x6d,0x7d,0x07, /4,5,6,7 0x7f,0x6f; /8,9/延时void Delay(uchar i)uchar j;for(;i>0;i-)for(j=0;j<125;j+) ;/初始化void Init(void) TMOD=0x16; EA=1; EX0=1; IT0=1;/边沿触发 ET0=1; ET1=1; TH0=0xFF; TL0=0xFF; TH1=0xFC; TL1=0x18; TR1=1; TR0=1;/74HC164写数据程序void Write_74HC164(uchar wda)uchar i;DA=0;CLK=0;for(i=0;i<8;i+) DA=wda&0x80; wda<<=1; CLK=0; CLK=1; CLK=0; /主函数void main(void)uchar temp,seg;Init();while(1) temp=cnt0/100;seg=led_7segtemp;Write_74HC164(seg);S0=0;Delay(10);S0=1;temp=cnt0%100/10;seg=led_7segtemp;Write_74HC164(seg);S1=0;Delay(10);S1=1;temp=cnt0%10;seg=led_7segtemp;Write_74HC164(seg);S2=0;Delay(10);S2=1;/按键处理void Inter0() interrupt 0 using 2if(J0=0) /加t1+;if(t1=10)t1=5; if(J1=0) /减 t0+;if(t0=10)t0=5; if(J2=0) /停止EA=0;pwm=1; if(J3=0) /启动EA=1; /PWMvoid Pwm(void) interrupt 3 using 0TH1=0xFC; TL1=0x18;v+;flag+;if(v=t0)pwm=1;if(v=t1)pwm=0;if(v=t0&v=t1) v=0;/计数转动圈数void Counter(void) interrupt 1 using 1TH0=0xFF; TL0=0xFF;cnt1+;if(flag=60000)cnt1=0;cnt0=cnt1;