📄 新建 文本文档.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 + -