基于单片机的数字直流电流源设计毕业论文_第1页
基于单片机的数字直流电流源设计毕业论文_第2页
基于单片机的数字直流电流源设计毕业论文_第3页
基于单片机的数字直流电流源设计毕业论文_第4页
基于单片机的数字直流电流源设计毕业论文_第5页
已阅读5页,还剩40页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

河南城建学院本科毕业设计(论文)III摘要由于现代科技发展的日新月异,它极大地促进了社会的不断向前发展,而且为高端电子设备的研发提供了新的技术支持。同时,电源充当这些设备的食粮,众所周知,不同的电子元件和线路对电源的大小要求是不同的,所以,我们对其的探索仍是十分的迫切。近些年基于单片机的各种器件的兴起,为数控恒定电流源的研究与开发指明了发展方向。本文系统的介绍了以STC89C52单片机为中心控制器数控电流源的设计方法,并运用仿真软件如Proteus进行了仿真。利用按键设置输出电流,单片机将该电流值送1602液晶屏显示,同时,DACTLC5615把数字量转换由运算放大器输出的模拟电压值,它作为参考电压控制晶体管电流的输出,又有限制电路输入输出的作用。该数控电流源是基于单片机设计的,因此精确度很高,体积小,功耗低等优点。关键词:电流源;STC89C52;LCD显示;Proteus;TLC5615

