单片机-步进电机控制

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

郑州科技学院
《单片机》课程设计
题目单片机控制步进电机
学生姓名x x x
专业班级电气工程及其自动化六班
学号2012471xx
院(系)电气工程学院
指导教师 xx 完成时间 2015年 11 月 6 日
目录
1背景 (1)
2设计原理及功能说明 (1)
3硬件电路及软件设计 (1)
4硬件的制作与调试 (1)
5总结 (1)
参考文献 (1)
附录1:总体电路原理图 (1)
附录2:实物图 (1)
附录3:元器件清单 (1)
附录4:参考源程序 (1)
1背景
前,数字技术、计算机技术和永磁材料的迅速发展,推动了步进电机的发展。

在当今社会的各个领域步进电机无处不在,应用领域涉及机器人、工业电子自动化设备、医疗器件、广告器材、舞台灯光设备、印刷设备、计算机外部应用设备等等。

然步进电机已被广泛地应用,但步进电机并不能象普通的直流电机、交流电机在常规下使用。

它必须由双环形脉冲信号、功率驱动电路等组成控制系统方可使用。

因此,设计步进电机具有重要的现实意义和实用价值。

论文首先分析了步进电机的基本原理和特点,步进电机实现启停、加速、转向、位置控制的方案及WZM-2H042M混合式步进电机驱动电路,其次讲解了AT89C51单片机引脚功能及特点,接着综合地阐述了整个系统的设计思路及组成框图,然后逐步讲解了各模块电路的实现方法,最后设计了控制步进电机正反转的程序以实现论文目的。

2设计原理及功能说明
2.1元器件选用原理
1.AT89C51单片机
T89C51是一种带4K 字节FLASH 存储器(FPEROM—Flash Programmable and Erasable Read Only Memory)的低电压、高性能CMOS 8位微处理器,俗称单片机。

AT89C2051是一种带2K 字节闪存可编程可擦除只读存储器的单片机。

单片机的可擦除只读存储器可以反复擦除1000次。

该器件采用ATMEL 高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。

由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,AT89C2051是它的一种精简版本。

AT89C51 单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。

外形及引脚排列如图所示
图2-1AT89C51实物图及引脚图
VCC:供电电压。

GND:接地。

P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。

当P0口的管脚第一次写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口也可作为AT89C51的一些特殊功能口,如下表所示:口管脚备选功能
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口同时为闪烁编程和编程校验接收一些控制信号。

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应不接。

有余输入至内部时钟信号要通过一个二分频触发器,因此对外部时钟信号的脉宽无任何要求,但必须保证脉冲的高低电平要求的宽度。

图2-2步进电机
进电机是将电脉冲信号转变为角位移或线位移的开环控制元步进电机件。

在非超载的情况下,电机的转速、停止的位置只取决于脉冲信号的频率和脉冲数,而不受负载变化的影响,当步进驱动器接收到一个脉冲信号,它就驱动步进电机按设定的方向转动一个固定的角度,称为“步距角”,它的旋转是以固定的角度一步一步运行的。

可以通过控制脉冲个数来控制角位移量,从而达到准确定位的目的;同时可以通过控制脉冲频率来控制电机转动的速度和加速度,从而达到调速的目的。

进电机是一种感应电机,它的工作原理是利用电子电路,将直流电变成分时供电的,多相时序控制电流,用这种电流为步进电机供电,步进电机才能正常工作,驱动器就是为步进电机分时供电的,多相时序控制器。

然步进电机已被广泛地应用,但步进电机并不能像普通的直流电机,交流电机在常规下使用。

它必须由双环形脉冲信号、功率驱动电路等组成控制系统方可使用。

因此用好步进电机却非易事,它涉及到机械、电机、电子及计算机等许多专业知识。

步进电机作为执行元件,是机电一体化的关键产品之一,广泛应用在各种自动化控制系统中。

随着微电子和计算机技术的发展,步进电机的需求量与日俱增,在各个国民经济领域都有应用。

作原理:通常电机的转子为永磁体,当电流流过定子绕组时,定子绕组产生一矢量磁场。

该磁场会带动转子旋转一角度,使得转
子的一对磁场方向与定子的磁场方向一致。

当定子的矢量磁场旋转一个角度。

