// Author : Toby
// Date : 2008/12/02
// Function : 用作電源的電流電壓溫度等控制
// MCU : PIC16F877A
// C Compiler : PICC 8.05
// IDE : MPLAB IDE v8.10
/////////////////////////////////////////////////
#include
__CONFIG (0x3f32); //燒寫配置位
const char TABLE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0X82,0XF8,0X80,0X90}; //定義常數0-9的數據表格
void adinitial_voltage();
void display_voltage();
void delay(unsigned char x);
unsigned long int AD_data=0;
void initial();
main() //主程序
{
unsigned int a;
initial(); //先初始化各I/O
while(1)
{
for(a=850;a>=1;--a)
display_voltage();
}
}
void initial()
{
TRISA=0B00000001;
TRISB=0X0;
PORTB=0XFF;
}
//輸入電壓A/D轉化初始化子程序
void adinitial_voltage()// RA0為AD輸入
{ unsigned char a;
AD_data=0;
for(a=200;a>=1;--a)
{
ADCON1=0B00000100; //ADRESH 寄存器的高6 位讀為0;6位與7位須置1
ADCON0=0B01000001; //A/D轉換器模塊工作;但AD轉換不進行;FOSC/8
asm("nop");asm("nop");
GODONE=1;
while(GODONE);
AD_data+=ADRES;
}
}
void display_voltage() //電壓顯示函數
{
int ge,shi,bai,temp; //定義6個臨時變量
adinitial_voltage();
temp=AD_data/10203.268234356317257871662016740*100;
bai=temp/100; //求顯示的千位
shi=temp%100/10; //求顯示的百位
ge=temp%10; //求顯示的十位
PORTB=TABLE[bai]&0x7f; //顯示一個小數點
PORTA=0B1111100; //RA1輸出低電平,點亮千位顯示
delay(1);
PORTB=TABLE[shi]; //查表得百位顯示的代碼
PORTA=0B1111010; //RA2輸出低電平,點亮百位顯示
delay(1); //延時一定時間,保證顯示亮度
PORTB=TABLE[ge]; //查表得十位顯示的代碼
PORTA=0B1110110; //RA3輸出低電平,點亮十位顯示
delay(1); //延時一定時間,保證亮度
PORTB=0xff;
}
void delay(unsigned char x) //延時程序
{
unsigned char i=x; //定義整形變量
for(i=200;--i;); //延時
}