?? 新建 文本文檔.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 + -