少占鱼-STC12C2052AD做的手机电池充电器

2023-11-22 22:58

本文主要是介绍少占鱼-STC12C2052AD做的手机电池充电器,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 
 /*******************
 C语言运算符优先级
 


   1级优先级 左结合   
  () 圆括号   [] 下标运算符   -> 指向结构体成员运算符   . 结构体成员运算符     
  
   2级优先级 右结合    
  ! 逻辑非运算符   ~ 按位取反运算符  ++ 自增运算符  -- 自减运算符  - 负号运算符 (类型) 类型转换运算符 * 指针运算符 & 地址与运算符 sizeof 长度运算符
          
   3级优先级 左结合    
  * 乘法运算符   / 除法运算符   % 取余运算符    
  
   4级优先级 左结合   
  + 加法运算符   - 减法运算符


   5级优先级 左结合    
  << 左移运算符   >> 右移运算符


   6级优先级 左结合   
  <、<=、>、>= 关系运算符


   7级优先级 左结合    (注意"等于"运算符== )
  == 等于运算符   != 不等于运算符
        
   8级优先级 左结合    
  & 按位与运算符


   9级优先级 左结合  
  ^ 按位异或运算符


   10级优先级 左结合 
  | 按位或运算符


   11级优先级 左结合   
  && 逻辑与运算符
  
   12级优先级 左结合 
  || 逻辑或运算符   
  
   13级优先级 右结合   
  ? : 条件运算符


   14级优先级 右结合 (赋值运算符)
  =+ =- =*   =/ =% =   >= < <=   &= ^= |= 全为赋值运算符


   15级优先级 左结合 
  , 逗号运算符
 *******************************/
#include <stc12c2052ad.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define AD_SPEED   0x60 //0110,0000   1      1     270个时钟周期转换一次,
//少占鱼制作  河北正定欢迎您   长沙航空职业技术学院  2010 年QQ:411656434
//
sbit M=P1^5; //过压指示灯
sbit N=P1^6; //欠压指示灯
sbit LED=P1^7; //充满 指示灯
sbit  REF=P1^0;
sbit PWM=P3^7;


bit START =0;


uchar timeL=0x90;
uchar timeH=0x90;
/****************************************************************/
void pwm();
void delayms(uint);          
void ADC();
void InitADC();
//void baohu();


float voltage=0.0;
const float Uref=2.500 ;


/***8**************************************************************/
 void main()

 
 PWM=1;
   delayms(700);
 START=0;
 PWM=0;
 LED=0;
 REF=0;
 delayms(9000);


 delayms(1000);
 M=0;
 N=0;
 LED=0;
  delayms(7000);
 M=1;
 N=1;
   LED=1;
    delayms(7000);
 PWM=1;
    delayms(1000);//延时 
  pwm();
    InitADC();
    delayms(6000);
    START=0;


   while(1)
   {
     ADC();


  if(START)
  {
  pwm();
  delayms(2000);
     }
   }
   
}
//
//
 void pwm()



   CR=0;
   START=0;


    //PCA模块工作于PWM模式 C程序  


   CMOD = 0x02; //用定时器0溢出做PCA脉冲    
   CL = 0x00; //PCA定时器低8位 地址:E9H   
   CH = 0x00; //PCA高8位 地址 F9H  
   CCON=0x00;


   CCAP0L = timeL; //PWM模式时他俩用来控制占空比  
   CCAP0H = timeH; //0xff-0xc0=0x3f  64/256=25% 占空比(溢出)    


   CCAPM0 = 0x42; //0100,0010 Setup PCA module 0 in PWM mode
               // ECOM0=1使能比较 PWM0=1 使能CEX0脚用作脉宽调节输出
/*********************
PCA 模块工作模式设置 (CCAPMn 寄存器 n= 0-3四种)
 7     6        5        4       3       2     1      0
 -   ECOMn   CAPPn     CAPNn   MATn     TOGn   PWMn   ECCFn
选项: 0x00 无此操作
       0x20 16位捕捉模式,由 CEXn上升沿触发
       0x10 16位捕捉模式,由CEXn下降沿触发
       0x30 16位捕捉模式,由CEXn的跳变触发
       0x48 16位软件定时器
       0x4c 16位高速输出
       0x42  8位PWM输出
 每个PCA模块另外还对应两个寄存器:CCAPnH和CCAPnL 。  捕获或者比较时,它们用来
保存16位计数值,当工作于PWM模式时,用来控制占空比   
*******************************/     


   CR=1; //Start PCA Timer.


}