转子也随着该磁场转一个角度。

每输入一个电脉冲,电动机转动一个角度前进一步。

它输出的角位移与输入的脉冲数成正比、转速与脉冲频率成正比。

改变绕组通电的顺序,电机就会反转。

所以可用控制脉冲数量、频率及电动机各相绕组的通电顺序来控制步进电机的转动。

3硬件电路及软件设计
3.1硬件电路设计
图3-1步进电机控制
进电机和普通电动机不同之处是步进电机接受脉冲信号的控制。

即步进电机是将电脉冲信号转换为机械角位移的执行元件。

步进电机的控制可以用硬件,也可以用软件通过单片机实现。

硬件方法是采用脉冲分配器芯片进行通用换相控制;而软件方法是用单片机产生控制脉冲来控制步进电机的运行状态,这种方法可简化电路,降低成本。

由于单片机的驱动电流一般都比较小,不能直接驱动电机工作,所以单片机的I/O口输出必须接驱动电路,即功率驱动,才得以控制电机正常工作,驱动芯片我们选择的是UNL2003。

3.2软件设计
步进电机控制系统的软件需要同时完成读取键盘、处理键盘、控制步进电机转动、控制数码管动态显示等任务,这就必须通过中断技术来实现。

程序采用查询方式扫描键盘端口,检测按键动作是否发生,若有按键动作则处理键盘,根据按键值修改相应参数值,实现键盘的实时处理功能。

定时器0中断服务程序控制步进电机的转动:根据当前显示的速度进行键盘手动改变T0定时时间常数,设置TH0和TL0的值,达到对转速精确控制的目的;根据转动方向控制位的值,控制脉冲信号循环移动的方向,达到对转动方向控制的目的。

4硬件的制作与调试
4.1硬件的制作
量技巧:1.测电容:用电阻档,根据电容容量选择适当的量程,并注意测量时对于电解电容黑表笔要接电容正极。

①、估测微波法级电容容量的大小:可凭经验或参照相同容量的标准电容,根据指针摆动的最大幅度来判定。

所参照的电容不必耐压值也一样,只要容量相同即可,例如估测一个100μF/250V的电容可用一个100μF/25V的电容来参照,只要它们指针摆动最大幅度一样,即可断定容量一样。

②、估测皮法级电容容量大小:要用R×10k档,但只能测到1000pF以上的电容。

对1000pF或稍大一点的电容,只要表针稍有摆动,即可认为容量够了。

③、测电容是否漏电:对一千微法以上的电容,可先用R×10档将其快速充电,并初步估测电容容量,然后改到R×1k档继续测一会儿,这时指针不应回返,而应停在或十分接近∞处,否则就是有漏电现象。

对一些几十微法以下的定时或振荡电容(比如彩电开关电源的振荡电容),对其漏电特性要求非常高,只要稍有漏电就不能用,这时可在R×1k档充完电后再改用R×10k档继续测量,同样表针应停在∞处而不应回返。

.在测二极管、三极管好坏:因为在实际电路中,三极管的偏置电阻或二极管、稳压管的周边电阻一般都比较大,大都在几百欧姆以上,这样,我们就可以用万用表的R×10或R×1档来在路测
量PN结的好坏。

在路测量时,用R×10档测PN结应有较明显的正反向特性(如果正反向电阻相差不太明显,可改用R×1档来测),一般正向电阻在R×10档测时表针应指示在200Ω左右,在R×1档测时表针应指示在30左右(根据不同表型可能略有出入)。

如果测量结果正向阻值太大或反向阻值太小,都说明这个PN结有问题,这个管子也就有问题了。

这种方法对于维修时特别有效,可以快速地找出坏管,甚至可以测出尚未完全坏掉但特性变坏的管子。

比如当你用小阻值档测量某个PN结正向电阻过大,如果你把它焊下来用常用的R×1k档再测,可能还是正常的,其实这个管子的特性已经变坏了,不能正常工作或不稳定了。

.测电阻:重要的是要选好量程,当指针指示于1/3~2/3满量程时测量精度最高,读数最准确。

要注意的是,在用R×10k电阻档测兆欧级的大阻值电阻时,不可将手指捏在电阻两端,这样人体电阻会使测量结果偏小。

