ImageVerifierCode 换一换
格式:DOCX , 页数:17 ,大小:119.01KB ,
资源ID:14446947      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/14446947.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(基于51单片机的智能充电器系统.docx)为本站会员(b****2)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

基于51单片机的智能充电器系统.docx

1、基于51单片机的智能充电器系统基于51单片机的智能充电器系统一、 功能简介:通过定时器定时从A/D上读取数据,根据不同的电压选择不同的控制充电方案,使用PWM控制输出脉宽来控制电流。二、 器件以及接口本文中使用了8051和ADC0809芯片。下面对所使用的器件以及器件和单片机的接口作以下说明。1、器件和原理本文中主要使用的器件是可以进行AD转换的8位ADC0809芯片。ADC0809是一种逐次逼近式8路模拟输入、8位数字量输出的AD转换器。其引脚如图1所示。图1 ADC0809外观图由引脚图可知,ADC0809共有28引脚,采用双列直插式封装。其主要引脚功能如下。(1)、IN0IN7是8路模拟

2、信号输入端。(2)、2(-1)2(-8)是8位数字量输出端。(3)、ADDA、ADDB、ADDC与ALE控制8路模拟通道的切换,ADDA、ADDB、ADDC分别与3根地址线或数据线相连,三者编码对应8个通道地址口。ADDC、ADDB、ADDA=000111分别对应IN0IN7通道地址。(4)、OUTPUT ENABLE、START、CLK为控制信号端,OUTPUT ENABLE为输出允许端、START为启动信号输入端、CLK为时钟信号输入端。(5)、VREF(-)和VREF(+)为参考电压输入端。2、器件的接口在讨论8051与ADC0809的接口设计之前,先来讨论单片机如何控制ADC的问题。用

3、单片机控制ADC时,多数采用查询和中断控制两种方法。查询法是在单片机把启动命令送到ADC之后,执行别的程序,同时对ADC的状态进行查询,以检查ADC变换是否已经结束,如查询到变换已结束,则读入转换完毕的数据。中断控制法是在启动信号达到ADC之后,单片机执行别的程序。当ADC变换结束并向单片机发出中断请求信号时,单片机响应此中断请求,进入中断服务程序。读入转换数据,并进行必要的数据处理,然后返回到原程序。这种方法单片机无需进行转换时间的管理。CPU效率高,所以特别适合于变换时间较长的ADC。如果对转换速度要求高,采用上述两种ADC控制方式往往不能满足要求,可采用DMA(直接存储器存取)的方法,这

4、时可在ADC与单片机之间插入一个DMA接口(例如,btel公司的8237DM控制器)。传输一开始,AD转换的数据就可以从输出寄存器经过DMA中的数据寄存器直接传输到主存储器,因而不必受程序的限制。 在本文中,采用中断方式。从ADC0809与8051的中断方式接口电路如硬件电路图2和图3所示,ADC0809和8051的INT0管脚连接,当转换结束的时候,EOC向8051发送一个脉冲信号,提出中断申请,单片机响应中断请求,由外部中断l的中断服务程序读AD结果,并启动8051的下一个转换,外部中断1采用跳沿触发方式。图2 智能充电器原理电路图图3智能充电器原理电路图三、硬件电路图本文中,单片机电路主

5、要包括8051和ADC0809两块芯片,DM74163N用做分频器,74F138SJ用来产生和选择地址。具体的连接原理电路图如图2和图3所示。其中,8051的晶振频率为11.0592MHz。电路有2个输入输出端口,Analog Voltage Input是作为电池组电压的输入,PWM contraltor是做为电池组控制脉宽的输出。四、软件程序设计本文为智能充电器,传统充电器采用电流负反馈来进行控制,本程序使用8051单片机作为控制器进行控制。对于电池中不同的电量,如果采取同样的方案,不会获得满意的充电效果,一般根据电池两端不同的电压值采取不同的方案进行充电。本文中,将采集电池组的电压值,通过

6、ADC转到单片机,在单片机端接收到信号后,根据不同的电压情况采取不同的方案。当电压非常小的时候,采取方案1来充电,方案l采取小电流充电;当电压比较小但是不是极小的时候,采取方案2来充电,方案2采取较大电流充电;当电压达到正常电压的时候,采取方案3来充电,方案3采取恒流充电;对于电压超出正常电压,采取方案4,即不充电的方案。本文中,采用定时查询电压的机制,定时器每500ms给出标志位,查询AD上的电压值,根据不同的电压值选择不同的方案。对于电流的控制,采用PWM控制脉宽的方法来控制电流,应用不同的占空比,占空比越高,电流越大。下面将首先对程序的主要模块进行介绍,然后给出整个程序。(1)、初始化在