//AD转换初始化 ----打开ADC电源
void InitADC()
{
P1=0xff;
ADC_CONTR|=0x80;
delayms(3);
//这两个寄存器用来设置 P1口四种状态,每一位对应一个P1引脚 ,按状态组合操作


/*****************
 P1M0 和P1M1 寄存器位  7      6     5    4     3      2     1     0
                     P1.7  P1.6  P1.5  P1.4  P1.3  P1.2  P1.1  P1.0
 同理P3M0  P3M0 也是。因为STC12C2052AD只有两个P口,所以只有这俩组  STC12C5410AD还多P2M0 P1M0 有三组    
  P1M0   P1M1                 高
    0   0     普通I0口 (准双向)        P1寄存器位  7      6     5    4     3      2     1     0
 0      1     强推挽输出 (20MA电流 )尽量少用      P1.7  P1.6  P1.5  P1.4  P1.3  P1.2  P1.1  P1.0
 1  0     仅做输入  A/D转换时可用此模式     
 1      1    开漏 ,A/D转换时可用此模式
 


  例如:
  要设置P1.1为 AD 输入口
  则 P1M0=0X02 ;
     P1M1=0X02;   开漏即可
  当不用AD时,最好 关闭ADC电源 ,恢复为IO口状态
********************************/
P1M0=0x06;//这两个寄存器用来设置 P1口四种状态,每一位对应一个P1引脚 ,按状态组合操作
P1M1=0x06;//设置P1.1 P1.2开漏状态


 }


 


// AD转换程序
void  ADC()
{
    float V0,V1;


    ADC_DATA   = 0; //清除结果


    ADC_CONTR = 0x60;      //转换速度设置  0x60  最快速度


    ADC_CONTR = 0xE0;               //1110,0000 清 ADC_FLAG, ADC_START 位和低 3 位


    ADC_CONTR |= 0x01;           //选择 A/D 当前通道   P1.1
    delayms(1);                       //使输入电压达到稳定
   ADC_CONTR |= 0x08;              //0000,1000 令 ADCS = 1, 启动A/D转换, 


    while(!(ADC_CONTR & 0x10)); //!的优先级比&高太多了 
   //养成经常加括号的习惯 ,没坏处 。也不浪费速度
 /***************
 这里while 不能改成while(ADC_CONTR & 0x10==0) ;就错误了,因为优先级 ==比&高 ,所以要加括号
  while( (ADC_CONTR & 0x10)  ==0)    或者非一下  while(!(ADC_CONTR & 0x10)); //!的优先级比&高太多了 
    while( (ADC_CONTR & 0x10)  ==1)注意 if while这类判断逻辑真假的语句,用“==1”时 注意前面是否是后面的1,
 后面的1可是0x01啊,前面要是0x02===1,这是不会成立的。但是去掉后面的==1就可以用了。多此一举反而带来麻烦 
 *****************************/
    ADC_CONTR &= 0xE7;     //1111,0111 清 ADC_FLAG 位, 关闭A/D转换, 


    V0=  ADC_DATA; //返回 A/D 10 位转换结果



    ADC_DATA   = 0; //清除结果


    ADC_CONTR = 0x60;      //转换速度设置  0x60  最快速度


    ADC_CONTR = 0xe0;               //1110,0000 清 ADC_FLAG, ADC_START 位和低 3 位
   ADC_CONTR =0xe2;
   //  ADC_CONTR |= 0x02;           //选择 A/D 当前通道   P1.2
    delayms(1);                       //使输入电压达到稳定
    ADC_CONTR = 0xea;
   // ADC_CONTR |= 0x08;              //0000,1000 令 ADCS = 1, 启动A/D转换, 


    while(!(ADC_CONTR & 0x10)); //!的优先级比&高太多了 
   //养成经常加括号的习惯 ,没坏处 。也不浪费速度


 ADC_CONTR =0xe2;
    //ADC_CONTR &= 0xE7;     //1111,0111 清 ADC_FLAG 位, 关闭A/D转换, 
 V1=  ADC_DATA; //返回 A/D 10 位转换结果


 voltage=V1/V0*Uref*3.000;


  


   if( voltage>4.180)
    {
     M=0;//过压灯
     N=1;
     LED=1;
 timeL=timeL+0x08;
 timeH=timeH+0x08;
 START=1;
 LED=0;
    }
   if(voltage<3.601)
    {
    N=0;//欠压灯
 M=1;
 LED=1;
 timeL=timeL-0x01;
 timeH=timeH-0x01;
 START=1;
    }


 if(voltage>=3.601&&voltage<=4.155)
 {
  M=1;
  N=1;
  LED=1;
 } 
 
    if(voltage>=4.110&&voltage<=4.155)
   {
    timeL = 0xa2; //PWM模式时他俩用来控制占空比
    timeH = 0xa2; //0xff-0xc0=0x3f  64/256=25% 占空比(溢出) 
    START=1;
 LED=0;
    }


     if(voltage>=4.155&&voltage<=4.180)
   {
    timeL = 0xb2; //PWM模式时他俩用来控制占空比
    timeH = 0xb2; //0xff-0xc0=0x3f  64/256=25% 占空比(溢出) 
    START=1;
 LED=0;
    }


  /**************************
     if( voltage<3.772&&(timeL!=0xf0))
    {
   timeL = 0xf0; //PWM模式时他俩用来控制占空比
   timeH = 0xf0; //0xff-0xc0=0x3f  64/256=25% 占空比(溢出)    
   START=1;
    }


   if( voltage<4.052&&voltage>3.772&&(timeL!=0xf2))
    {
   timeL = 0xf2; //PWM模式时他俩用来控制占空比
   timeH = 0xf2; //0xc0 64/256=25% 占空比(溢出) 高电平时间    
   START=1;
     M=1;
  N=1;
  LED=1;
    }
 
   if( voltage>4.052&&voltage<4.167&&(timeL!=0xfd))
    {
   timeL = 0xfd; //PWM模式时他俩用来控制占空比
   timeH = 0xfd; //0xff-0xc0=0x3f  64/256=25% 占空比(溢出)    
   START=1;
     M=1;
  N=1;
  LED=1;
    }


    if( voltage>4.167&&voltage<4.208&&(timeL!=0x60))
   {
   timeL = 0x80; //PWM模式时他俩用来控制占空比
   timeH = 0x80; //0xff-0xc0=0x3f  64/256=25% 占空比(溢出)    
   START=1;
     M=1;
  N=1;
  LED=1;
    }


   if(voltage>4.2050&&voltage<4.235)
   {
    timeL = 0x96; //PWM模式时他俩用来控制占空比
    timeH = 0x96; //0xff-0xc0=0x3f  64/256=25% 占空比(溢出) 
    START=1;
 LED=0;
    }


   ****************************************************/


 


}



 /**********
// 保护函数
   void baohu()
   {
  
      if( voltage>4.231)
    {
     M=0;//过压灯
     N=1;
     LED=1;
    }
   if(voltage<3.501)
    {
    N=0;//欠压灯
 M=1;
 LED=1;
    }


     if( voltage<3.772&&(timeL!=0xcf))
    {
   timeL = 0xcf; //PWM模式时他俩用来控制占空比
   timeH = 0xcf; //0xff-0xc0=0x3f  64/256=25% 占空比(溢出)    
   START=1;
    }


   if( voltage<4.052&&voltage>3.772&&(timeL!=0x60))
    {
   timeL = 0x60; //PWM模式时他俩用来控制占空比
   timeH = 0x60; //0xc0 64/256=25% 占空比(溢出) 高电平时间    
   START=1;
    }
 
   if( voltage>4.052&&voltage<4.167&&(timeL!=0xb0))
    {
   timeL = 0xb0; //PWM模式时他俩用来控制占空比
   timeH = 0xb0; //0xff-0xc0=0x3f  64/256=25% 占空比(溢出)    
   START=1;
    }


   if( voltage>4.167&&voltage<4.218&&(timeL!=0xe0))
   {
   timeL = 0xe0; //PWM模式时他俩用来控制占空比
   timeH = 0xe0; //0xff-0xc0=0x3f  64/256=25% 占空比(溢出)    
   START=1;
    }


   if(voltage>4.220&&(timeL!=0xf2))
   {
    timeL = 0xf2; //PWM模式时他俩用来控制占空比
    timeH = 0xf2; //0xff-0xc0=0x3f  64/256=25% 占空比(溢出) 
    START=1;
 LED=0;
    }


 



 }


***************************/