.测三极管:通常我们要用R×1k档,不管是NPN管还是PNP管,不管是小功率、中功率、大功率管,测其be结cb结都应呈现与二极管完全相同的单向导电性,反向电阻无穷大,其正向电阻大约在10K左右。

为进一步估测管子特性的好坏,必要时还应变换电阻档位进行多次测量,方法是:置R×10档测PN结正向导通电阻都在大约200Ω左右;置R×1档测PN结正向导通电阻都在大约3 0Ω左右,(以上为47型表测得数据,其它型号表大概略有不同,可多试测几个好管总结一下,做到心中有数)如果读数偏大太多,可以断定管子的特性不好。

还可将表置于R×10k再测,耐
压再低的管子(基本上三极管的耐压都在30V以上),其cb结反向电阻也应在∞,但其be结的反向电阻可能会有些,表针会稍有偏转(一般不会超过满量程的1/3,根据管子的耐压不同而不同)。

同样,在用R×10k档测ec间(对NPN管)或ce间(对PNP管)的电阻时,表针可能略有偏转,但这不表示管子是坏的。

但在用R×1k以下档测ce或ec间电阻时,表头指示应为无穷大,否则管子就是有问题。

应该说明一点的是,以上测量是针对硅管而言的,对锗管不适用。

不过现在锗管也很少见了。

另外,所说的“反向”是针对PN结而言,对NPN管和PNP管方向实际上是不同的。

现在常见的三极管大部分是塑封的,三极管的b极很容易测出来,ce这里推荐三种方法:第一种方法:对于有测三极管hF E插孔的指针表,先测出b极后,将三极管随意插到插孔中去(当然b极是可以插准确的),测一下hFE值,然后再将管子倒过来再测一遍,测得hFE值比较大的一次,各管脚插入的位置是正确的。

这个方法适用于所有外形的三极管,方便实用。

根据表针的偏转幅度,还可以估计出管子的放大能力,当然这是凭经验的。

第三种方法:先判定管子的NPN或PNP类型及其b极后,将表置于R×10kΩ档,对NPN管,黑表笔接e极,红表笔接c极时,表针可能会有一定偏转,对PNP管,黑表笔接c极,红表笔接e 极时,表针可能会有一定的偏转,反过来都不会有偏转。

由此也可以判定三极管的c、e极。

不过对于高耐压的管子,这个方法就不适用了。

中、小功率管有的b极可能在中间。

比如常用的90 13三极管及其系列的其它型号三极管、2SC1815、2N5401、2N5 551等三极管,其b极有的在就中间。

当然它们也有c极在中间的。

所以在维修更换三极管时,尤其是这些小功率三极管,不可
拿来就按原样直接安上,一定要先测一下。

万用表的使用的注意事项:
.在使用万用表之前,应先进行“机械调零”,即在没有被测电量时,使万用表指针指在零电压或零电流的位置上。

.在使用万用表过程中,不能用手去接触表笔的金属部分,这样一方面可以保证测量的准确,另一方面也可以保证人身安全。

.在测量某一电量时,不能在测量的同时换档,尤其是在测量高电压或大电流时,更应注意。

否则,会使万用表毁坏。

如需换挡,应先断开表笔,换挡后再去测量。

.万用表在使用时,必须水平放置,以免造成误差。

同时,还要注意到避免外界磁场对万用表的影响。

.万用表使用完毕,应将转换开关置于交流电压的最大挡。

用电烙铁一定要注意安全,使用前用万用表测一下电烙铁电源插头两端的电阻是否为正常值。

正常时20瓦烙铁的电阻约2000欧,45瓦的为1000欧,75瓦的为600欧,100瓦的约500欧。

电源插头与电烙铁外壳、烙铁头之间电阻应接近无穷大,否则说明这把电烙铁漏电,不能使用。

路的连接:在连接电路的时候,要严格按照电路图连接电路,
也要注意烙铁与电路板接触的时间,不要烧坏电路板及元器件。

并在连接好电路以后进行测量,及时发现问题及时改正。

4.2产品的调试与仿真
图6-1电路仿真图
.调试前,先将焊好的电路板对照印刷电路图认真核对一遍,不要有错焊、漏焊、短路、元件相碰等现象发生。

通电后,人体不允许接触电路板的任一部分,防止触电,注意安全。

