以单片机为核心的智能充电器设计与实现项目可行性研究报告_第1页
以单片机为核心的智能充电器设计与实现项目可行性研究报告_第2页
以单片机为核心的智能充电器设计与实现项目可行性研究报告_第3页
以单片机为核心的智能充电器设计与实现项目可行性研究报告_第4页
以单片机为核心的智能充电器设计与实现项目可行性研究报告_第5页
已阅读5页,还剩61页未读 继续免费阅读

下载本文档

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

文档简介

1、 i以 AT89S52单片机为核心的智能充电器设计与实现项目可行性研究报告目录 摘要(.3).关键词(.4.).Abstract(.错误!未定义书签。) TOC o 1-5 h z Key words(.4)前言.绪论.5).1.1课题研究的背景.5.)课题研究的意义 (.6.)1.2课题研究的主要工作(.7.)2充电技术(.7).2种电池的充电特性 .7.)2.1.1镍氢/镍镉电池充电模式(.7.)2.1.2锂离子电池的特点及充电方式 .8 )2.2智能充电器(9).2.3设计的功能模块(.1.0)2.3.1单片机模块(.10 )2.3.2充电过程控制模块(.10)2.3.3充电电压提供模块

2、 (.1.1 )2.3.4 光耦模块(.1.1 )2.3.5电压测试模块(.1.2 )3设计方案充电过程(.1.3)预充(13)快快充(13) TOC o 1-5 h z 满充(13.)断电(14.)报警(.14.)4锂离子电池充电器硬件设计 (.14)4.1单片机电路.14)4.1.1 AT89S52 (16 )4.2充电部分(.1.9)4.4光耦控制部分.22 )5锂离子电池充电器软件设计 (.23)5.1程序功能(.23)5.2程序流程图.23 )5.3程序代码及说明 (.25)附录(.57)致谢(.59.)参考文献 (.60.)摘 要:随着移动电话用户数量的不断增长,相应的电池和电池充

3、电器需求也将会有较大的增加。电子技术的快速发展使得人们对高性能、小尺寸、重量轻的智能电池充电 器的需求也越来越大。目前,使用较多的是镍镉电池(Nied )、镍氢电池(NiMH )和 锂离子电池。由于不同类型电池的充电特性不同,通常对不同类型,甚至不同容量等 级和电压的电池使用不同充电器,实际使用中会带来诸多不便。于是设计一种以AT89S52单片机为核心的智能充电器,较好地解决了上述电池的充电问题。 在设计上, 选择了简洁、高效的系统硬件,包括单片机电路、充电控制电路、电压转换及光耦隔 离电路。实践证明,设计的充电器功耗低、成本低、系统工作稳定可靠,智能化程度 高,具有推广价值。关键词:智能充电

4、器;AT89S52单片机;硬件构成、八 、-刖言现在社会信息化的不断加快,人们对自己使用的各种家电设备、仪表以及工业生产中的数据采集与控制设备要求很高。尤其随着手机在世界范围内的普及,手机电池充电 器的使用越来越广泛的时候人们对高性能、小尺寸、重量轻的智能电池充电器的需求 也越来越大,所以智能充电器有它的巨大发展空间。所谓智能充电器是单片机参与处理和控制的充电器,能根据用户的需要自主选择充电 方式,并且在充电过程中能对被充电电池进行保护从而防止过电压、电流和温度过高 的一种智能化充电器。该智能充电器具有检测锂离子电池的状态;自动切换充电模式 以满足充电电池的充电需要;充电器短路保护功能;充电状

5、态显示的功能。在生活中 更好的维护了充电电池,延长了它的使用寿命。因此,研究智能充电器的设计及推广 其应用,有着非常现实的意义。单片机模块:实现充电器的智能化控制,比如自动断电、充电完成报警提示等。充电过程控制模块:采用专用的电池充电芯片实现对充电过程的控制。充电电压提供模块:采用电压转换芯片将外部+12V电压转换为需要的+5V电压 该电压在送给充电控制模块之前还需经过一个光耦模块。C52程序:单片机控制电池充电芯片实现充电过程的自动化,并根据充电的状态给出 有关的输出指示。本论文从锂离子电池技术特性、充电技术、充电器电路结构、充电器典型电路和电池 保护等方面,多角度地阐述了充电技术发展和应用

6、的智能化。绪论1.1课题研究的背景社会信息化进程的加快对电力、信息系统的安全稳定运行提出了更高的要求。而各种 用电设备都离不开可靠的电源,如果在工作中间电源中断,人们的生产和生活都将受 到不可估量的经济损失。对于由交流供电的用电设备,为了避免出现上述不利情况,所以要设计一种电源系统,它能不间断地为人们的生产和生活提供以安全和操作为目 的可靠的备用电源。为此,以安全和操作为目的的备用电源设备上都使用可充电池。 电池是一种化学电源,是通过能量转换而获得电能的器件。二次电池是可多次反复使 用的电池,它又称为可充电池或蓄电池。二次电池的工作原理:当对二次电池充电时, 电能转变为化学能,实现向负荷供电,