//延时函数
void delayms(uint k)
{
uint data i,j;
for(i=0;i<k;i++)
  {
    for(j=0;j<600;j++)
     {;}
   }
}


 

这篇关于少占鱼-STC12C2052AD做的手机电池充电器的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/413510

相关文章

FT8493PA-RT隔离型SOP8快充充电器电源IC

FT8493XX,FT8493PA-RT是应用于隔离反激电压变换器的- -款高性能PWM控制器.芯片工作在CCM模式,工作频率随着负载降低而减小.拥有更高的效率,更快的瞬态响应以及更低的待机功耗.同时使用内部抖频技术可以更好的处理ENI. FT8493XX内部集成高压启动可以更快的起机以及更低的功耗.同时可以精简外围电路.满足六级能耗要求. FT8493XX拥有各种保护功能,使得系统在发生异常时能

LN2054Y42AMR 具有热调节功能的独立直线锂离子电池充电器

一般说明         LN2054是一款为单节锂离子电池设计的完整恒流/恒压线性充电器。其ThinSOT封装和外部元件数量少,使LN2054最适合便携式应用。此外,LN2054专门设计用于在 USB 电源规格内工作。         由于内部 MOSFET架构,不需要外部感测电阻,也不需要阻塞二极管。热反馈调节电荷电流,以限制高功率运行或高环境温度下的管芯温度。电荷电压固定在4.2V,电荷电流

