软件设计本设计主要是对突发停电或电路故障等做出的自动切换备用电源的设计,主要针对检测到电路中正常电压为0V时,说明停电或电路故障,这时自动切换备用电池,提供用电。其次还会对电池电量进行检测,防止过充等情况。
电路原理图如下:
4.1 主程序 在程序开始以前我们要进行引脚的初始化,首先需要对adc0832芯片进行初始化,然后对LCD1602初始化并对其进行赋值,随后初始化界面显示。进入到while循环中,先检测市电电压值,如果电压值为0,则报警提醒断电或电路故障,并切换电池供电。随后对电池电压进行检测,如果电压值小于20v或大于25v,说明电池电压异常,停止充电,并报警;如果电压值大于等于20v小于24v,则正常充电;如果电压值大于等于24v小于等于25v,则停止充电。 图 4.1主流程图
4.2 电池电压检测程序
每次运行前面都要初始化单片机,再初始化adc模块,然后采集我们需要的电池电压值并判断电压的值,如果电压值小于20v或大于25v,说明电池电压异常,停止充电,并报警;如果电压值大于等于20v小于24v,则正常充电;如果电压值大于等于24v小于等于25v,表面已充满,则停止充电。 图4.2 电池电压检测流程图
4.3 LCD显示程序
初始化LCD1602,刚开始第一行显示“INPUT:000v”,第二行显示“BAT:00.0v”。后面读取实时的电压值后填入第一行的数值处,替代原先位置,第二行也是同样的操作。 图4.3 LCD显示运行流程图
单片机源程序如下:
- #include <reg52.h>
- #include <intrins.h>
- #include <math.h>
- #define uchar unsigned char
- #define uint unsigned int
- #define ulong unsigned long
- #include "1602.h"
- #include "ad.h"
- sbit beer=P1^0;//蜂鸣器
- sbit out=P2^3; //负载
- sbit bat=P2^4; //充电
- //喇叭控制
- void beerc()
- {
- beer=0;_delay_ms(500);
- beer=1;_delay_ms(500);
- }
- //显示充电参数------------------------------
- void xianshi()
- {
- uint u1=0; //充电电压
- uint u2=0; //被充电电压
- u1=adc0832(0)*(uint)300/(uint)255; //市电电压
- u2=adc0832(1)*(uint)300/(uint)255; //电池电压
- lcd1602_adr(0x07);
- lcd1602_writenumber(0x30+u1%1000/100);
- lcd1602_writenumber(0x30+u1%100/10);
- lcd1602_writenumber(0x30+u1%10);
- lcd1602_adr(0x45);
- lcd1602_writenumber(0x30+u2%1000/100);
- lcd1602_writenumber(0x30+u2%100/10);
- lcd1602_writenumber('.');
- lcd1602_writenumber(0x30+u2%10);
- if(u1 == 1)
- {
- beerc();
- bat = 1;
- out=1;
- }
- else
- {
- out=0;
- }
- if(u1 != 1 && (u2 >= 200 && u2 < 240))
- {
- bat = 0;
- }
- if(u2 >= 240 && u2 <= 250)
- {
- bat = 1;
- }
- if(u2 < 200 || u2 > 250)
- {
- bat = 1;
- beerc();
- }
- }
- //主函数
- void main()
- {
- //初始化
- lcd1602_init();
- _delay_ms(10);
- LCD1602_string(1,2,"INPUT:000v");
- LCD1602_string(2,2,"BAT:00.0v ");
- while(1)
- {
- xianshi();
- }
- }
复制代码
以上资料51hei提供下载(方便保存):
水平有限,仅供参考:
源程序.7z
(56.74 KB, 下载次数: 37)
上文的Word版(和网页上的内容一样):
软件设计.doc
(346.5 KB, 下载次数: 23)
|