SummaryDuetotherapiddevelopmentofmoderntechnology,whichgreatlypromotedthecontinuousdevelopmentofsociety,butalsoforthedevelopmentofhigh-endelectronicequipmentprovidesanewtechnicalsupport.Atthesametime,serveasafoodsupplyforthesedevicesiswellknown,differentelectroniccomponentsandcircuitsizeofthepowersupplyrequirementsaredifferent,soweexploreitremainsveryurgent.Inrecentyearstheriseofavarietyofdevicesbasedonsingle-chipmicrocomputer,astheresearchanddevelopmentofnumericalcontrolconstantcurrentsourcepointedoutthedevelopmentdirection.SysteminthispaperareintroducedtheSTC89C52microcontrollerasthecentercontrollerdesignmethodofnumericalcontrolcurrentsource,andhascarriedonthesimulationusingthesimulationsoftwaresuchasProteus.UsingthecurrentvalueSettingsoutputcurrent,MCUsend1602LCDscreendisplay,atthesametime,withTLC5615d/aconvertertoconvertdigitaltoanalog,theoutputreferencevoltage,throughtheop-ampTLC5615ThisarticledescribesthesystemasacentralcontrollertoSTC89C52microcontrollerdigitallycontrolledcurrentsourcedesignmethodsandtheuseofsimulationsoftwaresuchasProteussimulation.Usebuttonstosettheoutputcurrent,thecurrentvalueissenttothemicrocontroller1602LCDscreendisplay,while,DACTLC5615analogtodigitalconverteroutputvoltagefromtheoperationalamplifier,whichisusedasareferencevoltagecontroltransistorcurrentoutput,butalsolimittheinputandoutputcircuitsrole.Thedigitallycontrolledcurrentsourceisbasedonthesingle-chipdesign,thereforehighaccuracy,smallsize,lowpowerconsumption.Thenumericalcontrolcurrentsourceisbasedonmicrocontrollerdesign,sotheaccuracyishigh,smallsize,lowpowerconsumptionandsoon.KeywordsCurrentsource;TLC5615;STC89C52;LCDdisplay;Proteus河南城建学院本科毕业设计(论文)目录目录13698摘要………………I30607Summary………………II16358目录………………III132621绪论………………129321.1研究背景和目的…………………1320321.2研究概况与趋势…………………151741.3本系统解决的主要内容…………2186452设计任务及要求……………………3170882.1设计任务……………………3157032.2设计思路……………………3177882.3方案论证……………………3293132.4总体方案设计………………4213833硬件系统的设计……………………538113.1硬件系统的模块……………5157313.1.1电路设计………………5235563.1.2电源模块……………7238113.1.3显示模块……………7290943.1.4键盘模块……………991603.1.5扩流模块……………9226353.1.6D/A模块……………10179843.1.7TLC5615时序设计………………10181553.2系统的原理图……………104系统的设计21383……………………11275104.1单片机使用状况…………11316454.2软件系统的模块…………11157454.2.1定时模块……………1176064.2.2LCD显示模块………11216714.3程序流程图………………1234814.3.1主控制流程图………12235884.3.2按键操作流程图……………………1331514.3.3D/A转换流程图……………………13206334.3.4数制转换流程图……………………14196584.3.5LCD显示流程图……………………14262984.4程序清单…………………15287515仿真测试…………1611715.1设计结论及使用方法……………………16202685.2仿真结果…………………16189165.2.1输出电流范围仿真…………………16143725.2.2步进调整仿真………17185255.2.3输出电流仿真………17211895.2.4仿真软件的介绍……………………1824845.3误差分析…………………19结束语………………20参考文献……………21致谢…………………22附录…………………23河南城建学院本科毕业设计(论文)1绪论1绪论1.1研究背景和目的近些年科学技术的大力发展,使得电源技术也有了飞跃的进步。这是一个非常实用的工程技术,企业正在越来越多地转向数字电源技术。数控电流源的发展方向及用何种技术来促进其大力发展就显得相当重要了。当今人们生活离不开电源,电源更作为一种普遍的电子商品而存在着。随着科学技术不断的向前发展,更多新技术和高科技产品也走进了人们的日常生活和生产中,给现代电流源技术勾画了美好的发展蓝图。同时,由于现在生产和技术的发展趋于更低的噪音和更好的系统稳定性,旧的直流电流源技术的工作方式已不能达到新时代的发展要求,数字化智能电流源模块是针对传统智能电源模块的不足提出的,它促使数字直流电流源向更大的灵活性和自动化道路开创。在实际的运用和发展上,我们日常使用的电子设备通常需要稳定的直流电压电源,它可以为这些设备提供所需的动力。通过稳压这个关键环节我们才能在实际的生活和生产中,使用由220V交流电网提供的电力。变压,整流,过滤器,稳压器是最核心的四个部分组成的电压调整的整个过程。滤波器用于滤去整流输出电压中的波纹,传统滤波器由滤波扼流圈和电容器组成,但其可靠性低和精度低。传统滤波器慢慢的退出了市场,晶体管滤波器的诞生,它们都是科技的进步所推动的。它不仅可缩小直流电源的体积和减轻其重量,并且不需要直流稳压器就能用于家用电器的电源。近些年来单片机技术的不断发展,其运用的范围也在不断地扩大,基于单片机的数字直流电流源在生产,科研中运用越来越广泛。在未来的几年中,它不仅可以应用到日常生活中,并在一些高能物理领域,基于单片机控制电流源也适用于控制低纹波,调节范围宽。1.2研究概况与趋势人们对于电流源的研究始于十九世纪90年代末,当时由于人们渴望得到更高效率和系统更低功耗的电流源,在随后的一些年的不断研究与实验中推动了电源行业中直流/直流电源转换器向智能性前进的步伐。在此期间,电力电子技术理论的发展,它不只是电源动力的源泉,更是为其壮大提供了坚实的基础。在接下来的几十年中,它已经在原来的基础上前进了一大步。但局限于当时的技术其存在很大的缺点,比如数字控值程度无法满足生产要求、电流微小变化分辨不出等。我们在正确认识到这些弊端的同时,它也在对未来数控电流源的主要发展方向上给予了我们进一步的认识。单片机技术作为一个新兴的学科为数控电源进一步的发展指明了道路方向,特别是将其与单片机技术有机的结合为进一步发展精确的数控电流源的提供了条件,极大地刺激了数控电流源的发展速度。到90年代时的数控电流源,它在调控电流精度方面和功率使用情况都有了质的提高。新技术的不断被数控电流源所采用,它的功能变得更加完美。电压的调节通过旋纽开关来进行,这种是当代电子产品的主流设计,但是它具有微小电压无法调节,性能不稳定等缺点。根据上述这些,我们迫切需要一种新的控制电流源的方法即使用单片机,其有很大的优势:1)控制电流源更加智能化。2)形体更加小,具有很高的工作效率,抵制一些不必要的干扰等。3)整体系统维护方便。4)高次谐波能降到很低,设备工作噪声低,系统可靠性强等特点。1.3本系统解决的主要内容我对数控直流电流源主要是针对以下几个方面进行研究和设计的:首先是如何利用单片机对功率的输出进行有效的控制,输出电压实现连续可调,且它的电压与电流输出精度高。在实际生活中有很多方法能够做到,所以我做设计之前,必须要解决的第一个问题就是选择一种更有效的方式。其次是如何有效地实施以输出直流电流源为基础的控制按钮上,和输出高精度电流的要求。最后是用何种方法能使输出电流稳定的问题。河南城建学院本科毕业设计(论文)2设计任务及要求2设计任务及要求2.1设计任务本次设计基本要求:1)设计直流电源:输入交流200~240V,50Hz;输出直流电压≤10V。完成0mA~1000mA之间各不同幅值的电流的输出,纹波电流≤2mA;2)能够预置数值,能够自动扫描输出电流并直接显示到LCD数码显示管上;3)电流输出部分,手动递增和递减,步进≤10mA;4)编程实现输出电流的控制;2.2设计思路采用单片机为中心,整个电路输出电压值的大小,可以通过可变电阻值的大小以及输入的电流数值来调节。结合相关程序和不同的按键来设置直流电流源的输出电流,得到不同的输出电压,步进电流设置等级为0.01A,最后电流的设定值可通过显示器实时显示,在量程允许范围内,经TLC5615转换和运放放大的输出电压可用万用表测得。最后,为了分析系统误差的来源和测试电路连接的正确性,我将分若干次实验进行验证。主要的方法是通过改变电阻和输入电流的大小,用万用表测出电压输出值。2.3方案论证鉴于我自身的实际能力考虑,在这里我挑选出了两种可行的方案,现对它们进行设计前分析和抉择:第一种方案:我给出了几个组成数控直流电流源主要成分。其中,键盘的作用是设定电流值;控制器是用来设定为8(或12)的二进制输出的电流值;按键设定的电流值在显示器上可以进行正确的显示;数模转换可以将输入的数字量转换为可以在电路端口测到的模拟量,但模数转换与其相反,它是通过按键设定的电流值与用万用表显示的输出电流值相同,输出的模拟量与数字量可以相互转换,最后能将其反馈到控制器。如图1所示:图1方案一的方框图第二种方案:方框图如图2所示,整个系统的核心是单片机,电流的输出值是通过按键步进调节的,电压的输出值是通过改变输入D/A的数字量进行的。为使系统硬件更加简洁,各类功能易于实现。对于数据的设置以及电流的步进操作,我采用有关程序进行控制的。图2方案二方框图2.4总体方案设计方案一的直流电流源的设计简单,采用DAC控制和电流的改变可以通过FPGA来获得。可通过LED管观察得到的数据。方案二的设计使用单片机和有关程序作为整个电路的核心,结合Proteus软件可以实现模拟仿真,因此,可以调整得到较精确的电源的电流值数值。也可以通过Keil等软件编程,可实现更加详细功能和细微的操作变化。最后采用LCD进行实时显示。该方案的困难之一是,设计稳定的恒流源和精密电流检测电路。其优点是步进电流的量可以被精确地控制,并且在电流输出和负载之间的关系几乎没有影响。通过多次与老师进行探讨和从个人实际能力出发,基于我能够较好应用单片机的能力。最后,我决定采用方案二实施有关程序的设计和电路的仿真。3硬件系统的设计3.1硬件系统的模块3.1.1电路设计(1)按键电路如图3所示。按键是常用的一类电路开关,其中,不同的代码赋予于不同的按键上,我们称之为键码。由于电路中高、低电平两种状态是通过按键的闭/开来控制的,因此,实际电路操作中会产生抖动。本次设计为了保证实验的精确性,我采用了软件程序来去除抖动的方法。单片机单片机图3单片机的按键电路图(2)复位电路复位信号是在复位电路中生成的,并且它作用于微控制器的RST引脚并将信号送入单片机中进行的(注:若使单片机可以有效地复位,RST端子应保持超过10MS高电平。),且单片机的各状态在复位后都恢复到初始化状态。复位逻辑电路图如图4所示。图4单片机复位电路图(3)STC89C52单片机STC89C52是一种低耗高性能且全双工异步串行口的微控制器。它有40个引脚可以供使用,2个16位定时/计数器,2个优先级,同时内含5个中断源等。STC89C52的存储器系统由8K字节程序存储空间和256字节数据存储空间组成。需要强调的是它没有内带EEPROM存储空间。此单片机拥有4个8位的并行双向I/O口,它们分别记作P0、P1、P2、P3,其不但可以按字节寻址,而且还可按位寻址。其中:P2口(P2.0-P2.7,21-28脚):它输出高8位地址,当其访问片外EPROM/RAM时。P3口(P3.0-P3.7,10-17脚):每个引脚都有第二功能。表1P3口线第二功能口线第二功能信号第二功能信号名称P3.0RXD串行数据接收P3.1TXD串行数据发送P3.2INT0外部中断0申请P3.3INT1外部中断1申请P3.4T0定时器/计数器0计数输入P3.5T1定时器/计数器1计数输入P3.6外部RAM写选通P3.7外部RAM读选通单片机系统图如图5所示。图5单片机系统图3.1.2电源模块该系统使用220伏电源来获得固定的直流电源,为了得到稳定的直流电,我们要想办法将220V先降到一个低压状态,在这里可以使用常规的变压器。最后,为了得到电路所需的5V电压,我们可通过整流滤波获得。由于电路中最大允许通过的电流是1安培,在这里我们不使用线性电源,因为,它会造成过多热量的功率,但开关电源LM2596可以消除这一弊端。稳定的5伏的电路可以提供所需的直流电压,并能满足10V输出的最大电压。图6稳压电源电路图3.1.3显示模块方案一:不同的设定值以及其它输出特性值可采用LED数码管显示,则不仅要求的数量较多而且使电路变得复杂。方案二:使用LCD液晶显示。其具有轻薄短小,分辨率高,方便的显示数字,功耗小等优点。在本次设计中的LCD液晶选择上,鉴于我们接触到的字符液晶大多数是基于HD44780液晶芯片的,所以,我采用LCD1602液晶模块,它可以同时显示16×02即32个字符(16列2行),它可以完全满足设计的要求。LCD1602具有体积小与显示内容丰富等功能,常被用在袖珍型仪表和低功耗应用系统中,其与单片机MCU通讯可采用8位或4位并行传输两种方式。如下表2所示。表2LCD1602引脚功能引脚符号功能说明1VSS一般接地2VDD接电源(+5V)3V0液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高(对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度)。4RSRS为寄存器选择,高电平1时选择数据寄存器、低电平0时选择指令寄存器。5R/WR/W为读写信号线,高电平(1)时进行读操作,低电平(0)时进行写操作。6EE(或EN)端为使能(enable)端,下降沿使能。7DB0底4位三态、双向数据总线0位(最低位)8DB1底4位三态、双向数据总线1位9DB2底4位三态、双向数据总线2位10DB3底4位三态、双向数据总线3位11DB4高4位三态、双向数据总线4位12DB5高4位三态、双向数据总线5位13DB6高4位三态、双向数据总线6位14DB7高4位三态、双向数据总线7位(最高位)(也是busyflang)15BLA背光电源正极16BLK背光电源负极根据上面所叙述的内容,我最后采用的是LCD液晶显示所设定的电流值。连接电路图如图7所示。图7LCD1602与单片机的接线图3.1.4键盘模块本按键模块使用的是独立操作按键,按键一端接I/O口,一端接地且单片机的I/O口都有内部上拉。当按键没有按下的时候I/O口检测到的是高电平;反之,它为低电平(相当于I/O短接地)。这样的话,我们就可以根据I/O口端电压的高低来判断按键的使用情况。在电路板上,我设计了四个按键,它们分别被命名为功能按键(SET)、增加按键(+)、减少按键(-)、复位键(RESET)。其电路图如图8所示。图8键盘与单片机的接线图3.1.5扩流模块如图9所示。因D/A输出功率是有限的,所以我们需要额外和扩大电流电路。我们可以这样做,把D/A的输入端连接到LM358的输出端,并要求两者应同向连接。三极管TIP31C在电路中的作用是进行电路扩流,这是为了达到输出电流为1A的设计要求,另一个重要作用是防止烧坏D/A转换器的可能性。图9功率放大电路图3.1.6D/A模块在D/A转换接口设置中,对于转换器的选择,我们要从设计的内容和要求进行细致的系统的分析。在使用之前,我仔细分析了老师给出的宝贵意见。最后,我决定采用了TLC5615,它是一种10位数模转换器。详细引脚功能如图10:图10TLC5615引脚图(1)DIN:串行数据输入端;(2)SCLK:串行时钟输入端;(3)CS:芯片选用通端,低电平有效;(4)DOUT:用于级联时的串行数据输出端;(5)AGND:模拟地;(6)REFIN:基准电压输入端;3.1.7TLC5615时序设计如图11所示。当CS为低电平时,我们可以看到DIN中的数据被SCLK时钟的上升沿移入到16位移位寄存器中(注:二进制最高有效位被导前移入);但当其为高电平时,就不能把数据移入了。最后可供DAC电路进行转换。图11TLC5615工作时序图3.2系统的原理图详见附录。4系统的设计4.1单片机使用状况本设计中数控直流电流源的数据要存储到数据存储器中去,用到了30H到50H之间的单元。通常数控直流电流源须根据实际需要进行调节的,因此,需要在单片机的P口上加上按键,即直接接在P2口上。电路中的液晶显示器,我们可以把它接到单片机的P0口线上,其使能端接到了P3口线。4.2软件系统的模块4.2.1定时模块在具体的操作过程中,主要用到了两种定时模块,它们在电路中各有不同的作用。其一是为了保证按键程序扫描结果的正确性,同时,为了将抖动对实验结果的影响降到最低,尤其是电压抖动。所以,当使用按键设置数据时,我们第一要做的工作是去抖动。其二是由于我们在观察东西的时候,它需要一个传输时间才能把我们看到的信息送到大脑中。正是这一点,因此我们要尽量延长屏幕上数字显示内容的时间,从而确保我们能观察到所需要的内容。无论是抖动的去除还是数码管延时显示,在这里,我均采用软件的方法来实现。4.2.2LCD显示模块关于寄存器选择如下表3。表3寄存器选择控制表RSR/W操作说明00写入指令寄存器(清除屏等)01都busyflag(DB7),以及读取位址计数器(DB0~DB6)值10写入数据寄存器(显示各字型等)11从数据寄存器读取数据1602液晶模块与器件接口如图12所示:图12LCD1602接口图4.3程序流程图4.3.1主控制流程图如图13所示。对于这次数控直流电流源的设计,我是运用将其构建成模块的方式进行的。使用此方式不但可加强系统逻辑性,而且使系统看起来更加的直观和立体,便于理解和复查。图13主控制流程图4.3.2按键操作流程图如图14所示。在本次程序设计中,为了便于按键的操作,我专门设计了一个按键扫描子程序。它的功能是,分配各个按键的操作功能,实时监督不同按键得到的指令,并对所得到的信息进行扫描归纳。我的判断依据是由于在设计中键码与按键是一一对应的,那么可以根据键码来判断按键是否按下。图14按键扫描流程图4.3.3D/A转换流程图如图15所示。下图给出了数模转换的具体步骤,它的元件选用要根据课题要求来选择。交流电压向电路提供所需电压,随后数模转换器开始工作,电路中的数据开始交换,测试电路运行情况,最后关闭电源。图15D/A转换流程图4.3.4数制转换流程图如图16所示。系统在进行部分的操作过程中,它所使用的是十进制数,且数制是不需要进行转换的,但做除法要进行。图16数制转换流程图4.3.5LCD显示流程图如图17所示。图17LCD显示流程图4.4程序清单附录中有所需程序。5仿真测试5.1设计结论及使用方法本次设计比较成功,在按键操作中能够按照预先给定的功能进行操纵,并完成了进行数控直流电流源的显示。如图18所示。首先运行Proteus软件,在计算机上找到已经设计好的电路文件并双击打开,然后点击单片机的线路图,加载提前通过软件编程的应用程序,单击run按钮,整个电路的性能测试就可以进行了。详细操作说明:按了复位键之后,液晶显示屏上显示“SetCurrent1.00A”。不能直接按增减键来进行电流的调节,需要按下功能键才能进入电流设置,这个时候我们可以看到光标在数据下方闪动。然后,我们可以手动实现步进,屏幕会显示变化的数据,直到是想要的数字即可设定。图18仿真界面图5.2仿真结果5.2.1输出电流范围仿真在量程内显示正确结果,必须在设计程序上满足限制电流输出范围是0~1000mA,限定输出电压值小于或等于10V的前提条件;从而,当我们所预置的数字超过系统的量程时,其不能在频幕上显示。在电流设置的环节中,我们在仿真模拟时开始应先按下SET键,系统会出现如图19所示画面,这时可手动输入数据,它在量程0~1000mA内,则会正确显示,若不满足0~1000mA,则显示器无法显示。图19输出电流值SET显示界面图5.2.2步进调整仿真通过点击SET键进行数值的设定,这个操作只有在有效量程内才能实现的。具体操作是点击增加键(+)、减少按键(-)来实现步进的,它的步进电流值是0.001安培,电流数值大小的变化可通过显示器观察得到。5.2.3输出电流仿真下图20所示是通过按键步进调节使仿真电流达到200mA,并外接2.0欧姆负载电阻时的状态。经按键操作将电流值预置为200毫安,在电路外接万用表测得实际输出的电流值和电压值。做好对所需器材准备,下面就进行仿真环节了。图20负载电阻为2.0仿真状态图表4负载RL=2.0Ω的数据表格给定值(mA)200300400500800100015001980电流AD测值(mA)201301401501800100015001980误差绝对值11110010负载电压(V)0.4000.6290.8391.4091.6792.0993.1494.155负载阻值(Ω)2.02.02.02.02.02.02.12.0当电阻为3.0时表5负载RL=3.0Ω的数据表格给定值(mA)200300400500800100015001980电流AD测值(mA)201300401501800100015001980误差绝对值10110000负载电压(V)0.6000.8981.2011.4992.3972.9984.4975.937负载阻值(Ω)3.03.03.03.03.02.93.03.05.2.4仿真软件的介绍Proteus软件所提供了上万种元器件,新元件可能是现在技术无法制造的或者是我们无法把一些性能加到实际元件中去的,现实中不能满足人们的科研要求的。Proteus就很好的解决了这一遗憾,更加重要的是,Proteus还提供了目前所使用的仪器所没有的功能,这为人们进行科研和电路开发奠定了良好的开端。一些实验需要在理想情况下才能进行,现在可以在计算机上直接模拟进行了,这是在实践中很难实现的。但Proteus软件的出现很好地解决了这个难题,它不但给人们提供了一个实践的互动平台,而且更是节约了仪器制造的成本。该软件的特点是:①支持PCB自动或人工布线,拥有多样的激励源包括直流、正弦、脉冲、分段线性脉冲等。②互动的电路仿真。③提供软件调试功能。可与Keil和Hitesh结合,进行高级语言的源码级仿真和调试。④具有强大的原理图绘制功能。总之,所做的基于单片机的数控直流电流源电路能够利用仿真软件先在计算机上进行模拟。5.3误差分析输出电流的纹波的影响。为了消除影响,我们可以采用,不要将器件靠近容易产生脉冲工作设备和降低电源纹波等一系列屏蔽的方法。在运放前加一级晶体管或者场效应管的差分级,选择低噪声的运放。该设计的电流源可能存在的误差,第一种是移位电路电压参考价值是不是非常标准,按照设定的期望能否输出所需电压值。运用高标准测量电路,标准化移位电路的输出电压。第二个能否达林管按照对应的理想条件下开展相应的工作。河南城建学院本科毕业设计(论文)结束语结束语不知不觉就要马上毕业了,在这几个月的课程设计中,它让我学会了好多道理,让我认识到了自己的不足并给予了我补救的机会。在这里我认识到知识永远是没有尽头的,自己在这段时间里虽然有时会感觉很累,但真的很充实,很感谢学校能给予我们这个证明自己能力的机会。它让我对本专业有了新的见解,明白了自己将来能做哪些方向,具体怎么做的问题。通过它让我知道了电子世界不会那么的枯燥无趣,在它的身上也有很多的奥妙等着我们去一一解答。大学四年即将结束,在河南城建学院学习的过程将是我人生的一笔珍贵的财富,我想我会很珍惜这些用四年匆匆青春换来的知识,在这里我学到了很多专业知识和一些已经或者将要懂得的做人的道理,对于这里的一切我都报以感恩的态度来表达我对母校的热爱,在即将进入社会的时候,我能将所学理论知识运用到实践中去,基于此来完成此次课题设计,我感到非常的高兴。这次设计给我带来的影响还是很大的,经历它之后我看到了本专业知识的欠缺,还有许多的知识等着我去学习和运用,让我明白了毕业不是对知识学习的终结而是真正的开始。我很庆幸自己还有机会和时间去弥补自己的不足,让我在离开母校的时候还能进一步提高自己。经过这几个月的不断摸索和实践,我发现自己的动手能力得到了很大的提高,一些自己不会做的不能做到的基于单片机的设计慢慢的我也能做出来了,对于一些原理和仿真软件的操作也有了自己的一些独特见解。在这个劳累且生活充实的过程中,我从身边的每个人身上都看到了一个共同的精神缩影即拼搏的冲劲,它给予我的不仅仅是精神上的震撼还有行动上支持,我想这种精神会伴随着自己一生,在我即将离开生活四年的母校,踏入社会的时刻将使我受益终身。河南城建学院本科毕业设计(论文)参考文献参考文献[1]孙肖子.模拟电子电路及技术基础[M]西安电子科技大学出版社,2009[2]阎石.数字电子技术基础.北京:高等教育出版社,1997年[3]曾波.数控恒流源.电子世界[J]第九期,2005[4]何广兴.新编电子电路实用手册[M]北京:电子工业出版社,2011[5]李建忠.单片机原理及应用.西安:西安电子科技大学,2002年[6]刘树中,孙书膺,王春平.单片机和液晶显示驱动器串行接口的实现[J].微计算机信息,2007河南城建学院本科毕业设计(论文)致谢致谢经过几个月忙碌,从第一天拿到毕业课题到现在设计的结束。这期间发生了很多事情,借此机会我要向那些在设计过程中帮助我的人表达最深切的谢意。首先说的是我的导师徐老师,拿到课题后我们组去跟老师会面,我对老师的第一印象就是瘦瘦高高的,给人一种很亲切的感觉。在设计过程中,当我遇到瓶颈时,徐老师帮我梳理思路,分析问题的症结所在提出了一些逻辑清晰,富有建设性的建议,在我进行实物焊接的过程中,遇到了一些自己无法解决的难题,徐老师能在百忙之中帮助我解决一些技术性的问题。徐老师在这段时间给予了我莫大的帮助,给我的接下来的人生带来了很大影响。在这一路走来的过程中,我碰到很多事很多的难题,这不禁让我感到自己专业知识的欠缺和有关技能的缺失,更让我明白了一分辛苦一分收获这句真理。任何人如若想取得一分成绩,就要付出十分的努力。这对我的未来有很大的帮助。尽管有些地方,我做的并不是十分的完美,一些基础理论知识掌握的还不是很牢固,但我想只要敢想敢做多向老师同学请教最后总能顺利解决的。在这次毕业设计的过程中,许多我无法解决的问题是通过寻求老师同学的帮助才得以解决。再次感谢他们对我的帮助!附录系统原理图实物图