手机快充头哪个牌子好?倍思65W伸缩线充电器交出优秀答卷

手机电池的持久续航能力显著影响我们的工作效率和日常生活。在众多手机快充头品牌中挑选一款既高效又安全的产品,对许多人来说是一大挑战。对于“手机快充头哪个牌子好”这一问题,或许在了解倍思65W氮化镓伸缩线充电器后,可以找到满意的答案。 极速充电,效率倍增—— 倍思65W氮化镓伸缩线充电器,搭载先进的氮化镓技术,实现单口高达65W的输出功率,并配备双Type-C及USB接口,支持三口同时快充。相较于

磁吸充电宝对手机电池有损害吗?哪些磁吸充电宝性价比比较高?

在现代生活中,手机已成为我们日常生活中不可或缺的工具,而电池续航问题常常困扰着用户。磁吸充电宝作为一种新兴的充电方式,以其便捷和高效逐渐受到青睐。然而,关于磁吸充电宝是否会对手机电池造成损害,仍然存在不少疑问。本文将探讨磁吸充电宝对手机电池的影响,并推荐一些性价比高的磁吸充电宝产品,帮助用户在选择时做出明智的决定,让你在享受便捷充电的同时,也能有效保护手机电池的健康。 一、磁吸充电宝对手机电池有

同时使用磁吸充电器和Lightning时,iPhone充电速度会变快吗?

在智能手机的世界里,续航能力一直是用户关注的焦点。苹果公司以其创新的MagSafe技术和传统的Lightning接口,为iPhone用户提供了多样化的充电解决方案。 然而,当这两种技术同时使用时,它们能否带来更快的充电速度?本文将探讨这一问题,并揭示MagSafe外接电池与Lightning充电线背后的科技原理。 一、MagSafe:无线充电的新篇章 MagSafe技术是苹果公司的一项创

SD5510 单节锂离子电池充电器和恒定5V升压控制器芯片IC

一般描述        SD5510为一款移动电源专用的单节锂离子电池充电器和恒定5V升压控制器,充电部分集高 精度电压和充电电流调节器、预充、充电状态指示和充电截止等功能于一体,可以输出最大1A充电电流。而升压电路采用CMOS工艺制造的空载电流极低的VFM开关型DC/DC升压转换器。其具有极低的空载功耗(小于10uA),且升压输出驱动电流能力能达到1A。无需外部按键,可以即插即用。

SD4056E 1.1A锂离子电池线性充电器芯片IC

一般描述        SD4056E是一个完整的CC/CV线性充电器单节锂离子电池。它是专门设计的USB电源规格内工作。       由于内部P-MOSFET架构,不需要外部检测电阻,也不需要阻塞二极管。在高功率运行或高环境温度下,热反馈调节充电电流以限制模具温度。充电电压固定在4.2V,充电电流可以通过单个电阻外部编程。在达到最终浮动电压后,当充电电流降至程序值的1/10时,SD4056E会

选择快充时代下的理想充电器与电压诱骗芯片PW6606

随着科技的不断进步,我们的电子设备对于充电速度和效率的要求越来越高。在快充技术迅猛发展的今天,了解不同类型的充电器及其对应的快充协议,以及如何选择适合的电压诱骗芯片,对于提升充电体验和保障设备安全显得尤为重要。     一、快充充电器的分类与特点 A口充电器(USB口) 特点:A口充电器,即我们常见的USB口充电器,是快充技术的早期代表。它支持QC3.0、QC2.0等快充协议,能够输

TP4065H 是一款600mA线性锂离子电池充电器芯片 30V高压输入带OVP保护

一般描述        TP4065H是一款输入电源30V高耐压具备OVP保护功能完整的单节锂离子电池采用恒定电流/恒定电压线性充电器。采用SOT23-5封装与较少的外部元件数目使得TP4065H成为便携式应用的理想选择。TP4065H可以适合USB电源和适配器电源工作。TP4065H的CH RG端口的耐压最高也可达到30V的电压。        由于采用了内部PMOSFET架构,加上防倒充电路,

直流快速充电器启动方案介绍

直流快速充电器可处理大量电力来为电动汽车充电。这意味着电动汽车的突然充电或放电可能会突然破坏电力系统。当连接多辆此类电动汽车时,情况尤其严重。在这种情况下,处理的功率相当大,这可能会导致闪烁。因此,为了顺利应对电动汽车车队的大功率,良好的启动方案是必要的。 一种可能的解决方案是遵循电动汽车充电的坡道式启动。斜坡式充电方式是指电动汽车的线性充电方式,与电动汽车的阶梯式充电相比,它具有很多优点。电池