#include<pic.h>
__CONFIG(0X3F39);
//=========子函数声明=================
void init(void); //初始化子函数
void dycl(void); //电压测量子函数
void display(void); //显示子函数
void delay(void); //延时子函数
void baojing(void); //报警函数
bit flag;
int result,bai,shi,ge; //定义4个临时变量;
const char TABLE[10]={0X88,0X9F,0XA4,0X85,0X93,0XC1,0XC0,0X8F,0X80,0X81}; //定义常数0-9的数据表格
//===========主函数===================
void main()
{
init(); //端口初始化
while(1)
{
dycl(); //电压测量
display(); //显示函数
}
}
//=============端口初始化子函数================
void init()
{
TRISA=0X01; //设置RA0为输入,其他为输出
TRISC=0X00; //设置C口全为输出
PORTA=0XFF;
PORTC=0X00; //熄灭所有显示
ADCON1=0X0E; //转换结果左对齐,RA0做模拟输入口,其它做普通I/O
ADCON0=0X41; //系统时钟Fosc/8,选择RA0通道,允许ADC工作
}
//=============电压比较子函数==========================
void dycl(void)
{
// double i;
int temp;
ADGO=1; //开启转换过程
while(ADGO); //等待转换完成
result=ADRESH;
result=(result<<2)+(ADRESL>>6);
// i=result*0.489;
// if((i>=3.876)||(i<=3.170)) flag=1;
temp=(int)(result*30.54/100); //0.489为比例系数,1023*0.489=5.00V
if(temp>=242||temp<=198)
baojing(); //过压欠压报警
bai=temp/0x64; //求显示的百位
shi=(temp%0x64)/0xa; //求显示的十位
ge=(temp%0x64)%0xa; //求显示的百分个位
}
//=============报警子函数==================================
void baojing()
{
int i;
for(i=20;i>0;i--)
{
PORTC=TABLE[7];
PORTA=0X37;
delay();
}
}
//=============显示子函数===============================
void display()
{
PORTC=TABLE[bai]; //查表得百位显示的代码
PORTA=0X38; //RA3输出低电平,点亮百位显示
delay(); //延时一定时间,保证显示亮度
PORTC=TABLE[shi]; //查表得十位显示的代码
PORTA=0X1F; //RA6输出低电平,点亮十位显示
delay(); //延时一定时间,保证亮度
PORTC=TABLE[ge]; //求个位显示的代码
PORTA=0x2f; //RA5输出低电平,点亮个位显示
delay(); //延时一定时间,保证亮度
}
//----------延时程序------------------------------------
void delay() //延时程序
{
int i; //定义整形变量
for(i=0x100;i--;); //延时
}