// 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;); //延时
}