版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、以 AT89S52 单片机为核心的智能充电器设计与实现项目可行性研究报告目录摘要(.4.).关键词(.4).Abstract(.错误!未定义书签。) TOC o 1-5 h z Key words(.4)前言.5.).绪论.5.).1.1课题研究的背景.6.)课题研究的意义 .6.)1.2课题研究的主要工作 C7)2充电技术(.7).2种电池的充电特性.8)2.1.1镍氢/镍镉电池充电模式(.8.)2.1.2锂离子电池的特点及充电方式 (.8)2.2智能充电器(.10 )2.3设计的功能模块(.1.0)2.3.1单片机模块(.10 )2.3.2充电过程控制模块 (.10)2.3.3充电电压提供
2、模块 (.11 )2.3.4光耦模块(.11 )2.3.5电压测试模块(.13)3设计方案充电过程(.1.3)预充(.13.)快充(.14.)满充.14.)断电.14.)报警.14.)4锂离子电池充电器硬件设计 (.1.5)4.1单片机电路.15 )AT89S52 .16 )4.2充电部分(.1.9.) TOC o 1-5 h z 4.4光耦控制部分(22 )5锂离子电池充电器软件设计 (.23)5.1程序功能(23)5.2程序流程图.23 )5.3程序代码及说明 .25)附录.59.)致谢.61.)参考文献.62.)摘 要: 随着移动电话用户数量的不断增长,相应的电池和电池充电器需求也将会有
3、较 大的增加。电子技术的快速发展使得人们对高性能、小尺寸、重量轻的智能电池充电器 的需求也越来越大。目前,使用较多的是镍镉电池( Nicd )、镍氢电池( NiMH )和锂 离子电池。由于不同类型电池的充电特性不同,通常对不同类型,甚至不同容量等级和 电压的电池使用不同充电器,实际使用中会带来诸多不便。于是设计一种以 AT89S52 单片机为核心的智能充电器,较好地解决了上述电池的充电问题。在设计上,选择了简 洁、高效的系统硬件,包括单片机电路、充电控制电路、电压转换及光耦隔离电路。实 践证明,设计的充电器功耗低、成本低、系统工作稳定可靠,智能化程度高,具有推广 价值。关键词: 智能充电器;
4、AT89S52 单片机;硬件构成、尸 、-前言现在社会信息化的不断加快,人们对自己使用的各种家电设备、仪表以及工业生产中的 数据采集与控制设备要求很高。尤其随着手机在世界范围内的普及,手机电池充电器的 使用越来越广泛的时候人们对高性能、小尺寸、重量轻的智能电池充电器的需求也越来 越大,所以智能充电器有它的巨大发展空间。所谓智能充电器是单片机参与处理和控制的充电器, 能根据用户的需要自主选择充电方 式,并且在充电过程中能对被充电电池进行保护从而防止过电压、电流和温度过高的一 种智能化充电器。该智能充电器具有检测锂离子电池的状态;自动切换充电模式以满足 充电电池的充电需要;充电器短路保护功能;充电
5、状态显示的功能。在生活中更好的维 护了充电电池,延长了它的使用寿命。因此,研究智能充电器的设计及推广其应用,有 着非常现实的意义。单片机模块:实现充电器的智能化控制,比如自动断电、充电完成报警提示等。充电过程控制模块:采用专用的电池充电芯片实现对充电过程的控制。充电电压提供模块:采用电压转换芯片将外部+12V电压转换为需要的+5V电压 该电压在送给充电控制模块之前还需经过一个光耦模块。C52 程序:单片机控制电池充电芯片实现充电过程的自动化,并根据充电的状态给出有关的输出指示。本论文从锂离子电池技术特性、充电技术、充电器电路结构、充电器典型电路和电池保 护等方面,多角度地阐述了充电技术发展和应
6、用的智能化。绪论课题研究的背景 社会信息化进程的加快对电力、信息系统的安全稳定运行提出了更高的要求。而各种用电设备都离不开可靠的电源,如果在工作中间电源中断,人们的生产和生活都将受到不 可估量的经济损失。对于由交流供电的用电设备,为了避免出现上述不利情况,所以要 设计一种电源系统, 它能不间断地为人们的生产和生活提供以安全和操作为目的可靠的 备用电源。为此,以安全和操作为目的的备用电源设备上都使用可充电池。电池是一种化学电源,是通过能量转换而获得电能的器件。二次电池是可多次反复使用的电池,它又称为可充电池或蓄电池。二次电池的工作原理:当对二次电池充电时,电能转变为化学能,实现向负荷供电,伴随吸
7、热过程。普通充电器多采用大电流的快速充 电法,在电池充满后如果不及时结束会使电池发烫,过度的充电也会严重损害电池的寿 命。一些低成本的充电器采用电压比较法,为了防止过充,一般充电到90% 就停止大电流快充,接着采用小电流涓流补充充电,这样就使充电时间加长了。好的充电器不但能在短时间内将电量充足,而且对锂电池起到一定维护作用,修复由于记忆造成的记忆效应。于是设计出的智能充电器是采用单片机控制的,可以检测出电池充电饱和时发出的电压变化信号,比较精确的停止充电工作,通过单片机对充电芯片的控制实现充电过程的智能化,以缩短充电时间,延长电池使用寿命。智能充电器还增加了充电电压的显示,让我们能看到电池的预
8、充、快充、满充充电阶段,从而加强对电池 的维护。课题研究的意义此课题研究的对象主要是锂离子电池的充电原理和充电控制。 锂离子电池的充电设备需 要解决的问题有 :通过单片机的控制,简化外围电路的复杂性, 增加自动化管理设置, 减轻充电过程的劳 动强度和劳动时间,从而使充电器具有更大的灵活性、更高的可靠性和成本低。改善充电控制不合理而造成过充、欠充等问题,提高电池的使用性能和使用寿命。可以进行充电前处理,包括电池充电状态的鉴定和预处理。需解决充电时间长、效率低等问题。研究课题的意义:掌握锂离子电池的充放电方式和特点,从中找到最佳充电方式及电池管理途径。完善充电设备的适时处理功能和自诊断功能。实现充
9、电器具备强大的功能扩展性,为智能充电器的功能升级提供平台。课题研究的主要工作本课题主要研究锂离子电池的充放电方法,在此基础上进行硬件设计和软件设计,并通过调试结果对充电控制方法测试验证。为了完成智能充电器的设计,我需做如下工作:了解锂离子电池的特点和在应用中存在的主要问题从而分析实现电池的充放电方法和智能充电器的实现方法,从而选择合适的充电电池芯片。进行硬件电路的设计,绘制充电电路原理图。进行软件设计,以 C 语言为开发工具,进行详细设计和编写程序代码。调试硬件和软件电路,验证整个设计。2 充电技术2 种电池的充电特性镍氢/ 镍镉电池充电模式这2 种镍类电池具有相似的充电特性曲线, 因而可以用
10、一样的充电算法。 这2种电池的主要充电控制参数为-AV和温度9.对镍氢/镍镉电池由预充电到标准充电转换的判据为:单节电池电压水平0.61V ;电池温度-50C.电池饱和充电的判据为:电池电压跌落或接近零增长 -AV= 615 mV /节;电池 最高温度9max 50 C;电池温度上升率 d 9/dt 1.0 C/min。由于温度的变化容易 受环境影响,因而实际用于判别充电各阶段的变量主要为 V、9max ,其中对V的检测 需要有足够的 A/D 分辨率和较高的电流稳定度. -V 的测量与 A/D 分辨率、充电电 流的稳定性与电池内阻之间有以下关系:当电池内阻等于50 Q(接近饱和充电)时,充电电
11、 流=1200mA,电流漂移等于5%,单节电池的最高充电电压为 1.58V,则此时电流漂 移可能引起的电池电压变化为 3 mV 。锂离子电池的特点及充电方式锂离子电池的正极材料通常由锂的活性化合物组成,常见的正极材料主要成分为LiCo02 ,负极则是特殊分子结构的碳。 充电时, 加在电池两级的电势迫使正极化合物释 出锂离子,嵌入在负极分子排列呈片层结构的碳中。放电时,锂离子则从片层结构的碳 中析出,重新与正极的化合物结合。于是锂离子的移动产生了电流。重量方面:锂离子电池为 3.6V,锂离子电池的电压是镍氢、镍镉电池的 3倍。但锂离 子电池因端电压为3.6V,在输出同电池的情况下,单个电池组合时
12、数目可减少 2/3从而使成型后的电池组重量和体积都减小 自放电率:镍镉电池为15%30% ,镍氢电池为25%35% ,锂离子电池为2%5% 镍氢电池的自放电率最大,而锂离子电池的自放电率最小。记忆效率:锂离子电池很少有镍镉电池的记忆效应,记忆效应的原理是结晶化,但在锂 电池中几乎不会出现这种反应。锂离子电池在几次充电放电后容量仍然会下降,主要的 原因从分子层里来看,正负极材料本身的变化,正负极上容纳锂离子的空穴结构会逐渐 塌陷,堵塞;从化学角度来看,是正负极材料活性钝化,出现副反应生成稳定的其他化 合物。在物理上还会出现正极材料逐渐剥落等情况,降低了电池中可以自由在充放电过 程中移动的锂离子数
13、目。记忆效应一般认为是长期不正确的充电导致的,它可以使电池早衰,使电池无法进行有 效的充电,出现一充就满、一放就完的现象。严格遵循“充足放光”的原则,即在充电 前最好将电池内残余的电量放光,充电时要一次充足,可防止电池出现记忆效应。对于 由于记忆效应而引起容量下降的电池,可以通过一次充足再一次性放光的方法反复数 次,大部分电池都可以得到修复。充电方式:过度充电和过度放电,将对锂离子电池的正负极造成永久的损坏,从分子层面看,过度放电导致负极碳过度释放出锂离子而使得其片层结构出现塌陷,过度充电将 把太多的锂离子硬塞进负极碳结构里去,而使得其中一些锂离子再也无法释放出来。这 就是锂离子电池为什么通常
14、配有充放电的控制电路的原因。锂离子电池以恒流转恒压方式进行充电。采用 1C 充电速率充电至 4.1V 时,充电器应立即转入恒压充电,充电电流逐渐减小;当电池充足电后,进入涓流充电过程。为避免过充电或过放电,锂离子电池不仅在内部设有安全机构,充电器也必须采取安全保护措 施,以监测锂离子电池的充放电状态智能充电器 在人们日常工作和生活中,充电器的使用越来越广泛。从随身听到数码相机,从手机到 笔记本电脑,几乎所有用到电池的电器设备都需要用到充电器。充电器为人们的外出旅 行和出差办公提供了极大的方便。随着手机在世界范围内的普及使用,手机电池充电器 的使用也越来越广泛。所谓智能充电器是单片机参与处理和控
15、制,能根据用户的需要自主选择充电方式,并且 在充电过程中能对被充电电池进行保护从而防止过电压、 电流和温度过高的一种智能化 充电器。本课题将通过一个典型实例介绍 AT89S52 单片机在实现手机电池充电器方面的应用。 此次设计所要实现的充电器是一种智能充电器,它在单片机的控制下,具有预充、充电 保护、自动断电、电压显示和充电完成报警提示功能。设计的功能模块2.3.1 单片机模块智能的实现需要利用单片机控制,经过分析后单片机芯片可以选择 Atmel 公司的AT89S52 ,通过中断控制光耦器件通电和断电。充电过程控制模块锂离子电池一般都具有管理芯片和充电控制芯片。其中管理芯片中有一系列的寄存器,
16、 用来存储电容容量、温度、 ID 、充电状态、放电次数等数值。这些数值在使用中会逐渐 变化。充电控制芯片主要控制电池的充电过程。锂离子电池的充电过程分为两个阶段,恒流快充阶段(电池指示灯呈黄色时)和恒压电流递减阶段(电池指示灯呈绿色闪烁)恒流快充阶段,电池电压逐步升高到电池的标准电压,随后在控制芯片下转入恒压阶段,电 压不再升高以确保不会过充现象,电流则随着电池电量的上升逐步减弱到 0 ,而最终完 成充电。电量统计芯片通过记录放电曲线(电压、电流、时间)可以抽样计算出电池的电量。而 锂离子电池在多次使用后,放电曲线是会改变的,如果芯片一直没有机会再次读出完整 的一个放电曲线,其计算出来的电量也
17、就是不准确的。所以我们需要深充放来校准电池 的芯片。定时电容C和充电时间Tchg的关系式满足:C=34.33 XTchg最大充电电流Imax和限流电阻Rset的关系式满足:Imax = 1400/Rset充电电压提供模块由于一般家用电压是 +220V 交流电压,需要设计一个电压转换电路将 +220V 交流电压 转换成 +5V 直流电压。首先用变压器将 220V 交流电压转换成 7V 交流电压,经过桥式 整流变成直流电压,再利用电压转换芯片 LM7805 将 7V 直流电转换为 5V 直流电压。光耦模块为了在充满电后能及时关断充电电源,则需要引入一个光耦模块芯片6N137 。6N137 光耦合器
18、是一款用于单通道的高速光耦合器,其内部由一个 850 nm 波长 AlGaAs LED 和一个集成检测器组成,其检测器由一个光敏二极管、高增益线性运放及 一个肖特基钳位的集电极开路的三极管组成。具有温度、电流和电压补偿功能,高的输 入输出隔离, LSTTL/TTL 兼容,高速 (典型为 10MBd) ,5mA 的极小输入电流。工作参数:-最大输入电流,低电平:250uA-最大输入电流,高电平:15mA最大允许低电平电压(输出高):0.8v最大允许高电平电压:Vcc 最大电源电压、输出:5.5V扇出TTL负载):8个(最多)工作温度范围:-40 to +85 典型应用:高速数字开关,马达控制系统
19、和A/D转换等6N137光耦合器的内部结构、管脚如下图所示图1 6N137光耦合器6N137光耦合器的电源管脚旁应有一个 0.1uF的去耦电容。在选择电容类型时,应尽 量选择高频特性好的电容器,如陶瓷电容或钽电容,并且尽量靠近6N137光耦合器的电源管脚;另外,输入使能管脚在芯片内部已有上拉电阻,无需再外接上拉电阻。6N137光耦合器的引脚:第6脚Vo输出电路属于集电极开路电路,必须上拉一个电阻;第2脚和第3脚之间是一个LED,必须串接一个限流电阻6N137光耦合器的真值表如下:6N137光耦合器的真值输入“ + ”ENOUTPUT输入“ + ”ENOUTPUT1100010111NC0101
20、0NC1表1 6N137光耦合器的真值2.3.5电压测试模块该部分采用AD转换来实现充电电压的现实。采用中断触发,基本原理是将一段时间内的输入模拟电压 Ui和参考电压UR通过两次积分,变换成与输入电压平均值成正比的 时间间隔,再变换成正比于输入模拟信号的数字量。把模拟信号转换成数字信号,转换原理为:仏和门2 +仏2 +好+血 2)其中,n为准换后的二进制位数,dn-i do为具体二进制位。Ur为参考电压,Ua为显 示电压。3设计方案充电过程3.1预充在安装好电池之后,接通输入直流电源,当充电其检测到电池时将定时器复位,从而进入预充过程,在此期间充电器以快充电流的10 %给电池充电,使电压、温度
21、恢复到正 常状体,预充电时间由外接电容 C9确定,如果在预充时间内电池电压达到 2.5V,且电 池温度正常,则进入快充过程;如果超过预充时间后,电池电压低于 2.5V ,则认为电 池不可充电,充电器显示电池故障,由单片机发出故障指令, LED 指示灯闪烁。快充快充就是以恒定电流对电池充电,恒流充电时,电池的电压缓慢上升,一旦电池电压达 到所设定的终止电压时,恒流充电终止,充电电流快速递减,充电进入满充过程。满充在满充过程中,充电电流逐渐递减,直到充电速率降到设置值以下,或满充超时时,转 入顶端截止充电,顶端截止充电时,充电器以极小的充电电流为电池补充能量,由于充 电器在检测电池电压是否达到终止
22、电压时有充电电流通过电池电阻, 尽管在满充和顶端 截至充电过程中充电电流逐渐下降, 减小了电池内阻和其它串联电阻对电池端电压的影 响,但串联在充电回路中的电阻形成的压降仍然对电池终止电压的检测有影响,一般情 况下,满充和顶端截止充电可以延长电池 5 %10 %的使用时间。断电当电池充满后,MAX1898芯片的2脚/CHG发送的脉冲电平会由低变高,这将会被单 片机检测到,引起单片机的中断,在中断中,如果判断出充电完毕,则单片机将通过 P2.O 口控制光耦切断 L7805 向 MAX1898 供电, 从而保证芯片和电池的安全, 同时也 减小功耗。报警 当电池充满后,MAX1898芯片的2引脚/CH
23、G发送。LED灯会闪烁。但是,为了安全起见,单片机在检测到充满状态的脉冲后, 不仅会自动切断MAX1898芯片的供电,而 且会通过蜂鸣器报警,提醒用户及时取出电池。4锂离子电池充电器硬件设计4.1单片机电路单片机控制设计,电路如下图:1U1114*,*SID 31516131134M :2DREST SLCK DATAC1230PRE90 1DP1.0/TVccPI.1/TP1.2P0.0Pi 3PO.lPl 4P0.2P1JP0.3Pl.5P0.4PL 7 ATftSSXP0.5P0.5RST/VPDP0.7EA/VPPLEDP3.0/KCD P3.1/TXDP3.2/INT0P3.3/IN
24、TI 卩王盯巩 P3 5/T1 巧石吨 P3.7/WALE/PROGPSENXTAL2XTAL1P2-?P2肓F2 5P2JP2.3P2.2P2.1P2.023 START27 0EATS9S2图2单片机控制电路电路说明如下:P3.1脚控制发出报警声提示。P3.0脚输出控制光耦器件,在需要的时候可以及时关断充电电源-外部中断0由充电芯片MAX1898的充电状态输出信号经过反向后触发4.1.1 AT89S52I1234578910111213TS14151617UU1819202piorrVccP1.1ZTPl .2POOPl.3P0.1Pl.4P02Pl 5P0.3Pl 6P04P1? ATB
25、9S5X P05RST/VPDP0.6P07P3 0RXDEA/7PPP3.1/TXD P3.2HHT0P3.3/INTTPSENP3.4/T0P2.7P3 6/WRPN&P3.7/KDP25XTAL2P2.4P23XT ALLP22GidP2 1 P2040393637363534:331300“茅2E27262524232221图 3 AT89S52AT89S52是一个低电压,高性能CMOS 8位单片机,片内含8k bytes的可反复擦写的Flash只读程序存储器和256 bytes的随机存取数据存储器(RAM ),器件采用ATMEL 公司的高密度、非易失性存储技术生产,兼容标准 MCS-
26、51指令系统,片内置通用8 位中央处理器和Flash存储单元,AT89S52单片机在电子行业中有着广泛的应用。主要功能特性:兼容MCS51指令系统8kB可反复擦写(大于1000次)Flash ROM32个双向I/O 口256x8bit 内部 RAM3个16位可编程定时/计数器中断-时钟频率0-24MHz2个串行中断,可编程 UART串行通道2个外部中断源,共8个中断源2个读写中断口线,3级加密位低功耗空闲和掉电模式,软件设置睡眠和唤醒功能件DIP、PQFP、TQFP及PLCC等几种封装形式,以适应不同产品的需求管脚说明:VCC :供电电压。GND :接地。P0 口: P0 口为一个8位漏级开路
27、双向I/O 口,每脚可吸收8TTL门电流。当P1 口的 管脚第一次写 1 时,被定义为高阻输入。 P0 能够用于外部程序数据存储器,它可以被 定义为数据 /地址的第八位。在 FIASH 编程时, P0 口作为原码输入口,当 FIASH 进行 校验时, P0 输出原码,此时 P0 外部必须被拉高。P1 口: P1 口是一个内部提供上拉电阻的8位双向I/O 口,P1 口缓冲器能接收输出4TTL 门电流。 P1 口管脚写入 1 后,被内部上拉为高,可用作输入, P1 口被外部下拉为低电 平时,将输出电流,这是由于内部上拉的缘故。在 FLASH 编程和校验时, P1 口作为第 八位地址接收。P2 口:
28、 P2 口为一个内部上拉电阻的 8 位双向 I/O 口, P2 口缓冲器可接收,输出 4个TTL门电流,当P2 口被写“ 1”时,其管脚被内部上拉电阻拉高,且作为输入。并因此 作为输入时,P2 口的管脚被外部拉低,将输出电流。这是由于内部上拉的缘故。P2 口当用于外部程序存储器或 16 位地址外部数据存储器进行存取时, P2 口输出地址的高八 位。在给出地址“ 1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读 写时,P2 口输出其特殊功能寄存器的内容。P2 口在FLASH编程和校验时接收高八位 地址信号和控制信号。P3 口: P3 口管脚是8个带内部上拉电阻的双向I/O 口,可接收
29、输出4个TTL门电流。 当P3 口写入“1”后,它们被内部上拉为高电平,并用作输入。作为输入,由于外部下 拉为低电平,P3 口将输出电流(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:复位输入。当振
30、荡器复位器件时,要保持 RST脚两个机器周期的高电平时间。ALE/PROG :当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。在FLASH编程期间,此引脚用于输入编程脉冲。在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的 1/6。因此它可用作对外部输出的脉冲或用于定时目的。然而要注意的是:每当用作外部数据存储器时,将跳过一个 ALE脉冲。如想禁 止ALE的输出可在SFR8EH地址上置0。此时, ALE只有在执行 MOVX , MOVC指令是ALE才起作用。另外,该引脚被略微拉高。如果微处理器在外部执行状态ALE禁止,置位无效。EA/VPP :当EA保持低电
31、平时,则在此期间外部程序存储器(0000H-FFFFH),不管 是否有内部程序存储器。注意加密方式 1时,EA将内部锁定为RESET;当EA端保持 高电平时,此间内部程序存储器。在 FLASH编程期间,此引脚也用于施加12V编程电 源(VPP)。PSEN :外部程序存储器的选通信号。在由外部程序存储器取指期间,上个机器周期两次PSEN有效。但在访问外部数据存储器时,这两次有效的PSEN信号将不出现。XTAL1 :反向振荡放大器的输入及内部时钟工作电路的输入。XTAL2 :来自反向振荡器的输出。4.2充电部分该部分为设计的主核心部分,电路图如下:LIIO5ViCV)our3T2VIMGNDC7Q
32、3TRANS1C4J3104220V4R2 UKru.IKaio.皿则3oT110二 5 二購湎M8tra:0N4OPTOIOlTOUT7SL0iC7J?HZ20V RKC 核售L27M!广心=TFT kkcw I I ;JAcaL 上血 -220uF/5(iV 十 23h3I2V御(J75OV门C1dlIJ +i 42V18F1二F,-1A22眩时R24LJ*5V2图4智能充电器的主核心电路4.3充电电压转换,实现电路模块如下:LM1LI3400V/6AOVFlour 40ovtm?12378LQ5C7TKA1I51】KCC17luFIIrioVINTOUTGND亡 9 6.3TL10Hl
33、10DOuF/50VLM7B05CTHZftOPTOEOlR24J1图6充电电压转换电路首先用变压器将220V交流电压转换成7V交流电,经过桥式整流变成直流电,再利用 电压转换芯片LM7805将7V直流电压转换为5V直流电压4.4光耦控制部分,实现电路如下:图7 6N137 光耦控制电路充电电压显示,该部分其实就是一个 AD转换,原理图如下:图85锂离子电池充电器软件设计 5.1程序功能单片机AT89S2052和LM7805的智能电池充电器的程序需要完成以下的功能:通过CHG信号引起INTO外中断。在两次中断中使用TO计数,判断是否充电完毕。如果充电完毕,则控制P1.2和P1.3引脚,输出低电
34、平。5.2程序流程图智能充电器的程序流程图简介:外部中断0设为边沿触发;中断*第一个下降沿 TO开始计数 第二次下降沿 *停止TO计数读取TO 计数器 中断返回图9等待外部信号输入图10外部中断程序图11定时程序5.3程序代码及说明#in elude 相关控制#in elude /lcd12864#i nclude #in clude sbit CTRL_UP=P2P;sbit CTRL_DOWN=P2A1;sbit ADCOE=P2A6;sbit ADCSTART=P2T;sbit ADCALE=P2A5;sbit ADCA=P2A4;sbit ADCB=P2A3;sbit POWERKK=
35、P1A4;#define ADCDATE P0sbit KEY1=P3A7;sbit KEY2=P3A5;sbit KEY3=P3A6;void InitSys();/ 初始化系统void InitInt();/ 初始化外部中断void InitTimer();/ 初始化定时器,串口中断void SendSerialData();/ 启动并发送一组串口数据void StartADC(); 选择通道n,开始转换void ShowAllTime();/ 显示完整的时间unsigned char g_myPar15,g_CurSend;/g_t10,g_t11,g_t20,g_t21,g_t30,g
36、_t31,g_n,g_U0,g_U1p,g_U1f,g_U2,g_U3,g_Th,g_Tm,g_Ts; 参数顺序bit bSerialSending;unsigned char g_time6;unsigned char g_CurIn;unsigned char code g_adda=0,1,1,0,1;unsigned char code g_addb=1,0,0,0,1; unsigned char code g_ctrlu=1,1,1,0,0; unsigned char code g_ctrld=0,1,0,1,1;unsigned char g_tt10,g_tt11,g_tt2
37、0,g_tt21,g_tt30,g_tt31; unsigned char CutState;bit CurTR0,Curctrlu,Curctrld;float SqrtDuty;unsigned char g_Percent;void main()/DelayMs(10); /Delay4us(10);InitSys();DelayMs(1200);InitLCD();InitLCDshow(0);InitInt();/ 初始化外部中断 0InitTimer();/ 初始化定时器 0 ,串口中断 bSerialSending = 0;/ bLinking = 0; /WriteLCD(0,
38、0 x80);/DspNumber(123);StartADC();while(1)if(KEY1=0)/ 充电TR1 = 0;CutState = 0;POWERKK = 1;InitLCDshow(0);TR0 = 1;g_myPar0=g_tt10;g_myPar1=g_tt11;g_myPar2=g_tt20;g_myPar3=g_tt21;g_myPar4=g_tt10;g_myPar5=g_tt11;/SqrtDuty = sqrt(float)g_myPar1/(g_myPar0+g_myPar1);/Duty=g_myPar0*100/(g_myPar0+g_myPar1);T
39、R1 = 1;StartADC();ShowAllTime();DelayMs(100);else if(KEY2=0)/ TR1 = 0;CutState = 1;POWERKK = 1;InitLCDshow(1);TR0 = 0; g_CurIn = 0;CTRL_UP = 1;CTRL_DOWN = 0;TR1 = 1;StartADC();ShowAllTime();DelayMs(100);else if(KEY3=0)/ TR1 = 0;POWERKK = 0;CutState = 2;放电维护InitLCDshow(2);TR0 = 1;g_myPar0=0 xff;g_myP
40、ar1=0 xf0;g_myPar2=0 xfe;g_myPar3=0 x74;g_myPar4=0 xff;g_myPar5=0 xf2;/SqrtDuty = sqrt(float)g_myPar1/(g_myPar0+g_myPar1);/Duty=g_myPar0*100/(g_myPar0+g_myPar1);TR1 = 1;StartADC();ShowAllTime();DelayMs(100);/ 初始化系统void InitSys()unsigned char i;for(i=0;i6;i+)g_timei =;ADCOE = 1;ADCALE = 0;ADCSTART =
41、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_myPar5=0 x30;g_tt10 = 0 xff;g_tt11 = 0 x30;g_tt20 = 0 xff;g_tt21 = 0 x30;/*g_myPar0 = 0 x80;/g_TH1g_myPar1 = 0 x00;/g_TH2g_myPar2 = 0 x00;/g_TH3*/ g_myPar6 = 6;SqrtDuty = sqrt(0.5);/Duty=g_myPa
42、r0*100/(g_myPar0+g_myPar1);/ 初始化外部中断void InitInt()IT0 = 1;/ 0/1 低电平 /下跳变PX0 = 1;/ 中断优先级/EX0 = 1;/EA = 1;/ 初始化定时器,串口中断void InitTimer()TMOD = 0 x11;/ 使用高 4 位 0/1/2/3 13 位/16 位/8 位自动重载 /双 8 位 TH0 = (65536 - 49235) / 256;TL0 = (65536 - 49235) % 256;PT0 = 1;TR0 = 1;/ 开启定时器 0ET0 = 1;TH1 = (65536 - 49235)
43、/ 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;/ 串口方式 1 ,允许接收PCON = 0 x00;/ 关闭波特率加倍PS = 1;/ 设置串口中断为高优先级ES = 1;/ 开串口中断/TH1 = 0 xfd;
44、/ 串口通信使用定时器 1,设定波特率 9600/TH1 = 0 xf3;/ 串口通信使用定时器 1,设定波特率 2400EA = 1;/ 开始发送串口数据void SendSerialData()if(!bSerialSending)bSerialSending = 1;g_CurSend = 0;SBUF = g_myParg_CurSend; g_CurSend+;/ 开始 ADC 转换void StartADC()CurTR0 = TR0;TR0 = 0;g_CurIn=0;ADCA = g_addag_CurIn;ADCB = g_addbg_CurIn;CTRL_UP = g_ct
45、rlug_CurIn;CTRL_DOWN = g_ctrldg_CurIn;Curctrlu = CTRL_UP;Curctrld = CTRL_DOWN;ADCALE = 1;ADCALE = 0;ADCSTART = 1;ADCSTART = 0;EX0 = 1;/ 倒序转换unsigned char Reverse(unsigned char num)unsigned char i,rtTmp;rtTmp = 0 x00;for(i=0; i8; i+)rtTmp = 1;return rtTmp;/ 显示完整的时间void ShowAllTime()WriteLCD(0,0 x98+4
46、);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 Int0() interrupt 0g_myPar7+g_CurIn = ADCDATE; g_CurIn+;if(g_CurIng_myPar6)i = 0;CTRL_UP = 1;CTRL_DOWN = 0;TH0 = g_myPar4;TL0
47、 = g_myPar5;elseCTRL_UP = 1;CTRL_DOWN = 1;TH0 = g_myPar2;TL0 = g_myPar3;elsej = 1;CTRL_UP = 0;CTRL_DOWN = 1;TH0 = g_myPar0;TL0 = g_myPar1;/ 定时器 1 中断服务程序void Timer1() interrupt 3static unsigned char i,j;unsigned char temp_data2;unsigned char presence,k;TH1 = (65536 - 60730) / 256;TL1 = (65536 - 60730
48、) % 256; i+;if(i24)/ 时间显示i=0;g_time5+;g_myPar14+;if(g_time5 0 x39)/ 秒个位g_time5 = 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+; if(g_time2 0 x35)/ g_time2 = 0 x30; g_time1+; g_myPar13 = 0; g_myPar12+; if(g_time1 0
49、 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); / 分个位 WriteLCD(0,0 x98+6);WriteLCD(1,g_time3); / 秒十位 / 秒个位 WriteLCD(0,0 x98
50、+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,.);WriteLCD(1,.);break;case 4:WriteLCD(0,0 x98+3);WriteLCD(1,
51、.);j = 0;break;default:j = 0;presence = Init_DS18B20();if(presence=0)WriteOneChar(0 xCC); / 跳过 ROM 匹配操作Delay4us(10);WriteOneChar(0 x44); / 启动温度转换presence = Init_DS18B20();if(presence=0)WriteOneChar(0 xCC); / 跳过 ROM 匹配操作Delay4us(10);WriteOneChar(0 xBE); / 读取温度寄存器Delay4us(10);temp_data0 = ReadOneChar(
52、); / 温度低 8 位Delay4us(10);temp_data1 = ReadOneChar(); / 温度高 8 位 if(presence=0)if(temp_data1=0 xff) presence=1;if(g_CurIn = 5)for(k=0;k100) g_Percent = 0;if(CutState=0)/ 充电模式g_tt10 =(65536-5*(105-g_Percent)/256;g_tt11 =(65536-5*(105-g_Percent)%256;g_tt20 =(65536-5*(5+g_Percent)/256;g_tt21 =(65536-5*(5
53、+g_Percent)%256;g_myPar0=g_tt10;g_myPar1=g_tt11;g_myPar2=g_tt20;g_myPar3=g_tt21;g_myPar4=g_tt10;g_myPar5=g_tt11;SqrtDuty = sqrt(1-g_Percent/100.0);/Duty=g_myPar0*100/(g_myPar0+g_myPar1);g_CurIn = 0;if(CutState=2)/ 维护WriteLCD(0,0 x90);DspNumber(g_myPar7+2*156);/ 电池电压WriteLCD(1,V);/g_Percent = g_myPar
54、4+2*1.56-48;DspPercent(g_Percent);if(presence=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_Percent = g_myPar4+2*1.56-48;DspPercent(g_Percent);WriteLCD(0,0 x88+4);WriteL
55、CD(1,:);DspNumber(g_myPar7+2-g_myPar7)*31);/ 放电电流 if(presence=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_Percent = g_myPar4+2*1.56-48;DspPercent(g_Percent);WriteLCD(0,0 x90+4);Write
56、LCD(1,:);充电电流DspNumber(g_myPar7+4-g_myPar7+3)*78)*SqrtDuty);/WriteLCD(0,0 x88+4);充电电压WriteLCD(1,:);DspNumber(g_myPar7+4*156*SqrtDuty);/ if(presence=0)WriteLCD(0,0 x80+5);DspTemp(temp_data1,temp_data0);/ 串口中断服务程序void Serial() interrupt 4if(RI)RI = 0;bSerialSending = 0; if(SBUF = 5)SBUF = 6;else if(SB
57、UF = 6)SendSerialData();elseSBUF = 0 xff;elseTI = 0;if(bSerialSending)if(g_CurSend15)SBUF = g_myParg_CurSend; g_CurSend+;elsebSerialSending = 0;18B20 程序:#include /unsigned char data temp_data2;/DS18B20 初始化unsigned char Init_DS18B20(void)bit presence;DQ = 0; / 单片机发出低电平复位信号Delay4us(120); / 延时 480usDQ
58、= 1; / 释放数据线Delay4us(16); / 延时64us,等待应答presence = DQ; / 接收应答信号Delay4us(100); /延时400us,等待数据线出现高电平DQ = 1; / 释放数据线return (presence); / 返回 presence 信号/ 读一个字节数据unsigned char ReadOneChar(void)unsigned char i = 0;unsigned char dat = 0;DQ = 1;for (i = 0; i = 1;DQ = 1; / 释放总线_nop_();_nop_();if (DQ)/ 读总线电平状态d
59、at |= 0 x80;/ 最高位置 1Delay4us(15); / 延时 45usDQ = 1; / 释放总线 ,表示此次读操作完成return (dat); / 返回所读得数据/ 写一个字节数据void WriteOneChar(unsigned char dat) unsigned char i = 0;for (i = 0; i 8; i+)/ 一个字节 8 个 bitDQ = 0; / 给低脉冲信号Delay4us(1); / 延时 = 1; /数据右移一位 ,最低位移入 CYDQ = CY; / 写 1bit 数据Delay4us(15); / 延时 45usDQ = 1; /
60、释放总线 , 表示此次写操作完成/*/ 温度数据转换子程序void Temperature_conver()unsigned char minus = 0;if (temp_data1 127)/ 温度为负值temp_data0 = (temp_data0) + 1; / 取反加一,将补码变成原码if (temp_data0) = 0 xff)temp_data1 = (temp_data1) + 1;elsetemp_data1 = temp_data1;minus = 1; / 温度为负值标志*/LCD12864 程序:#include /lcd12864 相关控制unsigned cha
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026中国现代物流行业竞争格局与市场发展趋势研究报告
- 2025~2026学年上海市新中初级中学九年级下学期化学阶段性练习三
- 2026生物制药临床试验行业市场现状分析调研发展投资评估规划前景
- 2026中国物流行业市场供需分析现状投资评估规划研究报告
- 2026石油化工溶剂行业竞争态势供应开发战略指导
- 六年级上册Unit 1 第2课时
- 2026区块链行业市场发展趋势分析及投资前景与行业发展报告
- 2026中国运动防护产品售后服务体系建设与客户忠诚度研究报告
- 2026全球食品饮料市场渠道重塑与品牌年轻化营销策略报告分析
- 2026中国稀土永磁材料下游应用拓展与供需格局预测
- 2026年港口危险货物安全管理人员考试试题题库含答案
- 中国老视矫正多专科管理专家共识(2026年)
- 2025临川二中高一入学语文分班考试真题含答案
- 历年保安证试题及答案
- 从“五方面人员”中选拔乡镇领导班子成员面试试题附答案及解析 (广西壮族自治区桂林市2026年)
- 2026年4399游戏策划管培生笔试题及答案
- 长江存储校招测评题目
- 2026年屠宰兽医卫生检验员考试题库及答案
- 2026年天津市高考英语首考试卷试题完整版(含答案详解+听力MP3)
- 《动态管式反应器设计、制造和使用规范》征求意见稿
- 2026年机械工程高级工程师职称考试题库及答案解析
评论
0/150
提交评论