7、伴随吸热过程。普通充电器多采用大电流的快 速充电法,在电池充满后如果不及时结束会使电池发烫,过度的充电也会严重损害电池 的寿命。一些低成本的充电器采用电压比较法,为了防止过充,一般充电到90%就停止大电流快充,接着采用小电流涓流补充充电,这样就使充电时间加长了。好的充电器不但能在短时间内将电量充足,而且对锂电池起到一定维护作用,修复由 于记忆造成的记忆效应。于是设计出的智能充电器是采用单片机控制的,可以检测出 电池充电饱和时发出的电压变化信号,比较精确的停止充电工作,通过单片机对充电 芯片的控制实现充电过程的智能化,以缩短充电时间,延长电池使用寿命。智能充电 器还增加了充电电压的显示,让我们能

8、看到电池的预充、快充、满充充电阶段,从而 加强对电池的维护。1.1.1课题研究的意义此课题研究的对象主要是锂离子电池的充电原理和充电控制。锂离子电池的充电设备需要解决的问题有:通过单片机的控制,简化外围电路的复杂性,增加自动化管理设置,减轻充电过程的 劳动强度和劳动时间,从而使充电器具有更大的灵活性、更高的可靠性和成本低。改善充电控制不合理而造成过充、欠充等问题,提高电池的使用性能和使用寿命。可以进行充电前处理,包括电池充电状态的鉴定和预处理。-需解决充电时间长、效率低等问题。研究课题的意义:掌握锂离子电池的充放电方式和特点,从中找到最佳充电方式及电池管理途径。完善充电设备的适时处理功能和自诊

9、断功能。实现充电器具备强大的功能扩展性,为智能充电器的功能升级提供平台。1.2课题研究的主要工作本课题主要研究锂离子电池的充放电方法,在此基础上进行硬件设计和软件设计,并 通过调试结果对充电控制方法测试验证。为了完成智能充电器的设计,我需做如下工 作:了解锂离子电池的特点和在应用中存在的主要问题从而分析实现电池的充放电方法和智能充电器的实现方法,从而选择合适的充电电池芯片。进行硬件电路的设计,绘制充电电路原理图。进行软件设计,以C语言为开发工具,进行详细设计和编写程序代码。调试硬件和软件电路,验证整个设计。2充电技术2.1 2种电池的充电特性2.1.1镍氢/镍镉电池充电模式这2种镍类电池具有相

10、似的充电特性曲线,因而可以用一样的充电算法。这2种电池的主要充电控制参数为-AV和温度9.对镍氢/镍镉电池由预充电到标准充电转换的判据为:单节电池电压水平0.61V ;电池温度-50oC.电池饱和充电的判据为:电池电压跌落或接近零增长V= 615 mV /节;电池最高温度Omax 50 C;电池温度上升率d B/dt 1.0 C/min。由于温度的变化容易受环境影响,因而实际用于判别充电各阶段的变量主要为V、Omax ,其中对-a的检测需要有足够的A/D分辨率和较高的电流稳定度.-的测量与A/D分辨率、充 电电流的稳定性与电池内阻之间有以下关系:当电池内阻等于50 Q(接近饱和充电)时, 充电

11、电流=1200mA,电流漂移等于5%,单节电池的最高充电电压为1.58V,则此时 电流漂移可能引起的电池电压变化为 3mV。2.1.2锂离子电池的特点及充电方式锂离子电池的正极材料通常由锂的活性化合物组成,常见的正极材料主要成分为LiCo02,负极则是特殊分子结构的碳。充电时,加在电池两级的电势迫使正极化合物释出锂离子,嵌入在负极分子排列呈片层结构的碳中。放电时,锂离子则从片层结构的碳中析出,重新与正极的化合物结合。于是锂离子的移动产生了电流。重量方面:锂离子电池为3.6V,锂离子电池的电压是镍氢、镍镉电池的 3倍。但锂离 子电池因端电压为3.6V,在输出同电池的情况下,单个电池组合时数目可减

12、少 2/3从 而使成型后的电池组重量和体积都减小。自放电率:镍镉电池为15%30%,镍氢电池为25%35%,锂离子电池为2%5%。 镍氢电池的自放电率最大,而锂离子电池的自放电率最小。记忆效率:锂离子电池很少有镍镉电池的记忆效应,记忆效应的原理是结晶化,但在锂电池中几乎不会出现这种反应。锂离子电池在几次充电放电后容量仍然会下降,主 要的原因从分子层里来看,正负极材料本身的变化,正负极上容纳锂离子的空穴结构 会逐渐塌陷,堵塞;从化学角度来看,是正负极材料活性钝化,出现副反应生成稳定 的其他化合物。在物理上还会出现正极材料逐渐剥落等情况,降低了电池中可以自由 在充放电过程中移动的锂离子数目记忆效应

