#include<reg51.h>
#include<intrins.h>
#define FOSC 18432000L
#define BAUD 9600
typedef unsigned char BYTE;
typedef unsigned int WORD;
sfr ADC_CONTR = 0XBC;
sfr ADC_RES = 0XBD;
sfr ADC_LOW2 = 0XBE;
sfr P1ASF = 0X9D;
BYTE sh[3]="0",RES,ch;
WORD t;
BYTE code shu[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90};
BYTE code shu_zs[]={0X40,0X79,0X24,0X30,0X19,0X12,0X02,0X78,0X00,0X10};
#define ADC_POWER 0X80
#define ADC_FLAG 0X10
#define ADC_START 0X08
#define ADC_SPEEDLL 0X00
#define ADC_SPEEDL 0X20
#define ADC_SPEEDH 0X40
#define ADC_SPEEDHH 0X60
void InitADC();
void display();
sbit P27=P2^7;
sbit P26=P2^6;
sbit P25=P2^5;
void delayus(WORD i)
{
while(i--);
}
void display() // 数码管显示
{
float ADC_value;
WORD value;
ADC_value=RES*5/256;
value=ADC_value*100;
sh[0]=value/100;
sh[1]=value%100/10;
sh[2]=value%10;
P2=0xFE; //整数部分
P0=shu_zs[sh[0]];
delayus(200);
P2=0xFD; //第一位小数
P0=shu[sh[1]];
delayus(200);
P2=0xFB; //第二位小数
P0=shu[sh[2]];
delayus(200);
}
void main()
{
InitADC();
IE=0XA0;
while(1)
display();
}
void adc_isr() interrupt 5 using 1
{
ADC_CONTR=0X00;
t++;
if(t==30000)
{
t=0;
RES=ADC_RES;
}
ch=0;
ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ADC_START | ch;
}
void InitADC()
{
P1ASF = 0XFF;
ADC_RES = 0;
ADC_CONTR = 0X00|ADC_POWER | ADC_SPEEDLL | ADC_START | ch;
delayus(10000);
}