#include <pic.h>
#define uchar unsigned char
#define uint unsigned int
uchar LED_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf};//不带小数点的字型码
uchar LED_CODE1[]={0x40,0x79,0x24,0x30,0x19,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf};//带小数点的字型码
void delay(uchar x);
void init();
void display(uchar num1,uchar num2,uchar num3,uchar num4);
void beep();
uint get_ad()//整型带返回值子函数
{
uint adval,ad;//定义两个无符号整型变量
ADGO=1;//启动AD转换
//while(ADGO);//查询AD转换是否完成,此行可以不用,程序一样运行正常
//if(ADGO==1);//可以采用while查询也可以用if查询AD转换是否完成,此行一样可以不要
//adval=ADRESH;//注释此行可以不要
adval=ADRESH<<8|ADRESL;//ADRESH高8位数据左移8位,然后再与ADRESL低8位数据相加
ad=adval*41;//这里的41是VDD电压,adval的值在0-1023之间,假设adval当前数字量是800,那么800*41=32800
adval=ad/10;//因为我的是4位数码显示,将得到的32800除以10以后给数码管显示当前电压值即:3280(3.28V)
return(adval); //返回adval值给主程序调用的地方
}
void main()
{
init();//程序初始化
uint tempad;//定义临时整型变量
uchar s1,s2,s3,s4;//定义4个无符号字符型变量
while(1)
{
tempad=get_ad();//调用ad子程序
s1=tempad/1000;//将得到的值3280除以1000取商丢去余数,所以s1的值是3(即千位)
s2=tempad%1000/100;//3280除1000求余280再除以100取商,所以s2的值是2(取百位)
s3=tempad%100/10;//3280除100求余80再除以10取商,所以s3的值是8(取十位)
s4=tempad%10;//3280除10求余,余数是0(取个位)
display(s1,s2,s3,s4); //给数码管分别显示四位值
/////以下是判断ad采样的电压是否大于4v,大于或等于4v时led等亮/////
if(s1>=4)//判断千位值
{
RA5=0;
}
/////////////~~~~~~~~~~~~~~~~~~~~~~~~~~///////////////////////////////////
}
}
void init()
{
TRISA=0x01;//RA0设置为输入AN0(AD采集端口)
TRISD=0;//D端口全部设置成输出
PORTA=0x01;
PORTD=0xFF;
TRISE=0;
PORTE=0;
ADCON0=0x41;
ADCON1=0x8e;
delay(1);//延时5ms稳定AD采用
}
void display(uchar num1,uchar num2,uchar num3,uchar num4)
{
PORTD=LED_CODE[num4];//数码管个位显示值
PORTA=0xfd;//1111 1101 开数码管个位位选
delay(1);
PORTD=LED_CODE[num3];//数码管十位显示值
PORTA=0xfb;//1111 1011
delay(1);
PORTD=LED_CODE[num2];//数码管百位显示值
PORTA=0xf7;//1111 0111
delay(1);
PORTD=LED_CODE1[num1];//数码管千位显示值(这个值是带小数点的)
PORTA=0xef;
delay(1);
}
void delay(uchar x)//5ms延时子函数
{
uint y,k;
for(y=0;y<x;y++)
for(k=0;k<200;k++);
}
void beep()
{
RE1=0;
delay(20);
RE1=1;
delay(20);
}
|