13、一般认为是长期不正确的充电导致的,它可以使电池早衰,使电池无法进行 有效的充电,出现一充就满、一放就完的现象。严格遵循“充足放光”的原则,即在 充电前最好将电池内残余的电量放光,充电时要一次充足,可防止电池出现记忆效应。 对于由于记忆效应而引起容量下降的电池,可以通过一次充足再一次性放光的方法反 复数次,大部分电池都可以得到修复。充电方式:过度充电和过度放电,将对锂离子电池的正负极造成永久的损坏,从分子 层面看,过度放电导致负极碳过度释放出锂离子而使得其片层结构出现塌陷,过度充 电将把太多的锂离子硬塞进负极碳结构里去,而使得其中一些锂离子再也无法释放出 来。这就是锂离子电池为什么通常配有充放电

14、的控制电路的原因。锂离子电池以恒流转恒压方式进行充电。采用 1C充电速率充电至4.1V时,充电器应立即转入恒压充电,充电电流逐渐减小;当电池充足电后,进入涓流充电过程。为避 免过充电或过放电,锂离子电池不仅在内部设有安全机构,充电器也必须采取安全保 护措施,以监测锂离子电池的充放电状态。2.2智能充电器在人们日常工作和生活中,充电器的使用越来越广泛。从随身听到数码相机,从手机 到笔记本电脑,几乎所有用到电池的电器设备都需要用到充电器。充电器为人们的外 出旅行和出差办公提供了极大的方便。随着手机在世界范围内的普及使用,手机电池 充电器的使用也越来越广泛。所谓智能充电器是单片机参与处理和控制,能根

15、据用户的需要自主选择充电方式,并 且在充电过程中能对被充电电池进行保护从而防止过电压、电流和温度过高的一种智 能化充电器。本课题将通过一个典型实例介绍 AT89S52单片机在实现手机电池充电器方面的应用。此次设计所要实现的充电器是一种智能充电器,它在单片机的控制下,具有预充、充 电保护、自动断电、电压显示和充电完成报警提示功能。2.3设计的功能模块2.3.1单片机模块智能的实现需要利用单片机控制,经过分析后单片机芯片可以选择Atmel公司的AT89S52,通过中断控制光耦器件通电和断电。2.3.2充电过程控制模块锂离子电池一般都具有管理芯片和充电控制芯片。其中管理芯片中有一系列的寄存器,用来存

16、储电容容量、温度、ID、充电状态、放电次数等数值。这些数值在使用中会逐 渐变化。充电控制芯片主要控制电池的充电过程。锂离子电池的充电过程分为两个阶段,恒流快充阶段(电池指示灯呈黄色时)和恒压电流递减阶段(电池指示灯呈绿色闪烁)。恒流快充阶段,电池电压逐步升高到电池的标准电压,随后在控制芯片下转入恒压阶段, 电压不再升高以确保不会过充现象,电流则随着电池电量的上升逐步减弱到0,而最终完成充电。电量统计芯片通过记录放电曲线(电压、电流、时间)可以抽样计算出电池的电量。 而锂离子电池在多次使用后,放电曲线是会改变的,如果芯片一直没有机会再次读出 完整的一个放电曲线,其计算出来的电量也就是不准确的。所

17、以我们需要深充放来校 准电池的芯片。定时电容C和充电时间Tchg的关系式满足:C=34.33 XTchg最大充电电流Imax和限流电阻Rset的关系式满足:Imax = 1400/Rset2.3.3充电电压提供模块由于一般家用电压是+220V 交流电压,需要设计一个电压转换电路将 +220V交流电 压转换成+5V直流电压。首先用变压器将 220V交流电压转换成7V交流电压,经过 桥式整流变成直流电压,再利用电压转换芯片 LM7805将7V直流电转换为5V直流 电压。2.3.4光耦模块为了在充满电后能及时关断充电电源,贝嚅要引入一个光耦模块芯片6N137 。6N137光耦合器是一款用于单通道的高

18、速光耦合器,其内部由一个850 nm波长AIGaAs LED和一个集成检测器组成,其检测器由一个光敏二极管、高增益线性运放及一个肖特基钳位的集电极开路的三极管组成。具有温度、电流和电压补偿功能,高的 输入输出隔离,LSTTL/TTL兼容,高速(典型为10MBd),5mA的极小输入电流 工作参数:最大输入电流,低电平:250uA最大输入电流,高电平:15mA最大允许低电平电压(输出高):0.8v最大允许高电平电压:Vcc最大电源电压、输出:5.5V扇出TTL负载):8个(最多)工作温度范围:-40 to +85 典型应用:高速数字开关,马达控制系统和A/D转换等6N137光耦合器的内部结构、管脚

