#include <reg52.h>
#include <math.h>
#define uint unsigned int
#define uchar unsigned char
#define AD_CLK_WIDTH 1
uchar temp0, temp1,temp2,temp3,temp4,temp5;
uint i;
uchar code table1[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf};//0 1 2 3 4 5 6 7 8 9 -
uchar code table2[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0xbf};//0. 1. 2. 3. 4. 5. 6. 7. 8. 9. -
uint out;
sbit AD7705_DIN=P2^6;
sbit AD7705_DOUT=P2^5;
sbit AD7705_SCLK=P2^2;
sbit AD7705_DRDY=P2^4;
sbit no1=P3^7;//数码管十位选择
sbit no2=P3^6; //数码管个位选择
sbit no3=P3^3; //数码管小数位选择
sbit rest=P2^3;
void delay(uint z)
{
int i,j; // 声明变量
for (i=1;i<x;i++) // 执行x次,延迟X*1ms
for (j=1;j<120;j++);// 执行120次,延迟1ms
}
void AD7705_Reset(void)
{
uchar i;
AD7705_SCLK =1;
for(i=0;i<40;i++)
{
AD7705_SCLK =0;
AD7705_DIN =1; // DIN端口连续写40个周期的高电平,保证复位
AD7705_SCLK =1;
}
delay(1); // 复位之后等待1MS
}
//****************************************************************************
//功能:往AD7705写1个字节数据
//参数:要写入AD7705的数据
//返回:无
//备注:无
//****************************************************************************
void AD7705_WriteByte(uchar d)
}
uchar i;
AD7705_SCLK =1;
for(i=0;i<8;i++)
{
AD7705_SCLK =0;
if(d & 0x80)
AD7705_DIN =1;
else
AD7705_DIN =0;
AD7705_SCLK =1;
d<<= 1;
}
AD7705_SCLK =1;
AD7705_DIN =1;
}
//****************************************************************************
//功能:从AD7705读一个字节的数据
//参数:无
//返回:读到的一字节数据
//备注:无
//****************************************************************************
uchar AD7705_ReadByte()
{
uchar i;
uint d=0;
while(AD7705_DRDY);// 写数据的时候不需要判断忙,只有读数据的时候才需?
AD7705_WriteByte(0x38);
AD7705_SCLK =1;
for(i=0;i<16;i++) // 读数据,高位在前
{
d<<= 1;
AD7705_SCLK =0;
if(AD7705_DOUT)
d++;
AD7705_SCLK =1;
}
AD7705_SCLK =1;
AD7705_DIN =1;
AD7705_DRDY=1;
return d;
}
void AD7705_Init()
{
uchar i;
for(i=10;i>0;i--)
{AD7705_WriteByte(0xff);}
AD7705_Reset(); // 复位,防止接口迷失
AD7705_WriteByte(0x20); // 写ch0 clock register
AD7705_WriteByte(0x10); // 2MHz时钟,无分频 50Hz数据更新速率
AD7705_WriteByte(0x10);//设置寄存器
AD7705_WriteByte(0x46);//自校正 单极性 增益1 缓冲开
delay(50);
}
float AD7705_ReadVol()
{
uchar adc_h=0, adc_l=0;
uint ADValue=0;
adc_h=AD7705_ReadByte();
adc_l=AD7705_ReadByte();
ADValue |= adc_h;
ADValue<<= 8;
ADValue |= adc_l;
return ADValue;
}
void main()
{
TMOD = 0x21;// 定时器1 工作于方式2,8 位自动重载模式, 用于产生波特率。
// 定时器 0 工作于方式 1,产生 1s 的 AD 间隔时间
TH0=15536/256;//T0 定时 50ms
TL0=15536%256;
TH1 = 0xe1;// 波特率 1000
TL1 = 0xe1;
SCON = 0x50;// 设定串行口工作方式 1
PCON = 0x00;// 波特率不倍增
TI=0;//清除发送中断标志
EA = 1; // 开总中断
ET0 = 1;//开 T0 中断
ET1=0;
TR1 = 1;// 启动 T1
TR0 = 1;//启动 T0
rest=1;
delay(10);
rest=0;
delay(10);
rest=1;
delay(10);
AD7705_Init();
while(1)
{
out=AD7705_ReadVol();
temp1=out/10000;
temp2=out%10000/1000;
temp3=out%10000%1000/100;
temp4=out%10000%1000%100/10;
temp5=out%10000%1000%100%10;
P1=table1[temp3];
no3=0;no2=1;no1=1;
delay(1);
P1=0xff;
P1=table1[temp2];
no3=1;no2=0;no1=1;
delay(1);
P1=0xff;
P1=table1[temp1];
no3=1;no2=1;no1=0;
delay(1);
P1=0xff;
}
} |