.调试时,电路不可以正常工作,经逐级检查,原来是数码管的引脚接错了,经过改正后,电路可以正常工作。

5总结
过本次单片机控制步进电机正反转的设计,AT89C51单片机、数码管和步进电机实际应用有了更深刻的理解和体会,这次课程设计,不仅提高了动手能力,对设计的整个流程有了一定的了解,更了解到了单片机应用的广泛性和前景。

设计的成功,极大地提高了自信心,促进了对单片机的学习兴趣,明白了理论联系实际的重要性。

次设计清楚了一项设计的整体流程:明确设计要求、功能及功能模块的设计,查阅相关资料并确定元器件,电路连接、调试、调整改进与检查、电路成型、总结。

同时设计电路时,和搭档上网查阅了很多资料,这培养了搜索的能力,开拓了视野。

调试过程中掌握了一些电路调试的方法和规律,同时也掌握了如何来检查和排除实验中的所遇到的一些常见故障,明白了动手的重要性,懂得了实践出真知的道理。

电路的连接和调试都极大地提高了动手实践能力,这也是目前较为缺乏的。

作为工科的学生,就应该具备这样的动手能力。

最后,设计报告的制作还培养了整理知识的能力。

之,这次设计,认识到了知识的局限性,培养了动手能力,懂得了团队合作精神,对今后的学习起到了极大的促进作用。