19、如下图所示图1 6N137光耦合器6N137光耦合器的电源管脚旁应有一个 O.luF的去耦电容。在选择电容类型时,应尽 量选择高频特性好的电容器,如陶瓷电容或钽电容,并且尽量靠近6N137光耦合器的 电源管脚;另外,输入使能管脚在芯片内部已有上拉电阻,无需再外接上拉电阻。6N137光耦合器的引脚:第6脚Vo输出电路属于集电极开路电路,必须上拉一个电 阻;第2脚和第3脚之间是一个LED,必须串接一个限流电阻。6N137光耦合器的真值表如下:6N137光耦合器的真值输入“ + ”ENOUTPUT输入“ + ”ENOUTPUT1100010111NC01010NC1表1 6N137光耦合器的真值2.

20、3.5电压测试模块该部分采用AD转换来实现充电电压的现实。采用中断触发,基本原理是将一段时间内的输入模拟电压 Ui和参考电压UR通过两次积分,变换成与输入电压平均值成正比的时间间隔,再变换成正比于输入模拟信号的数字量。把模拟信号转换成数字信号,转换原理为:其中,n为准换后的二进制位数,dn-i do为具体二进制位。Ur为参考电压,Ua为显 示电压。3设计方案充电过程3.1预充在安装好电池之后,接通输入直流电源,当充电其检测到电池时将定时器复位,从而 进入预充过程,在此期间充电器以快充电流的10 %给电池充电,使电压、温度恢复到正常状体,预充电时间由外接电容 C9确定,如果在预充时间内电池电压达

21、到 2.5V, 且电池温度正常,则进入快充过程;如果超过预充时间后,电池电压低于2.5V,则认为电池不可充电,充电器显示电池故障,由单片机发出故障指令,LED指示灯闪烁。3.2快充快充就是以恒定电流对电池充电,恒流充电时,电池的电压缓慢上升,一旦电池电压 达到所设定的终止电压时,恒流充电终止,充电电流快速递减,充电进入满充过程。3.3满充在满充过程中,充电电流逐渐递减,直到充电速率降到设置值以下,或满充超时时, 转入顶端截止充电,顶端截止充电时,充电器以极小的充电电流为电池补充能量,由 于充电器在检测电池电压是否达到终止电压时有充电电流通过电池电阻,尽管在满充和顶端截至充电过程中充电电流逐渐下

22、降,减小了电池内阻和其它串联电阻对电池端 电压的影响,但串联在充电回路中的电阻形成的压降仍然对电池终止电压的检测有影响,一般情况下,满充和顶端截止充电可以延长电池5 %10 %的使用时间。3.4断电当电池充满后,MAX1898芯片的2脚/CHG发送的脉冲电平会由低变高,这将会被 单片机检测到,引起单片机的中断,在中断中,如果判断出充电完毕,则单片机将通 过P2.0 口控制光耦切断L7805向MAX1898供电,从而保证芯片和电池的安全,同 时也减小功耗。3.5报警当电池充满后,MAX1898芯片的2引脚/CHG发送。LED灯会闪烁。但是,为了安 全起见,单片机在检测到充满状态的脉冲后, 不仅会

23、自动切断MAX1898芯片的供电, 而且会通过蜂鸣器报警,提醒用户及时取出电池。4锂离子电池充电器硬件设计4.1单片机电路单片机控制设计,电路如下图:SLCK 2DATA 7plo/tVccPI.l/TPl .2P0.0PL.3PO.lPL4P0.2plsP0.3Pl.6P0.4PL7 atbsssxP0.5P0.5RST/VPDP0.7EA/VPPLED10cii1314151617P3 0/RXDP3.1/TXDP3.2HHT0P3.3HWTIP3 4/TOP3 5/T1P3fmP3.?rRDALE/PROGPSEH30P13Tp20XTAL2XTAL1P2?P2.6F2 5P2.4P2.

24、3P2.2P2.1P2.0a30CLKr0252:START25 A24 B2322 P2J21 P2-0图2单片机控制电路电路说明如下:P3.1脚控制发出报警声提示。P3.0脚输出控制光耦器件,在需要的时候可以及时关断充电电源。外部中断)由充电芯片MAX1898的充电状态输出信号经过反向后触发4.1.1 AT89S52123457891011121314眉宀17UU181920Pt 0/TVccP1.L/TP1.2POOPI.3P0.1P1.4P0.2P1JP03P16P0.4P17 AT&9S5X P05EST/VPDP0.6 P0 7P3 0/RXDEA/VPPP3.irrxD P3 2

25、/INTOALEZPROGP33/INT1PENP3.4/T0P3.smP2.7P3.6/WRP2.6P3.7/KDP25XTAL2P24 P2.3XT AllP2.2GmlP2.1 P20403?36373634323130岁2827262524232221图 3 AT89S52AT89S52是一个低电压,高性能 CMOS 8位单片机,片内含8k bytes的可反复擦写 的Flash只读程序存储器和 256 bytes的随机存取数据存储器(RAM),器件采用 ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置 通用8位中央处理器和Flash存储单元,AT89S

