#include <reg51.h>
#include <absacc.h>
#include <stdio.h>
#include <math.h>
#define uchar unsigned char
#define IN0 XBYTE [0x7FF8]
sbit ad_busy=P3^3;
sbit CLK=P3^2;
//全局变量声明
uchar code tab[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xBF,0xFF};//0~9,全灭
uchar code tabp[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0x30,0x7F};//0~9,全灭(含小数点)
uchar ave;
uchar tm;
//函数声明
void time0();
void time1();
void ad0808();
void ledshow();
//主函数
void main()
{
SCON=0x00; //串行口工作方式0
TMOD=0x11; //定时器0工作方式0,定时器1工作方式0
TH0=(65535-625)/256; //设置初始值
TL0=(65535-625)%256;
TH1=(65536-200)/256;
TL1=(65536-200)%256;
EA=1; //开中断允许
ET0=1;
TR0=1; //定时开始
ET1=1;
TR1=1;
while(1)
{
ad0808();
ledshow();
}
}
//AD转换和计算函数,得出所测50Hz信号的平均值
void ad0808()
{
uchar i,x;
long sum=0;
uchar xdata *ad_adr;
ad_adr=&IN0;
for(i=0;i<32;i++) //每周期采样32个点
{
while(tm); //等待中断定时
*ad_adr = 0; //开始A/D转换
while(ad_busy==0); //等待A/D转换完成
x=*ad_adr; //获取数据
sum+=x; //周期求和
tm=1;
}
ave=(sum)/32; //求平均值
}
//八段数码管显示函数,将所得数据归一化至5V并输出个位和十分位
void ledshow()
{
uchar ge,shi,bai,qian;
float tmp;
// uchar buf[10];
tmp=((float)ave/255)*5;
/* sprintf(buf,"%f",tmp);
ge=buf[0]-0x30;
shi=buf[2]-0x30;
bai=buf[3]-0x30;
*/
ge=tmp/1;
shi=(tmp-ge)*10;
bai=((tmp-ge)*10-shi)*10;
qian=(((tmp-ge)*10-shi)*10-bai)*10;
SBUF=tab[qian]; //移位寄存器方式发送数据
while(!TI); //等待发送完毕
TI=0;
SBUF=tab[bai];
while(!TI);
TI=0;
SBUF=tab[shi];
while(!TI);
TI=0;
SBUF=tabp[ge];
while(!TI);
TI=0;
}
//计数器/定时器0中断处理子程序
void time0(void) interrupt 1 using 2
{
TH0=(65535-625)/256;
TL0=(65535-625)%256;
tm=0;
}
//计数器/定时器1中断处理子程序
void time1(void) interrupt 3 using 0
{
TH1=(65536-400)/256;
TL1=(65536-400)%256;
CLK=~CLK;
}