//MCU:AT89S51
//晶振:12M
//选用查询方法读AD转化后的值
#include
#include “math.h”
#include “intrins.h”
unsigned char
0x92,0x82,0xf8,0x80,0x90,
0xC1,0XB7,0xFF
};//数字0~9及”U=””“共阳数码管代码
unsigned char
0X12,0X02,0X78,0X00,0X10
};//带数点的0~9共阳数码管代码
unsigned char
0xef,0xdf,0xbf,0x7f};//数码管位选代码
unsigned char
unsigned char
unsigned char
unsigned char
unsigned long int
sbit START=P3^0;
sbit EOC=P3^2;
sbit OE=P3^1;
sbit AD_ALE=P3^3;
voidmain(void)
{
TMOD=0x01;//挑选守时器T0,方法为1(16位守时器)
TH0=(65536-3000)/256;//守时3MS初值
TL0=(65536-3000)%6;
TR0=1;
ET0=1;
EA=1;
AD_ALE=0;
START=0;
OE=0;
while(1)
{
if(flag==1)//每隔40ms发动一次AD采样
{
flag=0;
AD_ALE=1;//锁存输入通道
START=0;//驱动AD转化
START=1;
AD_ALE=0;
START=0;//坚持低电平
while(EOC==0);//等候AD转化完毕
TR0=0;//AD转化完毕时先中止T0
P0=0XFF;//封闭数码管显现,呵呵,其实人眼是感觉不到数码管平息的
P1=0XFF;// 这个很重要
OE=1;//转化完毕,答应AD值输出
getdata=P1;//读出AD值,假如硬件连接上改成P2口来读AD值,这句就改成”getdata=P2;”
OE=0;//制止输出
getdata=(unsigned long int)((unsigned long int)(getdata*500)/255);//转化成电压
dispbuff[2]=getdata/100;
dispbuff[1]=(getdata0)/10;
dispbuff[0]=getdata;
TR0=1;//重新发动T0
}
}
}
voidt0(void) interrupt 1
{
TH0=(65536-3000)/256;
TL0=(65536-3000)%6;
if(disp_count==2)
P0=dot_numcode[dispbuff[disp_count]];
else
P0=numcode[dispbuff[disp_count]];
P1=bitcode[disp_count];
disp_count++;
flag_count++;
if(disp_count==8)
{
disp_count=0;
}
if(flag_count==100)
{
flag=1;
flag_count=0;
}
}