程序清单;************************************************************ ;****;在本次课程设计的程序中,我用到的是液晶显示器,其使能***;****;端接单片机的P3.0,P3.1,P3.2引脚,用到了DA转换等需要***;****;的暂存单元分别为30H到35H,其中还有一些必要的标志位存***;****;在在36H到4AH单元。按键接单片机的P2.0到P2.7,液晶显示*** ;****;显示器数据口接单片机的P0.0到P0.7,本数控直流电流源有加*** ;****;减调整,采用闭环控制系统进行调整,精确度更高。 ***;************************************************************#include<reg52.h>#defineucharunsignedchar#defineuintunsignedintsbitrs=P3^0;sbitrw=P3^1;sbitlcden=P3^2;//液晶显示屏相关位定义sbitAD_OUT=P1^0;sbitAD_IN=P1^1;sbitAD_CS=P1^2;sbitAD_CLOCK=P1^3;sbitDA_IN=P3^3;sbitDA_CK=P3^4;sbitDA_CS=P3^5;sbitx=P1^4;ucharcodetable1[]="Areyousure";ucharcodetable2[]="tosetI?";ucharcodetable3[]="ERROR!RESET!";unsignedlonginttemp0,temp1;uintADCdat,i,AD_DAstart;floatVoltage1,Voltage2,r;intvol,rtt;ucharset,volarry0[4],volarry1[4],rt[2];chariset[5]={0,0,2,0,0,};voidled_init();//函数声明voiddelayms(uintz);voiddelay(uintt);voidwrite_com(ucharcom);voidwrite_date(uchardate);voiddisplay_AD();uintread2543(ucharport);voidSend1456(uintDACdat);voidkeyscan();;************************************************************;****;主程序 ****;************************************************************#include<reg52.h>#include"LCD1602.h"//IO接口定义sbitSCLK=P3^1; //TLC5615时钟接口sbitDIN=P3^2; //TLC5615数据接口sbitCS=P3^0; //TLC5615片选接口sbitkey_1=P3^5; //按键1sbitkey_2=P3^6; //按键2sbitkey_3=P3^7; //按键3doubleoutPut=0; //输出数据变量unsignedcharkey_count=0; //按键状态变量voidtlc5615(unsignedinttemp) //TLC5615写数据函数{ unsignedchari; //定义变量供后续使用 temp<<=5; //将要输出的DA数据左移5位 CS=0; //片选给0 SCLK=0; //时钟IO口初始化 for(i=0;i<12;i++) //分12次将数据写入 { if((temp&0x8000)==0x8000) //判断temp最高位是否为1 DIN=1; //数据IO口给高 else //如果temp最高位为0 DIN=0; //则数据IO口给低 SCLK=1; //给一个时钟上升沿 temp=temp<<1; //将temp变量左移1位 SCLK=0; //恢复时钟IO口 } CS=1; //取消TLC5615片选}voiddelayms(unsignedinti) //ms级延时{ unsignedintj,k; //定义两个变量,用于延时函数 for(j=0;j<i;j++) //i决定延时多少ms for(k=0;k<120;k++); //空循环}voidkey_scan(void) //按键扫描函数。{ unsignedinttemp; //定义局部变量用于这个函数内 if(key_1==0) //如果第一个按键按下 { delayms(10); //延时消抖 if(key_1==0) //如果第一个按键确实按下 { key_count++; //按键状态变量加1 if(key_count==1) //如果按键状态为1 { LCDDispNum(8,2,(int)(outPut*10)%10); //刷新电流小数点后第一位 LCDCursor(); //LCD1602上显示光标,此时光标显示在小数点后第二位 } if(key_count==2) //如果按键状态为2 { LCDDispChar(7,2,'.'); //在LCD1602上显示小数点 LCDCursor(); //LCD1602上显示光标,此时光标显示在小数点后第一位 } if(key_count==3) //如果按键状态为3 { LCDDispChar(5,2,''); //在LCD1602上显示空格 LCDCursor(); //LCD1602上显示光标,此时光标显示在小数点前一位 } elseif(key_count==4) //如果按键状态为4,则设定完毕 { key_count=0; //清除按键状态标志位 LCDDispString(3,1,"SetCurrent"); //屏幕上显示设置电流 LCDDispNum(6,2,(int)(outPut)%10); //在LCD1602上将设置的电流显示出来 LCDDispChar(7,2,'.'); LCDDispNum(8,2,(int)(outPut*10)%10); LCDDispNum(9,2,(int)(outPut*100)%10); temp=outPut*1023/1.2841055; //将设置好的电流转换后存储到temp变量中 tlc5615(temp); //将上一句得到的数据输入到TLC5615中输出 LCDNotCursor(); //取消光标显示 } } while(!key_1); //直到按键松开 } if(key_2==0) //如果增加键按下 { delayms(10); //延时消抖 if(key_2==0) //如果增加键确实按下 { if(key_count==1) //如果按键状态为1,则表明以0.01A增加 { outPut=outPut+0.01; //输出电流增加0.01A if(outPut>1.00) //如果超过1A { outPut=1.00; //不能再次增加输出电流,并且限制为1A } LCDDispNum(6,2,(int)(outPut)%10); //刷新显示输出电流 LCDDispNum(9,2,(int)(outPut*100)%10); LCDDispNum(8,2,(int)(outPut*10)%10); } elseif(key_count==2) //如果按键状态为2,则表明以0.1A增加 { outPut=outPut+0.1; //输出电流增加0.1A if(outPut>1.00) //如果输出电流大于1A { outPut=1.00; //不能再次增加输出电流,并且限制为1A } LCDDispNum(6,2,(int)(outPut)%10); //刷新显示输出电流 LCDDispNum(9,2,(int)(outPut*100)%10); LCDDispNum(8,2,(int)(outPut*10)%10); LCDDispChar(7,2,'.'); } elseif(key_count==3) //如果按键状态位3,则表明以1A增加 { outPut=outPut+1.0; //输出电流增加1A if(outPut>1.00) //如果输出电流大于1A { outPut=1.00; //不能再次增加输出电流,并且限制为1A } LCDDispNum(6,2,(int)(outPut)%10); //刷新显示输出电流 LCDDispNum(9,2,(int)(outPut*100)%10); LCDDispNum(8,2,(int)(outPut*10)%10); LCDDispChar(5,2,''); } } while(!key_2); //直到增加键松开 } if(key_3==0) //如果减少键按下 { delayms(10); //延时消抖 if(key_3==0) //如果减少键确实按下 { if(key_count==1) //如果按键状态为1,则表明以0.01A减少 { outPut=outPut-0.01; //输出电流减少0.01A if(outPut<=0.0) //如果输出电流小于等于0 { outPut=0.0; //不能再次减少输出电流,并且限制为0 } LCDDispNum(6,2,(int)(outPut)%10); //刷新显示输出电流 LCDDispNum(9,2,(int)(outPut*100)%10); LCDDispNum(8,2,(int)(outPut*10)%10); } elseif(key_count==2) //如果按键状态为2,则表明以0.1A减少 { outPut=outPut-0.1; //输出电流减少0.1A if(outPut<=0.0) //如果输出电流小于等于0 { outPut=0.0; //不能再次减少输出电流,并且限制为0 } LCDDispNum(6,2,(int)(outPut)%10); //刷新显示输出电流 LCDDispNum(9,2,(int)(outPut*100)%10); LCDDispNum(8,2,(int)(outPut*10)%10); LCDDispChar(7,2,'.'); } elseif(key_count==3) //如果按键状态为2,则表明以1A减少 { outPut=outPut-1.0; //输出电流减少1A if(outPut<=0.0) //如果输出电流小于等于0 { outPut=0.0; //不能再次减少输出电流,并且限制为0 } LCDDispNum(6,2,(int)(outPut)%10); //刷新显示输出电流 LCDDispNum(9,2,(int)(outPut*100)%10); LCDDispNum(8,2,(int)(outPut*10)%10); LCDDispChar(5,2,''); } } while(!key_3); //直到减少键松开 } }voidmain(void) //主函数{ LCDInit(); //液晶初始化 outPut=0.00; //输出电流初始化为0 tlc5615(0); //执行输出 LCDDispString(3,1,"SetCurrent"); //屏幕显示“SetCurrent”字样 LCDDispChar(10,2,'A'); //显示电流单位“A” LCDDispNum(6,2,(int)(outPut)%10); //在屏幕上显示输出电流大小 LCDDispChar(7,2,'.'); LCDDispNum(8,2,(int)(outPut*10)%10); LCDDispNum(9,2,(int)(outPut*100)%10); while(1) //主循环,只用于检测按键。所有设定都由按键扫描函数完成。 { key_scan(); //调用按键扫描程序 }};************************************************************;****;D/A转换子程序 ****;************************************************************uintread2543(ucharport)//DA转换子程序{ uintad=0,j;AD_CLOCK=0;AD_CS=0;port<<=4;delay(50);for(j=0;j<12;j++){ if(AD_OUT){ ad|=0x01;}AD_IN=(bit)(port&0x80);AD_CLOCK=1;delay(6);AD_CLOCK=0;delay(3);port<<=1;ad<<=1;}AD_CS=1;ad>>=1;return(ad);}voidSend1456(uintDACdat){ uchari=0; DA_CK=0; delay(2); DA_CS=0; delay(2); for(i=0;i<12;i++) { DA_IN=(bit)(DACdat&0x800); DA_CK=1; DACdat<<=1; DA_CK=0; } DA_CS=1; DA_CS=0;};************************************************************;****;按键键扫子程序 ****;************************************************************voidkeyscan()//矩阵键盘{ uchartemp,keycount,num;//定义局部变量 P2=0xfe;//检测最上面一行各键是否有按键按下temp=P2;//将P2口的值赋给temptemp=temp&0xf0;//位与if(temp!=0xf0){ delayms(100); temp=P2; temp=temp&0xf0; if(temp!=0xf0)//确认被按下,防止抖动 { temp=P2; switch(temp) { case0xee://检测到7被按下 if(keycount!=0) { write_date(0x30+7); iset[keycount++]=7; } break; case0xde: //检测到8被按下 if(keycount!=0) { write_date(0x30+8); iset[keycount++]=8; } break; case0xbe: //检测到9被按下 if(keycount!=0) { write_date(0x30+9); iset[keycount++]=9; } break; case0x7e: //检测到取消键被按下 write_com(0x01);//数据指针及数据清0 write_com(0x0c); write_com(0x80+5); write_date(0x6d); write_date(0x41); write_com(0x80); write_date(0x53); write_date(0x30+iset[1]); write_date(0x30+iset[2]); write_date(0x30+iset[3]); write_date(0x30+iset[4]); AD_DAstart=1; } while(temp!=0xf0)//松手检测 { temp=P2; temp=P2&0xf0; } } } P2=0xfd;//检测最二行各键是否有按键按下temp=P2;//将P2口的值赋给temptemp=temp&0xf0;//位与if(temp!=0xf0){ delayms(100); temp=P2; temp=temp&0xf0; if(temp!=0xf0)//确认被按下,防止抖动 { temp=P2; switch(temp) { case0xed://检测到4被按下 if(keycount!=0) { write_date(0x30+4); iset[keycount++]=4; } break; case0xdd: //检测到5被按下 if(keycount!=0) { write_date(0x30+5); iset[keycount++]=5; }break; case0xbd: //检测到6被按下 if(keycount!=0) { write_date(0x30+6); iset[keycount++]=6; } break; case0x7d: //检测到+被按下 iset[4]++; if(iset[4]==10) { iset[4]=0; iset[3]++; if(iset[3]==10) { iset[3]=0; iset[2]++; if(iset[2]==10) { iset[2]=0; iset[1]++; } } } write_com(0x80+5); write_date(0x6d); write_date(0x41); write_com(0x80); write_date(0x53); write_date(0x30+iset[1]); write_date(0x30+iset[2]); write_date(0x30+iset[3]); write_date(0x30+iset[4]); AD_DAstart=1; break; } while(temp!=0xf0)//松手检测 { temp=P2; temp=P2&0xf0; } } } P2=0xfb;//检测第三行各键是否有按键按下temp=P2;//将P2口的值赋给temptemp=temp&0xf0;//位与if(temp!=0xf0){ delayms(100); temp=P2; temp=temp&0xf0; if(temp!=0xf0)//确认被按下,防止抖动 { temp=P2; switch(temp) { case0xeb://检测到1被按下 if(keycount!=0) { write_date(0x30+1); iset[keycount++]=1; } break; case0xdb: //检测到2被按下 if(keycount!=0) { write_date(0x30+2); iset[keycount++]=2; }break; case0xbb: //检测到3被按下 if(keycount!=0) { write_date(0x30+3); iset[keycount++]=3; } break; case0x7b: //检测到-被按下 iset[4]--; if(iset[4]==-1) { iset[4]=9; iset[3]--; if(iset[3]==-1) { iset[3]=9; iset[2]--; if(iset[2]==-1) { iset[2]=9; iset[1]--; } } } write_com(0x80+5); write_date(0x6d); write_date(0x41); write_com(0x80); write_date(0x53); write_date(0x30+iset[1]); write_date(0x30+iset[2]); write_date(0x30+iset[3]); write_date(0x30+iset[4]); AD_DAstart=1; break; } while(temp!=0xf0)//松手检测 { temp=P2; temp=P2&0xf0; } } } P2=0xf7;//检测第四行各键是否有按键按下temp=P2;//将P2口的值赋给temptemp=temp&0xf0;//位与if(temp!=0xf0){ delayms(100); temp=P2; temp=temp&0xf0; if(temp!=0xf0)//确认被按下,防止抖动 { temp=P2; switch(temp) { case0xe7://检测到0被按下 if(keycount!=0) { write_date(0x30); iset[keycount++]=0; } break; case0xd7: //检测到删除键被按下 if(keycount<5&&keycount>0) { if(keycount!=1) keycount--; write_com(0x80+keycount); }

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论