7、初始化程序中,需要进行与定时器相关的寄存器的初始化以及各个标志位和计数位的清零,如果采用中断方式,还包括与中断相关的寄存器。本文中,电路中采用的晶振频率fosc=110592MHz,需要每500ms查询l次,将定时器设置成16位计数器,根据计算,可以得出定时器T0的初值为7936(1F00H),并且中断中使用计数器,计满8就达到了500ms。将方案选择位置1,以便主程序查询。初始化程序清单如下:;程序开始,初始化各个寄存器以及标志位START:MOV SP,#050H ;设置堆栈MOV R0,#030H ;设置A/D存储单元初始地址MOV IE,#0FFH ;打开所有中断MOV DPTR,#7

8、8FFH ;采集通道首地址,只使用一路A/D就可以MOV R0,#40HMOV R0,#00H ;清除方案选择位MOV R0,#40HMOV R0,#00H ;清除方案选择触发位MOV R1,#042HMOV R0,#00H ;清除定时器计数器LCALL TIMER1_INITTIMER1_INIT:ANL TMOD,#0FH ;设置定时器T1为方式2ORL TMOD,#10HMOV TMOD,#21H ;定时器T0工作在方式1MOV PCON,#080HCLR TR1 ;禁止定时器T1SETB EASETB ET1SETB ET0SETB PT0 ;定时器T0中断优于串口中断CLR TF1M

9、OV TL0,#00HMOV TH0,#01FH ;定时器T0中断发生时间为62.5msSETB TR0 ;使能定时器T0CLR TF0RET;(2)、定时器中断定时器中断是用来计时的,在中断中使用软件计数来达到想要的时间。当时间到达0FFFFH后,再跳到O000H,TFX位就会申请中断。使用定时器T0,那么TF0位会申请中断,进入中断服务程序,进行中断处理,设置相应的触发标志位。应当注意的是,在采用中断方式处理时,对于中断中使用到的寄存器、变量(作为全局变量使用的除外)应当进行压栈处理,并且更换寄存器的区域。;进入定时器中断,每500ms设置1次标志位TIMER0_INIT:PUSH ACC

10、 ;累加器入栈PUSH PSW ;程序状态字入栈MOV PSW,#18H ;切换寄存器区域CLR TF0 ;清除定时器中断TF0CLR TR0 ;禁止定时器T0MOV TL0,#00HMOV TH0,#01FH ;定时器T0中断发生时间为6CLR TF0 ;清除溢出中断位MOV R1,#042HINC R1 ;增加计数器的值,到8为止,这样达到500msCJNE R1,#08H,TIMER0_READYMOV R1,#00H ;清除计数器的值MOV R1,#041H ;设置标志位,每500ms重新选择方案MOV R1,#01HTIMER0_READY:SETB TR0 ;使能定时器T0POP

11、PSW ;程序状态字出栈POP ACC ;累加器出栈RETI(3)、AD转换器的使用当ADC转换结束时,会向单片机发出中断请求信号,触发单片机的外部中断,这时单片机响应此中断请求,进入中断服务程序,读取转换数据,ADC读入的首地址要依靠电路原理图来确定。程序清单如下:EXTERN_INIT:PUSH ACC ;累加器压栈PUSH PSW ;程序状态字压栈MOV PSW,#010H ;切换寄存器区域MOV DPTR,#78FFH ;A/D转换器首地址MOVX A,DPTR ;读入A/D的值MOV R1,#030H ;存储A/D转换器的数据的地址MOV R1,A ;将A/D的值读入该地址POP P

12、SW ;程序状态字出栈POP ACC ;累加器出栈RETI(4)、PWM脉冲宽度的控制在本文中,需要控制PWM脉冲的占空比来控制充电的电流,因此采用直接设置对应管脚高低来产生脉冲,对于不同的要求,可以使用空跑来设置不同占空比。本文选用方案1.程序清单如下:PROCESS_01:MOV R1,#040HMOV R1,#01H ;选择方案1PROCESS_01_NEXT:SETB P2.0 ;将和PMW连接的管脚置高MOV R1,#0F0HMOV R0,#00HPROCESS_01_01:DJNZ R1,PROCESS_01_01DJNZ R0,PROCESS_01_01 ;空跑162562个周期

