立创EDA网页版画PCB:
带PCB照片转换,5元打样,DIY爱好者的福音,良心立创!
Altium Designer画的原理图和PCB图如下:(51hei附件中可下载工程文件)
拆了一个4056锂电板,把零件搬过来,拨动开关调节电流大小:
看个全貌:
按下按键,LED显示电池电压:
套上透明热缩管,开始工作了:
单片机源程序如下:
/******* 充电器_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(); } } //
复制代码