历史上的今天
返回首页

历史上的今天

今天是:2025年01月30日(星期四)

2018年01月30日 | STC12C2052AD单片机做的手机电池充电器程序

2018-01-30 来源:eefocus

STC12C2052AD单片机做的手机电池充电器程序

#include  
#include  
#define uchar unsigned char 
#define uint unsigned int

#define AD_SPEED   0x60 //0110,0000   1      1     270个时钟周期转换一次,  
//少占鱼制作  河北正定欢迎您   长沙航空职业技术学院  2010 年QQ:41165643  
// 
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  { 
    for(j=0;j<600;j++) 
     {;} 
   } 


C语言运算符优先级  
  

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

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

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

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

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

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

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

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

   15级优先级 左结合   
  , 逗号运算符  


推荐阅读

史海拾趣

FOCI Fiber Optic Communications Inc公司的发展小趣事

FOCI Fiber Optic Communications Inc.公司发展的五个故事

故事一:成立与初创期

FOCI Fiber Optic Communications Inc.(以下简称FOCI)成立于1995年,由台湾工业技术研究院(工研院)的核心团队创立。这家公司自诞生之初就专注于光纤互连技术的发展,致力于设计、制造和销售高性能的光纤组件和集成模块。初创时期,FOCI凭借其对光纤技术的深刻理解和市场需求的敏锐洞察,逐步在市场上站稳脚跟,成为光纤通信领域的一股新兴力量。

故事二:技术创新与突破

FOCI在发展过程中,始终将技术创新视为企业发展的核心驱动力。公司不断投入研发资源,在光纤耦合器、PLC分配器、薄膜粗波分复用/密集波分复用以及多光纤电缆组装模块等领域取得了多项技术突破。这些技术创新不仅提升了产品的性能和质量,还大幅降低了生产成本,使得FOCI的产品在市场上更具竞争力。

故事三:与奇景光电的战略合作

2024年,半导体解决方案无晶圆厂巨头奇景光电(Himax Technologies)宣布向FOCI投入5.22亿新台币(折合约为1610万美元)的资金。这次投资不仅是两家公司财务合作的结果,更是双方在技术融合与应用拓展上迈出的重要一步。根据合作协议,FOCI的共封装光学器件(CPO)与奇景光电的晶圆级光学器件(WLO)将被整合到多芯片模块中,这些模块将广泛应用于高性能计算、云服务器、人工智能等多个领域。

故事四:全球化布局与市场拓展

随着全球光纤通信市场的快速发展,FOCI积极实施全球化战略,不断拓展国际市场。公司通过参加国际展会、建立海外销售网络等方式,将高性能的光纤组件和集成模块带到了世界各地。特别是在光纤到户(FTTH)和云计算领域,FOCI的产品因其高效、低成本的特性而广受欢迎,成功在全球市场占据了一席之地。

故事五:子公司设立与多元化发展

为了进一步拓展业务领域和市场份额,FOCI在国内设立了多家子公司,如中山上诠通信科技有限公司等。这些子公司不仅继承了FOCI在光纤通信领域的深厚底蕴和技术优势,还根据当地市场需求进行了产品和服务的本地化调整。同时,FOCI还积极探索多元化发展路径,涉足光纤高速数据传输技术开发设计、研发和咨询等多个领域,为公司未来的持续发展奠定了坚实基础。

超霸(GP)公司的发展小趣事

2013年,绿索超容在南京江宁区智能电网产业园正式成立。公司自创立之初,就明确了“制造中国可靠性最高的超级电容”的目标,以及“引领超容行业,做绿色能源模范”的使命。这一清晰的发展定位,为绿索超容后续的技术创新和市场拓展奠定了坚实的基础。公司初期虽然面临资金和技术挑战,但通过不懈努力,逐步建立了自己的研发团队和生产体系。

Bias Power公司的发展小趣事

Bias Power公司深知研发实力是企业发展的核心。因此,公司投入大量资源用于研发工作,建立了完善的研发团队和实验设施。通过不断的技术创新和研发投入,Bias Power公司成功推出了一系列具有竞争力的新产品,巩固了其在电子行业的领先地位。

同时,公司还注重知识产权的保护,积极申请专利,保护其核心技术不被侵犯。这些专利的申请和授权不仅提升了公司的技术实力,还为公司的发展提供了有力保障。

HTC Korea(TAEJIN Technology )公司的发展小趣事