13、CLR P2.0 ;将和PMW链接的管脚置低MOV R1,#070HMOV R0,#00HPROCESS_01_02:DJNZ R1,PROCESS_01_02DJNZ R0,PROCESS_01_02 ; 空跑1625629个周期MOV R1,#041H ;当方案改变标志位到来的时候,清除;标志并且重新进行判断CJNE R1,#00H,CLEAR_FLAGSJMP PROCESS_01_NEXT注意:当输出脉冲的时候,应一直在查询方案改变标志位,当标志位到来的时候跳出循环,重新选择新的万菜。(5)、方案的选择控制本实例中,在主程序中需要对不同的方案进行选择,需要根据输入信号的不同范围进行跳转

14、,对于8051,通常与需要比较的数进行相减,然后读取进位标志位,根据标志位来判断两个数的大小。程序清单如下:;进入循环,查询标志位,采取不同的方案LOOP:MOV R0,#30H ;30H是AD转换的地址,将数据和几个值;进行比较,确定方案MOV A,R0SUBB A,#30H ;当电压很小的时候,采用第一种方案,;向引脚PWM发送占空比为10%的信号JC PROCESS_01MOV A,R0SUBB A,#90HJC PROCESS_02 ;当电压较小的时候,采用第二种方;案,向引脚PWM发送占空比为20%的信号MOV A,R0 SUBB A,#90HJZ PROCESS_03 ; 当电压正

15、好的时候,采用第三种方;案,向引脚PWM发送占空比为50%的信号MOV A,#04H ; 当电压超出的时候,采用第四种方;案,向引脚PWM发送占空比为0%的信号LJMP PROCESS_04(6)、程序全貌本文中,AD采用外部中断触发的方式,当数据到来的时候将数据读入,根据不同的电压值选择不同方案,并且用定时器每500ms查询l次,改变原来的方案。程序清单如下:;智能充电器;功能:通过定时器定时从A/D上读取数据,根据不同的电压选;择不同的控制充电方案,使用PWM控制输出脉宽来控制电流ORG 0000HLJMP START ORG 0003HLJMP EXTERN_INT ;外中断入口ORG

16、000BHLJMP TIMER0_INT ;定时器中断入口;程序开始,初始化各个寄存器以及标志位START:MOV SP,#050H ;设置堆栈MOV R0,#030H ;设置A/D存储单元初始地址MOV IE,#0FFH ;打开所有中断MOV DPTR,#78FFH ;采集通道首地址,只使用一路A/D就可以MOV R0,#40HMOV R0,#00H ;清除方案选择位MOV R0,#40HMOV R0,#00H ;清除方案选择触发位MOV R1,#042HMOV R0,#00H ;清楚定时器计数器LCALL TIMER1_INIT;进入循环,查询标志位,采取不同的方案LOOP:MOV R0,

17、#30H ;30H是A/D转换的地址,;将数据和几个值进行比较,确定方案MOV A,R0SUBB A,#30H ;当电压很小的时候,采用第一种方案,;向引脚PWM发送占空比为10%的信号JC PROCESS_01MOV A,R0SUBB A,#90HJC PROCESS_02 ; ;当电压较小的时候,采用第二种方案,;向引脚PWM发送占空比为20%的信号MOV A,R0SUBB A,#90HJZ PROCESS_03 ; ;当电压正好的时候,采用第三种方案,;向引脚PWM发送占空比为50%的信号MOV A,#04H ; ;当电压超出的时候,采用第四种方案,;向引脚PWM发送占空比为0%的信号L

18、JMP PROCESS_04CLEAR_FLAG:MOV R0,#40H ;清除方案选择位MOV R0,#00HMOV R0,#41H ;清除触发位MOV R0,#00HLJMP LOOPPROCESS_01:MOV R1,#40HMOV R1,#01H ;选择方案1PROCESS_01_NEXT:SETB P2.0 ;将和PWM连接的管脚置高MOV R1,#0F0H MOV R0,#00HPROCESS_01_01:DJNZ R1,PROCESS_01_01DJNZ R0,PROCESS_01_01 ;空跑162562个周期CLR P2.0 ;将和PWM连接的管脚置低MOV R1,#070H

