| #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;
 
 
 
 }
 }
 |