参考文献
[1] 朱清慧编著 .基于Proteus显示控制系统设计与实例.北京:清华大学出版社,2011.
[2] 清华大学电子学教研组编 . 杨素行主编 . 模拟电子技术基础简明教程 . 3版 .北京:高等教育出版社,2005.
[3] 张亚华. 电子电路计算机辅助分析与辅助设计. 北京航空工业出版社,2004.
[4] 莫正康. 电力电子应用技术. 北京:机械工业出版社,2009.
[5] 曾晓宏. 数字电子技术. 北京:机械工业出版社,2008.
[6] 江晓安. 模拟电子技术. 陕西:西安电子科技大学出版社,2007.
[7]蒋辉平周国雄. 基于Proteus的单片机系统设计与仿真实例北京:机械工业出版社,2009.
[8]王宗培.步进电动机及其控制系统[M].哈尔滨:哈尔滨工业大学出版社,2009.
[9]余永权.单片机应用系统的功率接口技术[M].北京:北京航空航天大学出版社,2006.
附录1:总体电路原理图
附录2:实物图
附录3:元器件清单
附录4:参考源程序
/数码管位高位-----低位
/四个按键控制步进电机:正转,反转,加1,减1
/上电时电机启动,数码管上显示速度最小档1,加减档位均能通过数码管显示出来,电机采用单双八拍方式
/电机转速一共10档,通过按键调节转速
/电机正转时最高位数码管显示0,反转时显示1
include<reg52.h>
define uchar unsigned char
define uint unsigned int
define led P0//数码管段选
/#define haha P2
bit s1 = P1^0;sbit s2 = P1^1;sbit s3 = P3^0;sbit s4 = P3^1;//按键定义,s1正转,s2反转,s3加1,s4减1
bit wei3 = P2^3;sbit wei2 = P2^2;sbit wei1 = P2^1;sbit wei0 = P2^0;//数码管位选定义
bit a = P2^7;sbit b = P2^6;sbit c = P2^5;sbit d = P2^4;//脉冲信号输入端定义
char code display[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90, 0xff};//共阳数码管驱动信号0---9,不显示
char code time_counter[10][2]={{0xda,0x1c},{0xde,0xe4},{0xe1,0xec},{0xe5, 0xd4},{0xe9,0xbc}, //9.7 ----1ms
{0xed,0xa4},{0xf1,0x8c},{0xf5,0x74},{0xf9,0x5c},{0xfc,0x18}}; char code qudong[8]={0x80,0xc0,0x40,0x60,0x20,0x30,0x10,0x90}; /uchar num1 = 0;//控制取励磁信号变量
/uchar num2 = 8;
char k=1;//加减档位控制,1为最小档
it flag1 = 0;//初始正转,正反转标志
char
buf[4]={0,10,10,1};//数码管显示缓存,正转,不显示,不显示,显示1档位,高----低
/================================定时器0/1初始化函数
================================
oid T0_T1_init()
TMOD = 0x11;//定时器0/1均工作于方式1,16位计时方式
TH0 = (65536 - 3000)/256;
TL0 = (65536 - 3000)%256;//定时器0,定时3ms用于数码管扫描显示
TH1 = time_counter[k-1][0];
TL1 = time_counter[k-1][1];//定时器1,定时10ms用于步进电机转速控制
TR0 = 1;
TR1 = 0;
ET0 = 1;
ET1= 1;//开定时器中断
EA = 1;//开总中断
/================================ms级延时函数====== =================================
oid delay1m(uint x)
uint i,j;
for(i=0;i<x;i++) //连数x次,约 x ms
for(j=0;j<120;j++); //数120 次,约1 ms
/================================主函数=========== ==================================
oid main()
T0_T1_init();
buf[1] = 10;//不显示buf[2]= 0;
buf[3]= 1;
while(1)
{
if(s1 == 0 )
{
delay1m(3);
if(s1 == 0)
{
TR1 = ~TR1;
}
while(!s1);
}
if(s2 == 0)
{
delay1m(3);
if(s2 == 0)
{
delay1m(5);
// while(!s1);
flag1=~flag1;
if(flag1==0) //正转
{
buf[0] = 0;//最高位显示0
}
else
{
buf[0] = 1;//最高位显示0
}
// haha = 0x00;//停止
}
while(!s2);
}
if(s3 == 0) //速度加1档{
delay1m(3);
if(s3 == 0)
{
k++;
if(k > 10 )
{
k = 1;
}
buf[2]= k/10;
buf[3]= k%10;
}
while(!s3);
}
if(s4 == 0) //速度减1档{
delay1m(3);
if(s4 == 0)
{
k--;
if(k == 0)
{
k = 10;
}
buf[2]= k/10;
buf[3]= k%10;
}
while(!s4);
}
}
/==================================定时器0中断函数,用于数码管扫描显示=================================
===
oid time0_interrupt()interrupt 1
static num = 0;
TH0 = (65536 - 3000)/256;
TL0 = (65536 - 3000)%256;//定时器0,定时3ms用于数码管扫描显示
wei3=1;wei2=1;wei1=1;wei0=1;
switch(num)
{
case 0:wei3=1;wei2=1;wei1=1;wei0=0;led = display[buf[3]];break;
case 1:wei3=1;wei2=1;wei1=0;wei0=1;led = display[buf[2]];break;
case 2:wei3=0;wei2=1;wei1=1;wei0=1;led = display[buf[0]];break;
}
num++;
if(num == 3) num = 0;
/==================================定时器1中断函数,用于脉冲频率控制=================================== ==
oid time1_interrupt()interrupt 3
static num1 = 0;
static num2 = 0;
TH1 = time_counter[k-1][0];
TL1 = time_counter[k-1][1];//定时器1,定时1 用于步进电机转速控制
if(flag1 == 0)//正转
{
switch(num1)
{
case 0:a = 1;b = 0;c = 0;d = 0;break;
case 1:a = 1;b = 1;c = 0;d = 0;break;
case 2:a = 0;b = 1;c = 0;d = 0;break;
case 3:a = 0;b = 1;c = 1;d = 0;break;
case 4:a = 0;b = 0;c = 1;d = 0;break;
case 5:a = 0;b = 0;c = 1;d = 1;break;
case 6:a = 0;b = 0;c = 0;d = 1;break;
case 7:a = 1;b = 0;c = 0;d = 1;break;
}
num1++;
if(num1 == 8)num1 = 0;
}
else //反转
{
switch(num2)
{
case 0:a = 1;b = 0;c = 0;d = 1;break;
case 1:a = 0;b = 0;c = 0;d = 1;break;
case 2:a = 0;b = 0;c = 1;d = 1;break;
case 3:a = 0;b = 0;c = 1;d = 0;break;
case 4:a = 0;b = 1;c = 1;d = 0;break;
case 5:a = 0;b = 1;c = 0;d = 0;break;
case 6:a = 1;b = 1;c = 0;d = 0;break;
case 7:a = 1;b = 0;c = 0;d = 0;break;
}
num2++;
if(num2 == 8)num2 = 0;
}。

相关文档
最新文档