19、MOV R0,#00HPROCESS_01_02:DJNZ R1,PROCESS_01_02DJNZ R0,PROCESS_01_02 ; 空跑1625629个周期MOV R1,#041H ;当方案改变标志位到来的时候,;清除标志并且重新进行判断CJNE R1,#00H,CLEAR_FLAGSJMP PROCESS_01_NEXTPROCESS_02:MOV R1,#040HMOV R1,#02H ;选择方案2PROCESS_02_NEXT: SETB P2.0 ;将和PWM连接的管脚置高MOV R1,#0E0HMOV R0,#00HPROCESS_02_01:DJNZ R1,PROCESS_

20、02_01DJNZ R0,PROCESS_02_01 ; 空跑162562个周期CLR P2.0 ; 将和PWM连接的管脚置低MOV R1,#080HMOV R0,#00HPROCESS_02_02:DJNZ R1,PROCESS_02_02DJNZ R0,PROCESS_02_02 ; 空跑1625628个周期MOV R1,#041H ;当方案改变标志位到来的时候,;清除标志并且重新进行判断CJNE R1,#00H,CLEAR_FLAGSJMP PROCESS_02_NEXTPROCESS_03:MOV R1,#040HMOV R1,#30H ;选择方案3PROCESS_03_NEXT:SE

21、TB P2.0 ;将和PWM连接的管脚置高MOV R1,#0B0H MOV R0,#00HPROCESS_03_01:DJNZ R1,PROCESS_03_01DJNZ R0,PROCESS_03_01 ; 空跑1625622个周期CLR P2.0 ; 将和PWM连接的管脚置低MOV R1,#0B0HMOV R0,#00HPROCESS_03_02:DJNZ R1,PROCESS_03_02DJNZ R0,PROCESS_03_02 ;空跑1625627个周期MOV R1,#041H ; 当方案改变标志位到来的时候,;清除标志并且重新进行判断CJNE R1,#00H,CLEAR_FLAGSJM

22、P PROCESS_03_NEXTPROCESS_04:CLR P2.0MOV R1,#040HMOV R1,#04H ;选择方案4MOV R1,#041HCJNE R1,#00H,CLEAR_FLAGSJMP PROCESS_04TIMER1_INIT:ANL TMOD,#0FH ;设置定时器T1为方式2ORL TMOD,#10HMOV TMOD,#21H ;定时器T0工作在方式1MOV PCON,#080HCLR TR1 ;禁止定时器T1SETB EASETB ET1SETB ET0SETB PT0 ;定时器T0中断优先于串口中断CLR TF1MOV TL0,#00HMOV TH0,#01

23、FH ;定时器T0中断发生时间为62.5msSETB TR0 ;使能定时器T0CLR TF0RET;进入定时器中断,每500ms设置1次标志位TIMER0_INT:PUSH ACC ;累加器入栈PUSH PSW ;程序状态字入栈MOV PSW,#18H ;切换寄存器区域CLR TF0 ;清除定时器中断TF0CLR TR0 ;禁止定时器T0MOV TL0,#00HMOV TH0,#01FH ;定时器T0中断发生时间为6CLR TF0 ;清除溢出中断位MOV R1,#042HINC R1 ;增加计数器的值,直到8为止,这样达到500msCJNE R1,#08H,TIMER0_READYMOV R1

24、,#00H ;清除计数器的值MOV R1,#041H ;设置标志位,每500ms重新选择方案MOV R1,#01HTIMER0_READY:SETB TR0 ;使能定时器T0POP PSW ;程序状态字出栈POP ACC ;累加器出栈RETI;进入外部中断,每进入一次读取ADC的值EXTERN_INT:PUSH ACC ;累加器压栈PUSH PSW ;程序状态字压栈MOV PSW,#010H ;切换寄存器区域MOV DPTR,#78FFH ;A/D转换器首地址MOVX A,DPTR ;读入A/D的值MOV R1,#030H ;存储A/D转换器的数据的地址MOV R1,A ;将A/D的值读入该地址POP PSW ;程序状态字出栈POP ACC ;累加器出栈RETIEND五、技巧总结1、程序中,如果有多个中断,可通过设置PS位来调整串口的优先级。注意在8051中中断的优先级只有两级。2、AD转换器的首地址要根据硬件设计来读取,数据的读取采用外部中断触发的方式速度比较快。3、输出脉冲可以通过管脚的置高置低来直接进行控制,若波形有占空比的需要,可以通过空跑的时间来控制占空比。4、在定时器中断完成后,需要对TFX位进行软件清0。5、在比较两个数的大小来控制程序走向的时候,通常采用相减再判断进位标志的办法来控制程序。

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1