26、52单片机在电子行业中有着广泛的应 用。主要功能特性:兼容MCS51指令系统8kB可反复擦写(大于1000次)Flash ROM32个双向I/O 口256x8bit 内部 RAM 3个16位可编程定时/计数器中断-时钟频率)-24MHz2个串行中断,可编程 UART串行通道2个外部中断源,共8个中断源2个读写中断口线,3级加密位低功耗空闲和掉电模式,软件设置睡眠和唤醒功能有PDIP、PQFP、TQFP及PLCC等几种封装形式,以适应不同产品的需求管脚说明:VCC :供电电压。GND :接地。P0 口: P0 口为一个8位漏级开路双向I/O 口,每脚可吸收8TTL门电流。当P1 口的 管脚第一次

27、写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 口

28、被写“ 1 ”时,其管脚被内部上拉电阻拉高,且作为输入。并因 此作为输入时,P2 口的管脚被外部拉低,将输出电流。这是由于内部上拉的缘故。P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2 口输出地址的 高八位。在给出地址“ 1”时,它利用内部上拉优势,当对外部八位地址数据存储器进 行读写时,P2 口输出其特殊功能寄存器的内容。P2 口在FLASH编程和校验时接收高八位地址信号和控制信号P3 口: P3 口管脚是8个带内部上拉电阻的双向I/O 口,可接收输出4个TTL门电流。 当P3 口写入“ 1”后,它们被内部上拉为高电平,并用作输入。作为输入,由于外部 下拉为低电平,P3

29、 口将输出电流(ILL)这是由于上拉的缘故。P3 口也可作为AT89S52的一些特殊功能口,如下表 2所示:管脚备选功能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(外部数据存储器读选通)表 2 P3 口P3 口同时为闪烁编程和编程校验接收一些控制信号。RST:复位输入。当振荡器复位器件时,要保持 RST脚两个机器周期的高电平时间。ALE/PROG :当访问外部存储器时,地址锁存允许的输出电平用

30、于锁存地址的地位字 节。在FLASH编程期间,此引脚用于输入编程脉冲。在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。因此它可用作对外部输出的脉冲或用于定时目的。然而要注意的是:每当用作外部数据存储器时,将跳过一个ALE脉冲。 如想禁止ALE的输出可在SFR8EH地址上置0。此时,ALE只有在执行MOVX ,MOVC 指令是ALE才起作用。另外,该引脚被略微拉高。如果微处理器在外部执行状态ALE禁止,置位无效EA/VPP :当EA保持低电平时,则在此期间外部程序存储器(OOOOH-FFFFH ),不管 是否有内部程序存储器。注意加密方式 1时,EA将内部锁定为RES

31、ET;当EA端保持 高电平时,此间内部程序存储器。在 FLASH编程期间,此引脚也用于施加 12V编程 电源(VPP )。PSEN:外部程序存储器的选通信号。在由外部程序存储器取指期间,每个机器周期两 次PSEN有效。但在访问外部数据存储器时,这两次有效的 PSEN信号将不出现。XTAL1 :反向振荡放大器的输入及内部时钟工作电路的输入。XTAL2 :来自反向振荡器的输出。4.2充电部分该部分为设计的主核心部分,电路图如下:T120VLIL210CS1000uF/50IODOuFjSQVCIO13!2l2ci.IKil20VlourR2D33YINOFTOKOlGNDQ3TRANS11C4B:

32、4C0N41猛0二殖42VE迥ICON4TOUT?NEZ-220uF07LM1Vin * *571占373O5C7Ifelg:6fflOOlODV14占0-2C?1-1705图4智能充电器的主核心电路4.3充电电压转换,实现电路模块如下:图6充电电压转换电路首先用变压器将220V交流电压转换成7V交流电,经过桥式整流变成直流电,再利用 电压转换芯片LM7805将7V直流电压转换为5V直流电压。4.4光耦控制部分,实现电路如下:图7 6N137 光耦控制电路充电电压显示,该部分其实就是一个 AD转换,原理图如下:5锂离子电池充电器软件设计5.1程序功能单片机AT89S2052和LM7805的智能

33、电池充电器的程序需要完成以下的功能:通过CHG信号引起INTO外中断。在两次中断中使用TO计数,判断是否充电完毕。如果充电完毕,则控制P1.2和P1.3引脚,输出低电平。5.2程序流程图智能充电器的程序流程图简介:外部中断0设为边沿触发;中断*第一个下降沿 * TO开始计数 *第二次下降沿 停止TO计数读取TO计数器 中断返回图9等待外部信号输入图10外部中断程序图11定时程序5.3程序代码及说明#in elude #i nclude /lcd12864相关控制#i nclude #in clude sbit CTRL_UP=P2P;sbit CTRL_DOWN=P2A1;sbit ADCOE

