版主 
 
主题
回帖0
积分39546
阅读权限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; 
    } 
   
} |   
 
 
 
 |