版主
主题
回帖0
积分39503
阅读权限200
注册时间2011-5-6
最后登录1970-1-1
在线时间 小时
|
小弟想做一个单片机控制的充电器,要求是上电或者使用过程中电压降低到3.2V一下开启充电,冲到4.2V关闭充电。充满电后使用过程中3.2V~4.2V不充电
但是实际使用情况是上电之后只要电压低于4.2V,就开启充电。使用过程中正常。
#include <stc12c5a60s2.h> //STC自己的头文件
#include <string.h> //包含初试化头文件
#include <intrins.h>
//#include <stdlib.h> //包含标准函数库头文件
#define TH0_TL0 (65536-60000) //PWM设定中断的间隔时长
#include "4bitlcm1602.h" //包含4线驱动1602头文件
#include "18b20.h" //包含18b20头文件
#include "delay.h" //包含delay头文件
#include "STCAD.h" //包含AD转换头文件
#include "pwm.h" //包含pwm转换头文件
#define uchar unsigned char
#define uint unsigned int
sbit beep = P2^4; //喇叭
sbit PWM = P2^5; //闪灯
sbit POW = P2^6; //充电继电器
/********************定时器1初始化***闪灯用***************/
void Timer0_init(void)
{
TMOD=0x01; //定时器0工作于方式1
TH0=TH0_TL0/256;
TL0=TH0_TL0%256;
TR0=1;
ET0=1;
EA=1;
}
main() //主程序入口
{
Delay400Ms();
POW=1;
InitADC(); //Init ADC sfr
LCMInit(); //初始化LCD
sys_init(); //系统初始化
Timer0_init();
LCD_cls();
PWM_init(); //PWM初始化
// PWMR1 = 0;
// PWMR2 = 1;
PWM0_set (1);
PWM1_set (1);
z = 1;
while(1)
{ //主程序循环(开始)
PWMset ();
DisplayListChar(13,1,"pwm=");
WriteDataLCM(z/100+0x30); //PWM显示
WriteDataLCM(z%100/10+0x30);
WriteDataLCM(z%100%10+0x30);
R2=(GetADCResult(1)*1.0/GetADCResult(7))*R5*2; //电池电压
R5=2500; //基准电压2.5V
if(R2>4200)
{POW=1;}
if(POW==0)
{
if(++count < count0)
{
WriteDataLCM(7);
}
}
if(R2>4100)
{DisplayOneChar(19,0,6); beep=1; }
else if(R2>3900)
{WriteDataLCM(5); beep=1;}
else if(R2>3760)
{WriteDataLCM(4); beep=1; }
else if(R2>3550)
{WriteDataLCM(3); beep=1;}
else if(R2<3350)
{WriteDataLCM(2); beep=1;}
if(R2<3200)
{
WriteDataLCM(1);
POW=0;
if(++count < count0)
{
beep = 1;
}
else
{
beep = 0;
}
}
DisplayListChar(0,1,"Bat=");
WriteDataLCM(R2/1000+0x30);
WriteDataLCM(0x2E);
WriteDataLCM(R2%1000/100+0x30);
WriteDataLCM(R2%1000%100/10+0x30);
WriteDataLCM(0x56);
} //主程序循环结束返回
POW=1;
}
void Timer0_int(void) interrupt 1 using 1
{
TR0 = 0; //设置定时器初值期间,关闭定时器
TL0 = TH0_TL0 % 256;
TH0 = TH0_TL0 / 256 ; //定时器装初值
TR0 = 1;
if(++count < count0)
{
PWM = 1;
}
else
PWM = 0;
if(count >= 100)
{
count=0;
}
} |
|