34、=P2A6;sbit ADCSTART=P2A7;sbit ADCALE=P2A5;sbit ADCA=P2A4;sbit ADCB=P2A3;sbit POWERKK=PM4;#defi ne ADCDATE P0sbit KEY仁 P3A7;sbit KEY2=P3A5;sbit KEY3=P3A6;void In itSys(); 初始化系统void In it In t();/初始化外部中断void In itTimer();/ 初始化定时器,串口中断void Sen dSerialData();/ 启动并发送一组串口数据void StartADC();/ 选择通道n ,开始转换voi

35、d ShowAIITime();显示完整的时间un sig ned char g_myPar15,g_CurSe nd;g_t10,g_t11,g_t20,g_t21,g_t30,g_t31,g_n,g_U0,g_U1p,g_U1f,g_U2,g_U3,g _Th,g_Tm,g_Ts;参数顺序bit bSerialSe nding;un sig ned char g_time6;un sig ned char g_Curl n;un sig ned char code g_adda=0,1,1,0,1;unsigned char code g_addb=1,0,0,0,1;un sig ned

36、 char code g_ctrlu=1,1,1,0,0;un sig ned char code g_ctrld=0,1,0,1,1;un sig ned char g_tt10,g_tt11,g_tt20,g_tt21,g_tt30,g_tt31;un sig ned char CutState;bit CurTR0,Curctrlu,Curctrld;float SqrtDuty;un sig ned char g_Perce nt;void mai n()DelayMs(10);Delay4us(10);In itSys();DelayMs(1200);In itLCD();In it

37、LCDshow(0);Initlnt(); 初始化外部中断0InitTimer(); 初始化定时器0,串口中断bSerialSe nding = 0;/ bLi nking = 0;/WriteLCD(0,0 x80);DspNumber(123);StartADC();while(1)if(KEY1=0) 充电TR1 = 0;CutState = 0;POWERKK = 1;In itLCDshow(0);TR0 = 1;g_myPar0=g_tt10;g_myPar1=g_tt11;g_myPar2=g_tt20;g_myPar3=g_tt21;g_myPar4=g_tt10;g_myPa

38、r =g_tt11;/SqrtDuty = sqrt(float)g_myPar1/(g_myPar0+g_myPar1);Duty=g_myPar0*100/(g_myPar0+g_myPar1);TR1 = 1;StartADC();ShowAIITime();DelayMs(100);else if(KEY2=0) TR1 = 0;CutState = 1;POWERKK = 1;In itLCDshow(1);TR0 = 0; g_Curln = 0;CTRL_UP = 1;CTRL_DOWN = 0;TR1 = 1;StartADC();ShowAIITime();DelayMs(1

39、00);放电维护else if(KEY3=0)/TR1 = 0;POWERKK = 0;CutState = 2;In itLCDshow(2);TR0 = 1;g_myParO=Oxff;g_myPar1=0 xf0;g_myPar2=0 xfe;g_myPar3=0 x74;g_myPar4=0 xff;g_myPar =0 xf2;/SqrtDuty = sqrt(float)g_myPar1/(g_myPar0+g_myPar1);Duty=g_myPar0*100/(g_myPar0+g_myPar1);TR1 = 1;StartADC();ShowAIITime();DelayMs

40、(100);/初始化系统void In itSys()un sig ned char i;for(i=0;i6;i+)g_timei=;ADCOE = 1;ADCALE = 0;ADCSTART = 0;POWERKK = 1; g_myPar0=0 xff;/0 x30 g_myPar1=0 x30;g_myPar2=0 xff; g_myPar3=0 x30;/0 x30 g_myPar4=0 xff;g_myPar =0 x30;g_tt10 = 0 xff;g_tt11 = 0 x30;g_tt20 = 0 xff;g_tt21 = 0 x30;/*g_myPar0 = 0 x80;/

41、g_TH1g_myPar1 = 0 x00;/g_TH2g_myPar2 = 0 x00;/g_TH3*/g_myPar =6;SqrtDuty = sqrt(0.5);Duty=g_myPar0*100/(g_myPar0+g_myPar1);/初始化外部中断void In itI nt()IT0 = 1;/ 0/1 低电平/下跳变PX0 = 1;/中断优先级/EX0 = 1;EA = 1;/初始化定时器,串口中断void Ini tTimer()TMOD = 0 x11;/ 使用高4位0/1/2/3 13 位/16位/8位自动重载/双8位TH0 = (65536 - 49235) / 25

