久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

專注電子技術學習與研究
當前位置:單片機教程網 >> MCU設計實例 >> 瀏覽文章

STC12C2052AD做的手機電池充電器

作者:佚名   來源:本站原創   點擊數:  更新時間:2011年03月31日   【字體:
 /*******************
 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: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<k;i++)
  {
    for(j=0;j<600;j++)
     {;}
   }
}

 
關閉窗口

相關文章

主站蜘蛛池模板: 日韩欧美在线观看 | 亚洲乱码国产乱码精品精98午夜 | 国产原创视频 | 免费高清av | 午夜视频网 | 美女久久久久 | 久久久性色精品国产免费观看 | 久久乐国产精品 | 九九色九九| 中文字幕成人在线 | 欧美成人黄色小说 | 久久精品久久久 | 亚洲精品在线免费 | 国产精品久久 | 精品国产一区二区三区久久久四川 | 国产精品久久在线 | 性做久久久久久免费观看欧美 | 91精品国产一区二区三区 | 免费在线黄色av | 色婷婷精品| 亚洲免费在线观看 | 国产91精品久久久久久久网曝门 | 久久久久国产 | 欧美日韩一区二区三区四区 | 国产视频中文字幕在线观看 | 亚洲国产成人av好男人在线观看 | 欧美a v在线 | 日本成人免费网站 | 欧美一区二区三区高清视频 | 色伊人网| 日韩在线资源 | 99精品欧美一区二区三区 | 特黄特黄a级毛片免费专区 av网站免费在线观看 | 欧美视频一级 | 婷婷二区 | 国产精品178页 | 国产91色在线 | 亚洲 | 欧美日韩国产一区二区三区 | 国产精品久久 | 亚洲精品电影网在线观看 | 国产午夜精品一区二区三区四区 |