买了几个4056充电板,一个才几毛钱:
1.jpg


立创EDA网页版画PCB:
2.jpg


带PCB照片转换,5元打样,DIY爱好者的福音,良心立创!
Altium Designer画的原理图和PCB图如下:(51hei附件中可下载工程文件)
3.jpg

4.jpg


拆了一个4056锂电板,把零件搬过来,拨动开关调节电流大小:
5.jpg


看个全貌:
6.jpg


按下按键,LED显示电池电压:
7.jpg


套上透明热缩管,开始工作了:
8.jpg


单片机源程序如下:
/******* 充电器_LED电压表STC8G1K08_TSSOP20 **********/
  • /*
  • 功能:        
  • 通电LED显示芯片供电电压
  • */
  • #include "STC8.h"
  • #include "intrins.h"
  • #define ADCTIM   (*(unsigned char volatile xdata*)0xfea8) //ADC内部时序控制寄存器
  • #define ON 0
  • #define OFF 1
  • u16 *BGV;                                //内部参考电压
  • void ADC_Init();//ADC初始化
  • /*----------------------------
  • 初始化ADC,ADC_Init()
  • ----------------------------*/
  • void ADC_Init() //选择第15通道,测供电电压
  • {
  •         P_SW2|=0x80;
  •         ADCTIM=0x3f;                //设置ADC内部时序控制寄存器
  •         P_SW2&=0x7f;
  •         ADCCFG=0x2f;                //ADC时钟
  •         ADC_CONTR=0x8f;                //使能ADC,选择第15通道
  • }
  • //
  • u16 ADCRead()
  • {
  •         static u16 res;
  •         ADC_CONTR|=0x40;//启动AD转换
  •         _nop_();                        //等待4个NOP
  •         _nop_();
  •         while (!(ADC_CONTR & ADC_FLAG));//等待ADC转换完成标记ADC_FLAG=2
  •         ADC_CONTR &= ~ADC_FLAG;         //清完成标记
  •         res=(ADC_RES<<8)|ADC_RESL;
  •         return res;
  • }        
  • //
  • u16 ADC_GET_vcc()//读取15通道,测供电电压
  • {
  •         static u16 res;
  •         static u16 vcc;
  •         static u8 i;        
  •         //BGV=(u16 idata*)0xef;//从RAM读取
  •         BGV=(u16 code*)0x1ff7;//从ROM读取        ,要勾选“在程序区结束处添加重要参数”
  •         ADC_Init();
  •         ES=1;
  •         ADCRead();ADCRead();//前两次丢弃
  •         res=0;
  •         for(i=0;i<8;i++)        //读8次取平均值
  •         {
  •                 res+=ADCRead();        
  •         }
  •         res>>=3;
  •         vcc=(1023L**BGV)/res; //10位ADC计算VREF电压,mv
  •         //vcc=(int)(4096**BGV/RES); //12位ADC计算VREF电压
  •         return vcc;
  • }
  • //
  • void LED_Service(void)
  • {
  •         static u32 VCC_Temp=0;
  •         VCC_Temp=ADC_GET_vcc();
  •         if(VCC_Temp<3400)              P55=OFF;  else   P55=ON;
  •         if(VCC_Temp<3500)              P54=OFF;  else   P54=ON;
  •         if(VCC_Temp<3600)             P17=OFF;  else   P17=ON;
  •         if(VCC_Temp<3700)                   P16=OFF;  else   P16=ON;
  •         if(VCC_Temp<3800)                          P15=OFF;  else   P15=ON;
  •         if(VCC_Temp<3900)                         P14=OFF;  else   P14=ON;
  •         if(VCC_Temp<4000)                          P13=OFF;  else   P13=ON;
  •         if(VCC_Temp<4100)                          P12=OFF;  else   P12=ON;
  • }
  • //
  • void main(void)
  • {
  •         //端口设置
  •         P1M1=B0000_0000;   //00上拉准双向口/10浮空输入  
  •         P1M0=B0000_0000;   //11开漏输出/01推挽输出        
  •         P5M1=B0000_0000;   //00上拉准双向口/10浮空输入
  •         P5M0=B0000_0000;   //11开漏输出/01推挽输出
  •         ADC_Init();
  •         while (1)
  •         {
  •                 LED_Service();
  •         }
  • }
  • //
  • 复制代码