42、6;TL0 = (65536 - 49235) % 256;PT0 = 1;TR0 = 1;/开启定时器0ET0 = 1;TH1 = (65536 - 49235) / 256;TL1 = (65536 - 49235) % 256;TR1 = 1;/开启定时器1ET1 = 1;TCLK=1;RCLK=1;TH2=0 xFF; /19200bps 22.1184MHz 的时钟频率TL2=0 xDC;RCAP2H=0 xFF; /方式1和方式3的波特率=fosc/(32-(65535-(RCAP2H,RCAP2L)RCAP2L=0 xDC;TR2=1;/ET2=1;SCON = 0 x50;/串

43、口方式1,允许接收PCON = 0 x00;/关闭波特率加倍PS = 1;/设置串口中断为高优先级ES = 1;/开串口中断/TH1 = 0 xfd;/串口通信使用定时器1,设定波特率9600/TH1 = 0 xf3;/ 串口通信使用定时器1,设定波特率2400EA = 1;/开始发送串口数据void Sen dSerialData()if(!bSerialSe ndi ng)bSerialSe nding = 1;g_CurSe nd = 0;SBUF = g_myParg_CurSe nd;g_CurSe nd+;/开始ADC转换void StartADC()CurTRO = TRO;TR

44、O = 0;g_Curl n=0;ADCA = g_addag_Curl n;ADCB = g_addbg_Curl n;CTRL_UP = g_ctrlug_Curl n;CTRL_DOWN = g_ctrldg_Curl n;Curctrlu = CTRL_UP;Curctrld = CTRL_DOWN;ADCALE = 1;ADCALE = 0;ADCSTART = 1;ADCSTART = 0;EX0 = 1;/倒序转换un sig ned char Reverse( un sig ned char num)un sig ned char i,rtTmp;rtTmp = 0 x00;f

45、or(i=0; i8; i+)rtTmp = 1;return rtTmp;/显示完整的时间void ShowAIITime()WriteLCD(0,0 x98+4);WriteLCD(1,g_time0); 时WriteLCD(1,g_time1);WriteLCD(1,:);WriteLCD(1,g_time2); 分WriteLCD(1,g_time3);WriteLCD(1,:);WriteLCD(1,g_time4);WriteLCD(1,g_time5);/外部中断0服务程序void In t0() in terrupt 0g_myPar7+g_Curl n = ADCDATE;g

46、_Curl n+;if(g_Curl *5)ADCA = g_addag_CurI n;ADCB = g_addbg_CurI n;CTRL_UP = g_ctrlug_Curl n;CTRL_DOWN = g_ctrldg_CurI n;ADCALE = 1;ADCALE = 0;ADCSTART = 1;ADCSTART = 0;elseTR0 = CurTR0;EXO = 0;CTRL_UP = Curctrlu;CTRL_DOWN = Curctrld;/定时器0中断服务程序void TimerO() in terrupt 1static un sig ned char i;stati

47、c bit j;if(j)j = 0;i+;if(ig_myPar6)i = 0;CTRL_UP = 1;CTRL_DOWN = 0;TH0 = g_myPar4;TL0 = g_myPar5;elseCTRL_UP = 1;CTRL_DOWN = 1;TH0 = g_myPar2;TL0 = g_myPar3;elsej = 1;CTRL_UP = 0;CTRL_DOWN = 1;TH0 = g_myParO;TL0 = g_myPar1;/定时器1中断服务程序void Timer1() interrupt 3static un sig ned char i,j;un sig ned cha

48、r temp_data2;un sig ned char prese nce,k;TH1 = (65536 - 60730)/ 256;TL1 = (65536 - 60730) % 256;i+;if(i24)时间显示i=0;g_time5+;g_myPar14+;if(g_time5 0 x39)/ 秒个位g_time 5 = 0 x30;g_time4+;if(g_time4 0 x35)/ 秒十位g_time4 = 0 x30;g_time3+;g_myPar14 = 0;g_myPar13+;if(g_time3 0 x39)/ 分个位g_time3 = 0 x30;g_time2+

49、;if(g_time2 0 x35)/ 分十位g_time2 = 0 x30;g_time1+;g_myPar13 = 0;时个位时十位g_myPar12+;if(g_time1 0 x33)/g_time1 = 0 x30;g_time0+;if(g_time0 0 x39)/g_time0 = 0 x30; g_myPar12=0;/时十位/时个位WriteLCD(0,0 x98+4);WriteLCD(1,g_time0);WriteLCD(1,g_time1); /分十位 WriteLCD(0,0 x98+5);WriteLCD(1,:);WriteLCD(1,g_time2);/分个

50、位WriteLCD(0,0 x98+6);WriteLCD(1,g_time3);/秒十位/秒个位WriteLCD(0,0 x98+7);WriteLCD(1,g_time4);WriteLCD(1,g_time5);/显示充/放电状态j+;switch(j)case 1:WriteLCD(0,0 x98+2);WriteLCD(1,);WriteLCD(1,);WriteLCD(1,);StartADC();break;case 2:WriteLCD(0,0 x98+2);WriteLCD(1,.);break;case 3:WriteLCD(0,0 x98+2);WriteLCD(1,.)

51、;WriteLCD(1,.);break;case 4:WriteLCD(0,0 x98+3);WriteLCD(1,.);j = 0;break;default:j = 0;prese nee = In it_DS18B20();if(prese nce=0)WriteOneChar(0 xCC); /跳过 ROM 匹配操作Delay4us(10);WriteO neChar(0 x44); /启动温度转换prese nee = In it_DS18B20();if(prese nce=0)WriteOneChar(0 xCC); /跳过 ROM 匹配操作Delay4us(10);Write

52、 On eChar(OxBE); / 读取温度寄存器Delay4us(10);temp_data0 = Read On eChar(); / 温度低 8 位Delay4us(10);temp_data1 = Read On eChar(); / 温度高 8 位if(prese nce=0)if(temp_data1=0 xff) prese nce=1;if(g_Curln = 5)for(k=0;k100) g_Perce nt = 0;if(CutState=0)充电模式g_tt10 = (65536-5*(105-g_Perce nt)/256;g_tt11 = (65536-5*(10

53、5-g_Perce nt)%256; g_tt20 = (65536-5*(5+g_Perce nt)/256;g_tt21 = (65536-5*(5+g_Perce nt)%256;g_myPar0=g_tt10;g_myPar1=g_tt11;g_myPar2=g_tt20;g_myPar3=g_tt21;g_myPar4=g_tt10;g_myPar =g_tt11;SqrtDuty = sqrt(1-g_Perce nt/100.0);Duty=g_myPar0*100/(g_myPar0+g_myPar1);g_Curln = 0;if(CutState=2)维护WriteLCD(

54、0,0 x90);DspNumber(g_myPar7+2*156);电池电压WriteLCD(1,V);/g_Perce nt = g_myPar4+2*1.56-48;DspPerce nt(g_Perce nt);if(prese nce=0)WriteLCD(0,0 x90+5);DspTemp(temp_data1,temp_data0);else if(CutState=1)放电/ 显示参数 g_U0,g_U1p,g_U1f,g_U2,g_U3, WriteLCD(0,0 x90);DspNumber(g_myPar7+2*156);电池电压WriteLCD(1,V);g_Perc

55、e nt = g_myPar4+2*1.56-48;DspPerce nt(g_Perce nt);WriteLCD(0,0 x88+4);放电电流WriteLCD(1,:);DspNumber(g_myPar7+2-g_myPar7)*31);if(prese nce=0)WriteLCD(0,0 x90+5);DspTemp(temp_data1,temp_data0);else/充电/ 显示参数 g_U0,g_U1p,g_U1f,g_U2,g_U3, WriteLCD(0,0 x80);DspNumber(g_myPar7+2*156);电池电压WriteLCD(1,V);g_Perce

56、 nt = g_myPar4+2*1.56-48;DspPerce nt(g_Perce nt);WriteLCD(0,0 x90+4);充电电流WriteLCD(1,:);DspNumber(g_myPar7+4-g_myPar7+3)*78)*SqrtDuty);WriteLCD(0,0 x88+4);WriteLCD(1,:);DspNumber(g_myPar7+4*156*SqrtDuty);充电电压if(prese nce=0)WriteLCD(0,0 x80+5);DspTemp(temp_data1,temp_data0);/串口中断服务程序void Serial() in t

57、errupt 4 if(RI)RI = 0;bSerialSe nding = 0;if(SBUF = 5)SBUF = 6;else if(SBUF = 6)Sen dSerialData();elseSBUF = 0 xff;elseTI = 0;if(bSerialSe nding)if(g_CurSe nd15)SBUF = g_myParg_CurSe nd;g_CurSe nd+;elsebSerialSe nding = 0;18B20程序:#i nclude un sig ned char data temp_data2;/DS18B20初始化un sig ned char I

58、n it_DS18B20(void)bit prese nee;DQ = 0; /单片机发出低电平复位信号Delay4us(120); / 延时 480usDQ = 1; /释放数据线Delay4us(16); / 延时 64us,等待应答 prese nee = DQ; / 接收应答信号 Delay4us(15); / 延时 45us Delay4us(100); /延时400us,等待数据线出现高电平DQ = 1; /释放数据线return (presenee); / 返回 presenee 信号/读一个字节数据un sig ned char Read On eChar(void)un s

59、ig ned char i = 0;un sig ned char dat = 0;DQ = 1;for (i = 0; i = 1;DQ = 1; /释放总线_nop_();_nop_();if (DQ)/读总线电平状态dat |= 0 x80;/最高位置1DQ = 1; /释放总线,表示此次读操作完成return (dat); /返回所读得数据/写一个字节数据void Write On eChar( un sig ned char dat)un sig ned char i = 0;for (i = 0; i 8; i+)/ 一个字节8个bitDQ = 0; /给低脉冲信号Delay4us

60、(1); / 延时 = 1; /数据右移一位,最低位移入CYDQ = CY; / 写 1bit 数据Delay4us(15); / 延时 45usDQ = 1; /释放总线,表示此次写操作完成/*/温度数据转换子程序void Temperature_c on ver()un sig ned char minus = 0;WriteLCD(0,0 x88); for(i=0;i 127)/温度为负值temp_dataO = (temp_dataO) + 1; /取反加一,将补码变成原码if (temp_dataO) = Oxff)temp_data1 = (temp_data1) + 1;els

温馨提示

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

最新文档

评论

0/150

提交评论