基于单片机的太阳能充电器的设计.doc
山东交通学院课程设计报告课 题 名 称 基于单片机的太阳能充电器的设计 学 生 姓 名 傅传银 唐飞翔 学 号 140818108 140818110 专 业 电子信息工程信职141指 导 教 师 张波 2016年06月26日学习文档 仅供参考1 绪论1.1 本课题研究背景及现状当代社会随着一些不可再生资源如煤炭,石油等日益减少,使得各国社会经济越来越受能源问题的约制,因此许多国家开始逐渐的实行“阳光计划”,开发洁净的能源如太阳能,用以成为本国经济发展的新动力。首先让我们想到的是太阳能电池,因为它不会消耗水,燃料等物质,并且不会释放任何对环境有污染的气体,是直接通过太阳光与材料的相互作用释放出电能,这种无污染资源对环境的保护有着相当重要的意义1。由于无公害的作用,目前世界太阳能电池产业已经出具规模,1995年到2004年的十年内平均年增长率到达30%以上。随着新型太阳能电池的涌现,以及传统硅电池的不断革新,新的概念已经开始在太阳能电池技术中显现,从某种意义上讲,预示着太阳能电池技术的发展趋势2。世界各国对光伏发电也越来越重视,目前全世界已超过一百个国家使用光伏发电系统,其中以欧洲为代表的发达国家为主,占总市场的%,早在09年的时候,世界各国总的光伏新加装机容量接近800万千瓦,截至当年低,世界光伏装机容量总共接近2700万千瓦3。随着并网光伏发电市场的迅速发展,让它受到了世界各地的关注。目前,太阳能电池的应用已经逐渐广泛得到推广,众所周知,沙漠地区由于气温特别高,因此最具有大规模开发太阳能的潜力,这使得沙漠等偏远地区对其的使用更加方便,并且能减低甚至节省昂贵的输电线路,从长远发展状况来看,随着改善太阳能电池制造技术和新的光 - 电转换装置发明,国家环保和清洁能源,光伏发电系统和太阳能发电的巨大需求恢复将继续利用太阳辐射能比较实用方法,这可以为人类以后能使用太阳能提供了广阔的开辟前景4。当代社会太阳能 充电器得到了一定的使用,它具有运用方便,环保,节能,格外使用于应急场合,高效率充电,性价比较高,让大家无论身处何处,都不会受到 没电的困扰5。借此太阳能 充电器的众多优点,因此提出本课题。1.2 课题设计思想基于单片机的太阳能充电器的设计是本次探导的课题。首先,由于太阳能电池板的电压会随太阳光的强度波动,强烈的太阳光的太阳能电池板的电压是高的数,当太阳光弱的强度,所述太阳能电池板的输出电压低时,从太阳能电池板的输出到稳定的电压6。本设计采用了稳压器LM7805 , LM7805输出端口可以输出稳定的5V电压,因为电力可以用于单芯片和其它芯片,其次,作为下一个电源电压转换电路。第二,考虑到电池的充电过程的电压要求各不相同,不能简单稳定的直流输出,因此提出了利用DC / DC转换器电路的,通过控制关断时间的占空比,以调节输出电压。 SCM是控制中心,在控制信号产生电路是由充电过程的一个外部状态产生的,外部充电电压的比较信号和充电电流与理想充电过程中,占空比调节。单个微控制器设计用于该目的,所述电压检测电路和一个电流检测电路,并且为了方便用户知道系统的状态,设计设置在显示模块和指标。 2 基于单片机的太阳能充电器系统总体方案设计2.1 设计方案一方案一方框图如图所示DC/DC转换单片机按键显示 电池太阳能电池板该程序使用的DC / DC转换电路,将太阳能电池板输出的电压变换为需要的电压值给 电池充电,同时单片机可以控制电路变换,还可采用按键设定某些值,有显示部分,可以设定为显示电路状态。可以从该图中的框图中可以看出,该程序能够控制DC / DC变换器电路,显示模块,但该程序是没有实时检测的外部电路,而不是用DC / DC实时控制根据外部电路的条件转换电路。2.2 设计方案二借于方案一存在的缺点,所以在此提出第二种方案,方案二方框图如下列图。DC/DC转换单片机按键 电池太阳能电池板PWM芯片模数转换显示图2.2 方案二方框图如从图2可以看出,以弥补设计用于检测电路的状态的方案的缺点,并通过模拟转换到数字的转换模块的信号到微控制器。 PWM控制芯片微控制器可以产生施加PWM波转换电路的控制主要模块和显示模块,但此次方案是将生成PWM部分用芯片替换,这使得电路复杂硬件部分的设计,它是更好地使用软件允许硬件电路简单,而且还能充分利用单片机的功能。2.3基于单片机的太阳能充电器的设计的总体设计方案综合以上两种方案提出本次设计的整体设计框图如下列图所示。DC/DC转换单片机按键 电池太阳能电池板模数转换显示图 整体设计框图 相对于前两种方案,此整体方案显示的优点,不仅能对充电电路进行检测,单片机还可以根据充电电路的关键电路的信号处理后的分析来检测的情况进行控制可以选择系统可以实现功能。显示电路可以显示用于实现本方案的电路中,PWM控制信号的工作状态,从而使硬件电路非常简单,节省资源,提高系统的性能。 3 基于单片机的太阳能充电器系统的硬件设计太阳能电池板的选用太阳能电池板是通过吸收太阳光,将太阳辐射能通过光电效应或者光化学效应直接或间接转换成电能的装置,大部分太阳能电池板的主要材料为“硅”,但因制作成本很大,以致于它还不能被大量广泛和普遍地使用。硅太阳能电池分为晶体硅电池板,非晶硅电池板等几种。单晶硅太阳能电池的光电转换效率为15%左右,最高通常可以到达24%,它是所有种类的太阳能电池中光电转换效率最高的,但制作成本很大,以致于它还不能被普遍地使用,因为单晶硅通常会用钢化玻璃和防水树脂包装起来,所以会十分耐用,通常能用十几年,最长可以用25年。多晶硅太阳电池的制作过程与单晶的差不多,可相对而言起光电转换效率要比单晶降低很多,其效率大概在12%左右 (其中世界上最高的多晶硅转换效率为14.8%)7。但如果我们从制作费用上来讲,多晶硅的由于制造简单,节能节电,因此其生产费用就会降低不少,从而得到了一定的发展。另外,其使用年限没有单晶硅太阳能电池那么长。如果从性价比来说,自然是单晶硅太阳能电池还略好。接下来我们说下非晶硅太阳电池,它是1976年出现的新型薄膜式太阳电池,其制造过程得到了很多简化,对硅材料的使用很少,电耗也更低,它突出的优点是在很多情况下都能发电包括弱光时候。但它也有一定的问题,就是光电转换效率相对而言偏低,就算国际上的先进水平也只大约在10%,不够稳定,时间越久,其转换效率会衰减。根据所需要的不同数目的太阳能电池,其转换效率是通过光,温度和结晶型太阳能电池的制造工艺和其他因素的影响,2010年中国平均效率接近为18%,一般的太阳能电池电压有很多种,其主要用于太阳能发电。太阳能电池板的太阳能发电系统是其工作的基础,是充电器的第一部分,其功能是将太阳光转为电能,如今更多种类型的便携式数字设备,电压和电流范围所需的输入功率较大的器件,面积较大,必须使用太阳能电池板,这给了携带不便。因此,模块化设计的组合,可根据不同的负载充电需求,太阳能电池板组合起来以实现一组光伏电池在某个期望的输出功率和输出电压。本文通过一些常用的小功率设备例如 ,来讲解太阳能充电器设计的过程。3.2 LM7805稳压电路由于太阳能电池板的电压会随太阳光的强度波动,强烈的太阳光会使太阳能电池板的电压变高,当太阳光强度变弱时,自然会使电池板输出电压变低。为了获得到稳定的输出,本设计应用稳压管LM7805,其输出口能输出稳定的所需要电压5V,以便能保持稳定的输出电压。典型LM7805的应用电路图如图所示。图3.1 LM7805稳压电路图图中C4、C7的是用于清除因长期连接时由于电感效应产生的自激振荡,降低了纹波电压,在其输出端接上电容C6、C5的作用是清除电路高频产生的噪声,以便提高所用负载的瞬态响应。一般来说电容的耐压性都会比电源输入、输出电压要强。此外,在稳压器输入、输出端之间加上二极管,可以防止对稳压器的破坏,从而实现对LM7805的保护。LM7805输入电压在7V至37V之间,其最大工作电流可达,且拥有电路精简,电流输出高,运行工作稳定,即使电压不稳定,也能使太阳能电池拥有不变的输出电压5V,最后能让单片机控制的电路正常稳定的运行,并且性价比高,不需要消耗多余的材料。3.3 充电主电路的设计充电主电路图如图所示。图电池充电电路图DC/DC变换是将直流电能DC转换成另一种固定电压或电压可调的直流电能,又可称成直流斩波8。假设其输出电压较输入之电源电压低,则称为降压式(Buck )直流斩波器即频率调制1Buck电路,假设其输出电压较输入之电源电压高,则称为升压式(Boost)直流斩波器。主电路核心由图可以看出,主要由三部分组成即电感L1,三极管区和续流二极管D1,其也就形成了一个完整的BUCK降压DC/DC转换电路;上图Q2是具有将PWM信号打开变大,从而到达驱动Q1开关管的功能。3.4 信号采集处理电路为了使锂电池能完成安全充电,本设计的电流取样处理电路图如下列图所示图电流取样处理电路图电池电压与单片机A/D接口相连,通过A/D转换和微控制器即单片机,以获得测量的电压值得到计算处理。此次充电电流通过的取样电阻,产生的电压再使用LM358,将电流取样电压放大相应的倍数后输到单片机A/D接口进行采集。电压检测输出电压直接进行模数转换之后被发送到A/D输入接口的单片机进行处理。3.5 单片机选型单片机型号众多,但大家熟悉了解的就那么几种类型。我们在学校接触到的也就是C51系列,C51是51单片机C语言程序设计的简称,由于接触到的单片机以型号为AT开头的为多,所以选用了型号是AT89C51为此次设计的单片机。3.6 单片机AT89C51介绍AT89C51是一种带4K字节FLASH存储器FPEROMFlash Programmable and Erasable Read Only Memory的低电压、高性能CMOS 8位微处理器,俗称单片机9。AT89C2051是一种带2K字节闪存可编程可擦除只读存储器的单片机。单片机的可擦除只读存储器可以反复擦除1000次。该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。由于将多功能8位CPU和闪速存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,AT89C2051是它的一种精简版本。AT89C51单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。AT89C51单片机引脚图如下列图所示。图 单片机引脚图以下为其引脚功能及作用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外部中断0P3.3 /INT1外部中断1P3.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:来自反向振荡器的输出。 单片机电路单片机复位电路单片机复位电路图如图所示。图复位电路图当系统正常工作时,由于上图使用的是按键复位,当电源给电容充电的过程中,会使电容存储的电能增加,致使单片机复位端电平减低,这时候得人为的按下键,才能使电平变高,单片机收集到信号后就会自动复位。 单片机时钟电路单片机可作为驱动时钟定时逻辑电路,在其工作过程中可以看出,所有的工作都是在时钟信号的控制下进行的,当执行一个指令事,CPU控制器必须发出一系列特定的控制信号。单片机时钟电路图如图所示图单片机时钟电路图 单片机A/D转换电路 ADC0809是8位的采样分辨率,以模拟数字转换的逐次逼近原理。ADC0809由一个8通道模拟开关,地址锁存器,解码器, A/D转换器。内部有一个8通道多路复用器,它能根据信号的地址锁存译码后,门控8模拟输入信号的A/D转换。多路开关可选通8个模拟通道,允许8路模拟量分时输入,共用A/D转换器转换。数字锁存器的A/D转换完成三态输出锁存器,当OE端为高电平,可以从三态输出锁存器的数据转换。A/D转换的数据要发送数据后,应该传给单片机进行处理。关键的问题是如何确定数据的A/D转换完成转移,因为只有确认完成后,可以发送。A/D转换电路图如图所示 图3.7 A/D电路图ADC0809的引脚功能及作用IN0IN7:8路模拟量输入端。2-12-8:8位数字量输出端。ADDA、ADDB、ADDC:3位地址输入线,用于选通8路模拟输入中的一路。ALE:地址锁存允许信号,输入端,高电平有效。START: A/D转换启动脉冲输入端,输入一个正脉冲至少100ns宽使其启动脉冲上升沿使0809复位,下降沿启动A/D转换。EOC: A/D转换结束信号,输出端,当A/D转换结束时,此端输出一个高电平转换期间一直为低电平。OE:数据输出允许信号,输入端,高电平有效。当A/D转换结束时,此端输入一个高电平,才能打开输出三态门,输出数字量。CLK:时钟脉冲输入端。要求时钟频率不高于640KHz。REF+、REF-:基准电压。Vcc:电源+5V。GND:接地。按键电路按照键盘与单片机的连接方式分为独立式键盘和矩阵式键盘11。独立式键盘相互独立,每个按键占用一根I/O口线,每根I/O口线上的按键工作状态对其他按键的工作状态不会产生不好作用。这种按键软件程序简单,但占用I/O口线较多一根口线只能接一个键,适用于键盘应用数量较少的系统中。矩阵式键盘又称行列式键盘,与独立式键盘比照,单片机口线资源利用率提高了一倍。按键接线图如图所示。图按键电路图键盘抖动的时间一般为510ms,抖动现象会引起CPU对一次键操作进行多次处理,从而可能产生错误,因而必须设法消除抖动的不良后果。通过去抖动处理,可以得到按键闭合与断开的稳定状态。为了准确判断闭合键的位置,要对每个按键进行编码。根据矩阵式键盘的结构,采用行扫描的键位识别方法。使某条列线为低电平,如果这条列线上没有闭合键,则各行线的状态都为高电平;如果列线上有键闭合,则相应的那条行线即变为低电平。于是就可以根据行线号与列线号计算出闭合键的键码。扫描时由第一列开始,即由PA口先输出0FEH,然后由PC口输入行线状态,判断哪一行有键闭合,假设无键闭合,再输出0FDH检测下一列各行键闭合状态,由此一直扫描下去。在这个设计中,按键的数量设置为3,它们中的一个作为一个复位按钮;另一个作为电压按键,这样的设计提供3V,3.5V,4.0V,4.5V为周期的四个电压值,可以“电压选择”键选择一个电压输出;另一个开始充电,装上一个电池为电池充电,当按下“开始充电”按钮,系统开始为锂电池充电。因此,使用一个独立的密钥的方法,它可以减少编程的难度。数码管显示电路LED数码管组成的多个发光二极管打包在一起,以形成“8”字状的装置中,连接导线已在内部做好,只要能导致它们导出各自的笔划,公共电极。数码管显示电路图如图所示图 数码管显示电路图 本设计使用四位LED数码管数码管段加小数点为7或8个数码管,数码管有两种阴阳,本设计采用共阴极数码管,8段LED阴极接地连接在一起,阳极当某一高电平时,二极管被点亮而发光,设计时允许数码管阳极的某一组合被设置高。锂电池充电原理锂电池充电的工作原理就是指其充放电原理。充电时锂离子由正极向负极运动而嵌入石墨层中。放电时,锂离子从石墨晶体内负极外表脱离移向正极。所以,在该电池充放电过程中锂总是以锂离子形态出现,而不是以金属锂的形态出现。一般而言电池容量指的就是放电容量。可以看到,锂电池在充放电的过程中,锂离子是存在于正极 负极 正极的运动状态。如果我们把锂电池形象地比喻为一把摇椅,摇椅的两端为电池的两极,而锂离子就象优秀的运动健将,在摇椅的两端来回奔跑。锂蓄电池的充电特性曲线图如图所示:图锂电池充电特性曲线图为保证安全充电,对锂离子电池充电要求首先是在充电时保持电流不变,电池电压会在充电过程中渐渐升高,当电池端电压到达,会改变充电状态,即变化为电压不变的恒压充电。电流会依照电芯的饱和程度,随着充电过程的渐渐降低,当降低到时,认为充电终止。大家注意,其中C是以电池标称容量对照电流的一种表示方法,如电池是1000mAh的容量,1C就是充电电流1000mA,注意是mA而不是mAh,就是10mA。当然,标准的表示方式是。 4基于单片机的太阳能充电器系统的软件设计 设计思想首先主程序由初始化段和循环主体段两部分组成,在执行循环体时,需要一个个的调用所需的任务模块,不会直接去执行程序,其中每一个任务为一个子函数,这种机制也叫称为轮询机制。举个例子说明:就是当一个正在被主程序执行的子函数,它会自动确认其执行条件有无可行性,如果可以就执行,反之,就会返回。按键处理是以10ms为周期的选择一次。PWM的控制调节不能过快,最好以200ms为周期,如果太快,会影响到数码管刷屏,A/D采样速度也是一样。子程序主要由4部分组成,包括初始化程序,PWM波程序,按键采集程序,信号采集与转换程序;如果从系统表现出的功能来看,又可以分成充电子程序、电源子程序,这两程序都会用到子程序的4个程序。本次设计使用的PWM波是可以掌控开关管的占空比,它的生成是运用了输出在低电平和高电平的转换、延时。即当输出为低电平时,将输出信号放大驱动开关管断开,反之,如果其为高电平时,开关管则会打开。开关管的占空比是通过低电平和高电平的时间的比值即PWM波的占空比来控制。本设计单片机采用AT89C51芯片,由于其内部没有AD转换模块,单片机需外接转换模块,本设计采用ADC0809,模拟信号输入有两路,一路是电压信号,一路是电流信号。ADC0809 在对多路输入的模拟量进行模数转换时采用分时复用的方法,即AD转换器对两路信号轮换采集转换。轮换周期根据模数转换时间和控制的情况设定4.2 基于单片机的太阳能充电器系统的整体程序设计本设计由单片机程序控制来实现整体工作,其工作过程主要为:电路启动初始化,电路功能的选择,输出选择及确定输出,单片机集合计算输出PWM信号,定时采集数据及处理调节PWM信号占空比等,程序整体框架图如下列图所示。开始初始化电池充电电源子程序充电子程序NoYesYes结束图4.1 程序整体框架流程图 基于单片机的太阳能充电器系统的子程序的设计电路启动初始化初始化设置初始运行环境为单片机运行,主要完成以下任务:清理片内RAM,每一个微控制器上电,上电复位将导致单片机操作。在复位操作完成后,单芯片寄存器将被设置为不同的值,该值的一个相当大的部分是未知的。在微控制器的复位完成这些未知的值,正式工作后,会产生不能让程序员掌握的后果,甚至会损坏系统。因此,微控制器运行后,先设置为0,这样的初始参数设置,方便编程人员掌握,以方便系统的工作。设置系统运行所需的参数,设置定时器和中断设置。初始化程序流程图如下列图所示。清片内RAM初始参数设定AD设定定时器设定中断设定返回开始图4.2 初始化程序流程图按键采集程序键盘子程序用于检测开关,是否在有效的开关状态来决定是否启动系统运行。读线、读取、连接到该端口,它的值存储处理后确定相关的缓存。看完端口在其中做了一定的延迟,以排除引起的误动作键晃动。按键子程序结构流程图如图所示。入口读I/O口处理后存入缓存延时Y返回N图按键子程序结构流程图数据采集及模数转换程序数据收集主要是由单片机控制ADC0809来完成,该方案分为数据初始化,发送一个命令到开始转换,等待转换结束,接收数据,处理且存储在缓存中,程序流程如图所示。入口初始化启动转换处理存储返回N0Y转换结束图4.4 数据采集子程序结构流程图数码管显示子程序开机时,先让数码管初始化,通过串口为“0”字形码输出使数码管显示“O”。然后来确认按键是否被按下,如果没有键被按下继续确认。显示子程序时要先初始化串口,以致串口工作会显示在方式0,以便读取显示缓冲区的数据其用来存储数据也就是将被显示出来的数据,然后找到通过字形码查表相应的方式,再将字形码写入串口寄存器SBUF通过串口方式0发送出去显示。子程序是如何显示在缓冲区中的数据转换成相应的字形码呢?具体方法是,从小型字形码到每一位十六进制数到大的顺序固定区域,以便存储在表单中显示出来码表的记忆。当要显示的字符,该表的起始地址到数据指针DPTR寄存器为基地,在显示缓冲区中的数据作为偏移到索引寄存器A,查表“MOVCA, A + DPTR“,在取出相应数字的字形码其是通过累加器A得到的结果。4.3.5 充电子程序的设计充电过程分两阶段进行,第一阶段为预充电,充电电流以0.01CA的小电流进行充电;第二阶段,当充电电压到达3V时转入第二阶段(一般认为三分钟后电池电压大于3V),以0.5CA的电流进行恒流充电方式,。电流降到小于0.01CA时,说明电池已充到额定容量,如果继续充下去,充电电流会慢慢降低到零,电池完全充满4。充电过程中,“充电”指示灯亮;充满时,“充饱”指示灯亮,“充电”指示灯灭,通过按键设置可控制充电时间。充电子程序流程图如图4. 5所示。入口采集电压电流电压大于3V否电压大于4V预充电恒流充电恒压充电是电压大于3V是电压大于4V否O是充电完成结束是否O否否图4.5 充电子程序图电源子程序的设计与传统的 充电器相比,本次设计的太阳能 充电器最大的优点是不仅能够为电池直接充电,也可用作一般直流电源。该系统存在并且可以有3V,3.5V,4V,四种电压输出,这可以用来选择一个按钮作为输出电压。直流输出可直接给 充电,或作为电源等小型电子设备,如MP4。输出电压可以是一个数字显示,以及完善一个过流保护作用,以确保能安全使用的电子产品。电源程序流程图如图所示。入口按键采集输出控制电压检测输出电压判断增大占空比跳过减小占空比小大相等返回图4.6 电源子程序结构流程图学习文档 仅供参考5 仿真与调试5.1 充电电路仿真总所周知buck斩波电路中调整输出电压值的变化是由控制开关管开通与关断时间控制, multisim仿真电路如下列图所示图电压检测仿真图5.2 电流采样处理电路仿真上面提出将电流采样电压是采用LM358电路让其放大到相应倍后再输送到单片机的A/D接口,输入的电压是5V时,输出时的电压则为125V,这样就能看出其电路所具有放大多少倍计算可得21倍的功能。如下列图所示图电流采样处理电路仿真图系统做直流电源使用时电路仿真图Protues软件因为不存在太阳能电池模拟模块,所以在仿真时我们把稳压输出电压值用直流电源电压为5V的来更换,当数字到达3时,表示充电已经完成。按复位键会显示0,点开始键表示开始充电。整体电路仿真图如下列图所示图 整体电路仿真图 系统做充电器使用时仿真结果充电器在运行过程中它会随着充电的进行,充电电压会渐渐升高,指示灯会从0逐渐变成3,此过程可表示充电从开始到结束。仿真结果如下列图所示。图5.4 充电过程仿真图5.5 充电过程仿真图 充电过程仿真学习文档 仅供参考时附录A 整体电路图附录B 整体程序 #include <reg51.h> #define uchar unsigned char#define uint unsigned int sbit P3_3=P33;/开始充电 sbit P3_4=P34; /电压切换 sbit PWM=P35; sbit EOC=P31;/定义ADC0808的控制引脚/ sbit OE=P30; sbit START=P32; sbit P3_6=P36; sbit P3_7=P37; sbit wela=P21; sbit dula=P20; uchar time=0,time1=0; uchar period=40; uchar high=6,high1=12; uchar th0=0; uchar tl0=1; uchar i=0,j=0; uint x,z,n; uchar code dispcode=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f; /uchar n=0; /uchar flag1; /unsigned char volatile g_delay_count; uchar disp4=0,0,0,0; /显示数据,保存段码,四位/=/void delay(uchar z) /100us延时子程序/ while(z-); /=/void display() /定义显示子函数/ 可以使用锁存器实现for(n=0;n<4;n+)P0=0x00;dula=1; P0 =disp1; /显示第一位小数dula=0;wela=1;P0=0xfb;wela=0;delay(2);P0=0x00;dula=1;P0=disp2; /显示第二位小数 dula=0;wela=1;P0=0xfd;wela=0;delay(2);P0=0x00;dula=1; P0 =disp3; /显示第三位小数dula=0;wela=1;P0=0xfe;wela=0;delay(2);P0=0x00;dula=1; P0 =disp0+0x80; dula=0;wela=1;P0=0xf7;wela=0;delay(2);/=/uint ADC0808() /定义ADC0808读入数据子函数,并通过函数返回/ uchar d ; uchar value; START=1;START=0; /启动ADC0808,开始A/D转换/ while(!EOC);/等待ADC0808,转换结束,即EOC为高电平/ OE=1; if(time1<high1) d=P1;/读入数据/ if(high1=16) value=0.4*d; else if(high1=20) value=0.5*d; else if(high1=24) value=0.6*d; else if(high1=28) value=0.7*d; else if(high1=32) value=0.8*d; else if(high1=36) value=0.9*d; /允许ADC0808输出数据 / if(time<high) d=P1;/读入数据/ if(high=8) value=0.2*d; else if(high=10) value=0.25*d; else if(high=12) value=0.3*d; else if(high=14) value=0.35*d; else if(high=16) value=0.4*d; else if(high=18) value=0.45*d; else if(high=20) value=0.5*d; else if(high=22) value=0.55*d; else if(high=24) value=0.6*d; else if(high=26) value=0.65*d; else if(high=28) value=0.7*d; else if(high=30) value=0.75*d; else if(high=32) value=0.75*d; else if(high=34) value=0.8*d; else if(high=36) value=0.85*d; OE=0; /禁止ADC0808数据输出/ return value; /返回A/D转换数据/ /=/void convert(uint x) /定义显示码转换子函数/ uchar code dispcode=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f;/定义09显示码/ x=x*1.0/255*5000; /处理数据使其在05v范围内/ disp3=dispcodex%10;/第三位小数,最低位/ disp2=dispcodex/10%10; /第二位小数/ disp1=dispcodex/100%10; /第一位小数/ disp0=dispcodex/1000; /整数部分/ void timer0() interrupt 1 using 1 TH0=0xff; /*定时器初值重装载*/ TL0=0xf6; time+; if(time=high) /*高电平持续时间结束,变低*/ PWM=th0; /*经过反相器反相*/