近年来,HTC在VR领域取得了显著的成就。2023年,在美国国际消费性电子展(CES)中,HTC推出了最先进的虚拟实境头戴式显示器VIVE XR Elite,凭借其创新、高规格的设计和巧妙的人体工学设计,赢得了众多国际媒体的赞誉和奖项。此外,HTC还开发了多款VR内容套件和追踪器,为用户提供了更加沉浸式的虚拟体验。这些努力不仅推动了VR产业的发展,也为HTC带来了新的增长点。

B&B Electronics Manufacturing Company公司的发展小趣事

随着科技的不断进步,B&B公司意识到,要在竞争激烈的电子行业中立足,必须不断进行技术革新和产品升级。因此,公司加大了在研发上的投入,推出了一系列具有创新性的产品,如智能无线M2M和物联网连接解决方案。这些产品不仅提升了数据传输的效率和稳定性,也为客户提供了更加便捷和高效的解决方案。

FERYSTER公司的发展小趣事

在全球环保意识日益增强的背景下,FERYSTER公司积极响应环保号召,推动企业的绿色转型。公司采用环保材料替代传统材料,优化生产工艺减少能源消耗和废弃物排放。此外,公司还积极推广绿色电子产品,引导消费者关注环保问题。这些努力不仅提升了公司的社会形象,也为公司带来了更多的商业机会。

问答坊 | AI 解惑

毕业设计分享【一起学习吧】

发几个毕业设计上来,大家一起学习一下吧 [ 本帖最后由 open82977352 于 2010-1-14 11:10 编辑 ]     …

查看全部问答>

请问,三极管参数里的“耐压”和“功率”是什么意思?

前几天做实验,想买个三极管,但是看到这参数,不知道什么意思,有谁能告诉我的,详细一点的,还有,那个功率,是不是说三极管本身会耗功率啊?谢谢! 型 号 耐压(V) 电流(A) 功率(W) 型 号 耐压(V) 电流(A) 功率(W) B857 70V 4A 40W BU2508A 150 ...…

查看全部问答>

十万火急,,有没有汇编高手??我有个汇编程序小地方要修改,,要高手

哪个厉害发我邮箱   puyiyue1980@126.com 帮个忙,,十万着急,,着急的不行,,吃饭不下…

查看全部问答>

如何让单片机通过互联网控制???请高手指点.

今天做了一个东东...使用了周立功的ZNE10T串口转以太网模块..(该模块有IP协议栈) 实现了局域网的控制.... 但能不能实现外网的控制呢?(就是在远程通过别的PC机利用以太网控制) 请高手指点.... 上位机该怎样写呢?…

查看全部问答>

如何用c#实现wince4.2窗口最大化(隐藏任务栏),谢谢大家!!!

如何用c#实现wince4.2窗口最大化(隐藏任务栏),谢谢大家!!!…

查看全部问答>

LED光源技术在DLP拼接墙中应用的现状和前景深入分析

国内数字背投影显示墙市场已经经历了长达10年的高速增长。目前市场规模已攀升到40亿元人民币每年以上。而据预测,未来五年内该产业依然能保持年均30%以上的增长速率,并逐步实现市场规模化、品牌集中化。     数字背投影显示墙产品市场 ...…

查看全部问答>

STM32F21X的引脚复用简直让人绝望!

大部分引脚都有多个功能,看似功能强大的芯片功能:\'\'USB OTG HS/FS, Ethernet, 17 TIMs, 3 ADCs, 15 comm. interfaces & camera、USART FSMC“等大部分在复用,如果使用当中一个功能,其它很多功能就无法使用了。 很多重要的功能全部被 ...…

查看全部问答>

在IAR中怎样看程序的运行时间

怎样在IAR调试环境中看程序的运行时间呢?比如我想看一段程序的花费时间,在IAR中怎样设置呢?请各位指教,谢谢。…

查看全部问答>

新设计的MP3开发板

在LPC11U14没有出现之前用LPC1114设计的MP3开发板,在LPC11U14出现后感觉没有必要使用LPC1114,所以一直没有大样,现在秀秀图吧。。。。。。。。。。。。。。                     & ...…

查看全部问答>

苛刻环境下的产品系列-高温产品 2

设计考虑因素德州仪器高可靠性(HiRel)开发小组提供了许多不同的用于恶劣环境下的半导体产品。许多应用都要求电子器件能够在户外使用,工作在典型的工业温度范围内,甚至有时会超出了-55℃至+125℃的军用温度标准范围。这些应用都具有限定条件及封装 ...…

查看全部问答>