⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 新建 文本文档.txt

📁 测量电池电压的程序,运用于pic器件,AD转换功能
💻 TXT
字号:
//=======================================
//电池电量计 主控 PIC18F4620
//==V1.0
//说明:  略
//工作基本原理:略
//开始时间 09.4.9
//完成时间 09.4
//程序员:余冰
// ====================================


//#include <pic.h>       //PIC头文件
#include <pic18f4620.h>  //16F4620头文件
 __CONFIG(0x04);         //04看门狗关 0c开     
//芯片配置字,看门狗开,上电延时开,掉电检测关,低压编程关,加密,4M晶体HS振荡


//#define  Ka      RC2          //定义阴极
#define  Anode1  RC3          //阳极1档
#define  Anode2  RC2          //
#define  Anode3  RC1          //
#define  Frame   RC0          //边框
unsigned int    nCount ;      //结果
unsigned char    mCount;



//=====================子程序=========================
//端口初始化子程序
void IO_ST(void)
{
      TRISC=0x00; //设置C口为输出
                  //5 4 3 2 1 0
                  //0 0 0 0 0 0
      TRISB=0x1f; //   RB4输入,RB5输出
      PORTC=0x00;
       nCount=0;   //AD结果
       mCount=255;//8位AD计数器
}
//=====================================================



//=====================================================
//延时
void DELAY()
{
unsigned char i,j;
for(j=50;j>0;j--)
for(i=255;i>0;i--);
}
//====================================================
/*
      ┏━━━━━━━┓Vm 47K
   ┃       RB5┣━□R1━━┓
  ┃       ┃ 100   ┃ Vc 47K
      ┃      RB4┣━□R3━━╋━━□R3━Vi
      ┃       ┃     ┻
      ┃       ┃     ┳C1 1000PF
      ┃       ┃     ┃
      ┃  PIC    ┃     ┷
      ┗━━━━━━━┛    
Vi=(1+R2/R1)Vc-R2/R1Vm
Vc=Vt判别门电压   
    
*/
//====================================================
void IO_AD()
{
   //门限电压确定,一般在1.5-1.7V经验值
    if (RB4==1)      //测当前RB4的状态
       {
         RB5=0;       //RB4=1,转RB5输出为低电平
         while(RB4==1);    //等待RB4上的电压下降
       }
     else            
        {
       RB5=1;         //RB4=0,转RB5输出为高电平
       while(RB4==0); //等待RB4上的电压上升
         }                 



   //正式开始AD转换
while(mCount!=0)      //判断mCount是否为0,为0则AD转换结束.结果就是nCount中
   {
   if (RB4==1)        //检测现在RB4上的电平
      {
        RB5=0;       //RB4=1,高于判别门限,RB5=0,使RB4上的电平的电压降低
        nCount++;    //更新AD结果
      }
   else
      {
        RB5=1;     //RB4=0,低于判别门限,RB5=0,使RB4上的电平的电压上升
      }
 mCount--;
   }
}


//===================================
//主程序
//===================================
void main(void)
{
    IO_ST();   //端口初始化
    IO_AD();   //A/D转换
while(1)
{    
     if ((nCount>=100)&&(nCount<150))   //0.4V<=Vi<1.4V
         {
        Anode1 =0;
        Frame=0;
        DELAY();
        Anode1 =1;
        Frame=1;
        DELAY();
          }
    if ((nCount>=150)&&(nCount<200))    //1.4V<=Vi<2.4
         {
        Anode1 =0;
        Frame=0;
        Anode2=0;
        DELAY();
        Anode1 =1;
        Frame=1;
        Anode2=1;
        DELAY();
          }
    if (nCount>=200)     //2.4V<=Vi<3.2V
         {
        Anode1 =0;
        Frame=0;
        Anode2=0;
        Anode3=0;
        DELAY();
        Anode1 =1;
        Frame=1;
        Anode2=1;
        Anode3=1;
        DELAY();
         }
     if ((nCount>=0)&&(nCount<100))   //0V<=Vi<0.4V
         {
        Frame=0;
        DELAY();
        Frame=1;
        DELAY();
         }
}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -